use crate::components::{Motion, Player, Renderable}; use crate::map::{Map, Viewshed}; system_impl! { Draw( resource mut game_board: carpet::GameBoard, resource map: Map, resource vs: Viewshed, renderable: Renderable, pos: carpet::Coord, ) { game_board.clear(); for (x, y, t) in map.tiles.iter() { if vs.vs.visibility([x, y]) { game_board.set([x, y], t.glyph()); } } for (p, r) in (&pos, &renderable).join() { game_board.set_with_color([p.x, p.y], r.glyph, r.color); } } } system! { Move ( resource map: Map, resource mut viewshed: Viewshed, mut motion: Motion, mut pos: carpet::Coord, ) { let tgt_x = (pos.x as i8 + motion.right) as usize; let tgt_y = (pos.y as i8 + motion.down) as usize; if map.passable((tgt_x, tgt_y)) { viewshed.dirty = true; pos.x = tgt_x; pos.y = tgt_y; } } finally { motion.clear(); } } system! { Visibility( resource map: Map, resource mut viewshed: Viewshed, pos: carpet::Coord, _player: Player, ) { if viewshed.dirty { viewshed.vs.calculate_from(&map.tiles, *pos); viewshed.dirty = false; } } }