summaryrefslogtreecommitdiff
path: root/dungeon
diff options
context:
space:
mode:
Diffstat (limited to 'dungeon')
-rw-r--r--dungeon/src/entity.rs5
-rw-r--r--dungeon/src/lib.rs50
-rw-r--r--dungeon/src/player_input.rs9
3 files changed, 53 insertions, 11 deletions
diff --git a/dungeon/src/entity.rs b/dungeon/src/entity.rs
index a0750dd..9af27bd 100644
--- a/dungeon/src/entity.rs
+++ b/dungeon/src/entity.rs
@@ -337,6 +337,7 @@ pub struct Player {
pub weapon: Weapon,
// How long until we reset potion effects?
pub potion_timer: Option<Instant>,
+ pub active_inv_slot: usize,
}
impl Player {
/// Instantiates the game player at a given `Pos`
@@ -354,11 +355,13 @@ impl Player {
let inventory = vec![];
let weapon = Weapon::RustyKnife;
let potion_timer = None;
+ let active_inv_slot = 0;
Self {
entity,
inventory,
weapon,
potion_timer,
+ active_inv_slot,
}
}
}
@@ -517,7 +520,7 @@ impl Dungeon {
};
updater.update_entity(&mut self.player.entity);
- for enemy in &mut self.enemies {
+ for enemy in &mut self.entities {
updater.update_entity(enemy);
}
}
diff --git a/dungeon/src/lib.rs b/dungeon/src/lib.rs
index 13ab397..0076f26 100644
--- a/dungeon/src/lib.rs
+++ b/dungeon/src/lib.rs
@@ -15,11 +15,11 @@ use std::time::Instant;
use rand::{Rng, SeedableRng, TryRngCore, rngs::OsRng};
use crate::{
- entity::{Entity, Player},
+ entity::{Entity, EntityKind, PLAYER_INVENTORY_SIZE_USIZE, Player},
map::{Floor, Tile},
msg::Message,
player_input::PlayerInput,
- pos::FPos,
+ pos::{Direction, FPos},
rng::DungeonRng,
};
@@ -43,7 +43,7 @@ pub enum UpdateResult {
pub struct Dungeon {
pub floor: Floor,
pub player: Player,
- pub enemies: Vec<Entity>,
+ pub entities: Vec<Entity>,
pub msg: Message,
seed: u64,
level_rng: DungeonRng,
@@ -66,12 +66,12 @@ impl Dungeon {
let mut level_rng = DungeonRng::seed_from_u64(game_rng.random());
let floor = bsp::generate(&mut level_rng);
let player = Player::new(floor.player_start());
- let enemies = vec![];
+ let entities = vec![];
let msg = Message::empty();
let mut dungeon = Self {
floor,
player,
- enemies,
+ entities,
msg,
seed,
level_rng,
@@ -121,12 +121,13 @@ impl Dungeon {
UpdateResult::MessageUpdated(changed)
} else {
self.update_entities(player_input, delta_time);
- self.update_player();
+ self.update_player(player_input);
if self.floor.get(self.player.entity.pos) == Tile::Stairs {
// we are moving to a new floor
self.floor = bsp::generate(&mut self.level_rng);
self.player.entity.teleport(self.floor.player_start());
+ self.entities.clear();
self.spawn_enimies();
return UpdateResult::NextFloor;
}
@@ -135,19 +136,50 @@ impl Dungeon {
}
}
- fn update_player(&mut self) {
+ fn update_player(&mut self, player_input: PlayerInput) {
+ // update potion timer
if let Some(timer) = self.player.potion_timer
&& Instant::now() > timer
{
self.player.potion_timer = None;
self.player.entity.speed = self.player.entity.kind.initial_speed();
}
+
+ // use item
+ if player_input.use_item
+ && self.player.active_inv_slot < self.player.inventory.len()
+ {
+ let item = self.player.inventory.remove(self.player.active_inv_slot);
+ item.consume(self);
+ }
+
+ // TODO: attack
+
+ // check for drop input
+ if player_input.drop && self.player.active_inv_slot < self.player.inventory.len() {
+ let item = self.player.inventory.remove(self.player.active_inv_slot);
+ self.entities.push(Entity::new(
+ self.player.entity.pos,
+ Direction::East,
+ EntityKind::Item(item),
+ ));
+ self.player.active_inv_slot = self
+ .player
+ .active_inv_slot
+ .max(self.player.inventory.len().saturating_sub(1));
+ }
+
+ // check for inv slot request
+ if let Some(slot) = player_input.inv_slot
+ && slot < PLAYER_INVENTORY_SIZE_USIZE
+ {
+ self.player.active_inv_slot = slot;
+ }
}
fn spawn_enimies(&mut self) {
// TODO: better entity spawning
let zombie = Entity::zombie(self.floor.random_walkable_pos(&mut self.level_rng));
- self.enemies.clear();
- self.enemies.push(zombie);
+ self.entities.push(zombie);
}
}
diff --git a/dungeon/src/player_input.rs b/dungeon/src/player_input.rs
index ddaad9f..7fe85c3 100644
--- a/dungeon/src/player_input.rs
+++ b/dungeon/src/player_input.rs
@@ -15,5 +15,12 @@ pub struct PlayerInput {
/// If the player is currently attempting to interact
/// with some object, entity, etc.
pub interact: bool,
- // other player actions are to be added later
+ /// If the player wants to use an item
+ pub use_item: bool,
+ /// If the player is currently attempting to attack
+ pub attack: bool,
+ /// If the player is attempting to drop an item
+ pub drop: bool,
+ /// If the player is attempting to switch the active inv slot
+ pub inv_slot: Option<usize>,
}