static bool flow (struct anim *k) { struct pos pbf, pmt; survey (_bf, pos, &k->f, NULL, &pbf, NULL); k->collision = false; k->hit_by_loose_floor = false; bool turn = ((k->f.dir == RIGHT) && k->key.left) || ((k->f.dir == LEFT) && k->key.right); bool walk = ((k->f.dir == RIGHT) && k->key.right && k->key.shift) || ((k->f.dir == LEFT) && k->key.left && k->key.shift); bool run = (((k->f.dir == RIGHT) && k->key.right) || ((k->f.dir == LEFT) && k->key.left)) && ! walk; bool jump = ((k->f.dir == RIGHT) && k->key.right && k->key.up) || ((k->f.dir == LEFT) && k->key.left && k->key.up); bool couch = k->key.down; bool vjump = k->key.up; bool drink = is_potion (&pbf) && k->key.shift; bool raise_sword = is_sword (&pbf) && k->key.shift; bool take_sword = k->key.enter && k->has_sword; survey (_mt, pos, &k->f, NULL, &pmt, NULL); bool stairs = k->key.up && ! k->key.left && ! k->key.right && fg (&pmt) == LEVEL_DOOR && level_door_at_pos (&pmt)->i == 0 && k == get_anim_by_id (0); if (k->oaction == kid_normal && k->current_lives <= 0) { survey (_mt, pos, &k->f, NULL, &pmt, NULL); k->p = pmt; kid_die (k); return false; } if (k->oaction == kid_normal) { if (stairs) { k->p = pmt; kid_stairs (k); return false; } if (couch) { kid_couch (k); return false; } if (jump) { kid_jump (k); return false; } if (turn) { kid_turn (k); return false; } if (vjump) { kid_vjump (k); return false; } if (walk) { kid_walk (k); return false; } if (run) { if (dist_collision (&k->f, _bf, -4, -4, &k->ci) < 29) kid_walk (k); else kid_start_run (k); return false; } if (drink) { k->item_pos = pbf; place_frame (&k->f, &k->f, kid_couch_frameset[0].frame, &k->item_pos, (k->f.dir == LEFT) ? PLACE_WIDTH + 3 : +9, +27); kid_couch (k); return false; } if (raise_sword) { k->item_pos = pbf; kid_couch (k); return false; } if (take_sword) { kid_take_sword (k); return false; } } k->fo.b = kid_normal_00; k->fo.dx = k->fo.dy = +0; if (k->f.b == kid_stabilize_frameset[3].frame) k->fo.dx = +2; if (k->f.b == kid_walk_frameset[11].frame) k->fo.dx = -1; if (k->f.b == kid_jump_frameset[17].frame) k->fo.dx = -2; if (k->f.b == kid_couch_frameset[12].frame) k->fo.dx = -2; if (k->f.b == kid_vjump_frameset[17].frame) k->fo.dx = +2; if (k->f.b == kid_drink_frameset[7].frame) k->fo.dx = +0; if (k->f.b == kid_keep_sword_frameset[9].frame) k->fo.dx = +2; k->xf.b = NULL; return true; }
static bool flow (struct anim *k) { struct pos pmt; bool keep_sword = k->key.down; bool defense = k->key.up && ! k->key.shift && ! k->key.left && ! k->key.right; bool attack = k->key.shift && ! k->key.up && ! k->key.left && ! k->key.right; bool walkf = ((k->f.dir == RIGHT) && k->key.right) || ((k->f.dir == LEFT) && k->key.left); bool walkb = ((k->f.dir == RIGHT) && k->key.left) || ((k->f.dir == LEFT) && k->key.right); struct anim *ke = get_anim_by_id (k->enemy_id); k->keep_sword_fast = (k->enemy_id != -1 && ke->current_lives > 0 && ! is_anim_fall (&ke->f)); if (k->oaction != kid_sword_normal) k->i = -1; if (k->oaction == kid_sword_normal && k->current_lives <= 0) { survey (_mt, pos, &k->f, NULL, &pmt, NULL); k->p = pmt; kid_die (k); return false; } if (k->oaction == kid_sword_normal) { if (keep_sword) { /* keep_sword_fast = true; */ kid_keep_sword (k); return false; } if (defense) { kid_sword_defense (k); return false; } if (attack) { kid_sword_attack (k); return false; } if (walkf) { kid_sword_walkf (k); return false; } if (walkb) { kid_sword_walkb (k); return false; } } k->fo.b = kid_sword_normal_00; k->fo.dx = k->fo.dy = +0; select_xframe (&k->xf, sword_frameset, 13); if (k->f.b == kid_take_sword_frameset[3].frame) k->fo.dx = -4; if (k->f.b == kid_sword_walkf_frameset[1].frame) k->fo.dx = +5; if (k->f.b == kid_sword_walkb_frameset[1].frame) k->fo.dx = +2; k->i++; return true; }