From d19770117ab70ff8696b436419010f4f117c716c Mon Sep 17 00:00:00 2001 From: unintendedfraud Date: Sat, 3 Feb 2024 14:24:30 +0100 Subject: [PATCH] collisions --- rusty-roguelike/src/components.rs | 3 +++ rusty-roguelike/src/main.rs | 27 ++++++++++++++--------- rusty-roguelike/src/spawner.rs | 18 ++++++++++++++- rusty-roguelike/src/systems/collisions.rs | 20 +++++++++++++++++ rusty-roguelike/src/systems/mod.rs | 2 ++ 5 files changed, 59 insertions(+), 11 deletions(-) create mode 100644 rusty-roguelike/src/systems/collisions.rs diff --git a/rusty-roguelike/src/components.rs b/rusty-roguelike/src/components.rs index ae87f8d..ef2dbc3 100644 --- a/rusty-roguelike/src/components.rs +++ b/rusty-roguelike/src/components.rs @@ -8,3 +8,6 @@ pub struct Render { #[derive(Clone, Debug, Copy, PartialEq)] pub struct Player; + +#[derive(Clone, Debug, Copy, PartialEq)] +pub struct Ennemy; diff --git a/rusty-roguelike/src/main.rs b/rusty-roguelike/src/main.rs index ffb5c4d..6c97936 100644 --- a/rusty-roguelike/src/main.rs +++ b/rusty-roguelike/src/main.rs @@ -1,26 +1,26 @@ -mod map; -mod map_builder; mod camera; mod components; +mod map; +mod map_builder; mod spawner; mod systems; mod prelude { pub use bracket_lib::prelude::*; - pub use legion::*; - pub use legion::world::SubWorld; pub use legion::systems::CommandBuffer; + pub use legion::world::SubWorld; + pub use legion::*; - pub use crate::map::*; - pub use crate::map_builder::*; pub use crate::camera::*; pub use crate::components::*; + pub use crate::map::*; + pub use crate::map_builder::*; pub use crate::spawner::*; pub use crate::systems::*; - + pub const SCREEN_WIDTH: i32 = 80; pub const SCREEN_HEIGHT: i32 = 50; - + pub const DISPLAY_WIDTH: i32 = SCREEN_WIDTH / 2; pub const DISPLAY_HEIGHT: i32 = SCREEN_HEIGHT / 2; } @@ -42,11 +42,18 @@ impl State { let mut rng = RandomNumberGenerator::new(); let map_builder = MapBuilder::new(&mut rng); + spawn_player(&mut ecs, map_builder.player_start); + + map_builder + .rooms + .iter() + .skip(1) + .map(|r| r.center()) + .for_each(|pos| spawn_monster(&mut ecs, &mut rng, pos)); + resources.insert(map_builder.map); resources.insert(Camera::new(map_builder.player_start)); - spawn_player(&mut ecs, map_builder.player_start); - return Self { ecs, resources, diff --git a/rusty-roguelike/src/spawner.rs b/rusty-roguelike/src/spawner.rs index b2f4e6c..7559a1c 100644 --- a/rusty-roguelike/src/spawner.rs +++ b/rusty-roguelike/src/spawner.rs @@ -4,9 +4,25 @@ pub fn spawn_player(ecs: &mut World, pos: Point) { ecs.push(( Player, pos, - Render{ + Render { color: ColorPair::new(WHITE, BLACK), glyph: to_cp437('@'), }, )); } + +pub fn spawn_monster(ecs: &mut World, rng: &mut RandomNumberGenerator, pos: Point) { + ecs.push(( + Ennemy, + pos, + Render { + color: ColorPair::new(WHITE, BLACK), + glyph: match rng.range(0, 4) { + 0 => to_cp437('E'), + 1 => to_cp437('O'), + 2 => to_cp437('o'), + _ => to_cp437('G'), + }, + }, + )); +} diff --git a/rusty-roguelike/src/systems/collisions.rs b/rusty-roguelike/src/systems/collisions.rs new file mode 100644 index 0000000..d43cbcb --- /dev/null +++ b/rusty-roguelike/src/systems/collisions.rs @@ -0,0 +1,20 @@ +use crate::prelude::*; + +#[system] +#[read_component(Point)] +#[read_component(Player)] +#[read_component(Ennemy)] +pub fn collisions(ecs: &mut SubWorld, commands: &mut CommandBuffer) { + let mut player_position = Point::zero(); + let mut players = <&Point>::query().filter(component::()); + players.iter(ecs).for_each(|pos| player_position = *pos); + + let mut ennemies = <(Entity, &Point)>::query().filter(component::()); + + ennemies + .iter(ecs) + .filter(|(_, pos)| **pos == player_position) + .for_each(|(entity, _)| { + commands.remove(*entity); + }); +} diff --git a/rusty-roguelike/src/systems/mod.rs b/rusty-roguelike/src/systems/mod.rs index 19a1f4f..2cd97b3 100644 --- a/rusty-roguelike/src/systems/mod.rs +++ b/rusty-roguelike/src/systems/mod.rs @@ -1,12 +1,14 @@ mod player_input; mod map_render; mod entity_render; +mod collisions; pub use crate::prelude::*; pub fn build_scheduler() -> Schedule { return Schedule::builder() .add_system(player_input::player_input_system()) + .add_system(collisions::collisions_system()) .add_system(map_render::map_render_system()) .add_system(entity_render::entity_render_system()) .build();