static void place_in_initial_fall (struct anim *g) { struct pos pmt, pmtf, pmtb; struct pos fall_pos; int dirf = (g->f.dir == LEFT) ? -1 : +1; int dirb = (g->f.dir == LEFT) ? +1 : -1; survey (_mt, pos, &g->f, NULL, &pmt, NULL); prel (&pmt, &pmtf, +0, dirf); prel (&pmt, &pmtb, +0, dirb); invalid_pos (&fall_pos); if (is_strictly_traversable (&pmt)) fall_pos = pmt; else if (is_strictly_traversable (&pmtf)) fall_pos = pmtf; else if (is_strictly_traversable (&pmtb)) fall_pos = pmtb; struct frameset *frameset = get_guard_fall_frameset (g->type); if (is_valid_pos (&fall_pos)) place_frame (&g->f, &g->f, frameset[0].frame, &fall_pos, (g->f.dir == LEFT) ? PLACE_WIDTH - 12 : +6, (g->f.dir == LEFT) ? 23 : 27); }
struct pos * get_mouse_pos (struct pos *p) { struct mouse_coord m; get_mouse_coord (&m); if (! is_valid_coord (&m.c)) { invalid_pos (p); return p; } int ry = (m.c.y - 3) % PLACE_HEIGHT; pos_gen (&m.c, p, 0, 3); if (edit == EDIT_NONE) { invalid_pos (p); return p; } struct pos p0; switch (fake (p)) { case MIRROR: case CHOPPER: case WALL: case PILLAR: case BIG_PILLAR_TOP: case BIG_PILLAR_BOTTOM: case ARCH_BOTTOM: case ARCH_TOP_MID: case ARCH_TOP_SMALL: case ARCH_TOP_LEFT: case ARCH_TOP_RIGHT: break; default: if (is_arch_top (prel (p, &p0, +0, -1))) break; if (ry >= 60) pos_gen (&m.c, p, 0, 3); else if (ry >= 50) pos_gen (&m.c, p, 23 - 2.5 * (ry - 50), 3); else pos_gen (&m.c, p, 23, 3); break; } struct pos np; npos (p, &np); if (! np.room) { invalid_pos (p); return p; } return p; }
struct pos * get_new_rel_pos (struct pos *old_src, struct pos *old_dest, struct pos *new_src, struct pos *new_dest) { struct pos nold_src; npos (old_src, &nold_src); struct pos nold_dest; npos (old_dest, &nold_dest); struct pos nnew_src; npos (new_src, &nnew_src); pos2room (&nold_dest, nold_src.room, &nold_dest); if (nold_dest.room != nold_src.room) return invalid_pos (new_dest); new_pos (new_dest, nnew_src.l, nnew_src.room, nnew_src.floor + (nold_dest.floor - nold_src.floor), nnew_src.place + (nold_dest.place - nold_src.place)); return npos (new_dest, new_dest); }
void update_room0_cache (enum em em, enum vm vm) { room_view = 0; struct pos mouse_pos_bkp = mouse_pos; invalid_pos (&mouse_pos); con_caching = true; if (! room0) room0 = create_bitmap (ORIGINAL_WIDTH, ORIGINAL_HEIGHT); clear_bitmap (room0, TRANSPARENT_COLOR); mr.dx = 0; mr.dy = 0; draw_room (room0, 0, em, vm); con_caching = false; mouse_pos = mouse_pos_bkp; }
static bool flow (struct anim *k) { struct pos p; if (k->oaction != kid_drink) k->i = -1, k->wait = 4, k->reverse = false; if (k->i < 14 && ! k->reverse) k->i++; else if (k->wait > 0) k->wait--; else if (k->i == 14 && k->wait == 0) k->reverse = true, k->i = 10; else if (k->i == 10 && k->reverse) k->i = 7; else { kid_normal (k); invalid_pos (&k->item_pos); return false; } if (k->i == 14 && k->wait == 1) switch (k->item) { case EMPTY_POTION: break; case SMALL_LIFE_POTION: increase_kid_current_lives (k); break; case BIG_LIFE_POTION: increase_kid_total_lives (k); break; case SMALL_POISON_POTION: if (k->immortal || k->poison_immune) break; k->current_lives--; k->splash = true; if (k->current_lives == 0) k->death_reason = POTION_DEATH; play_sample (harm_sample, NULL, k->id); if (k->id == current_kid_id) { mr.flicker = 2; mr.color = get_flicker_blood_color (); } break; case BIG_POISON_POTION: if (k->immortal || k->poison_immune) break; k->current_lives = 0; k->splash = true; k->death_reason = POTION_DEATH; play_sample (harm_sample, NULL, k->id); if (k->id == current_kid_id) { mr.flicker = 2; mr.color = get_flicker_blood_color (); } break; case FLOAT_POTION: float_kid (k); break; case FLIP_POTION: if (screen_flags) screen_flags = 0; else { switch (prandom_pos (&k->item_pos, 2)) { case 0: screen_flags ^= ALLEGRO_FLIP_VERTICAL; break; case 1: screen_flags ^= ALLEGRO_FLIP_HORIZONTAL; break; case 2: screen_flags ^= ALLEGRO_FLIP_VERTICAL | ALLEGRO_FLIP_HORIZONTAL; break; } } break; case ACTIVATION_POTION: p.room = 8, p.floor = p.place = 0; activate_con (&p); break; default: break; } select_frame (k, kid_drink_frameset, k->i); if (k->i == 14 && k->wait < 4) k->fo.dx = 0; if (k->i == 10 && k->reverse) k->fo.dx = -2, k->fo.dy = +1; if (k->i == 7 && k->reverse) k->fo.dx = +1; return true; }