From 36a72c5789b705c0e9372e7dcafb1cf23f52bc8d Mon Sep 17 00:00:00 2001 From: klangner Date: Tue, 15 Sep 2020 08:45:40 +0200 Subject: [PATCH] Random Rooms renamed to Simple Rooms --- README.md | 2 +- demo/src/lib.rs | 26 ++++++++++++++++--- demo/www/index.html | 3 ++- demo/www/index.js | 13 +++++++--- src/dungeon/mod.rs | 2 +- .../{random_rooms.rs => simple_rooms.rs} | 17 ++++++------ 6 files changed, 45 insertions(+), 18 deletions(-) rename src/dungeon/{random_rooms.rs => simple_rooms.rs} (82%) diff --git a/README.md b/README.md index 5c69e5d..049681b 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Generate procedural maps for games. [Try it in the browser](https://klangner.git * [ ] Drunkard's walk * [ ] Maze * [ ] Prefabs - * [x] Random rooms + * [x] Simple rooms * [ ] Voronoi hive * [ ] Wave Function Collapse * Map modifiers (filters) diff --git a/demo/src/lib.rs b/demo/src/lib.rs index 1d0c0f9..c9fb11d 100644 --- a/demo/src/lib.rs +++ b/demo/src/lib.rs @@ -1,10 +1,11 @@ use wasm_bindgen::prelude::*; +use web_sys; use rand::prelude::*; use mapgen::dungeon::{ MapBuilder, map::TileType, cellular_automata::CellularAutomataGen, - random_rooms::RandomRoomsGen, + simple_rooms::SimpleRoomsGen, starting_point::{AreaStartingPosition, XStart, YStart}, cull_unreachable::CullUnreachable, distant_exit::DistantExit, @@ -29,7 +30,9 @@ pub struct World { #[wasm_bindgen] impl 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 map = MapBuilder::new(CellularAutomataGen::new()) .with(AreaStartingPosition::new(XStart::CENTER, YStart::CENTER)) @@ -45,9 +48,10 @@ impl World { 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 map = MapBuilder::new(RandomRoomsGen::new()) + let map = MapBuilder::new(SimpleRoomsGen::new()) .with(NearestCorridors::new()) .build_map_with_rng(width as usize, height as usize, &mut rng); let tiles = (0..map.tiles.len()) @@ -59,6 +63,15 @@ impl World { tiles } } + pub fn new_random(width: u32, height: u32, seed: u32) -> World { + let mut rng = rand::thread_rng(); + if rng.gen::() < 0.5 { + World::new_cellular_automata(width, height, seed) + } else { + World::new_simple_rooms(width, height, seed) + } + } + pub fn width(&self) -> u32 { self.width } @@ -70,4 +83,11 @@ impl World { pub fn tiles(&self) -> *const Cell { 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); + } } \ No newline at end of file diff --git a/demo/www/index.html b/demo/www/index.html index 07d6fec..a4e1734 100644 --- a/demo/www/index.html +++ b/demo/www/index.html @@ -35,8 +35,9 @@ Select generator diff --git a/demo/www/index.js b/demo/www/index.js index 4c95b2d..e3cd163 100644 --- a/demo/www/index.js +++ b/demo/www/index.js @@ -24,14 +24,18 @@ function newCellularAutomata() { var seed = Date.now(); world = World.new_cellular_automata(width, height, seed); requestAnimationFrame(renderLoop); - infoDiv.textContent = "Cellular Automata with the seed: " + seed; } function newSimpleRooms() { 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); - infoDiv.textContent = "Random Rooms with the seed: " + seed; } const renderLoop = () => { @@ -92,8 +96,9 @@ const drawCells = () => { ctx.stroke(); }; -newCellularAutomata(); +newRandomGen(); // Connect UI element document.getElementById('cellular-automata-option').addEventListener('click', newCellularAutomata); document.getElementById('simple-rooms-option').addEventListener('click', newSimpleRooms); +document.getElementById('random-option').addEventListener('click', newRandomGen); diff --git a/src/dungeon/mod.rs b/src/dungeon/mod.rs index 8e00cce..277ea98 100644 --- a/src/dungeon/mod.rs +++ b/src/dungeon/mod.rs @@ -30,7 +30,7 @@ pub mod map; pub mod cellular_automata; pub mod cull_unreachable; pub mod distant_exit; -pub mod random_rooms; +pub mod simple_rooms; pub mod rooms_corridors_nearest; pub mod starting_point; mod dijkstra; diff --git a/src/dungeon/random_rooms.rs b/src/dungeon/simple_rooms.rs similarity index 82% rename from src/dungeon/random_rooms.rs rename to src/dungeon/simple_rooms.rs index b54d4c3..7792fee 100644 --- a/src/dungeon/random_rooms.rs +++ b/src/dungeon/simple_rooms.rs @@ -1,17 +1,18 @@ //! 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: //! ``` //! use rand::prelude::*; //! use mapgen::dungeon::{ //! MapGenerator, -//! random_rooms::RandomRoomsGen +//! simple_rooms::SimpleRoomsGen //! }; //! //! 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); //! //! assert_eq!(map.width, 80); @@ -26,22 +27,22 @@ use crate::common::random; use super::map::{Map}; -pub struct RandomRoomsGen { +pub struct SimpleRoomsGen { max_rooms: usize, min_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 { self.build_rooms(width, height, rng) } } -impl RandomRoomsGen { - pub fn new() -> Box { - Box::new(RandomRoomsGen{ +impl SimpleRoomsGen { + pub fn new() -> Box { + Box::new(SimpleRoomsGen{ max_rooms: 30, min_room_size: 6, max_room_size: 10