systems.rs 909 B

123456789101112131415161718192021222324252627282930313233343536
  1. use crate::components::{Renderable, Motion};
  2. use crate::map::Map;
  3. system_impl! {
  4. Draw(
  5. resource mut game_board: carpet::GameBoard<carpet::CP437>,
  6. resource map: Map,
  7. renderable: Renderable,
  8. pos: carpet::Coord,
  9. ) {
  10. game_board.clear();
  11. for (x, y, t) in map.tiles.iter() {
  12. game_board.set([x, y], t.glyph());
  13. }
  14. for (p, r) in (&pos, &renderable).join() {
  15. game_board.set_with_color([p.x, p.y], r.glyph, r.color);
  16. }
  17. }
  18. }
  19. system! {
  20. Move (
  21. resource map: Map,
  22. mut motion: Motion,
  23. mut pos: carpet::Coord,
  24. ) {
  25. let tgt_x = (pos.x as i8 + motion.right) as usize;
  26. let tgt_y = (pos.y as i8 + motion.down) as usize;
  27. if map.passable((tgt_x, tgt_y)) {
  28. pos.x = tgt_x;
  29. pos.y = tgt_y;
  30. }
  31. } finally {
  32. motion.clear();
  33. }
  34. }