diff --git a/.gitignore b/.gitignore index ea8c4bf..d106d64 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ /target +.vscode +wasm +wasm.tgz \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 13ff1b9..88ca093 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -79,8 +79,7 @@ checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" [[package]] name = "bracket-algorithm-traits" version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a13fb98ac33e6cd03fc035d8503f8a80b38c523737c9f84b400a4b9e065cfd3" +source = "git+https://github.com/amethyst/bracket-lib#851f6f08675444fb6fa088b9e67bee9fd75554c6" dependencies = [ "bracket-geometry", "smallvec", @@ -89,8 +88,7 @@ dependencies = [ [[package]] name = "bracket-color" version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7333827cf727ceb302cc4f638cc8befc87f5f1423873255d94cc0a24009e940a" +source = "git+https://github.com/amethyst/bracket-lib#851f6f08675444fb6fa088b9e67bee9fd75554c6" dependencies = [ "lazy_static", "parking_lot 0.12.1", @@ -99,8 +97,7 @@ dependencies = [ [[package]] name = "bracket-embedding" version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cb6747f25903066109a619e3d580ef5ff7b3ffc281fa51ece473e1396e2298" +source = "git+https://github.com/amethyst/bracket-lib#851f6f08675444fb6fa088b9e67bee9fd75554c6" dependencies = [ "lazy_static", "parking_lot 0.12.1", @@ -109,8 +106,7 @@ dependencies = [ [[package]] name = "bracket-geometry" version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f31b525fcd65027885f3a1e3a250a5dd397d70de4a6a5a125f03e0bef951499" +source = "git+https://github.com/amethyst/bracket-lib#851f6f08675444fb6fa088b9e67bee9fd75554c6" dependencies = [ "ultraviolet", ] @@ -118,8 +114,7 @@ dependencies = [ [[package]] name = "bracket-lib" version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43bbe13e39628e7f73673737c825001494dee7329cee8ee79dfeaa7cfd136dbf" +source = "git+https://github.com/amethyst/bracket-lib#851f6f08675444fb6fa088b9e67bee9fd75554c6" dependencies = [ "bracket-algorithm-traits", "bracket-color", @@ -133,8 +128,7 @@ dependencies = [ [[package]] name = "bracket-noise" version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0b7443d0990c69db7a83f376f0101d684c20a911698e5f932bffbda2c8b08dd" +source = "git+https://github.com/amethyst/bracket-lib#851f6f08675444fb6fa088b9e67bee9fd75554c6" dependencies = [ "bracket-random", ] @@ -142,8 +136,7 @@ dependencies = [ [[package]] name = "bracket-pathfinding" version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32ae7f2ebf242316ba10e84ca3b31af064b8c0c77402b2171a3104a2a77718fc" +source = "git+https://github.com/amethyst/bracket-lib#851f6f08675444fb6fa088b9e67bee9fd75554c6" dependencies = [ "bracket-algorithm-traits", "bracket-geometry", @@ -154,8 +147,7 @@ dependencies = [ [[package]] name = "bracket-random" version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "437be61484077b1ddb57002ce3c96b7d03cbf500b5d15157ee7e67e22332c39b" +source = "git+https://github.com/amethyst/bracket-lib#851f6f08675444fb6fa088b9e67bee9fd75554c6" dependencies = [ "getrandom", "js-sys", @@ -169,8 +161,7 @@ dependencies = [ [[package]] name = "bracket-rex" version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4735d15070b98d0f07360d62914d1524679325019cae46c7af73637a6ef196a" +source = "git+https://github.com/amethyst/bracket-lib#851f6f08675444fb6fa088b9e67bee9fd75554c6" dependencies = [ "bracket-color", "bracket-embedding", @@ -181,8 +172,7 @@ dependencies = [ [[package]] name = "bracket-terminal" version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2493063cb676e2e9e3a3a630eee032a297e43c8a1cee08c94feaad3344ed0b46" +source = "git+https://github.com/amethyst/bracket-lib#851f6f08675444fb6fa088b9e67bee9fd75554c6" dependencies = [ "anyhow", "bracket-color", @@ -1436,8 +1426,7 @@ checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" [[package]] name = "rltk" version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30587bc9361fc5600650d17ad6b9a91bb6a290f9d06a434dc48198d22ead7543" +source = "git+https://github.com/amethyst/bracket-lib#851f6f08675444fb6fa088b9e67bee9fd75554c6" dependencies = [ "bracket-lib", ] diff --git a/Cargo.toml b/Cargo.toml index ba65edf..11072ec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rltk = { version = "0.8.7" } +rltk = { git = "https://github.com/amethyst/bracket-lib" } +# rltk = { version = "0.8.7" } specs = "0.18.0" specs-derive = "0.4.1" \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index fc55214..8141ab5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,6 +10,8 @@ pub use map::*; mod player; pub use player::*; +mod rect; +pub use rect::Rect; pub struct State { pub ecs: World, @@ -40,18 +42,6 @@ impl GameState for State { } } - - - - - - - - - - - - fn main() -> rltk::BError { use rltk::RltkBuilder; let context = RltkBuilder::simple80x50() @@ -61,11 +51,17 @@ fn main() -> rltk::BError { gs.ecs.register::(); gs.ecs.register::(); gs.ecs.register::(); - gs.ecs.insert(new_map()); + + let (rooms, map) = new_map_rooms_and_corridors(); + gs.ecs.insert(map); + let (player_x, player_y) = rooms[0].center(); gs.ecs .create_entity() - .with(Position { x: 40, y: 25 }) + .with(Position { + x: player_x, + y: player_y, + }) .with(Renderable { glyph: rltk::to_cp437('@'), fg: RGB::named(rltk::YELLOW), diff --git a/src/map.rs b/src/map.rs index 62a78a2..8869461 100644 --- a/src/map.rs +++ b/src/map.rs @@ -1,4 +1,5 @@ -use rltk::{GameState, Rltk, RGB}; +use super::Rect; +use rltk::{RandomNumberGenerator, Rltk, RGB}; use std::cmp::{max, min}; #[derive(PartialEq, Copy, Clone)] @@ -10,8 +11,8 @@ pub enum TileType { pub fn xy_idx(x: i32, y: i32) -> usize { (y as usize * 80) + x as usize } - -pub fn new_map() -> Vec { +/// Makes a map with solid boundaries and 400 randomly placed walls, this is bad +pub fn new_map_test() -> Vec { let mut map = vec![TileType::Floor; 80 * 50]; for x in 0..80 { @@ -37,6 +38,74 @@ pub fn new_map() -> Vec { map } +pub fn new_map_rooms_and_corridors() -> (Vec, Vec) { + let mut map = vec![TileType::Wall; 80 * 50]; + + let mut rooms: Vec = Vec::new(); + const MAX_ROOMS: i32 = 30; + const MIN_SIZE: i32 = 6; + const MAX_SIZE: i32 = 10; + + let mut rng = RandomNumberGenerator::new(); + + for _ in 0..MAX_ROOMS { + let w = rng.range(MIN_SIZE, MAX_SIZE); + let h = rng.range(MIN_SIZE, MAX_SIZE); + let x = rng.roll_dice(1, 80 - w - 1) - 1; + let y = rng.roll_dice(1, 50 - h - 1) - 1; + let new_room = Rect::new(x, y, w, h); + let mut ok = true; + for other_room in rooms.iter() { + if new_room.intersect(other_room) { + ok = false + } + } + if ok { + apply_room_to_map(&new_room, &mut map); + if !rooms.is_empty() { + let (new_x, new_y) = new_room.center(); + let (prev_x, prev_y) = rooms[rooms.len() - 1].center(); + if rng.range(0, 2) == 1 { + apply_horizontal_tunnel(&mut map, prev_x, new_x, prev_y); + apply_vertical_tunnel(&mut map, prev_y, new_y, new_x); + } else { + apply_vertical_tunnel(&mut map, prev_y, new_y, prev_x); + apply_horizontal_tunnel(&mut map, prev_x, new_x, new_y); + } + } + rooms.push(new_room); + } + } + + (rooms, map) +} + +pub fn apply_room_to_map(room: &Rect, map: &mut [TileType]) { + for y in room.y1 + 1..=room.y2 { + for x in room.x1 + 1..=room.x2 { + map[xy_idx(x, y)] = TileType::Floor; + } + } +} + +fn apply_horizontal_tunnel(map: &mut [TileType], x1: i32, x2: i32, y: i32) { + for x in min(x1, x2)..=max(x1, x2) { + let idx = xy_idx(x, y); + if idx > 0 && idx < 80 * 50 { + map[idx as usize] = TileType::Floor; + } + } +} + +fn apply_vertical_tunnel(map: &mut [TileType], y1: i32, y2: i32, x: i32) { + for y in min(y1, y2)..=max(y1, y2) { + let idx = xy_idx(x, y); + if idx > 0 && idx < 80 * 50 { + map[idx as usize] = TileType::Floor; + } + } +} + pub fn draw_map(map: &[TileType], ctx: &mut Rltk) { let mut y = 0; let mut x = 0; @@ -68,4 +137,4 @@ pub fn draw_map(map: &[TileType], ctx: &mut Rltk) { y += 1; } } -} \ No newline at end of file +} diff --git a/src/rect.rs b/src/rect.rs index e69de29..31cccd8 100644 --- a/src/rect.rs +++ b/src/rect.rs @@ -0,0 +1,24 @@ +pub struct Rect { + pub x1: i32, + pub x2: i32, + pub y1: i32, + pub y2: i32, +} + +impl Rect { + pub fn new(x: i32, y: i32, w: i32, h: i32) -> Rect { + Rect { + x1: x, + y1: y, + x2: x + w, + y2: y + h, + } + } + + pub fn intersect(&self, other: &Rect) -> bool { + self.x1 <= other.x2 && self.x2 >= other.x1 && self.y1 <= other.y2 && self.y2 >= other.y1 + } + pub fn center(&self) -> (i32, i32) { + ((self.x1 + self.x2) / 2, (self.y1 + self.y2) / 2) + } +}