summaryrefslogtreecommitdiff
path: root/dungeon/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'dungeon/src/lib.rs')
-rw-r--r--dungeon/src/lib.rs73
1 files changed, 65 insertions, 8 deletions
diff --git a/dungeon/src/lib.rs b/dungeon/src/lib.rs
index 0076f26..0fd3e0d 100644
--- a/dungeon/src/lib.rs
+++ b/dungeon/src/lib.rs
@@ -23,18 +23,40 @@ use crate::{
rng::DungeonRng,
};
+/// Lets the caller know what actions
+/// exactly the player has done
+#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash)]
+pub struct PlayerAction {
+ // The player picked up an item
+ pub pickup_item: bool,
+ // The player dropped an item
+ pub drop_item: bool,
+ // The player moved
+ pub walk: bool,
+ // The player attacked
+ pub attack: bool,
+ // The player used a bomb
+ pub bomb: bool,
+ // The player used a potion
+ pub potion: bool,
+}
+
/// Lets the caller know what has
/// changed in the game state this
/// tick
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum UpdateResult {
- /// Default, entities have moved
- EntityMovement,
+ /// Default, entities have moved, player done stuff
+ Default(PlayerAction),
/// We have moved to the next floor
NextFloor,
/// Message on screen updated.
/// Contains if a char was added.
MessageUpdated(bool),
+ /// Game over :(
+ GameOver,
+ /// We have done nothing!
+ Nothing,
}
/// The `Dungeon` type represents the game state of the
@@ -48,6 +70,7 @@ pub struct Dungeon {
seed: u64,
level_rng: DungeonRng,
game_rng: DungeonRng,
+ game_over: bool,
}
impl Dungeon {
/// Creates a new `Dungeon` with a provided seed.
@@ -68,6 +91,7 @@ impl Dungeon {
let player = Player::new(floor.player_start());
let entities = vec![];
let msg = Message::empty();
+ let game_over = false;
let mut dungeon = Self {
floor,
player,
@@ -76,6 +100,7 @@ impl Dungeon {
seed,
level_rng,
game_rng,
+ game_over,
};
dungeon.spawn_enimies();
@@ -116,12 +141,32 @@ impl Dungeon {
}
pub fn update(&mut self, player_input: PlayerInput, delta_time: f32) -> UpdateResult {
- if self.msg.visible() {
+ if self.game_over {
+ UpdateResult::Nothing
+ } else if self.msg.visible() {
let changed = self.msg.update(player_input);
UpdateResult::MessageUpdated(changed)
} else {
+ let mut action = self.update_player(player_input);
+
+ let curr_player_pos = self.player.entity.fpos;
self.update_entities(player_input, delta_time);
- self.update_player(player_input);
+ if self
+ .player
+ .entity
+ .fpos
+ .abs_diff(curr_player_pos)
+ .magnitude() > 0.0
+ {
+ // player has moved
+ action.walk = true;
+ }
+
+ if self.player.entity.health < 1 {
+ // player has died :(
+ self.game_over = true;
+ return UpdateResult::GameOver;
+ }
if self.floor.get(self.player.entity.pos) == Tile::Stairs {
// we are moving to a new floor
@@ -132,11 +177,13 @@ impl Dungeon {
return UpdateResult::NextFloor;
}
- UpdateResult::EntityMovement
+ UpdateResult::Default(action)
}
}
- fn update_player(&mut self, player_input: PlayerInput) {
+ fn update_player(&mut self, player_input: PlayerInput) -> PlayerAction {
+ let mut action = PlayerAction::default();
+
// update potion timer
if let Some(timer) = self.player.potion_timer
&& Instant::now() > timer
@@ -150,10 +197,15 @@ impl Dungeon {
&& self.player.active_inv_slot < self.player.inventory.len()
{
let item = self.player.inventory.remove(self.player.active_inv_slot);
+ action.potion = item.is_potion();
+ action.bomb = item.is_bomb();
item.consume(self);
}
- // TODO: attack
+ if player_input.attack {
+ // TODO: attack
+ action.attack = true;
+ }
// check for drop input
if player_input.drop && self.player.active_inv_slot < self.player.inventory.len() {
@@ -167,14 +219,19 @@ impl Dungeon {
.player
.active_inv_slot
.max(self.player.inventory.len().saturating_sub(1));
+ action.drop_item = true;
}
+ // TODO: pickup items
+
// check for inv slot request
if let Some(slot) = player_input.inv_slot
&& slot < PLAYER_INVENTORY_SIZE_USIZE
{
self.player.active_inv_slot = slot;
}
+
+ action
}
fn spawn_enimies(&mut self) {