diff options
| author | Freya Murphy <freya@freyacat.org> | 2025-11-19 23:10:38 -0500 |
|---|---|---|
| committer | Freya Murphy <freya@freyacat.org> | 2025-11-19 23:11:05 -0500 |
| commit | 9f2df31db6fe5450826cc68fd2158fe218dd8000 (patch) | |
| tree | 07096790eb1ca63512700a130c2baae3b4d151b3 /dungeon | |
| parent | dungeon: implement items (diff) | |
| download | DungeonCrawl-9f2df31db6fe5450826cc68fd2158fe218dd8000.tar.gz DungeonCrawl-9f2df31db6fe5450826cc68fd2158fe218dd8000.tar.bz2 DungeonCrawl-9f2df31db6fe5450826cc68fd2158fe218dd8000.zip | |
dungeon: inventory usage
Diffstat (limited to 'dungeon')
| -rw-r--r-- | dungeon/src/entity.rs | 5 | ||||
| -rw-r--r-- | dungeon/src/lib.rs | 50 | ||||
| -rw-r--r-- | dungeon/src/player_input.rs | 9 |
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>, } |