Random Rooms renamed to Simple Rooms
This commit is contained in:
parent
113c1837df
commit
36a72c5789
|
@ -19,7 +19,7 @@ Generate procedural maps for games. [Try it in the browser](https://klangner.git
|
||||||
* [ ] Drunkard's walk
|
* [ ] Drunkard's walk
|
||||||
* [ ] Maze
|
* [ ] Maze
|
||||||
* [ ] Prefabs
|
* [ ] Prefabs
|
||||||
* [x] Random rooms
|
* [x] Simple rooms
|
||||||
* [ ] Voronoi hive
|
* [ ] Voronoi hive
|
||||||
* [ ] Wave Function Collapse
|
* [ ] Wave Function Collapse
|
||||||
* Map modifiers (filters)
|
* Map modifiers (filters)
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
use wasm_bindgen::prelude::*;
|
use wasm_bindgen::prelude::*;
|
||||||
|
use web_sys;
|
||||||
use rand::prelude::*;
|
use rand::prelude::*;
|
||||||
use mapgen::dungeon::{
|
use mapgen::dungeon::{
|
||||||
MapBuilder,
|
MapBuilder,
|
||||||
map::TileType,
|
map::TileType,
|
||||||
cellular_automata::CellularAutomataGen,
|
cellular_automata::CellularAutomataGen,
|
||||||
random_rooms::RandomRoomsGen,
|
simple_rooms::SimpleRoomsGen,
|
||||||
starting_point::{AreaStartingPosition, XStart, YStart},
|
starting_point::{AreaStartingPosition, XStart, YStart},
|
||||||
cull_unreachable::CullUnreachable,
|
cull_unreachable::CullUnreachable,
|
||||||
distant_exit::DistantExit,
|
distant_exit::DistantExit,
|
||||||
|
@ -29,7 +30,9 @@ pub struct World {
|
||||||
|
|
||||||
#[wasm_bindgen]
|
#[wasm_bindgen]
|
||||||
impl World {
|
impl World {
|
||||||
|
|
||||||
pub fn new_cellular_automata(width: u32, height: u32, seed: u32) -> World {
|
pub fn new_cellular_automata(width: u32, height: u32, seed: u32) -> World {
|
||||||
|
World::print_map_info(format!("Cellular Automata with the seed: {}", seed));
|
||||||
let mut rng = StdRng::seed_from_u64(seed as u64);
|
let mut rng = StdRng::seed_from_u64(seed as u64);
|
||||||
let map = MapBuilder::new(CellularAutomataGen::new())
|
let map = MapBuilder::new(CellularAutomataGen::new())
|
||||||
.with(AreaStartingPosition::new(XStart::CENTER, YStart::CENTER))
|
.with(AreaStartingPosition::new(XStart::CENTER, YStart::CENTER))
|
||||||
|
@ -45,9 +48,10 @@ impl World {
|
||||||
tiles }
|
tiles }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_random_rooms(width: u32, height: u32, seed: u32) -> World {
|
pub fn new_simple_rooms(width: u32, height: u32, seed: u32) -> World {
|
||||||
|
World::print_map_info(format!("Simple Rooms with the seed: {}", seed));
|
||||||
let mut rng = StdRng::seed_from_u64(seed as u64);
|
let mut rng = StdRng::seed_from_u64(seed as u64);
|
||||||
let map = MapBuilder::new(RandomRoomsGen::new())
|
let map = MapBuilder::new(SimpleRoomsGen::new())
|
||||||
.with(NearestCorridors::new())
|
.with(NearestCorridors::new())
|
||||||
.build_map_with_rng(width as usize, height as usize, &mut rng);
|
.build_map_with_rng(width as usize, height as usize, &mut rng);
|
||||||
let tiles = (0..map.tiles.len())
|
let tiles = (0..map.tiles.len())
|
||||||
|
@ -59,6 +63,15 @@ impl World {
|
||||||
tiles }
|
tiles }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn new_random(width: u32, height: u32, seed: u32) -> World {
|
||||||
|
let mut rng = rand::thread_rng();
|
||||||
|
if rng.gen::<f32>() < 0.5 {
|
||||||
|
World::new_cellular_automata(width, height, seed)
|
||||||
|
} else {
|
||||||
|
World::new_simple_rooms(width, height, seed)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn width(&self) -> u32 {
|
pub fn width(&self) -> u32 {
|
||||||
self.width
|
self.width
|
||||||
}
|
}
|
||||||
|
@ -70,4 +83,11 @@ impl World {
|
||||||
pub fn tiles(&self) -> *const Cell {
|
pub fn tiles(&self) -> *const Cell {
|
||||||
self.tiles.as_ptr()
|
self.tiles.as_ptr()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn print_map_info(info: String) {
|
||||||
|
let window = web_sys::window().expect("no global `window` exists");
|
||||||
|
let document = window.document().expect("should have a document on window");
|
||||||
|
let div = document.get_element_by_id("map-info").expect("Need div with id: map-info");
|
||||||
|
div.set_inner_html(&info);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -35,8 +35,9 @@
|
||||||
Select generator
|
Select generator
|
||||||
</a>
|
</a>
|
||||||
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
|
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
|
||||||
<a class="dropdown-item" href="#" id="cellular-automata-option">Cellular Automata</a>
|
<a class="dropdown-item" id="cellular-automata-option">Cellular Automata</a>
|
||||||
<a class="dropdown-item" id="simple-rooms-option">Simple Rooms</a>
|
<a class="dropdown-item" id="simple-rooms-option">Simple Rooms</a>
|
||||||
|
<a class="dropdown-item" id="random-option">Random Generator</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -24,14 +24,18 @@ function newCellularAutomata() {
|
||||||
var seed = Date.now();
|
var seed = Date.now();
|
||||||
world = World.new_cellular_automata(width, height, seed);
|
world = World.new_cellular_automata(width, height, seed);
|
||||||
requestAnimationFrame(renderLoop);
|
requestAnimationFrame(renderLoop);
|
||||||
infoDiv.textContent = "Cellular Automata with the seed: " + seed;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function newSimpleRooms() {
|
function newSimpleRooms() {
|
||||||
var seed = Date.now();
|
var seed = Date.now();
|
||||||
world = World.new_random_rooms(width, height, seed);
|
world = World.new_simple_rooms(width, height, seed);
|
||||||
|
requestAnimationFrame(renderLoop);
|
||||||
|
}
|
||||||
|
|
||||||
|
function newRandomGen() {
|
||||||
|
var seed = Date.now();
|
||||||
|
world = World.new_random(width, height, seed);
|
||||||
requestAnimationFrame(renderLoop);
|
requestAnimationFrame(renderLoop);
|
||||||
infoDiv.textContent = "Random Rooms with the seed: " + seed;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const renderLoop = () => {
|
const renderLoop = () => {
|
||||||
|
@ -92,8 +96,9 @@ const drawCells = () => {
|
||||||
ctx.stroke();
|
ctx.stroke();
|
||||||
};
|
};
|
||||||
|
|
||||||
newCellularAutomata();
|
newRandomGen();
|
||||||
|
|
||||||
// Connect UI element
|
// Connect UI element
|
||||||
document.getElementById('cellular-automata-option').addEventListener('click', newCellularAutomata);
|
document.getElementById('cellular-automata-option').addEventListener('click', newCellularAutomata);
|
||||||
document.getElementById('simple-rooms-option').addEventListener('click', newSimpleRooms);
|
document.getElementById('simple-rooms-option').addEventListener('click', newSimpleRooms);
|
||||||
|
document.getElementById('random-option').addEventListener('click', newRandomGen);
|
||||||
|
|
|
@ -30,7 +30,7 @@ pub mod map;
|
||||||
pub mod cellular_automata;
|
pub mod cellular_automata;
|
||||||
pub mod cull_unreachable;
|
pub mod cull_unreachable;
|
||||||
pub mod distant_exit;
|
pub mod distant_exit;
|
||||||
pub mod random_rooms;
|
pub mod simple_rooms;
|
||||||
pub mod rooms_corridors_nearest;
|
pub mod rooms_corridors_nearest;
|
||||||
pub mod starting_point;
|
pub mod starting_point;
|
||||||
mod dijkstra;
|
mod dijkstra;
|
||||||
|
|
|
@ -1,17 +1,18 @@
|
||||||
//! Random rooms map generator.
|
//! Random rooms map generator.
|
||||||
//!
|
//!
|
||||||
//! Try to generate rooms of different size to fille the whole map area.
|
//! Try to generate rooms of different size to fill the map area.
|
||||||
|
//! Rooms will not overlap.
|
||||||
//!
|
//!
|
||||||
//! Example generator usage:
|
//! Example generator usage:
|
||||||
//! ```
|
//! ```
|
||||||
//! use rand::prelude::*;
|
//! use rand::prelude::*;
|
||||||
//! use mapgen::dungeon::{
|
//! use mapgen::dungeon::{
|
||||||
//! MapGenerator,
|
//! MapGenerator,
|
||||||
//! random_rooms::RandomRoomsGen
|
//! simple_rooms::SimpleRoomsGen
|
||||||
//! };
|
//! };
|
||||||
//!
|
//!
|
||||||
//! let mut rng = StdRng::seed_from_u64(100);
|
//! let mut rng = StdRng::seed_from_u64(100);
|
||||||
//! let gen = RandomRoomsGen::new();
|
//! let gen = SimpleRoomsGen::new();
|
||||||
//! let map = gen.generate_map(80, 50, &mut rng);
|
//! let map = gen.generate_map(80, 50, &mut rng);
|
||||||
//!
|
//!
|
||||||
//! assert_eq!(map.width, 80);
|
//! assert_eq!(map.width, 80);
|
||||||
|
@ -26,22 +27,22 @@ use crate::common::random;
|
||||||
use super::map::{Map};
|
use super::map::{Map};
|
||||||
|
|
||||||
|
|
||||||
pub struct RandomRoomsGen {
|
pub struct SimpleRoomsGen {
|
||||||
max_rooms: usize,
|
max_rooms: usize,
|
||||||
min_room_size: usize,
|
min_room_size: usize,
|
||||||
max_room_size: usize,
|
max_room_size: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MapGenerator for RandomRoomsGen {
|
impl MapGenerator for SimpleRoomsGen {
|
||||||
fn generate_map(&self, width: usize, height: usize, rng : &mut StdRng) -> Map {
|
fn generate_map(&self, width: usize, height: usize, rng : &mut StdRng) -> Map {
|
||||||
self.build_rooms(width, height, rng)
|
self.build_rooms(width, height, rng)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
impl RandomRoomsGen {
|
impl SimpleRoomsGen {
|
||||||
pub fn new() -> Box<RandomRoomsGen> {
|
pub fn new() -> Box<SimpleRoomsGen> {
|
||||||
Box::new(RandomRoomsGen{
|
Box::new(SimpleRoomsGen{
|
||||||
max_rooms: 30,
|
max_rooms: 30,
|
||||||
min_room_size: 6,
|
min_room_size: 6,
|
||||||
max_room_size: 10
|
max_room_size: 10
|
Loading…
Reference in New Issue
Block a user