diff --git a/src/main.rs b/src/main.rs index 0b646aa..efe06a1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -386,11 +386,15 @@ impl State { // Build a new map and place the player let worldmap; let current_depth; + let player_start; { let mut worldmap_resource = self.ecs.write_resource::(); current_depth = worldmap_resource.depth; - *worldmap_resource = map_builders::build_random_map(current_depth + 1); + let (newmap, start) = map_builders::build_random_map(current_depth + 1); + + *worldmap_resource = newmap; + player_start = start; worldmap = worldmap_resource.clone(); } @@ -400,7 +404,7 @@ impl State { } // Place the player and update resources - let (player_x, player_y) = worldmap.rooms[0].center(); + let (player_x, player_y) = (player_start.x, player_start.y); let mut player_position = self.ecs.write_resource::(); *player_position = Point::new(player_x, player_y); let mut position_components = self.ecs.write_storage::(); @@ -442,9 +446,13 @@ impl State { // Build a new map and place the player let worldmap; + let player_start; { let mut worldmap_resource = self.ecs.write_resource::(); - *worldmap_resource = map_builders::build_random_map(1); + let (newmap, start) = map_builders::build_random_map(1); + + *worldmap_resource = newmap; + player_start = start; worldmap = worldmap_resource.clone(); } @@ -454,7 +462,7 @@ impl State { } // Place the player and update resources - let (player_x, player_y) = worldmap.rooms[0].center(); + let (player_x, player_y) = (player_start.x, player_start.y); let player_entity = spawner::player(&mut self.ecs, player_x, player_y); let mut player_position = self.ecs.write_resource::(); *player_position = Point::new(player_x, player_y); @@ -526,8 +534,8 @@ fn main() -> rltk::BError { gs.ecs.insert(SimpleMarkerAllocator::::new()); - let map = map_builders::build_random_map(1); - let (player_x, player_y) = map.rooms[0].center(); + let (map, player_start) = map_builders::build_random_map(1); + let (player_x, player_y) = (player_start.x, player_start.y); let player_entity = spawner::player(&mut gs.ecs, player_x, player_y); diff --git a/src/map_builders/mod.rs b/src/map_builders/mod.rs index 9bf7575..cd7621b 100644 --- a/src/map_builders/mod.rs +++ b/src/map_builders/mod.rs @@ -1,14 +1,14 @@ mod common; mod simple_map; -use crate::Map; +use crate::{Map, Position}; use common::*; use simple_map::SimpleMapBuilder; trait MapBuilder { - fn build(new_depth: i32) -> Map; + fn build(new_depth: i32) -> (Map, Position); } -pub fn build_random_map(new_depth: i32) -> Map { +pub fn build_random_map(new_depth: i32) -> (Map, Position) { SimpleMapBuilder::build(new_depth) } diff --git a/src/map_builders/simple_map.rs b/src/map_builders/simple_map.rs index c2667df..20f6348 100644 --- a/src/map_builders/simple_map.rs +++ b/src/map_builders/simple_map.rs @@ -1,21 +1,20 @@ use super::{apply_horizontal_tunnel, apply_room_to_map, apply_vertical_tunnel, MapBuilder}; -use crate::{Map, Rect, TileType}; +use crate::{Map, Position, Rect, TileType}; use rltk::RandomNumberGenerator; pub struct SimpleMapBuilder {} impl MapBuilder for SimpleMapBuilder { - fn build(new_depth: i32) -> Map { + fn build(new_depth: i32) -> (Map, Position) { let mut map = Map::new(new_depth); + let playerpos = SimpleMapBuilder::rooms_and_corridors(&mut map); - SimpleMapBuilder::rooms_and_corridors(&mut map); - - map + (map, playerpos) } } impl SimpleMapBuilder { - fn rooms_and_corridors(map: &mut Map) { + fn rooms_and_corridors(map: &mut Map) -> Position { const MAX_ROOMS: i32 = 30; const MIN_SIZE: i32 = 6; const MAX_SIZE: i32 = 10; @@ -60,5 +59,12 @@ impl SimpleMapBuilder { let stairs_position = map.rooms[map.rooms.len() - 1].center(); let stairs_idx = map.xy_idx(stairs_position.0, stairs_position.1); map.tiles[stairs_idx] = TileType::DownStairs; + + let start_pos = map.rooms[0].center(); + + Position { + x: start_pos.0, + y: start_pos.1, + } } }