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; }
void kid_couch_collision (struct anim *k) { k->action = kid_couch_collision; place_frame (&k->f, &k->f, kid_couch_frameset[0].frame, &k->ci.p, (k->f.dir == LEFT) ? +PLACE_WIDTH + 24 : -PLACE_WIDTH + 18, +27); kid_couch (k); play_sample (hit_wall_sample, k->f.c.room); }
void kid_couch_suddenly (struct anim *k) { k->action = kid_couch_suddenly; struct coord nc; struct pos np, pmt; survey (_mt, pos, &k->f, &nc, &pmt, &np); place_frame (&k->f, &k->f, kid_couch_frameset[0].frame, &pmt, (k->f.dir == LEFT) ? 24 : 18, +27); kid_couch (k); }
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_start_run) k->i = -1, k->misstep = false; bool run = (k->f.dir == RIGHT) ? k->key.right : k->key.left; bool turn_run = (k->f.dir == RIGHT) ? k->key.left : k->key.right; bool couch = k->key.down; bool jump = ((k->f.dir == RIGHT) && k->key.right && k->key.up) || ((k->f.dir == LEFT) && k->key.left && k->key.up); if (couch) { kid_couch (k); return false; } if (jump && k->i < 3) { kid_jump (k); return false; } if ((k->i == 3 || k->i == 4) && turn_run) { kid_stop_run (k); return false; } if (k->i == 5) { if (run) kid_run (k); else kid_stop_run (k); return false; } select_frame (k, kid_start_run_frameset, k->i + 1); if (k->f.b == kid_turn_frameset[3].frame) k->fo.dx = +0; 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_run) k->i = -1; bool stop = ! ((k->f.dir == RIGHT) ? k->key.right : k->key.left); bool couch = k->key.down; bool jump = ((k->f.dir == RIGHT) && k->key.right && k->key.up) || ((k->f.dir == LEFT) && k->key.left && k->key.up); if (couch) { kid_couch (k); return false; } if (jump && k->f.b != kid_run_jump_frameset[10].frame) { kid_run_jump (k); return false; } if ((stop && k->f.b != kid_run_jump_frameset[10].frame)) { kid_stop_run (k); return false; } if (k->i == 7) k->i = -1; if (k->f.b == kid_turn_run_frameset[8].frame) k->i = 6; select_frame (k, kid_run_frameset, k->i + 1); if (k->f.b == kid_start_run_frameset[5].frame) k->fo.dx = -6; if (k->f.b == kid_turn_run_frameset[8].frame) k->fo.dx = -4; if (k->f.b == kid_run_jump_frameset[10].frame) k->fo.dx = -15; 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; }
void compute_loose_floor_fall (struct loose_floor *l) { int speed = 3 * ++l->i; if (speed > 29) speed = 29; struct frame nf; struct frame_offset fo; fo.b = l->f.b; fo.dx = 0; fo.dy = speed; next_frame (&l->f, &nf, &fo); struct coord mbo_f, mbo_nf; struct pos fpmbo_f, nfpmbo_f, fpmbo_nf, nfpmbo_nf; enum confg fcmbo_f; fcmbo_f = survey (_mbo, posf, &l->f, &mbo_f, &fpmbo_f, &nfpmbo_f)->fg; survey (_mbo, posf, &nf, &mbo_nf, &fpmbo_nf, &nfpmbo_nf); struct pos p; /* hit kid */ int i; for (i = 0; i < anima_nmemb; i++) { struct coord kmt, ambo_f, ambo_nf; struct pos np, kpmt; struct anim *a = &anima[i]; if (is_anim_dead (&a->f) || a->immortal || a->loose_floor_immune) continue; survey (_mt, pos, &a->f, &kmt, &kpmt, &np); coord2room (&mbo_f, kpmt.room, &ambo_f); coord2room (&mbo_nf, kpmt.room, &ambo_nf); if (peq (&nfpmbo_f, &kpmt) && ambo_f.y <= kmt.y && ambo_nf.y >= kmt.y && ! a->hit_by_loose_floor && ! is_kid_hang_or_climb (&a->f) && ! is_kid_fall (&a->f)) { a->hit_by_loose_floor = true; a->splash = true; a->current_lives--; a->uncouch_slowly = true; /* ensure kid doesn't couch in thin air (might occur when hit while jumping, for example) */ place_on_the_ground (&a->f, &a->f.c); play_sample (hit_wall_sample, kpmt.room); alert_guards (&kpmt); if (a->id == current_kid_id) { video_effect.color = get_flicker_blood_color (); start_video_effect (VIDEO_FLICKERING, SECS_TO_VCYCLES (0.1)); } if (a->current_lives <= 0) { a->p = kpmt; anim_die_suddenly (a); a->death_reason = LOOSE_FLOOR_DEATH; } else if (a->type == KID) kid_couch (a); } } /* fall */ if (is_strictly_traversable (&fpmbo_f) || peq (&fpmbo_f, &fpmbo_nf)) { /* the floor hit a rigid structure */ if (is_rigid_con (&fpmbo_nf)) prel (&fpmbo_nf, &p, -1, 0); /* the floor continue to fall */ else { l->f = nf; if (is_strictly_traversable (&fpmbo_nf)) l->p = fpmbo_nf; must_sort = true; return; } /* the floor hit the ground */ } else { struct loose_floor *m; p = fpmbo_f; switch (fcmbo_f) { case LOOSE_FLOOR: /* loose floor isn't ground */ m = loose_floor_at_pos (&fpmbo_f); if (m) m->p.room = -1; must_remove = true; l->f = nf; l->f.b = get_correct_falling_loose_floor_bitmap (dv_broken_floor); l->p = fpmbo_f; l->i = 0; con (&fpmbo_f)->fg = NO_FLOOR; must_sort = true; play_sample (broken_floor_sample, p.room); alert_guards (&p); return; case OPENER_FLOOR: break_opener_floor (&fpmbo_f); break; case CLOSER_FLOOR: break_closer_floor (&fpmbo_f); break; case SPIKES_FLOOR: break_spikes_floor (&fpmbo_f); break; case LEVEL_DOOR: break_level_door (&fpmbo_f); break; default: break; } } /* reach here only if the floor hit a rigid structure or the ground */ if (con (&p)->fg != LEVEL_DOOR) con (&p)->fg = BROKEN_FLOOR; shake_loose_floor_row (&p); l->p.room = -1; must_remove = true; must_sort = true; play_sample (broken_floor_sample, p.room); alert_guards (&p); }