From c454bab2b1447210140c17b3d259c874f7205b02 Mon Sep 17 00:00:00 2001 From: Peter Hart Date: Wed, 1 Apr 2020 23:28:53 -0400 Subject: [PATCH] initial monster AI system --- src/components.rs | 3 +++ src/main.rs | 20 ++++++++++++++------ src/monster_ai_system.rs | 21 +++++++++++++++++++++ 3 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 src/monster_ai_system.rs diff --git a/src/components.rs b/src/components.rs index 5f17e23..a3d594e 100644 --- a/src/components.rs +++ b/src/components.rs @@ -24,3 +24,6 @@ pub struct Viewshed { pub range: i32, pub dirty: bool, } + +#[derive(Component, Debug)] +pub struct Monster {} diff --git a/src/main.rs b/src/main.rs index ed5a245..c93d638 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,8 @@ mod components; pub use components::*; mod visibility_system; pub use visibility_system::VisibilitySystem; +mod monster_ai_system; +pub use monster_ai_system::MonsterAI; #[macro_use] extern crate specs_derive; @@ -26,7 +28,7 @@ pub fn try_move_player(delta_x: i32, delta_y: i32, ecs: &mut World) { for (_player, pos, viewshed) in (&mut players, &mut positions, &mut viewsheds).join() { let destination_idx = map.xy_idx(pos.x + delta_x, pos.y + delta_y); if map.tiles[destination_idx] != TileType::Wall { - pos.x = min(79 , max(0, pos.x + delta_x)); + pos.x = min(79, max(0, pos.x + delta_x)); pos.y = min(49, max(0, pos.y + delta_y)); viewshed.dirty = true; @@ -60,6 +62,8 @@ impl State { fn run_systems(&mut self) { let mut vis = VisibilitySystem {}; vis.run_now(&self.ecs); + let mut mob = MonsterAI {}; + mob.run_now(&self.ecs); self.ecs.maintain(); } } @@ -74,8 +78,10 @@ impl GameState for State { let renderables = self.ecs.read_storage::(); let map = self.ecs.fetch::(); for (pos, render) in (&positions, &renderables).join() { - let idx = map.xy_idx(pos.x,pos.y); - if map.visible_tiles[idx] { ctx.set(pos.x, pos.y, render.fg, render.bg, render.glyph); } + let idx = map.xy_idx(pos.x, pos.y); + if map.visible_tiles[idx] { + ctx.set(pos.x, pos.y, render.fg, render.bg, render.glyph); + } } } } @@ -128,6 +134,7 @@ fn main() { gs.ecs.register::(); gs.ecs.register::(); gs.ecs.register::(); + gs.ecs.register::(); gs.ecs .create_entity() @@ -152,9 +159,9 @@ fn main() { for room in map.rooms.iter().skip(1) { let (x, y) = room.center(); - let glyph = match rng.roll_dice(1,2) { - 1 => { rltk::to_cp437('g') } - _ => { rltk::to_cp437('o') } + let glyph = match rng.roll_dice(1, 2) { + 1 => rltk::to_cp437('g'), + _ => rltk::to_cp437('o'), }; gs.ecs .create_entity() @@ -169,6 +176,7 @@ fn main() { range: 8, dirty: true, }) + .with(Monster {}) .build(); } diff --git a/src/monster_ai_system.rs b/src/monster_ai_system.rs new file mode 100644 index 0000000..413ea77 --- /dev/null +++ b/src/monster_ai_system.rs @@ -0,0 +1,21 @@ +use super::{Map, Monster, Position, Viewshed}; +use rltk::{console, field_of_view, Point}; +use specs::prelude::*; + +pub struct MonsterAI {} + +impl<'a> System<'a> for MonsterAI { + type SystemData = ( + ReadStorage<'a, Viewshed>, + ReadStorage<'a, Position>, + ReadStorage<'a, Monster>, + ); + + fn run(&mut self, data : Self::SystemData) { + let (viewshed, pos, monster) = data; + + for (viewshed, pos, monster) in (&viewshed, &pos, &monster).join() { + console::log("Monster considers their own existence") + } + } +}