movement_system.rs 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  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 { destination, tgt_x, tgt_y } = event;
  26. if !map.blocked[destination] {
  27. viewshed.dirty = true;
  28. pos.x = tgt_x;
  29. pos.y = tgt_y;
  30. point.x = clamp(0, 79, tgt_x);
  31. point.y = clamp(0, 49, tgt_y);
  32. }
  33. }
  34. move_events.clear();
  35. }
  36. }