void mouse_run (struct anim *m) { m->oaction = m->action; m->action = mouse_run; m->f.flip = (m->f.dir == LEFT) ? 0 : ALLEGRO_FLIP_HORIZONTAL; m->dc = dist_collision (&m->f, false, &m->ci) + 4; m->df = dist_fall (&m->f, false); m->dl = dist_con (&m->f, _bf, pos, -4, false, LOOSE_FLOOR); if (is_colliding (&m->f, &m->fo, m->dc, false, &m->ci) && m->ci.t == DOOR) m->dc = PLACE_WIDTH + 1; if (! cutscene && (m->dc < 12 || m->df < 12 || m->dl < 12)) { mouse_normal (m); return; } if (m->oaction != mouse_run) m->i = -1; if (m->i == 1) m->i = 0; else m->i++; select_frame (m, run_frameset, m->i); if (m->oaction == mouse_normal) m->fo.dy = -2; next_frame (&m->f, &m->f, &m->fo); if (m->i == 0) update_depressible_floor (m, -1, -9); else if (m->i == 1) update_depressible_floor (m, -2, -11); }
bool is_safe_to_walkb (struct anim *k) { int df = dist_fall (&k->f, true); int dc = dist_collision (&k->f, _bb, +0, +0, &k->ci); return df > PLACE_WIDTH && dc > 4; }
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) { 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) { 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; }
bool is_there_enough_room_to_fight (struct anim *k) { return dist_collision (&k->f, _bf, +0, +0, &k->ci) > PLACE_WIDTH - 16 || dist_collision (&k->f, _bb, +0, +0, &k->ci) > PLACE_WIDTH - 16; }