systems.rs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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. } else if t.seen {
  16. game_board.set_with_color([x, y], t.glyph(), (0.5, 0.5, 0.5));
  17. }
  18. }
  19. for (p, r) in (&pos, &renderable).join() {
  20. if vs.vs.visibility([p.x, p.y]) {
  21. game_board.set_with_color([p.x, p.y], r.glyph, r.color);
  22. }
  23. }
  24. }
  25. }
  26. system! {
  27. Move (
  28. resource map: Map,
  29. resource mut viewshed: Viewshed,
  30. mut motion: Motion,
  31. mut pos: carpet::Coord,
  32. ) {
  33. let tgt_x = (pos.x as i8 + motion.right) as usize;
  34. let tgt_y = (pos.y as i8 + motion.down) as usize;
  35. if map.passable((tgt_x, tgt_y)) {
  36. viewshed.dirty = true;
  37. pos.x = tgt_x;
  38. pos.y = tgt_y;
  39. }
  40. } finally {
  41. motion.clear();
  42. }
  43. }
  44. system! {
  45. Visibility(
  46. resource mut map: Map,
  47. resource mut viewshed: Viewshed,
  48. pos: carpet::Coord,
  49. _player: Player,
  50. ) {
  51. if viewshed.dirty {
  52. viewshed.vs.calculate_from(&map.tiles, *pos);
  53. for (x, y, vis) in viewshed.vs.vis.iter() {
  54. if *vis {
  55. map.tiles[(x, y)].seen = true;
  56. }
  57. }
  58. viewshed.dirty = false;
  59. }
  60. }
  61. }