From b5e3880a332dc91848428cb607fcf58c9f30eff7 Mon Sep 17 00:00:00 2001 From: Llywelwyn Date: Tue, 1 Aug 2023 08:30:04 +0100 Subject: [PATCH] IntervalSpawningSystem{} fix, and mobs randomly move --- src/bystander_ai_system.rs | 58 +++++++++++++++++------------ src/main.rs | 7 ++++ src/map/interval_spawning_system.rs | 14 +++++-- src/map_builders/mod.rs | 2 +- src/monster_ai_system.rs | 8 +++- 5 files changed, 61 insertions(+), 28 deletions(-) diff --git a/src/bystander_ai_system.rs b/src/bystander_ai_system.rs index eaff950..e8d4feb 100644 --- a/src/bystander_ai_system.rs +++ b/src/bystander_ai_system.rs @@ -22,30 +22,42 @@ impl<'a> System<'a> for BystanderAI { for (entity, mut viewshed, _bystander, mut pos, _turn) in (&entities, &mut viewshed, &bystander, &mut position, &turns).join() { - // Try to move randomly - let mut x = pos.x; - let mut y = pos.y; - let move_roll = rng.roll_dice(1, 8); - match move_roll { - 1 => x -= 1, - 2 => x += 1, - 3 => y -= 1, - 4 => y += 1, - _ => {} - } - - if x > 0 && x < map.width - 1 && y > 0 && y < map.height - 1 { - let dest_idx = map.xy_idx(x, y); - if !map.blocked[dest_idx] { - let idx = map.xy_idx(pos.x, pos.y); - map.blocked[idx] = false; - pos.x = x; - pos.y = y; - entity_moved.insert(entity, EntityMoved {}).expect("Unable to insert marker"); - map.blocked[dest_idx] = true; - viewshed.dirty = true; - } + if try_move_randomly(&mut pos, &mut rng, &mut map, &mut viewshed) { + entity_moved.insert(entity, EntityMoved {}).expect("Unable to insert marker"); } } } } + +pub fn try_move_randomly( + pos: &mut Position, + rng: &mut rltk::RandomNumberGenerator, + map: &mut Map, + viewshed: &mut Viewshed, +) -> bool { + // Try to move randomly + let mut x = pos.x; + let mut y = pos.y; + let move_roll = rng.roll_dice(1, 8); + match move_roll { + 1 => x -= 1, + 2 => x += 1, + 3 => y -= 1, + 4 => y += 1, + _ => {} + } + + if x > 0 && x < map.width - 1 && y > 0 && y < map.height - 1 { + let dest_idx = map.xy_idx(x, y); + if !map.blocked[dest_idx] { + let idx = map.xy_idx(pos.x, pos.y); + map.blocked[idx] = false; + pos.x = x; + pos.y = y; + map.blocked[dest_idx] = true; + viewshed.dirty = true; + return true; + } + } + return false; +} diff --git a/src/main.rs b/src/main.rs index 48b13b0..7f6798e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -176,6 +176,7 @@ impl State { fn entities_to_remove_on_level_change(&mut self) -> Vec { let entities = self.ecs.entities(); let player = self.ecs.read_storage::(); + let clock = self.ecs.read_storage::(); let backpack = self.ecs.read_storage::(); let player_entity = self.ecs.fetch::(); let equipped = self.ecs.read_storage::(); @@ -184,6 +185,12 @@ impl State { for entity in entities.join() { let mut should_delete = true; + // Don't delete the turn clock + let c = clock.get(entity); + if let Some(_c) = c { + should_delete = false; + } + // Don't delete player let p = player.get(entity); if let Some(_p) = p { diff --git a/src/map/interval_spawning_system.rs b/src/map/interval_spawning_system.rs index fd9afa3..5fbb0f1 100644 --- a/src/map/interval_spawning_system.rs +++ b/src/map/interval_spawning_system.rs @@ -1,4 +1,4 @@ -use crate::{gamelog, raws, spawner, Clock, Map, RandomNumberGenerator, TakingTurn}; +use crate::{gamelog, raws, spawner, Clock, Map, RandomNumberGenerator, TakingTurn, LOG_SPAWNING}; use specs::prelude::*; const TRY_SPAWN_CHANCE: i32 = 70; @@ -17,12 +17,14 @@ pub fn try_spawn_interval(ecs: &mut World) { let mut rng = ecs.write_resource::(); for (_c, _t) in (&clock, &turns).join() { if rng.roll_dice(1, TRY_SPAWN_CHANCE) == 1 { - rltk::console::log("Trying spawn."); try_spawn = true; } } } if try_spawn { + if LOG_SPAWNING { + rltk::console::log("SPAWNINFO: Trying spawn."); + } spawn_random_mob_in_free_nonvisible_tile(ecs); } } @@ -32,6 +34,9 @@ fn spawn_random_mob_in_free_nonvisible_tile(ecs: &mut World) { let available_tiles = populate_unblocked_nonvisible_tiles(&map); let difficulty = (map.difficulty + gamelog::get_event_count("player_level")) / 2; if available_tiles.len() == 0 { + if LOG_SPAWNING { + rltk::console::log("SPAWNINFO: No free tiles; not spawning anything.."); + } return; } let mut rng = ecs.write_resource::(); @@ -41,6 +46,9 @@ fn spawn_random_mob_in_free_nonvisible_tile(ecs: &mut World) { let y = idx as i32 / map.width; std::mem::drop(map); std::mem::drop(rng); + if LOG_SPAWNING { + rltk::console::log(format!("SPAWNINFO: Spawning {} at {}, {}.", key, x, y)); + } raws::spawn_named_entity(&raws::RAWS.lock().unwrap(), ecs, &key, raws::SpawnType::AtPosition { x, y }, difficulty); } @@ -56,5 +64,5 @@ fn populate_unblocked_nonvisible_tiles(map: &Map) -> Vec { fn get_random_idx_from_possible_tiles(rng: &mut rltk::RandomNumberGenerator, area: Vec) -> usize { let idx = if area.len() == 1 { 0usize } else { (rng.roll_dice(1, area.len() as i32) - 1) as usize }; - return idx; + return area[idx]; } diff --git a/src/map_builders/mod.rs b/src/map_builders/mod.rs index 6a36568..be118ba 100644 --- a/src/map_builders/mod.rs +++ b/src/map_builders/mod.rs @@ -361,6 +361,6 @@ pub fn level_builder( match new_id { 1 => town_builder(new_id, rng, width, height, 0, initial_player_level), 2 => forest_builder(new_id, rng, width, height, 1, initial_player_level), - _ => random_builder(new_id, rng, width, height, difficulty, initial_player_level), + _ => random_builder(new_id, rng, 64, 64, difficulty, initial_player_level), } } diff --git a/src/monster_ai_system.rs b/src/monster_ai_system.rs index b5f0afe..a3fed20 100644 --- a/src/monster_ai_system.rs +++ b/src/monster_ai_system.rs @@ -1,4 +1,4 @@ -use super::{EntityMoved, Map, Monster, Position, TakingTurn, Viewshed, WantsToMelee}; +use super::{bystander_ai_system, EntityMoved, Map, Monster, Position, TakingTurn, Viewshed, WantsToMelee}; use rltk::Point; use specs::prelude::*; @@ -8,6 +8,7 @@ impl<'a> System<'a> for MonsterAI { #[allow(clippy::type_complexity)] type SystemData = ( WriteExpect<'a, Map>, + WriteExpect<'a, rltk::RandomNumberGenerator>, ReadExpect<'a, Point>, ReadExpect<'a, Entity>, Entities<'a>, @@ -22,6 +23,7 @@ impl<'a> System<'a> for MonsterAI { fn run(&mut self, data: Self::SystemData) { let ( mut map, + mut rng, player_pos, player_entity, entities, @@ -57,6 +59,10 @@ impl<'a> System<'a> for MonsterAI { viewshed.dirty = true; entity_moved.insert(entity, EntityMoved {}).expect("Unable to insert marker"); } + } else { + if bystander_ai_system::try_move_randomly(&mut pos, &mut rng, &mut map, &mut viewshed) { + entity_moved.insert(entity, EntityMoved {}).expect("Unable to insert marker"); + } } } }