void io_display(dungeon_t *d) { uint32_t y, x; uint32_t illuminated; clear(); for (y = 0; y < DUNGEON_Y; y++) { for (x = 0; x < DUNGEON_X; x++) { if ((illuminated = is_illuminated(d->pc, y, x))) { attron(A_BOLD); } if (d->charmap[y][x] && can_see(d, character_get_pos(d->pc), character_get_pos(d->charmap[y][x]), 1)) { mvaddch(y + 1, x, character_get_symbol(d->charmap[y][x])); } else { switch (pc_learned_terrain(d->pc, y, x)) { case ter_wall: case ter_wall_immutable: case ter_unknown: mvaddch(y + 1, x, ' '); break; case ter_floor: case ter_floor_room: mvaddch(y + 1, x, '.'); break; case ter_floor_hall: mvaddch(y + 1, x, '#'); break; case ter_debug: mvaddch(y + 1, x, '*'); break; case ter_stairs_up: mvaddch(y + 1, x, '<'); break; case ter_stairs_down: mvaddch(y + 1, x, '>'); break; default: /* Use zero as an error symbol, since it stands out somewhat, and it's * * not otherwise used. */ mvaddch(y + 1, x, '0'); } } if (illuminated) { attroff(A_BOLD); } } } io_print_message_queue(0, 0); refresh(); }
static void npc_next_pos_14(dungeon *d, npc *c, pair_t next) { /* pass wall; not smart; not telepathic; tunneling; not erratic */ if (can_see(d, character_get_pos(c), character_get_pos(d->PC), 0, 0)) { c->pc_last_known_position[dim_y] = character_get_y(d->PC); c->pc_last_known_position[dim_x] = character_get_x(d->PC); npc_next_pos_line_of_sight(d, c, next); } else { npc_next_pos_rand_pass(d, c, next); } }
static void npc_next_pos_00(dungeon *d, npc *c, pair_t next) { /* not smart; not telepathic; not tunneling; not erratic */ if (can_see(d, character_get_pos(c), character_get_pos(d->PC), 0, 0)) { c->pc_last_known_position[dim_y] = d->PC->position[dim_y]; c->pc_last_known_position[dim_x] = d->PC->position[dim_x]; npc_next_pos_line_of_sight(d, c, next); } else { npc_next_pos_rand(d, c, next); } }
static void npc_next_pos_11(dungeon *d, npc *c, pair_t next) { /* pass wall; smart; not telepathic; not tunneling; not erratic */ if (can_see(d, character_get_pos(c), character_get_pos(d->PC), 0, 0)) { c->pc_last_known_position[dim_y] = character_get_y(d->PC); c->pc_last_known_position[dim_x] = character_get_x(d->PC); c->have_seen_pc = 1; npc_next_pos_line_of_sight(d, c, next); } else if (c->have_seen_pc) { npc_next_pos_line_of_sight(d, c, next); } if ((next[dim_x] == c->pc_last_known_position[dim_x]) && (next[dim_y] == c->pc_last_known_position[dim_y])) { c->have_seen_pc = 0; } }
static void npc_next_pos_04(dungeon_t *d, character *c, pair_t next) { pc *the_pc; npc *the_npc; the_pc = (pc *) d->the_pc; the_npc = (npc *) c; /* not smart; not telepathic; tunneling; not erratic */ if (can_see(d, character_get_pos(c), character_get_pos(d->the_pc), 0)) { the_npc->pc_last_known_position[dim_y] = the_pc->position[dim_y]; the_npc->pc_last_known_position[dim_x] = the_pc->position[dim_x]; npc_next_pos_line_of_sight(d, c, next); } else { npc_next_pos_rand_tunnel(d, c, next); } }
static void npc_next_pos_05(dungeon_t *d, character *c, pair_t next) { pc *the_pc; npc *the_npc; the_pc = (pc *) d->the_pc; the_npc = (npc *) c; /* smart; not telepathic; tunneling; not erratic */ if (can_see(d, character_get_pos(c), character_get_pos(d->the_pc), 0)) { the_npc->pc_last_known_position[dim_y] = the_pc->position[dim_y]; the_npc->pc_last_known_position[dim_x] = the_pc->position[dim_x]; the_npc->have_seen_pc = 1; npc_next_pos_line_of_sight(d, c, next); } else if (the_npc->have_seen_pc) { npc_next_pos_line_of_sight_tunnel(d, c, next); } if ((next[dim_x] == the_npc->pc_last_known_position[dim_x]) && (next[dim_y] == the_npc->pc_last_known_position[dim_y])) { the_npc->have_seen_pc = 0; } }
uint32_t move_pc(dungeon_t *d, uint32_t dir) { pair_t next; uint32_t was_stairs = 0; next[dim_y] = character_get_y(d->pc); next[dim_x] = character_get_x(d->pc); switch (dir) { case 1: case 2: case 3: next[dim_y]++; break; case 4: case 5: case 6: break; case 7: case 8: case 9: next[dim_y]--; break; } switch (dir) { case 1: case 4: case 7: next[dim_x]--; break; case 2: case 5: case 8: break; case 3: case 6: case 9: next[dim_x]++; break; case '<': if (mappair(character_get_pos(d->pc)) == ter_stairs_up) { was_stairs = 1; new_dungeon_level(d, '<'); } break; case '>': if (mappair(character_get_pos(d->pc)) == ter_stairs_down) { was_stairs = 1; new_dungeon_level(d, '>'); } break; } if (was_stairs) { return 0; } if ((dir != '>') && (dir != '<') && (mappair(next) >= ter_floor)) { move_character(d, d->pc, next); dijkstra(d); dijkstra_tunnel(d); return 0; } return 1; }