static void fill_it(int rn, boolean do_rec_de) { short i, tunnel_dir, door_dir, drow, dcol; short target_room, rooms_found = 0; short srow, scol, t; static short offsets[4] = {-1, 1, 3, -3}; boolean did_this = 0; for (i = 0; i < 10; i++) { srow = get_rand(0, 3); scol = get_rand(0, 3); t = offsets[srow]; offsets[srow] = offsets[scol]; offsets[scol] = t; } for (i = 0; i < 4; i++) { target_room = rn + offsets[i]; if (((target_room < 0) || (target_room >= MAXROOMS)) || (!(same_row(rn,target_room) || same_col(rn,target_room))) || (!(rooms[target_room].is_room & (R_ROOM | R_MAZE)))) { continue; } if (same_row(rn, target_room)) { tunnel_dir = (rooms[rn].left_col < rooms[target_room].left_col) ? RIGHT : LEFT; } else { tunnel_dir = (rooms[rn].top_row < rooms[target_room].top_row) ? DOWN : UPWARD; } door_dir = ((tunnel_dir + 4) % DIRS); if (rooms[target_room].doors[door_dir/2].oth_room != NO_ROOM) { continue; } if (((!do_rec_de) || did_this) || (!mask_room(rn, &srow, &scol, TUNNEL))) { srow = (rooms[rn].top_row + rooms[rn].bottom_row) / 2; scol = (rooms[rn].left_col + rooms[rn].right_col) / 2; } put_door(&rooms[target_room], door_dir, &drow, &dcol); rooms_found++; draw_simple_passage(srow, scol, drow, dcol, tunnel_dir); rooms[rn].is_room = R_DEADEND; dungeon[srow][scol] = TUNNEL; if ((i < 3) && (!did_this)) { did_this = 1; if (coin_toss()) { continue; } } if ((rooms_found < 2) && do_rec_de) { recursive_deadend(rn, offsets, srow, scol); } break; } }
struct map_t *map_preset_arena(void) { struct map_t *arena; struct map_t *cave; double **armap; int i; int j; armap = empty_simplex_matrix(FULLSCREEN); for (i=0; i<LINES; i++) { for (j=0; j<COLS; j++) { if (i >= ARENA_H/2 && i <= LINES-ARENA_H/2 && j >= ARENA_W/2 && j <= COLS-ARENA_W/2) armap[i][j] = BEACH_F; else if (i > ISLAND_H_LO && i < ISLAND_H_HI && j > ISLAND_W_LO-2 && j < ISLAND_W_HI) { if (i > ISLAND_H_LO+ISLAND_FAT+5 && i < ISLAND_H_HI-ISLAND_FAT && j < ISLAND_W_LO+ISLAND_FAT+1) { if (j > ISLAND_W_LO+ISLAND_FAT-2) armap[i][j] = BEACH_F; else armap[i][j] = -0.05; } else { armap[i][j] = TERRA_F; } } else armap[i][j] = -0.05; } } arena = new_map(FULLSCREEN); map_gen(arena, armap, MAP_NOSMOOTH); /* Make a cave entrance */ cave = new_dungeon(); put_door(CAVE_DOOR, arena, cave, 1, 1, ARENA_H/2-1, COLS/2, 1, 1, LINES/2-10, COLS/2); cave_connect_door(cave); map_render(arena); map_render(cave); return arena; }
static int connect_rooms(short room1, short room2) { short row1, col1, row2, col2, dir; if ((!(rooms[room1].is_room & (R_ROOM | R_MAZE))) || (!(rooms[room2].is_room & (R_ROOM | R_MAZE)))) { return(0); } if (same_row(room1, room2) && (rooms[room1].left_col > rooms[room2].right_col)) { put_door(&rooms[room1], LEFT, &row1, &col1); put_door(&rooms[room2], RIGHT, &row2, &col2); dir = LEFT; } else if (same_row(room1, room2) && (rooms[room2].left_col > rooms[room1].right_col)) { put_door(&rooms[room1], RIGHT, &row1, &col1); put_door(&rooms[room2], LEFT, &row2, &col2); dir = RIGHT; } else if (same_col(room1, room2) && (rooms[room1].top_row > rooms[room2].bottom_row)) { put_door(&rooms[room1], UPWARD, &row1, &col1); put_door(&rooms[room2], DOWN, &row2, &col2); dir = UPWARD; } else if (same_col(room1, room2) && (rooms[room2].top_row > rooms[room1].bottom_row)) { put_door(&rooms[room1], DOWN, &row1, &col1); put_door(&rooms[room2], UPWARD, &row2, &col2); dir = DOWN; } else { return(0); } do { draw_simple_passage(row1, col1, row2, col2, dir); } while (rand_percent(4)); rooms[room1].doors[dir/2].oth_room = room2; rooms[room1].doors[dir/2].oth_row = row2; rooms[room1].doors[dir/2].oth_col = col2; rooms[room2].doors[(((dir+4)%DIRS)/2)].oth_room = room1; rooms[room2].doors[(((dir+4)%DIRS)/2)].oth_row = row1; rooms[room2].doors[(((dir+4)%DIRS)/2)].oth_col = col1; return(1); }