dungeon-generator

prodecural dungeon generator for games

Usage no npm install needed!

<script type="module">
  import dungeonGenerator from 'https://cdn.skypack.dev/dungeon-generator';
</script>

README

Dungeon generator

This is a procedural dungeon generator written in javascript.

Live demo

Features

  1. Pre-defined, tagged rooms
  2. Highly configurable
  3. Seeded rng
  4. Feedback about exits, perimeter, etc
  5. (Optional) corridors
  6. (Optional) circular paths

Output examples

Sample 1 Sample 2 Sample 3 Sample 4

Usage

@TODO

import Dungeon from 'dungeon-generator';

let dungeon = new Dungeon({
    size: [100, 100], 
    seed: 'abcd', //omit for generated seed
    rooms: {
        initial: {
            min_size: [3, 3],
            max_size: [3, 3],
            max_exits: 1,
            position: [0, 0] //OPTIONAL pos of initial room 
        },
        any: {
            min_size: [2, 2],
            max_size: [5, 5],
            max_exits: 4
        }
    },
    max_corridor_length: 6,
    min_corridor_length: 2,
    corridor_density: 0.5, //corridors per room
    symmetric_rooms: false, // exits must be in the center of a wall if true
    interconnects: 1, //extra corridors to connect rooms and make circular paths. not 100% guaranteed
    max_interconnect_length: 10,
    room_count: 10
});

dungeon.generate();
dungeon.print(); //outputs wall map to console.log

dungeon.size; // [width, heihgt]
dungeon.walls.get([x, y]); //return true if position is wall, false if empty

for(let piece of dungeon.children) {
    piece.position; //[x, y] position of top left corner of the piece within dungeon
    piece.tag; // 'any', 'initial' or any other key of 'rooms' options property
    piece.size; //[width, height]
    piece.walls.get([x, y]); //x, y- local position of piece, returns true if wall, false if empty
    for (let exit of piece.exits) {
        let {x, y, dest_piece} = exit; // local position of exit and piece it exits to
        piece.global_pos([x, y]); // [x, y] global pos of the exit
    }

    piece.local_pos(dungeon.start_pos); //get local position within the piece of dungeon's global position
}

dungeon.initial_room; //piece tagged as 'initial'
dungeon.start_pos; //[x, y] center of 'initial' piece