static bool flow (struct anim *k) { if (k->oaction != kid_turn) k->i = -1, k->misstep = k->hang = false; if (! k->turn) k->turn = ((k->f.dir == RIGHT) && k->key.left) || ((k->f.dir == LEFT) && k->key.right); bool run = ((k->f.dir == RIGHT) ? k->key.right : k->key.left) && ! k->key.shift; 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; if (k->i == 3) { int dc = dist_collision (&k->f, false, &k->ci); int df = dist_fall (&k->f, false); if (k->hang) kid_hang (k); else if (k->turn) { k->i = -1; k->turn = false; k->action = kid_normal; kid_turn (k); } else if (couch) kid_couch (k); else if (jump) kid_jump (k); else if (run && dc > PLACE_WIDTH && df > PLACE_WIDTH) kid_start_run (k); else kid_stabilize (k); return false; } if (k->f.b == kid_keep_sword_frameset[9].frame) k->i = 2; /* hang */ if (k->oaction == kid_fall || k->oaction == kid_jump || k->oaction == kid_run_jump || k->oaction == kid_hang_free || k->oaction == kid_hang_wall) { k->i = 2, k->hang = true; place_frame (&k->f, &k->f, kid_turn_frameset[2].frame, &k->hang_pos, (k->f.dir == LEFT) ? 7 : PLACE_WIDTH, +4); } select_frame (k, kid_turn_frameset, k->i + 1); if (k->f.b == kid_stabilize_frameset[0].frame) k->fo.dx = +6; if (k->f.b == kid_stabilize_frameset[1].frame) k->fo.dx = +10; if (k->f.b == kid_stabilize_frameset[2].frame) k->fo.dx = +8; if (k->f.b == kid_stabilize_frameset[3].frame) k->fo.dx = +4; if (k->f.b == kid_turn_frameset[3].frame) k->fo.dx = +3; if (k->f.b == kid_keep_sword_frameset[9].frame) k->fo.dx = -2; return true; }
static bool flow (struct anim *k) { struct coord nc; struct pos np, pm, ptf; if (k->oaction != kid_jump) k->i = -1, k->misstep = k->hang = false; bool hang_front = ((k->f.dir == LEFT) ? k->key.left : k->key.right) && ! k->key.up && k->key.shift; bool hang_back = ((k->f.dir == LEFT) ? k->key.right : k->key.left) && ! k->key.up && k->key.shift; int back_dir = (k->f.dir == LEFT) ? RIGHT : LEFT; /* hang front */ survey (_m, pos, &k->f, &nc, &pm, &np); survey (_tf, pos, &k->f, &nc, &ptf, &np); if (k->i >= 8 && k->i <= 10 && hang_front && (is_hangable_pos (&pm, k->f.dir) || is_hangable_pos (&ptf, k->f.dir))) { if (is_hangable_pos (&pm, k->f.dir)) k->hang_pos = pm; else if (is_hangable_pos (&ptf, k->f.dir)) k->hang_pos = ptf; pos2room (&k->hang_pos, k->f.c.room, &k->hang_pos); k->hang = true; play_sample (hang_on_fall_sample, k->f.c.room); kid_hang (k); return false; } /* hang back */ survey (_tf, pos, &k->f, &nc, &ptf, &np); if (k->i >= 8 && k->i <= 10 && hang_back && is_hangable_pos (&ptf, back_dir)) { k->hang_pos = ptf; pos2room (&k->hang_pos, k->f.c.room, &k->hang_pos); k->hang = true; play_sample (hang_on_fall_sample, k->f.c.room); kid_turn (k); return false; } if (k->i == 17) { kid_normal (k); return false; } select_frame (k, kid_jump_frameset, k->i + 1); if (k->f.b == kid_stabilize_frameset[0].frame) k->fo.dx = +2; if (k->f.b == kid_stabilize_frameset[1].frame) k->fo.dx = +6; if (k->f.b == kid_stabilize_frameset[2].frame) k->fo.dx = +4; if (k->f.b == kid_stabilize_frameset[3].frame) k->fo.dx = +0; return true; }
static bool flow (struct anim *k) { if (k->oaction != kid_stabilize) { k->i = -1, k->misstep = false; if (k->oaction == kid_stabilize_collision) { k->i = 0; k->collision = true; } else k->collision = false; if (k->oaction == kid_turn) k->collision = true; } if (! k->turn) k->turn = ((k->f.dir == RIGHT) && k->key.left) || ((k->f.dir == LEFT) && k->key.right); bool run = (((k->f.dir == RIGHT) && k->key.right) || ((k->f.dir == LEFT) && k->key.left)) && ! k->key.shift; 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; int dc = dist_collision (&k->f, false, &k->ci); int df = dist_fall (&k->f, false); if (k->i >= 0 && ! k->collision) { if (couch) { kid_couch (k); return false; } else if (jump) { kid_jump (k); return false; } else if (k->turn) { kid_turn (k); k->turn = false; return false; } else if (run && dc > PLACE_WIDTH && df > PLACE_WIDTH) { kid_start_run (k); return false; } } if (k->i == 3) { kid_normal (k); k->turn = false; return false; } select_frame (k, kid_stabilize_frameset, k->i + 1); if (k->f.b == kid_stop_run_frameset[3].frame) k->fo.dx = -5; return true; }
static bool flow (struct anim *k) { if (k->oaction != kid_keep_sword) k->i = -1, k->wait = 1; if (k->i < 8) k->i++; else if (k->i == 8 && k->wait > 0) k->wait--; else if (k->i == 8 && k->wait == 0) k->i++, k->wait = 2; else if (k->i == 9 && k->wait > 0) k->wait--; else { if (k->keep_sword_fast) { kid_normal (k); k->keep_sword_fast = false; return false; } else { /* kid turn will invert kid's direction */ k->f.dir = (k->f.dir == RIGHT) ? LEFT : RIGHT; kid_turn (k); return false; } } if (k->keep_sword_fast && k->i % 2 == 0) k->i++, k->wait = 0; k->j = 24 + k->i; select_frame (k, kid_keep_sword_frameset, k->i); if (k->i < 4) select_xframe (&k->xf, sword_frameset, k->j); if (k->i == 8 && k->wait < 1) k->fo.dx = 0; if (k->i == 9 && k->wait < 2) k->fo.dx = 0; if (k->keep_sword_fast && k->i % 2) k->fo.dx += kid_keep_sword_frameset[k->i - 1].dx; if (k->f.b == kid_sword_normal_00) k->fo.dx = +8; return true; }
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 np; if (k->oaction != kid_hang_free) k->i = 5, k->j = -1, k->wait = 3, k->reverse = true; bool hang_back = ((k->f.dir == LEFT) ? k->key.right : k->key.left) && ! k->key.up && k->key.shift; int back_dir = (k->f.dir == LEFT) ? RIGHT : LEFT; /* hang back */ if (k->i >= 7 && hang_back && is_hangable_pos (&k->hang_pos, back_dir)) { play_audio (&hang_on_fall_audio, NULL, k->id); kid_turn (k); return false; } /* climb */ if ((k->i < 5 || k->j > -1 || k->hang_caller != kid_unclimb) && k->key.up && ! ((k->key.left || k->key.right) && k->hang_caller == kid_unclimb) && ! k->hang_limit) { kid_climb (k); return false; } /* release */ if ((! k->key.shift || k->hang_limit || get_hanged_con (&k->hang_pos, k->f.dir) == NO_FLOOR) && (k->i < 5 || k->j > -1)) { int dir = (k->f.dir == LEFT) ? -1 : +1; k->hang_limit = false; if (! is_strictly_traversable (&k->hang_pos) && k->i >= 4) { place_frame (&k->f, &k->f, kid_vjump_frameset[13].frame, &k->hang_pos, (k->f.dir == LEFT) ? +7 : PLACE_WIDTH + 9, -8); kid_vjump (k); return false; } if (! is_strictly_traversable (prel (&k->hang_pos, &np, +0, dir)) && k->i <= 4) { place_frame (&k->f, &k->f, kid_vjump_frameset[13].frame, &k->hang_pos, (k->f.dir == LEFT) ? +7 : PLACE_WIDTH + 5, -8); kid_vjump (k); return false; } if (is_strictly_traversable (&k->hang_pos) && k->i >= 4) { place_frame (&k->f, &k->f, kid_fall_frameset[0].frame, &k->hang_pos, (k->f.dir == LEFT) ? +10 : +22, +4); kid_fall (k); return false; } if (is_strictly_traversable (prel (&k->hang_pos, &np, +0, dir)) && k->i <= 4) { place_frame (&k->f, &k->f, kid_fall_frameset[0].frame, &k->hang_pos, (k->f.dir == LEFT) ? -10 : PLACE_WIDTH + 10, +12); kid_fall (k); return false; } } if (k->reverse && k->i > 0) { if (k->i == 4 && k->j++ > 0) k->hang_limit = true; k->i--; } else if (k->reverse && k->i == 0) { if (k->wait == 0) { k->reverse = false; k->i++; } else k->wait--; } else if (! k->reverse && ((k->j == 0 && k->i < 12) || (k->j > 0 && k->i < 9))) k->i++; else if (! k->reverse && ((k->j == 0 && k->i == 12) || (k->j > 0 && k->i == 9))) { k->reverse = true; k->i--; } k->fo.b = kid_hang_frameset[k->i].frame; k->fo.dx = (k->reverse) ? -kid_hang_frameset[k->i + 1].dx : kid_hang_frameset[k->i].dx; k->fo.dy = (k->reverse) ? -kid_hang_frameset[k->i + 1].dy : kid_hang_frameset[k->i].dy; if (k->f.b == kid_hang_13) k->fo.dx = +0, k->fo.dy = +1; if (k->reverse && k->j == 0 && k->i == 0 && k->wait < 3) k->fo.dy = 0; return true; }
static bool flow (struct anim *k) { if (k->oaction != kid_hang_wall) k->i = 3, k->wait = 0, k->reverse = false; bool hang_back = ((k->f.dir == LEFT) ? k->key.right : k->key.left) && ! k->key.up && k->key.shift; int back_dir = (k->f.dir == LEFT) ? RIGHT : LEFT; /* hang back */ if (k->i == 4 && k->reverse && hang_back && is_hangable_pos (&k->hang_pos, back_dir)) { play_audio (&hang_on_fall_audio, NULL, k->id); kid_turn (k); return false; } if ((! k->key.shift && (k->reverse || k->i > 3)) || k->hang_limit || get_hanged_con (&k->hang_pos, k->f.dir) == NO_FLOOR) { if (is_strictly_traversable (&k->hang_pos)) { place_frame (&k->f, &k->f, kid_fall_frameset[0].frame, &k->hang_pos, (k->f.dir == LEFT) ? +10 : +22, +4); kid_fall (k); k->hang_limit = false; return false; } place_frame (&k->f, &k->f, kid_vjump_frameset[13].frame, &k->hang_pos, (k->f.dir == LEFT) ? +12 : PLACE_WIDTH + 2, -8); kid_vjump (k); k->hang_limit = false; return false; } if (k->key.up && ! ((k->key.left || k->key.right) && k->hang_caller == kid_unclimb) && ! k->hang_limit) { kid_climb (k); return false; } if (! k->reverse && k->i < 6) k->i++; else if (! k->reverse && k->i == 6) k->reverse = true; else if (k->reverse && k->i > 4 && k->wait == 0) k->i--, k->wait = 1; else if (k->reverse && k->i >= 4 && k->wait > 0) k->wait--; k->fo.b = kid_hang_frameset[k->i].frame; k->fo.dx = (k->reverse) ? -kid_hang_frameset[k->i + 1].dx : kid_hang_frameset[k->i].dx; k->fo.dy = (k->reverse) ? -kid_hang_frameset[k->i + 1].dy : kid_hang_frameset[k->i].dy; if (k->f.b == kid_hang_13) k->fo.dx = +0, k->fo.dy = +1; if (k->reverse && k->wait == 0) { k->fo.dx = 0; k->fo.dy = 0; } return true; }