Add more difficulty
This commit is contained in:
92
src/main.rs
92
src/main.rs
@@ -13,6 +13,7 @@ use monster_ai_system::*;
|
||||
use player::*;
|
||||
use visibility_system::*;
|
||||
|
||||
use crate::gamelog::GameLog;
|
||||
use crate::inventory_system::{ItemCollectionSystem, ItemDropSystem, ItemUseSystem};
|
||||
|
||||
mod components;
|
||||
@@ -25,6 +26,7 @@ mod map_indexing_system;
|
||||
mod melee_combat_system;
|
||||
mod monster_ai_system;
|
||||
mod player;
|
||||
mod random_table;
|
||||
mod rect;
|
||||
mod save_load_system;
|
||||
mod spawner;
|
||||
@@ -46,12 +48,94 @@ pub enum RunState {
|
||||
menu_selection: gui::MainMenuSelection,
|
||||
},
|
||||
SaveGame,
|
||||
NextLevel,
|
||||
}
|
||||
|
||||
pub struct State {
|
||||
pub ecs: World,
|
||||
}
|
||||
|
||||
impl State {
|
||||
fn entities_to_remove_on_level_change(&mut self) -> Vec<Entity> {
|
||||
let entities = self.ecs.entities();
|
||||
let player = self.ecs.read_storage::<Player>();
|
||||
let backpack = self.ecs.read_storage::<InBackpack>();
|
||||
let player_entity = self.ecs.fetch::<Entity>();
|
||||
|
||||
let mut to_delete: Vec<Entity> = Vec::new();
|
||||
for entity in entities.join() {
|
||||
let mut should_delete = true;
|
||||
|
||||
let p = player.get(entity);
|
||||
if let Some(p) = p {
|
||||
should_delete = false;
|
||||
}
|
||||
|
||||
let bp = backpack.get(entity);
|
||||
if let Some(bp) = bp {
|
||||
if bp.owner == *player_entity {
|
||||
should_delete = false;
|
||||
}
|
||||
}
|
||||
|
||||
if should_delete {
|
||||
to_delete.push(entity);
|
||||
}
|
||||
}
|
||||
|
||||
to_delete
|
||||
}
|
||||
|
||||
fn goto_next_level(&mut self) {
|
||||
let to_delete = self.entities_to_remove_on_level_change();
|
||||
for target in to_delete {
|
||||
self.ecs
|
||||
.delete_entity(target)
|
||||
.expect("Unable to delete entity")
|
||||
}
|
||||
|
||||
let worldmap;
|
||||
let current_depth;
|
||||
{
|
||||
let mut worldmap_resource = self.ecs.write_resource::<Map>();
|
||||
current_depth = worldmap_resource.depth;
|
||||
*worldmap_resource = Map::new_map_rooms_and_corridors(current_depth + 1);
|
||||
worldmap = worldmap_resource.clone();
|
||||
}
|
||||
|
||||
for room in worldmap.rooms.iter().skip(1) {
|
||||
spawner::spawn_room(&mut self.ecs, room, current_depth + 1);
|
||||
}
|
||||
|
||||
let (player_x, player_y) = worldmap.rooms[0].center();
|
||||
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) = player_pos_comp {
|
||||
player_pos.x = player_x;
|
||||
player_pos.y = player_y;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
let mut gamelog = self.ecs.fetch_mut::<GameLog>();
|
||||
gamelog
|
||||
.entries
|
||||
.push("You descend to the next level, and take a moment to heal".to_string());
|
||||
let mut player_health_store = self.ecs.write_storage::<CombatStats>();
|
||||
let player_health = player_health_store.get_mut(*player_entity);
|
||||
if let Some(player_health) = player_health {
|
||||
player_health.hp = i32::max(player_health.hp, player_health.max_hp / 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl State {
|
||||
fn run_systems(&mut self) {
|
||||
let mut vis = VisibilitySystem {};
|
||||
@@ -221,6 +305,10 @@ impl GameState for State {
|
||||
menu_selection: gui::MainMenuSelection::Quit,
|
||||
};
|
||||
}
|
||||
RunState::NextLevel => {
|
||||
self.goto_next_level();
|
||||
new_run_state = RunState::PreRun;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
@@ -269,13 +357,13 @@ fn main() -> rltk::BError {
|
||||
|
||||
gs.ecs.insert(SimpleMarkerAllocator::<SerializeMe>::new());
|
||||
|
||||
let map = Map::new_map_rooms_and_corridors();
|
||||
let map = Map::new_map_rooms_and_corridors(1);
|
||||
let (player_x, player_y) = map.rooms[0].center();
|
||||
|
||||
let player_entity = spawner::player(&mut gs.ecs, player_x, player_y);
|
||||
|
||||
for room in map.rooms.iter().skip(1) {
|
||||
spawner::spawn_room(&mut gs.ecs, room);
|
||||
spawner::spawn_room(&mut gs.ecs, room, 1);
|
||||
}
|
||||
|
||||
gs.ecs.insert(map);
|
||||
|
Reference in New Issue
Block a user