systems.rs 1.6 KB

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