From dc26fe3ddfc9c5321168cf75820d1a4c27160746 Mon Sep 17 00:00:00 2001 From: Rodrigo Oliveira Date: Mon, 25 Jan 2021 14:16:45 -0300 Subject: [PATCH 1/5] Add initial fog of vision --- src/main.rs | 2 ++ src/states/default.rs | 1 + src/systems/fog_of_vision.rs | 18 ++++++++++++++++++ src/systems/mod.rs | 2 ++ src/systems/spawn_creep.rs | 2 ++ 5 files changed, 25 insertions(+) create mode 100644 src/systems/fog_of_vision.rs diff --git a/src/main.rs b/src/main.rs index 75276d9..a259003 100644 --- a/src/main.rs +++ b/src/main.rs @@ -210,6 +210,7 @@ fn main() -> BError { let mut dispatcher = DispatcherBuilder::new(); dispatcher!( dispatcher, + fog_of_vision_system, combine_collision_system, input_driver::, update_collision_resource_system, @@ -288,6 +289,7 @@ fn main() -> BError { world.initialize::>(); world.initialize::>(); + world.initialize::>(); world.initialize::(); *world.get_mut::>().unwrap() = Some(CollisionResource::new( diff --git a/src/states/default.rs b/src/states/default.rs index 6816614..e138ee0 100644 --- a/src/states/default.rs +++ b/src/states/default.rs @@ -37,6 +37,7 @@ impl minigene::State for DefaultState { &*world.get().unwrap(), &*world.get().unwrap(), &*world.get().unwrap(), + &*world.get().unwrap(), ); } ctx.set_active_console(0); diff --git a/src/systems/fog_of_vision.rs b/src/systems/fog_of_vision.rs new file mode 100644 index 0000000..630a4c6 --- /dev/null +++ b/src/systems/fog_of_vision.rs @@ -0,0 +1,18 @@ +use crate::*; + +/// Sets which tiles are visible. +pub fn fog_of_vision_system( + collision_res: &Option, + viewsheds: &mut Components, + positions: &mut Components, +) -> SystemResult{ + for (v, p) in join!(&mut viewsheds && &positions).map(|(v, p)| (v.unwrap(), p.unwrap())) { + if let Some(col_res) = collision_res { + let map = &col_res.map; + v.visible_tiles.clear(); + v.visible_tiles = field_of_view(Point::new(p.x, p.y), v.range, map); + v.visible_tiles.retain(|p| p.x >= 0 && p.x < (map.size().0 as i32) && p.y >= 0 && p.y < (map.size().1 as i32)); + } + } + Ok(()) +} diff --git a/src/systems/mod.rs b/src/systems/mod.rs index 2288cad..e0e8185 100644 --- a/src/systems/mod.rs +++ b/src/systems/mod.rs @@ -8,6 +8,7 @@ mod bear_spawner; mod creep_spawner; mod damage_entity; mod dark_presence; +mod fog_of_vision; mod game_stats_updater; mod handle_action_points; mod kill_entity; @@ -44,6 +45,7 @@ pub use self::bear_spawner::*; pub use self::creep_spawner::*; pub use self::damage_entity::*; pub use self::dark_presence::*; +pub use self::fog_of_vision::*; pub use self::game_stats_updater::*; pub use self::handle_action_points::*; pub use self::kill_entity::*; diff --git a/src/systems/spawn_creep.rs b/src/systems/spawn_creep.rs index cc2e8fb..188862e 100644 --- a/src/systems/spawn_creep.rs +++ b/src/systems/spawn_creep.rs @@ -13,6 +13,7 @@ pub fn spawn_creep_system( teams: &mut Components, sprites: &mut Components, sprite_indices: &mut Components, + viewsheds: &mut Components, ) -> SystemResult { for ev in game_events.iter() { if let GameEvent::SpawnCreep(pos, team) = ev { @@ -37,6 +38,7 @@ pub fn spawn_creep_system( }, ); sprite_indices.insert(creep, SpriteIndex(9)); + viewsheds.insert(creep, Viewshed::new(Vec::new(), 5)); } } Ok(()) From 357fb672907b8f420eab8e2e7b9b81b60d84ba1a Mon Sep 17 00:00:00 2001 From: Rodrigo Oliveira Date: Mon, 25 Jan 2021 16:15:51 -0300 Subject: [PATCH 2/5] Fix performance issue --- src/components.rs | 5 +++++ src/main.rs | 6 +++++- src/systems/fog_of_vision.rs | 11 ++++++----- src/systems/spawn_creep.rs | 4 ++-- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/components.rs b/src/components.rs index 8c4f835..5c2d327 100644 --- a/src/components.rs +++ b/src/components.rs @@ -62,3 +62,8 @@ pub enum Team { /// The opponent's team. Other, } + +#[derive(new)] +pub struct LineOfSight { + pub range: i32, +} diff --git a/src/main.rs b/src/main.rs index a259003..327fcf6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -289,7 +289,8 @@ fn main() -> BError { world.initialize::>(); world.initialize::>(); - world.initialize::>(); + world.initialize::>(); + world.initialize::(); world.initialize::(); *world.get_mut::>().unwrap() = Some(CollisionResource::new( @@ -420,6 +421,7 @@ fn main() -> BError { Team::Me, Barrack, default_stats.clone(), + LineOfSight::new(15), ); // Creep spawners centity!( @@ -427,6 +429,7 @@ fn main() -> BError { Point::new(x, y - 1), CreepSpawner(0, CREEP_SPAWN_TICKS), Team::Me, + LineOfSight::new(15), ); } @@ -467,6 +470,7 @@ fn main() -> BError { SpriteIndex(80), Team::Me, default_stats.clone(), + LineOfSight::new(6), ); } } diff --git a/src/systems/fog_of_vision.rs b/src/systems/fog_of_vision.rs index 630a4c6..7b162f1 100644 --- a/src/systems/fog_of_vision.rs +++ b/src/systems/fog_of_vision.rs @@ -3,15 +3,16 @@ use crate::*; /// Sets which tiles are visible. pub fn fog_of_vision_system( collision_res: &Option, - viewsheds: &mut Components, + sights: &Components, + viewshed: &mut Viewshed, positions: &mut Components, ) -> SystemResult{ - for (v, p) in join!(&mut viewsheds && &positions).map(|(v, p)| (v.unwrap(), p.unwrap())) { + viewshed.visible_tiles.clear(); + for (sight, pos) in join!(&sights && &positions).map(|(s, p)| (s.unwrap(), p.unwrap())) { if let Some(col_res) = collision_res { let map = &col_res.map; - v.visible_tiles.clear(); - v.visible_tiles = field_of_view(Point::new(p.x, p.y), v.range, map); - v.visible_tiles.retain(|p| p.x >= 0 && p.x < (map.size().0 as i32) && p.y >= 0 && p.y < (map.size().1 as i32)); + viewshed.visible_tiles.extend(field_of_view(*pos, sight.range, map)); + viewshed.visible_tiles.retain(|p| p.x >= 0 && p.x < (map.size().0 as i32) && p.y >= 0 && p.y < (map.size().1 as i32)); } } Ok(()) diff --git a/src/systems/spawn_creep.rs b/src/systems/spawn_creep.rs index 188862e..3d2039e 100644 --- a/src/systems/spawn_creep.rs +++ b/src/systems/spawn_creep.rs @@ -13,7 +13,7 @@ pub fn spawn_creep_system( teams: &mut Components, sprites: &mut Components, sprite_indices: &mut Components, - viewsheds: &mut Components, + sights: &mut Components, ) -> SystemResult { for ev in game_events.iter() { if let GameEvent::SpawnCreep(pos, team) = ev { @@ -38,7 +38,7 @@ pub fn spawn_creep_system( }, ); sprite_indices.insert(creep, SpriteIndex(9)); - viewsheds.insert(creep, Viewshed::new(Vec::new(), 5)); + sights.insert(creep, LineOfSight::new(5)); } } Ok(()) From b1f9f9576a77711816d720be051d311446ac1ab1 Mon Sep 17 00:00:00 2001 From: Rodrigo Oliveira Date: Mon, 25 Jan 2021 16:19:20 -0300 Subject: [PATCH 3/5] Add doc to new component and cargo fmt --- src/components.rs | 2 ++ src/systems/fog_of_vision.rs | 10 +++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/components.rs b/src/components.rs index 5c2d327..6867efa 100644 --- a/src/components.rs +++ b/src/components.rs @@ -63,7 +63,9 @@ pub enum Team { Other, } +/// Allows a unit to see others. #[derive(new)] pub struct LineOfSight { + /// The limit of the unit vision. pub range: i32, } diff --git a/src/systems/fog_of_vision.rs b/src/systems/fog_of_vision.rs index 7b162f1..65d5c89 100644 --- a/src/systems/fog_of_vision.rs +++ b/src/systems/fog_of_vision.rs @@ -6,13 +6,17 @@ pub fn fog_of_vision_system( sights: &Components, viewshed: &mut Viewshed, positions: &mut Components, -) -> SystemResult{ +) -> SystemResult { viewshed.visible_tiles.clear(); for (sight, pos) in join!(&sights && &positions).map(|(s, p)| (s.unwrap(), p.unwrap())) { if let Some(col_res) = collision_res { let map = &col_res.map; - viewshed.visible_tiles.extend(field_of_view(*pos, sight.range, map)); - viewshed.visible_tiles.retain(|p| p.x >= 0 && p.x < (map.size().0 as i32) && p.y >= 0 && p.y < (map.size().1 as i32)); + viewshed + .visible_tiles + .extend(field_of_view(*pos, sight.range, map)); + viewshed.visible_tiles.retain(|p| { + p.x >= 0 && p.x < (map.size().0 as i32) && p.y >= 0 && p.y < (map.size().1 as i32) + }); } } Ok(()) From f26b2430cd1d41086cc03f4d5d13e25216d3a431 Mon Sep 17 00:00:00 2001 From: Rodrigo Oliveira Date: Tue, 26 Jan 2021 11:59:17 -0300 Subject: [PATCH 4/5] Add line of sight only to user own creeps --- src/systems/spawn_creep.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/systems/spawn_creep.rs b/src/systems/spawn_creep.rs index 3d2039e..fd0c2b2 100644 --- a/src/systems/spawn_creep.rs +++ b/src/systems/spawn_creep.rs @@ -25,6 +25,7 @@ pub fn spawn_creep_system( stats.insert(creep, stat_def.to_statset()); proximity_attacks.insert(creep, ProximityAttack::new(CREEP_ATTACK_RADIUS)); let bg = if *team == Team::Me { + sights.insert(creep, LineOfSight::new(5)); RGBA::named(GREEN) } else { RGBA::named(RED) @@ -38,7 +39,6 @@ pub fn spawn_creep_system( }, ); sprite_indices.insert(creep, SpriteIndex(9)); - sights.insert(creep, LineOfSight::new(5)); } } Ok(()) From 320e2e331d47c11a0e1a2ad52d2911da4a220b89 Mon Sep 17 00:00:00 2001 From: Rodrigo Oliveira Date: Fri, 29 Jan 2021 14:19:52 -0300 Subject: [PATCH 5/5] Change viewshed to an optional feature --- src/states/default.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/states/default.rs b/src/states/default.rs index e138ee0..a4b4fb2 100644 --- a/src/states/default.rs +++ b/src/states/default.rs @@ -37,7 +37,7 @@ impl minigene::State for DefaultState { &*world.get().unwrap(), &*world.get().unwrap(), &*world.get().unwrap(), - &*world.get().unwrap(), + Some(&*world.get().unwrap()), ); } ctx.set_active_console(0);