void mv_mons(void) { object *monster, *next_monster; boolean flew; if (haste_self % 2) { return; } monster = level_monsters.next_monster; while (monster) { next_monster = monster->next_monster; if (monster->m_flags & HASTED) { mon_disappeared = 0; mv_monster(monster, rogue.row, rogue.col); if (mon_disappeared) { goto NM; } } else if (monster->m_flags & SLOWED) { monster->slowed_toggle = !monster->slowed_toggle; if (monster->slowed_toggle) { goto NM; } } if ((monster->m_flags & CONFUSED) && move_confused(monster)) { goto NM; } flew = 0; if ((monster->m_flags & FLIES) && !(monster->m_flags & NAPPING) && !mon_can_go(monster, rogue.row, rogue.col)) { flew = 1; mv_monster(monster, rogue.row, rogue.col); } if (!(flew && mon_can_go(monster, rogue.row, rogue.col))) { mv_monster(monster, rogue.row, rogue.col); } NM: monster = next_monster; } }
int seek_gold(object *monster) { short i, j, rn, s; if ((rn = get_room_number(monster->row, monster->col)) < 0) { return 0; } for (i = rooms[rn].top_row + 1; i < rooms[rn].bottom_row; i++) { for (j = rooms[rn].left_col + 1; j < rooms[rn].right_col; j++) { if ((gold_at(i, j)) && !(dungeon[i][j] & MONSTER)) { monster->m_flags |= CAN_FLIT; s = mon_can_go(monster, i, j); monster->m_flags &= (~CAN_FLIT); if (s) { move_mon_to(monster, i, j); monster->m_flags |= ASLEEP; monster->m_flags &= (~(WAKENS | SEEKS_GOLD)); return 1; } monster->m_flags &= (~SEEKS_GOLD); monster->m_flags |= CAN_FLIT; mv_monster(monster, i, j); monster->m_flags &= (~CAN_FLIT); monster->m_flags |= SEEKS_GOLD; return 1; } } } return 0; }
void mv_aquatars(void) { object *monster; monster = level_monsters.next_monster; while (monster) { if ((monster->m_char == 'A') && mon_can_go(monster, rogue.row, rogue.col)) { mv_monster(monster, rogue.row, rogue.col); monster->m_flags |= ALREADY_MOVED; } monster = monster->next_monster; } }