boolean mon_damage(object *monster, short damage) { const char *mn; short row, col; monster->hp_to_kill -= damage; if (monster->hp_to_kill <= 0) { row = monster->row; col = monster->col; dungeon[row][col] &= ~MONSTER; mvaddch(row, col, (int)get_dungeon_char(row, col)); fight_monster = NULL; cough_up(monster); mn = mon_name(monster); sprintf(hit_message+strlen(hit_message), "defeated the %s", mn); message(hit_message, 1); hit_message[0] = 0; add_exp(monster->kill_exp, 1); take_from_pack(monster, &level_monsters); if (monster->m_flags & HOLDS) { being_held = 0; } free_object(monster); return(0); } return(1); }
void search(short n, boolean is_auto) { short s, i, j, row, col, t; short shown = 0, found = 0; static boolean reg_search; for (i = -1; i <= 1; i++) { for (j = -1; j <= 1; j++) { row = rogue.row + i; col = rogue.col + j; if ((row < MIN_ROW) || (row >= (ROGUE_LINES - 1)) || (col < 0) || (col >= ROGUE_COLUMNS)) { continue; } if (dungeon[row][col] & HIDDEN) { found++; } } } for (s = 0; s < n; s++) { for (i = -1; i <= 1; i++) { for (j = -1; j <= 1; j++) { row = rogue.row + i; col = rogue.col + j; if ((row < MIN_ROW) || (row >= (ROGUE_LINES - 1)) || (col < 0) || (col >= ROGUE_COLUMNS)) { continue; } if (dungeon[row][col] & HIDDEN) { if (rand_percent(17 + (rogue.exp + ring_exp))) { dungeon[row][col] &= (~HIDDEN); if ((!blind) && ((row != rogue.row) || (col != rogue.col))) { mvaddch_rogue(row, col, get_dungeon_char(row, col)); } shown++; if (dungeon[row][col] & TRAP) { t = trap_at(row, col); message(trap_strings[t * 2], 1); } } } if (((shown == found) && (found > 0)) || interrupted) { return; } } } if ((!is_auto) && (reg_search = !reg_search)) { (void) reg_move(); } } }
void tele(void) { mvaddch(rogue.row, rogue.col, get_dungeon_char(rogue.row, rogue.col)); if (cur_room >= 0) { darken_room(cur_room); } put_player(get_room_number(rogue.row, rogue.col)); being_held = 0; bear_trap = 0; }
void disappear(object *monster) { short row, col; row = monster->row; col = monster->col; dungeon[row][col] &= ~MONSTER; if (rogue_can_see(row, col)) { mvaddch_rogue(row, col, get_dungeon_char(row, col)); } take_from_pack(monster, &level_monsters); free_object(monster); mon_disappeared = 1; }
int check_imitator(object *monster) { char msg[80]; if (monster->m_flags & IMITATES) { wake_up(monster); if (!blind) { mvaddch_rogue(monster->row, monster->col, get_dungeon_char(monster->row, monster->col)); check_message(); sprintf(msg, mesg[206], mon_name(monster)); message(msg, 1); } return 1; } return 0; }
int try_to_cough(short row, short col, object *obj) { if ((row < MIN_ROW) || (row > (ROGUE_LINES - 2)) || (col < 0) || (col > (ROGUE_COLUMNS - 1))) { return 0; } if ((!(dungeon[row][col] & (OBJECT | STAIRS | TRAP))) && (dungeon[row][col] & (TUNNEL | FLOOR | DOOR))) { place_at(obj, row, col); if (((row != rogue.row) || (col != rogue.col)) && (!(dungeon[row][col] & MONSTER))) { mvaddch_rogue(row, col, get_dungeon_char(row, col)); } return 1; } return 0; }
int flame_broil(object *monster) { short row, col; if ((!mon_sees(monster, rogue.row, rogue.col)) || coin_toss()) { return 0; } row = rogue.row - monster->row; col = rogue.col - monster->col; if (row < 0) { row = -row; } if (col < 0) { col = -col; } if (((row != 0) && (col != 0) && (row != col)) || ((row > 7) || (col > 7))) { return 0; } if ((!blind) && (!rogue_is_around(monster->row, monster->col))) { row = monster->row; col = monster->col; get_closer(&row, &col, rogue.row, rogue.col); standout(); do { mvaddch_rogue(row, col, '~'); refresh(); get_closer(&row, &col, rogue.row, rogue.col); } while ((row != rogue.row) || (col != rogue.col)); standend(); row = monster->row; col = monster->col; get_closer(&row, &col, rogue.row, rogue.col); do { mvaddch_rogue(row, col, get_dungeon_char(row, col)); refresh(); get_closer(&row, &col, rogue.row, rogue.col); } while ((row != rogue.row) || (col != rogue.col)); } mon_hit(monster, flame_name, 1); return 1; }