map builder module

This commit is contained in:
Llywelwyn 2023-07-15 11:01:50 +01:00
parent 6302951694
commit 7e4953f096
5 changed files with 156 additions and 114 deletions

View file

@ -14,6 +14,7 @@ mod rect;
pub use rect::Rect;
mod gamelog;
mod gui;
pub mod map_builders;
mod saveload_system;
mod spawner;
mod visibility_system;
@ -143,11 +144,14 @@ impl State {
// Build new map
let worldmap;
let current_depth;
let player_start;
{
let mut worldmap_resource = self.ecs.write_resource::<Map>();
current_depth = worldmap_resource.depth;
let mut rng = self.ecs.write_resource::<RandomNumberGenerator>();
*worldmap_resource = Map::new_map_rooms_and_corridors(&mut rng, current_depth + 1);
let (newmap, start) = map_builders::build_random_map(&mut rng, current_depth + 1);
*worldmap_resource = newmap;
player_start = start;
worldmap = worldmap_resource.clone();
}
@ -157,15 +161,14 @@ impl State {
}
// Place the player and update resources
let (player_x, player_y) = worldmap.rooms[0].centre();
let mut player_position = self.ecs.write_resource::<Point>();
*player_position = Point::new(player_x, player_y);
*player_position = Point::new(player_start.x, player_start.y);
let mut position_components = self.ecs.write_storage::<Position>();
let player_entity = self.ecs.fetch::<Entity>();
let player_pos_comp = position_components.get_mut(*player_entity);
if let Some(player_pos_comp) = player_pos_comp {
player_pos_comp.x = player_x;
player_pos_comp.y = player_y;
player_pos_comp.x = player_start.x;
player_pos_comp.y = player_start.y;
}
// Dirtify viewshed
@ -196,10 +199,13 @@ impl State {
// Build a new map and place the player
let worldmap;
let player_start;
{
let mut worldmap_resource = self.ecs.write_resource::<Map>();
let mut rng = self.ecs.write_resource::<RandomNumberGenerator>();
*worldmap_resource = Map::new_map_rooms_and_corridors(&mut rng, 1);
let (newmap, start) = map_builders::build_random_map(&mut rng, 1);
*worldmap_resource = newmap;
player_start = start;
worldmap = worldmap_resource.clone();
}
@ -209,7 +215,7 @@ impl State {
}
// Place the player and update resources
let (player_x, player_y) = worldmap.rooms[0].centre();
let (player_x, player_y) = (player_start.x, player_start.y);
let player_entity = spawner::player(&mut self.ecs, player_x, player_y, "Player".to_string());
let mut player_position = self.ecs.write_resource::<Point>();
*player_position = Point::new(player_x, player_y);
@ -524,23 +530,22 @@ fn main() -> rltk::BError {
gs.ecs.register::<SerializationHelper>();
gs.ecs.insert(SimpleMarkerAllocator::<SerializeMe>::new());
// Create RNG.
// Create seed.
let mut rng = rltk::RandomNumberGenerator::new();
// Use seed to generate the map.
let map = Map::new_map_rooms_and_corridors(&mut rng, 1);
let (map, player_start) = map_builders::build_random_map(&mut rng, 1);
// Insert seed into the ECS.
gs.ecs.insert(rng);
let (player_x, player_y) = map.rooms[0].centre();
let player_name = "wanderer".to_string();
let player_entity = spawner::player(&mut gs.ecs, player_x, player_y, player_name);
let player_entity = spawner::player(&mut gs.ecs, player_start.x, player_start.y, player_name);
for room in map.rooms.iter().skip(1) {
spawner::spawn_room(&mut gs.ecs, room, 1);
}
gs.ecs.insert(map);
gs.ecs.insert(Point::new(player_x, player_y));
gs.ecs.insert(Point::new(player_start.x, player_start.y));
gs.ecs.insert(player_entity);
gamelog::setup_log();