|
@@ -36,6 +36,8 @@ pub mod hunger_system;
|
|
|
pub mod rex_assets;
|
|
|
pub mod trigger_system;
|
|
|
pub mod map_builders;
|
|
|
+#[macro_use]
|
|
|
+extern crate generator;
|
|
|
|
|
|
rltk::add_wasm_support!();
|
|
|
|
|
@@ -306,43 +308,15 @@ impl State {
|
|
|
}
|
|
|
|
|
|
// Build a new map and place the player
|
|
|
- let mut builder;
|
|
|
- let worldmap;
|
|
|
let current_depth;
|
|
|
- let player_start;
|
|
|
{
|
|
|
- let mut worldmap_resource = self.ecs.write_resource::<Map>();
|
|
|
+ let worldmap_resource = self.ecs.fetch::<Map>();
|
|
|
current_depth = worldmap_resource.depth;
|
|
|
- builder = map_builders::random_builder(current_depth + 1);
|
|
|
- builder.build_map();
|
|
|
- *worldmap_resource = builder.get_map();
|
|
|
- player_start = builder.get_starting_position();
|
|
|
- worldmap = worldmap_resource.clone();
|
|
|
}
|
|
|
-
|
|
|
- // Spawn bad guys
|
|
|
- builder.spawn_entities(&mut self.ecs);
|
|
|
-
|
|
|
- // Place the player and update resources
|
|
|
- let (player_x, player_y) = (player_start.x, player_start.y);
|
|
|
- let mut player_position = self.ecs.write_resource::<Point>();
|
|
|
- *player_position = Point::new(player_x, player_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;
|
|
|
- }
|
|
|
-
|
|
|
- // Mark the player's visibility as dirty
|
|
|
- let mut viewshed_components = self.ecs.write_storage::<Viewshed>();
|
|
|
- let vs = viewshed_components.get_mut(*player_entity);
|
|
|
- if let Some(vs) = vs {
|
|
|
- vs.dirty = true;
|
|
|
- }
|
|
|
+ self.generate_world_map(current_depth + 1);
|
|
|
|
|
|
// Notify the player and give them some health
|
|
|
+ let player_entity = self.ecs.fetch::<Entity>();
|
|
|
let mut gamelog = self.ecs.fetch_mut::<gamelog::GameLog>();
|
|
|
gamelog.entries.insert(0, "You descend to the next level, and take a moment to heal.".to_string());
|
|
|
let mut player_health_store = self.ecs.write_storage::<CombatStats>();
|
|
@@ -362,14 +336,25 @@ impl State {
|
|
|
self.ecs.delete_entity(*del).expect("Deletion failed");
|
|
|
}
|
|
|
|
|
|
+ // Spawn a new player
|
|
|
+ {
|
|
|
+ let player_entity = spawner::player(&mut self.ecs, 0, 0);
|
|
|
+ let mut player_entity_writer = self.ecs.write_resource::<Entity>();
|
|
|
+ *player_entity_writer = player_entity;
|
|
|
+ }
|
|
|
+
|
|
|
// Build a new map and place the player
|
|
|
- let mut builder = map_builders::random_builder(1);
|
|
|
+ self.generate_world_map(1);
|
|
|
+ }
|
|
|
+
|
|
|
+ fn generate_world_map(&mut self, new_depth : i32) {
|
|
|
+ let mut builder = map_builders::random_builder(new_depth);
|
|
|
+ builder.build_map();
|
|
|
let player_start;
|
|
|
{
|
|
|
let mut worldmap_resource = self.ecs.write_resource::<Map>();
|
|
|
- builder.build_map();
|
|
|
- player_start = builder.get_starting_position();
|
|
|
*worldmap_resource = builder.get_map();
|
|
|
+ player_start = builder.get_starting_position();
|
|
|
}
|
|
|
|
|
|
// Spawn bad guys
|
|
@@ -377,13 +362,11 @@ impl State {
|
|
|
|
|
|
// Place the player and update resources
|
|
|
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::<Point>();
|
|
|
*player_position = Point::new(player_x, player_y);
|
|
|
let mut position_components = self.ecs.write_storage::<Position>();
|
|
|
- let mut player_entity_writer = self.ecs.write_resource::<Entity>();
|
|
|
- *player_entity_writer = player_entity;
|
|
|
- let player_pos_comp = position_components.get_mut(player_entity);
|
|
|
+ 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;
|
|
@@ -391,10 +374,10 @@ impl State {
|
|
|
|
|
|
// Mark the player's visibility as dirty
|
|
|
let mut viewshed_components = self.ecs.write_storage::<Viewshed>();
|
|
|
- let vs = viewshed_components.get_mut(player_entity);
|
|
|
+ let vs = viewshed_components.get_mut(*player_entity);
|
|
|
if let Some(vs) = vs {
|
|
|
vs.dirty = true;
|
|
|
- }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -443,24 +426,17 @@ fn main() {
|
|
|
|
|
|
gs.ecs.insert(SimpleMarkerAllocator::<SerializeMe>::new());
|
|
|
|
|
|
- let mut builder = map_builders::random_builder(1);
|
|
|
- builder.build_map();
|
|
|
- let player_start = builder.get_starting_position();
|
|
|
- let map = builder.get_map();
|
|
|
- let (player_x, player_y) = (player_start.x, player_start.y);
|
|
|
-
|
|
|
- let player_entity = spawner::player(&mut gs.ecs, player_x, player_y);
|
|
|
-
|
|
|
+ gs.ecs.insert(Map::new(1));
|
|
|
+ gs.ecs.insert(Point::new(0, 0));
|
|
|
gs.ecs.insert(rltk::RandomNumberGenerator::new());
|
|
|
- builder.spawn_entities(&mut gs.ecs);
|
|
|
-
|
|
|
- gs.ecs.insert(map);
|
|
|
- gs.ecs.insert(Point::new(player_x, player_y));
|
|
|
+ let player_entity = spawner::player(&mut gs.ecs, 0, 0);
|
|
|
gs.ecs.insert(player_entity);
|
|
|
gs.ecs.insert(RunState::MainMenu{ menu_selection: gui::MainMenuSelection::NewGame });
|
|
|
gs.ecs.insert(gamelog::GameLog{ entries : vec!["Welcome to Rusty Roguelike".to_string()] });
|
|
|
gs.ecs.insert(particle_system::ParticleBuilder::new());
|
|
|
gs.ecs.insert(rex_assets::RexAssets::new());
|
|
|
|
|
|
+ gs.generate_world_map(1);
|
|
|
+
|
|
|
rltk::main_loop(context, gs);
|
|
|
}
|