visibility_system.rs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. extern crate specs;
  2. use super::{Map, Player, Position, Viewshed};
  3. use specs::prelude::*;
  4. extern crate rltk;
  5. use rltk::{field_of_view, Point};
  6. pub struct VisibilitySystem {}
  7. impl<'a> System<'a> for VisibilitySystem {
  8. type SystemData = (
  9. WriteExpect<'a, Map>,
  10. Entities<'a>,
  11. WriteStorage<'a, Viewshed>,
  12. ReadStorage<'a, Position>,
  13. ReadStorage<'a, Player>,
  14. );
  15. fn run(&mut self, data: Self::SystemData) {
  16. let (mut map, entities, mut viewshed, pos, player) = data;
  17. for (ent, viewshed, pos) in (&entities, &mut viewshed, &pos).join() {
  18. if viewshed.dirty {
  19. viewshed.dirty = false;
  20. viewshed.visible_tiles =
  21. field_of_view(Point::new(pos.x, pos.y), viewshed.range, &*map);
  22. // If this is the player, reveal what they can see
  23. let _p: Option<&Player> = player.get(ent);
  24. if let Some(_p) = _p {
  25. for t in map.visible_tiles.iter_mut() {
  26. *t = false
  27. }
  28. for vis in viewshed.visible_tiles.iter() {
  29. let idx = map.xy_idx(vis.x, vis.y);
  30. map.revealed_tiles[idx] = true;
  31. map.visible_tiles[idx] = true;
  32. }
  33. }
  34. }
  35. }
  36. }
  37. }