summaryrefslogtreecommitdiffstats
path: root/src/game.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/game.rs')
-rw-r--r--src/game.rs38
1 files changed, 31 insertions, 7 deletions
diff --git a/src/game.rs b/src/game.rs
index a17526b..f66ca40 100644
--- a/src/game.rs
+++ b/src/game.rs
@@ -544,7 +544,11 @@ fn place_entities(
544 } 544 }
545 545
546 // --- hallucinated pickups --- 546 // --- hallucinated pickups ---
547 let fake_count = if depth >= 3 { rng.random_range(1..=2) } else { 0 }; 547 let fake_count = if depth >= 3 {
548 rng.random_range(1..=2)
549 } else {
550 0
551 };
548 for _ in 0..fake_count { 552 for _ in 0..fake_count {
549 if next >= candidates.len() { 553 if next >= candidates.len() {
550 break; 554 break;
@@ -673,6 +677,9 @@ pub struct Game {
673 677
674 // ---- controls overlay ---- 678 // ---- controls overlay ----
675 pub show_controls: bool, 679 pub show_controls: bool,
680
681 // ---- death screen ----
682 pub death_frames: u32,
676} 683}
677 684
678fn smoothstep(t: f64) -> f64 { 685fn smoothstep(t: f64) -> f64 {
@@ -724,6 +731,7 @@ impl Game {
724 flash_color: 0, 731 flash_color: 0,
725 flash_alpha: 0.0, 732 flash_alpha: 0.0,
726 show_controls: true, 733 show_controls: true,
734 death_frames: 0,
727 } 735 }
728 } 736 }
729 737
@@ -802,10 +810,11 @@ impl Game {
802 if done { 810 if done {
803 self.state = GameState::ResolvingTurn; 811 self.state = GameState::ResolvingTurn;
804 self.resolve_turn(); 812 self.resolve_turn();
805 self.state = GameState::WaitingForInput; 813 if self.state != GameState::GameOver {
814 self.state = GameState::WaitingForInput;
815 }
806 return true; 816 return true;
807 } 817 }
808 false
809 } 818 }
810 819
811 GameState::AnimatingEnemies => { 820 GameState::AnimatingEnemies => {
@@ -814,14 +823,22 @@ impl Game {
814 self.enemy_anim_t = 0.0; 823 self.enemy_anim_t = 0.0;
815 self.state = GameState::ResolvingTurn; 824 self.state = GameState::ResolvingTurn;
816 self.resolve_turn(); 825 self.resolve_turn();
817 self.state = GameState::WaitingForInput; 826 if self.state != GameState::GameOver {
827 self.state = GameState::WaitingForInput;
828 }
818 return true; 829 return true;
819 } 830 }
820 false
821 } 831 }
822 832
823 _ => false, 833 _ => {}
834 }
835
836 // Count frames since death so the death screen has a minimum display time.
837 if self.state == GameState::GameOver {
838 self.death_frames += 1;
824 } 839 }
840
841 false
825 } 842 }
826 843
827 /// Attempt to walk one tile in grid direction (dx, dy). 844 /// Attempt to walk one tile in grid direction (dx, dy).
@@ -1160,7 +1177,9 @@ impl Game {
1160 fn advance_turn(&mut self) { 1177 fn advance_turn(&mut self) {
1161 self.state = GameState::ResolvingTurn; 1178 self.state = GameState::ResolvingTurn;
1162 self.resolve_turn(); 1179 self.resolve_turn();
1163 self.state = GameState::WaitingForInput; 1180 if self.state != GameState::GameOver {
1181 self.state = GameState::WaitingForInput;
1182 }
1164 } 1183 }
1165 1184
1166 /// Apply all per-turn effects (weakness, heartbeat, HP drain, message decay). 1185 /// Apply all per-turn effects (weakness, heartbeat, HP drain, message decay).
@@ -1248,4 +1267,9 @@ impl Game {
1248 pub fn weakness_factor(&self) -> f64 { 1267 pub fn weakness_factor(&self) -> f64 {
1249 (self.weakness as f64 / MAX_WEAKNESS as f64) * 2.0 1268 (self.weakness as f64 / MAX_WEAKNESS as f64) * 2.0
1250 } 1269 }
1270
1271 /// Compute the final score.
1272 pub fn score(&self) -> u64 {
1273 (self.kills * 100) + (self.depth.pow(2) * 50) + (self.weapon_base_damage as u64 * 500)
1274 }
1251} 1275}