movement_system.rs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. use crate::components::{MoveEvent, Position, Viewshed};
  2. use crate::map::Map;
  3. use rltk::Point;
  4. use specs::prelude::*;
  5. fn clamp<T: PartialOrd>(low: T, high: T, val: T) -> T {
  6. if val < low {
  7. low
  8. } else if val > high {
  9. high
  10. } else {
  11. val
  12. }
  13. }
  14. pub struct HandleMoveEvent;
  15. impl<'a> System<'a> for HandleMoveEvent {
  16. type SystemData = (
  17. WriteStorage<'a, MoveEvent>,
  18. WriteStorage<'a, Position>,
  19. WriteStorage<'a, Viewshed>,
  20. WriteExpect<'a, Point>,
  21. ReadExpect<'a, Map>,
  22. );
  23. fn run(&mut self, (mut move_events, mut pos, mut viewshed, mut point, map): Self::SystemData) {
  24. for (&event, pos, viewshed) in (&move_events, &mut pos, &mut viewshed).join() {
  25. let MoveEvent {
  26. destination,
  27. tgt_x,
  28. tgt_y,
  29. } = event;
  30. if !map.blocked[destination] {
  31. viewshed.dirty = true;
  32. pos.x = tgt_x;
  33. pos.y = tgt_y;
  34. point.x = clamp(0, 79, tgt_x);
  35. point.y = clamp(0, 49, tgt_y);
  36. }
  37. }
  38. move_events.clear();
  39. }
  40. }