Add more tests
This commit is contained in:
@@ -28,7 +28,7 @@ export function generateWorld(floor: number, runState: RunState): { world: World
|
||||
// Set ROT's RNG seed for consistent dungeon generation
|
||||
ROT.RNG.setSeed(floor * 12345);
|
||||
|
||||
const rooms = generateRooms(width, height, tiles, floor);
|
||||
const rooms = generateRooms(width, height, tiles, floor, random);
|
||||
|
||||
// Place player in first room
|
||||
const firstRoom = rooms[0];
|
||||
@@ -77,7 +77,8 @@ export function generateWorld(floor: number, runState: RunState): { world: World
|
||||
}
|
||||
|
||||
|
||||
function generateRooms(width: number, height: number, tiles: Tile[], floor: number): Room[] {
|
||||
// Update generateRooms signature to accept random
|
||||
function generateRooms(width: number, height: number, tiles: Tile[], floor: number, random: () => number): Room[] {
|
||||
const rooms: Room[] = [];
|
||||
|
||||
// Choose dungeon algorithm based on floor depth
|
||||
@@ -135,6 +136,9 @@ function generateRooms(width: number, height: number, tiles: Tile[], floor: numb
|
||||
} else {
|
||||
// Cellular caves don't have explicit rooms, so find connected floor areas
|
||||
rooms.push(...extractRoomsFromCave(width, height, tiles));
|
||||
|
||||
// Connect the isolated cave rooms
|
||||
connectRooms(width, tiles, rooms, random);
|
||||
}
|
||||
|
||||
// Ensure we have at least 2 rooms for player/exit placement
|
||||
@@ -144,11 +148,55 @@ function generateRooms(width: number, height: number, tiles: Tile[], floor: numb
|
||||
{ x: 5, y: 5, width: 5, height: 5 },
|
||||
{ x: width - 10, y: height - 10, width: 5, height: 5 }
|
||||
);
|
||||
// Connect the fallback rooms
|
||||
connectRooms(width, tiles, rooms, random);
|
||||
}
|
||||
|
||||
return rooms;
|
||||
}
|
||||
|
||||
function connectRooms(width: number, tiles: Tile[], rooms: Room[], random: () => number) {
|
||||
for (let i = 0; i < rooms.length - 1; i++) {
|
||||
const r1 = rooms[i];
|
||||
const r2 = rooms[i+1];
|
||||
|
||||
const c1x = r1.x + Math.floor(r1.width / 2);
|
||||
const c1y = r1.y + Math.floor(r1.height / 2);
|
||||
const c2x = r2.x + Math.floor(r2.width / 2);
|
||||
const c2y = r2.y + Math.floor(r2.height / 2);
|
||||
|
||||
if (random() < 0.5) {
|
||||
digH(width, tiles, c1x, c2x, c1y);
|
||||
digV(width, tiles, c1y, c2y, c2x);
|
||||
} else {
|
||||
digV(width, tiles, c1y, c2y, c1x);
|
||||
digH(width, tiles, c1x, c2x, c2y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function digH(width: number, tiles: Tile[], x1: number, x2: number, y: number) {
|
||||
const start = Math.min(x1, x2);
|
||||
const end = Math.max(x1, x2);
|
||||
for (let x = start; x <= end; x++) {
|
||||
const idx = y * width + x;
|
||||
if (tiles[idx] === TileType.WALL) {
|
||||
tiles[idx] = TileType.EMPTY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function digV(width: number, tiles: Tile[], y1: number, y2: number, x: number) {
|
||||
const start = Math.min(y1, y2);
|
||||
const end = Math.max(y1, y2);
|
||||
for (let y = start; y <= end; y++) {
|
||||
const idx = y * width + x;
|
||||
if (tiles[idx] === TileType.WALL) {
|
||||
tiles[idx] = TileType.EMPTY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* For cellular/cave maps, find clusters of floor tiles to use as "rooms"
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user