systems.rs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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]) == carpet::Visibility::Visible {
  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. mut motion: Motion,
  26. mut pos: carpet::Coord,
  27. ) {
  28. let tgt_x = (pos.x as i8 + motion.right) as usize;
  29. let tgt_y = (pos.y as i8 + motion.down) as usize;
  30. if map.passable((tgt_x, tgt_y)) {
  31. pos.x = tgt_x;
  32. pos.y = tgt_y;
  33. }
  34. } finally {
  35. motion.clear();
  36. }
  37. }
  38. system! {
  39. Visibility(
  40. resource map: Map,
  41. resource mut viewshed: Viewshed,
  42. pos: carpet::Coord,
  43. _player: Player,
  44. ) {
  45. if viewshed.dirty {
  46. viewshed.vs.calculate_from(&map.tiles, *pos);
  47. viewshed.dirty = false;
  48. }
  49. }
  50. }