diff options
Diffstat (limited to 'src/components')
| -rw-r--r-- | src/components/equipment.rs | 29 | ||||
| -rw-r--r-- | src/components/inventory.rs | 44 | ||||
| -rw-r--r-- | src/components/item.rs | 1 | ||||
| -rw-r--r-- | src/components/mod.rs | 11 |
4 files changed, 47 insertions, 38 deletions
diff --git a/src/components/equipment.rs b/src/components/equipment.rs index 1d86e95..94a440b 100644 --- a/src/components/equipment.rs +++ b/src/components/equipment.rs @@ -86,36 +86,9 @@ impl Equippable { #[derive(Component, Debug, Clone)] #[storage(HashMapStorage)] pub struct Equipment { - pub equipment: HashMap<Slot, Option<Equippable>> + pub slots: Vec<Slot> } -impl Equipment { - pub fn get_bonus(&self, stat: Stat) -> i64 { - let mut bonus = 0; - for v in self.equipment.values() { - if let Some(equippable) = v { - if let Some(s) = equippable.stats.get(&stat) { - bonus += s; - } - } - } - bonus - } - pub fn all_bonuses(&self) -> HashMap<Stat, i64> { - let mut bonuses: HashMap<Stat, i64> = HashMap::new(); - for v in self.equipment.values() { - if let Some(equippable) = v { - for (stat, s) in equippable.stats.iter(){ - let current: i64 = *bonuses.entry(*stat).or_insert(0); - bonuses.insert(*stat, current + s); - } - } - } - bonuses - } -} - - #[cfg(test)] mod tests { use super::*; diff --git a/src/components/inventory.rs b/src/components/inventory.rs new file mode 100644 index 0000000..81064d8 --- /dev/null +++ b/src/components/inventory.rs @@ -0,0 +1,44 @@ + +use std::collections::HashMap; +use specs::{Component, FlaggedStorage, HashMapStorage}; +use super::{ + item::{Item, ItemAction}, + equipment::{Stat, Equippable}, +}; + +#[derive(Debug, Clone, Default)] +pub struct Inventory { + pub items: Vec<(Item, bool)>, + pub capacity: usize +} +impl Component for Inventory { + type Storage = FlaggedStorage<Self, HashMapStorage<Self>>; +} + +impl Inventory { + + fn equipped(&self) -> Vec<Equippable> { + let mut equippables = Vec::new(); + for (item, is_equipped) in self.items.iter() { + if *is_equipped { + if let ItemAction::Equip(equippable) = &item.action { + equippables.push(equippable.clone()); + } else { + panic!("unequippable item equipped!"); + } + } + } + equippables + } + + pub fn equipment_bonuses(&self) -> HashMap<Stat, i64> { + let mut bonuses: HashMap<Stat, i64> = HashMap::new(); + for equippable in self.equipped() { + for (stat, s) in equippable.stats.iter(){ + let current: i64 = *bonuses.entry(*stat).or_insert(0); + bonuses.insert(*stat, current + s); + } + } + bonuses + } +} diff --git a/src/components/item.rs b/src/components/item.rs index 9e61567..3b931bb 100644 --- a/src/components/item.rs +++ b/src/components/item.rs @@ -48,7 +48,6 @@ impl ItemAction { } } - #[cfg(test)] mod tests { use super::*; diff --git a/src/components/mod.rs b/src/components/mod.rs index 5dd83bd..c3e8d5d 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -4,6 +4,7 @@ pub mod messages; pub mod faction; pub mod interactable; pub mod equipment; +pub mod inventory; pub use item::Item; pub use messages::{ @@ -14,6 +15,7 @@ pub use messages::{ pub use faction::Faction; pub use interactable::Interactable; pub use equipment::Equipment; +pub use inventory::Inventory; use specs::{ DenseVecStorage, @@ -102,15 +104,6 @@ impl Player { } } -#[derive(Debug, Clone, Default)] -pub struct Inventory { - pub items: Vec<Item>, - pub capacity: usize -} -impl Component for Inventory { - type Storage = FlaggedStorage<Self, HashMapStorage<Self>>; -} - #[derive(Component, Debug, Clone)] pub struct Health { pub health: i64, |
