From 667c68a706f557eb8cf622c2fd5f8f134fdaf546 Mon Sep 17 00:00:00 2001
From: Paul Weber <work@paul-weber.de>
Date: Sun, 4 Jul 2021 01:42:38 +0200
Subject: [PATCH] Add exit (progress) mechanic

---
 src/game_state.rs       | 9 +++++++++
 src/game_state/level.rs | 7 ++++++-
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/src/game_state.rs b/src/game_state.rs
index f5aed50..38fc7a0 100644
--- a/src/game_state.rs
+++ b/src/game_state.rs
@@ -19,6 +19,7 @@ use rand::{thread_rng, Rng};
 use tetra::graphics::text::{VectorFontBuilder, Font, Text};
 use crate::game_state::combat_log::PlayerAction;
 use crate::game_state::combat_log::PlayerAction::Move;
+use crate::game_state::level::Level;
 
 type Point = (usize, usize);
 
@@ -123,11 +124,18 @@ impl GameState {
             }
             Tile::Wall => return false,
             Tile::Enemy(id) => self.attack_enemy(id, target_position),
+            Tile::Exit => return self.progress_level(),
             _ => ()
         }
         true
     }
 
+    fn progress_level(&mut self) -> bool {
+        self.current_run.level_count += 1;
+        self.current_run.level = Level::new(self.current_run.level_count);
+        false
+    }
+
     fn attack_enemy(&mut self, enemy_id: usize, enemy_position: Point) {
         let damage = self.current_run.player.attack_power + GameState::roll_dice(6);
         match self.current_run.level.enemies.get_mut(enemy_id) {
@@ -325,6 +333,7 @@ impl GameState {
                     Tile::Wall => GameState::draw_tile(self, Color::BLACK, draw_x, draw_y, ctx),
                     Tile::Player => GameState::draw_player(self, draw_x, draw_y, ctx),
                     Tile::Enemy(_) => GameState::draw_enemy(self, draw_x, draw_y, ctx),
+                    Tile::Exit => GameState::draw_tile(self, Color::RED, draw_x, draw_y, ctx),
                     _ => {}
                 }
             }
diff --git a/src/game_state/level.rs b/src/game_state/level.rs
index 94fc136..2b6a8f1 100644
--- a/src/game_state/level.rs
+++ b/src/game_state/level.rs
@@ -100,7 +100,8 @@ impl Level {
         let with_walls = Level::add_walls(board);
         let with_player = Level::add_player(with_walls);
         let with_enemies = Level::add_enemies(enemy_count, with_player);
-        return with_enemies;
+        let with_exit = Level::add_exit(with_enemies);
+        return with_exit;
     }
 
     fn add_walls(board: Board) -> Board {
@@ -117,6 +118,10 @@ impl Level {
         board
     }
 
+    fn add_exit(board: Board) -> Board {
+        Level::add_entity(Tile::Exit, board)
+    }
+
     fn add_player(board: Board) -> Board {
         Level::add_entity(Tile::Player, board)
     }
-- 
GitLab