summaryrefslogtreecommitdiff
path: root/src/components
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-03-05 14:47:48 +0100
committertroido <troido@protonmail.com>2020-03-05 14:47:48 +0100
commita520382eb19e4234ed52fd1eb9fb965b5967d522 (patch)
tree5b4a8831cd544f57c6119eac5785973dc9e9bd50 /src/components
parent7846b871f5c9d57a19dbf09b7acbf0d6b38a69ca (diff)
equipment is now a part of the inventory
Diffstat (limited to 'src/components')
-rw-r--r--src/components/equipment.rs29
-rw-r--r--src/components/inventory.rs44
-rw-r--r--src/components/item.rs1
-rw-r--r--src/components/mod.rs11
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,