systems.rs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. use crate::components::{Motion, Player, Renderable};
  2. use crate::map::{Map, Viewshed};
  3. system_impl! {
  4. Draw(
  5. resource mut game_board: carpet::GameBoard<carpet::CP437>,
  6. resource map: Map,
  7. resource vs: Viewshed,
  8. renderable: Renderable,
  9. pos: carpet::Coord,
  10. ) {
  11. game_board.clear();
  12. for (x, y, t) in map.tiles.iter() {
  13. if vs.vs.visibility([x, y]) {
  14. game_board.set([x, y], t.glyph());
  15. }
  16. }
  17. for (p, r) in (&pos, &renderable).join() {
  18. game_board.set_with_color([p.x, p.y], r.glyph, r.color);
  19. }
  20. }
  21. }
  22. system! {
  23. Move (
  24. resource map: Map,
  25. resource mut viewshed: Viewshed,
  26. mut motion: Motion,
  27. mut pos: carpet::Coord,
  28. ) {
  29. let tgt_x = (pos.x as i8 + motion.right) as usize;
  30. let tgt_y = (pos.y as i8 + motion.down) as usize;
  31. if map.passable((tgt_x, tgt_y)) {
  32. viewshed.dirty = true;
  33. pos.x = tgt_x;
  34. pos.y = tgt_y;
  35. }
  36. } finally {
  37. motion.clear();
  38. }
  39. }
  40. system! {
  41. Visibility(
  42. resource map: Map,
  43. resource mut viewshed: Viewshed,
  44. pos: carpet::Coord,
  45. _player: Player,
  46. ) {
  47. if viewshed.dirty {
  48. viewshed.vs.calculate_from(&map.tiles, *pos);
  49. viewshed.dirty = false;
  50. }
  51. }
  52. }