From 48c24ec8b011d081550dc78329cbe61de67b30e9 Mon Sep 17 00:00:00 2001 From: troido Date: Sun, 5 Apr 2020 20:04:33 +0200 Subject: items are now mostly replaced by itemids, with a mapping to the item in the encyclopedia --- src/components/inventory.rs | 20 +++++++++---- src/components/item.rs | 70 --------------------------------------------- src/components/mod.rs | 10 +++++-- 3 files changed, 21 insertions(+), 79 deletions(-) delete mode 100644 src/components/item.rs (limited to 'src/components') diff --git a/src/components/inventory.rs b/src/components/inventory.rs index 81064d8..c3282e9 100644 --- a/src/components/inventory.rs +++ b/src/components/inventory.rs @@ -1,14 +1,22 @@ use std::collections::HashMap; use specs::{Component, FlaggedStorage, HashMapStorage}; -use super::{ +use crate::{ + ItemId, item::{Item, ItemAction}, - equipment::{Stat, Equippable}, + components::equipment::{Stat, Equippable}, }; +#[derive(Debug, Clone)] +pub struct InventoryEntry { + pub itemid: ItemId, + pub item: Item, + pub is_equipped: bool +} + #[derive(Debug, Clone, Default)] pub struct Inventory { - pub items: Vec<(Item, bool)>, + pub items: Vec, pub capacity: usize } impl Component for Inventory { @@ -19,9 +27,9 @@ impl Inventory { fn equipped(&self) -> Vec { let mut equippables = Vec::new(); - for (item, is_equipped) in self.items.iter() { - if *is_equipped { - if let ItemAction::Equip(equippable) = &item.action { + for entry in self.items.iter() { + if entry.is_equipped { + if let ItemAction::Equip(equippable) = &entry.item.action { equippables.push(equippable.clone()); } else { panic!("unequippable item equipped!"); diff --git a/src/components/item.rs b/src/components/item.rs deleted file mode 100644 index 0cb2589..0000000 --- a/src/components/item.rs +++ /dev/null @@ -1,70 +0,0 @@ - -use std::collections::HashSet; -use serde_json::{Value}; -use specs::{Component, DenseVecStorage}; -use crate::{ - Template, - components::Flag -}; - -use super::equipment::Equippable; - -#[derive(Component, Debug, Clone)] -pub struct Item { - pub ent: Template, - pub name: String, - pub action: ItemAction -} - - - - -#[derive(Debug, Clone, PartialEq)] -pub enum ItemAction { - Eat(i64), - Build(Template, HashSet, HashSet), - Equip(Equippable), - None -} - -use ItemAction::{Eat, Build, Equip, None}; - -impl ItemAction { - - pub fn from_json(val: &Value) -> Option { - let typ = val.get(0)?; - let arg = val.get(1)?; - Some(match typ.as_str()? { - "eat" => Eat(arg.as_i64()?), - "build" => Build( - Template::from_json(arg.get(0)?).ok()?, - arg.get(1)?.as_array()?.into_iter().map(|v| Flag::from_str(v.as_str()?)).collect::>>()?, - arg.get(2)?.as_array()?.into_iter().map(|v| Flag::from_str(v.as_str()?)).collect::>>()? - ), - "none" => None, - "equip" => Equip(Equippable::from_json(arg)?), - _ => {return Option::None} - }) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::hashmap; - use super::super::equipment::*; - use serde_json::json; - - #[test] - fn equip_from_json() { - assert_eq!( - ItemAction::from_json(&json!(["equip", {"slot": "hand", "stats": {"strength": 10}}])), - Some(ItemAction::Equip(Equippable {slot: Slot::Hand, stats: hashmap!(Stat::Strength => 10)})) - ); - assert_eq!( - ItemAction::from_json(&json!(["equip", {"slot": "hand", "stats": {"attack": 50}}])), - Option::None - ); - } -} - diff --git a/src/components/mod.rs b/src/components/mod.rs index 1a590b2..4065cc2 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -1,5 +1,4 @@ -pub mod item; pub mod messages; pub mod faction; pub mod interactable; @@ -9,7 +8,6 @@ pub mod serialise; pub mod flags; pub mod ear; -pub use item::Item; pub use messages::{ AttackMessage, AttackInbox, @@ -46,7 +44,8 @@ use crate::{ controls::Control, Template, playerstate::RoomPos, - Timestamp + Timestamp, + ItemId, }; #[derive(Component, Debug, Clone)] @@ -229,3 +228,8 @@ pub struct CreationTime { } +#[derive(Component, Debug, Clone)] +pub struct Item(pub ItemId); + + + -- cgit