2020-09-12 12:44:37 +00:00
|
|
|
use wasm_bindgen::prelude::*;
|
2020-09-13 11:26:36 +00:00
|
|
|
use rand::prelude::*;
|
|
|
|
use mapgen::dungeon::{
|
|
|
|
MapBuilder,
|
2020-09-13 12:43:59 +00:00
|
|
|
map::TileType,
|
2020-09-13 11:26:36 +00:00
|
|
|
cellular_automata::CellularAutomataGen,
|
2020-09-14 18:29:36 +00:00
|
|
|
random_rooms::RandomRoomsGen,
|
2020-09-13 11:26:36 +00:00
|
|
|
starting_point::{AreaStartingPosition, XStart, YStart},
|
|
|
|
cull_unreachable::CullUnreachable,
|
|
|
|
distant_exit::DistantExit,
|
2020-09-14 20:54:39 +00:00
|
|
|
rooms_corridors_nearest::NearestCorridors,
|
2020-09-13 11:26:36 +00:00
|
|
|
};
|
2020-09-12 12:44:37 +00:00
|
|
|
|
|
|
|
|
2020-09-14 09:46:48 +00:00
|
|
|
#[wasm_bindgen]
|
|
|
|
#[repr(u8)]
|
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
|
|
|
pub enum Cell {
|
|
|
|
Floor = 0,
|
|
|
|
Wall = 1,
|
|
|
|
}
|
|
|
|
|
2020-09-13 11:26:36 +00:00
|
|
|
#[wasm_bindgen]
|
|
|
|
pub struct World {
|
2020-09-13 12:43:59 +00:00
|
|
|
width: u32,
|
|
|
|
height: u32,
|
2020-09-14 09:46:48 +00:00
|
|
|
tiles: Vec<Cell>,
|
2020-09-13 11:26:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[wasm_bindgen]
|
|
|
|
impl World {
|
2020-09-14 09:46:48 +00:00
|
|
|
pub fn new_cellular_automata(width: u32, height: u32, seed: u32) -> World {
|
|
|
|
let mut rng = StdRng::seed_from_u64(seed as u64);
|
2020-09-14 18:29:36 +00:00
|
|
|
let map = MapBuilder::new(Box::new(CellularAutomataGen::new()))
|
2020-09-13 11:26:36 +00:00
|
|
|
.with(AreaStartingPosition::new(XStart::CENTER, YStart::CENTER))
|
|
|
|
.with(CullUnreachable::new())
|
|
|
|
.with(DistantExit::new())
|
2020-09-14 18:29:36 +00:00
|
|
|
.build_map_with_rng(width as usize, height as usize, &mut rng);
|
|
|
|
let tiles = (0..map.tiles.len())
|
|
|
|
.map(|i| if map.tiles[i] == TileType::Floor {Cell::Floor} else {Cell::Wall})
|
|
|
|
.collect();
|
|
|
|
World {
|
|
|
|
width,
|
|
|
|
height,
|
|
|
|
tiles }
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn new_random_rooms(width: u32, height: u32, seed: u32) -> World {
|
|
|
|
let mut rng = StdRng::seed_from_u64(seed as u64);
|
|
|
|
let map = MapBuilder::new(Box::new(RandomRoomsGen::new()))
|
2020-09-14 20:54:39 +00:00
|
|
|
.with(NearestCorridors::new())
|
2020-09-14 18:29:36 +00:00
|
|
|
.build_map_with_rng(width as usize, height as usize, &mut rng);
|
2020-09-14 09:46:48 +00:00
|
|
|
let tiles = (0..map.tiles.len())
|
|
|
|
.map(|i| if map.tiles[i] == TileType::Floor {Cell::Floor} else {Cell::Wall})
|
|
|
|
.collect();
|
2020-09-13 12:43:59 +00:00
|
|
|
World {
|
|
|
|
width,
|
|
|
|
height,
|
|
|
|
tiles }
|
2020-09-13 11:26:36 +00:00
|
|
|
}
|
2020-09-12 12:44:37 +00:00
|
|
|
|
2020-09-13 11:26:36 +00:00
|
|
|
pub fn width(&self) -> u32 {
|
2020-09-13 12:43:59 +00:00
|
|
|
self.width
|
2020-09-13 11:26:36 +00:00
|
|
|
}
|
2020-09-12 12:44:37 +00:00
|
|
|
|
2020-09-13 11:26:36 +00:00
|
|
|
pub fn height(&self) -> u32 {
|
2020-09-13 12:43:59 +00:00
|
|
|
self.height
|
|
|
|
}
|
|
|
|
|
2020-09-14 09:46:48 +00:00
|
|
|
pub fn tiles(&self) -> *const Cell {
|
2020-09-13 12:43:59 +00:00
|
|
|
self.tiles.as_ptr()
|
2020-09-13 11:26:36 +00:00
|
|
|
}
|
2020-09-14 09:46:48 +00:00
|
|
|
}
|