static bool physics_in (struct anim *k) { struct coord nc; struct pos np, pbf, pbb; /* collision */ if (kid_door_split_collision (k)) return false; /* fall */ survey (_bf, pos, &k->f, &nc, &pbf, &np); survey (_bb, pos, &k->f, &nc, &pbb, &np); if (! k->hang && is_strictly_traversable (&pbf) && is_strictly_traversable (&pbb)) { kid_fall (k); return false; } return true; }
static bool physics_in (struct anim *k) { struct coord nc; struct pos np, pm; enum confg cm; /* collision */ if (is_colliding (&k->f, &k->fo, +0, false, &k->ci) && k->ci.t != MIRROR) { if (k->i <= 2 && k->fall) uncollide (&k->f, &k->fo, &k->fo, +0, false, &k->ci); else { kid_stabilize_collision (k); return false; } } else if (is_colliding (&k->f, &k->fo, +2, false, &k->ci) && k->ci.t == MIRROR) { if (k->i <= 2) k->f.c.x += (k->f.dir == LEFT) ? +4 : -4; else { kid_stabilize_collision (k); return false; } } if (! k->fall && kid_door_split_collision (k)) return false; /* fall */ cm = survey (_m, pos, &k->f, &nc, &pm, &np)->fg; struct loose_floor *l = loose_floor_at_pos (prel (&pm, &np, -1, +0)); if ((is_strictly_traversable (&pm) || (l && l->action == FALL_LOOSE_FLOOR && cm == LOOSE_FLOOR)) && ! (k->fall && k->i == 0)) { kid_fall (k); return false; } return true; }