aboutsummaryrefslogtreecommitdiff
path: root/src/state.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/state.rs')
-rw-r--r--src/state.rs109
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);
+ }
}