diff options
Diffstat (limited to 'src/state.rs')
-rw-r--r-- | src/state.rs | 109 |
1 files changed, 21 insertions, 88 deletions
diff --git a/src/state.rs b/src/state.rs index 40c66f6..0badaf0 100644 --- a/src/state.rs +++ b/src/state.rs @@ -1,9 +1,5 @@ -use crossterm::cursor::MoveTo; -use crossterm::{execute, queue, Output}; -use std::io::{stdout, Write}; - -use crate::entities::{Character, Entity, Player}; -use crate::tiling::{tile_to_str, Tile, TileGrid, TileType}; +use crate::entities::{Character, Entity}; +use crate::tiling::{Tile, TileGrid, TileType}; use crate::world::{apply_movement, Dungeon, Generatable, Level, Movement}; const PLAYER_SIGHT: usize = 3; @@ -29,87 +25,21 @@ impl State { self.dungeon.generate(); self.switch_level(0); self.player.place(self.current_level().start_point()); - self.clear_los() + self.fog_of_war(); } - pub fn switch_level(&mut self, num_level: usize) { - self.level = num_level; - self.grid = Some(self.current_level().to_tilegrid().unwrap()); + pub fn get_grid(&self) -> Option<&TileGrid> { + self.grid.as_ref() } - pub fn render_level(&self) { - let mut sout = stdout(); - execute!(sout, MoveTo(0, 0)).unwrap(); - for (linenum, line) in self.grid.as_ref().unwrap().raw_data().iter().enumerate() { - let linestr = line.iter().map(tile_to_str).collect::<Vec<&str>>(); - let mut linestr2 = String::from(""); - for chr in linestr { - linestr2.push_str(chr); - } - queue!(sout, Output(linestr2), MoveTo(0, linenum as u16)).unwrap(); - sout.flush().unwrap(); - } + pub fn get_player(&self) -> &Character { + &self.player } - fn render_entity(&self, entity: &dyn Entity) { - if !entity.is_visible() || !entity.is_dirty() { - return; - } - let dirt = entity.previous_location(); - let background = self.grid.as_ref().unwrap().block_at(dirt.0, dirt.1); - let mut sout = stdout(); - queue!( - sout, - MoveTo(dirt.0 as u16, dirt.1 as u16), - Output(tile_to_str(background)), - MoveTo(entity.location().0 as u16, entity.location().1 as u16), - Output(tile_to_str(entity.tile())) - ) - .unwrap(); - sout.flush().unwrap(); - } - - pub fn render_entities(&self) { - for e in self.current_level().entities.iter() { - self.render_entity(&**e); - } - } - - pub fn render_player(&mut self) { - self.render_entity(&self.player); - } - - fn ui_state_position(&self) -> MoveTo { - MoveTo(0, (self.dungeon.ysize()) as u16) - } - - fn ui_notification_position(&self) -> MoveTo { - MoveTo(0, (self.dungeon.ysize() + 1) as u16) - } - - pub fn render_ui(&self) { - let mut sout = stdout(); - queue!(sout, self.ui_state_position(), Output(self.player.stats())).unwrap(); - sout.flush().unwrap(); - } - - pub fn notify(&self, message: String) { - let mut sout = stdout(); - queue!( - sout, - self.ui_notification_position(), - Output(" ".repeat(self.dungeon.xsize())), - self.ui_notification_position(), - Output(message) - ) - .unwrap(); - sout.flush().unwrap(); - } - - pub fn ui_help(&self) { - self.notify(String::from( - "quit: q, movement{up(k), down(j), left(h), right(l)}", - )) + pub fn switch_level(&mut self, num_level: usize) { + self.level = num_level; + self.grid = Some(self.current_level().to_tilegrid().unwrap()); + self.fog_of_war(); } pub fn current_level(&self) -> &Level { @@ -161,11 +91,9 @@ impl State { if !State::can_step_on(grid.block_at(loc.0, loc.1)) { return Err(String::from("Can't move entity!")); } - self.player.move_by(dir)?; - - self.clear_los(); - - Ok(()) + let ret = self.player.move_by(dir); + self.fog_of_war(); + ret } pub fn down_stairs(&mut self) -> Result<(), String> { @@ -182,7 +110,6 @@ impl State { match grid.block_at(loc.0, loc.1).get_type() { TileType::StairsDown => { self.switch_level(self.level + 1); - self.render_level(); Ok(()) } _ => Err(String::from("Not on stairs!")), @@ -203,10 +130,16 @@ impl State { match grid.block_at(loc.0, loc.1).get_type() { TileType::StairsUp => { self.switch_level(self.level - 1); - self.render_level(); Ok(()) } _ => Err(String::from("Not on stairs!")), } } + + pub fn fog_of_war(&mut self) { + self.grid + .as_mut() + .unwrap() + .clear_fog_of_war(self.player.location(), PLAYER_SIGHT); + } } |