summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/playerstate.rs19
-rw-r--r--src/room.rs2
2 files changed, 14 insertions, 7 deletions
diff --git a/src/playerstate.rs b/src/playerstate.rs
index 0e4fd3d..6d953fb 100644
--- a/src/playerstate.rs
+++ b/src/playerstate.rs
@@ -41,7 +41,7 @@ pub struct PlayerState {
pub room: Option<RoomId>,
pub pos: RoomPos,
pub inventory_capacity: usize,
- pub inventory: Vec<Template>,
+ pub inventory: Vec<(Template, bool)>,
pub health: i64,
pub maximum_health: i64,
pub equipment: HashMap<Slot, Option<Template>>
@@ -62,7 +62,7 @@ impl PlayerState {
}
}
- pub fn create(id: PlayerId, room: RoomId, inventory: Vec<Template>, inventory_capacity: usize, health: i64, maximum_health: i64, equipment: HashMap<Slot, Option<Template>>) -> Self {
+ pub fn create(id: PlayerId, room: RoomId, inventory: Vec<(Template, bool)>, inventory_capacity: usize, health: i64, maximum_health: i64, equipment: HashMap<Slot, Option<Template>>) -> Self {
Self {
id,
room: Some(room),
@@ -84,7 +84,7 @@ impl PlayerState {
},
"inventory": {
"capacity": self.inventory_capacity,
- "items": self.inventory.iter().map(Template::to_json).collect::<Vec<Value>>()
+ "items": self.inventory.iter().map(|(item, e)| (Template::to_json(item), *e)).collect::<Vec<(Value, bool)>>()
},
"equipment": {
"hand": null,
@@ -99,7 +99,14 @@ impl PlayerState {
let inventory = val.get("inventory").ok_or(aerr!("player json does not have inventory"))?;
let mut items = vec![];
for item in inventory.get("items").ok_or(aerr!("inventory does not have items"))?.as_array().ok_or(aerr!("inventory items not an array"))? {
- items.push(Template::from_json(item)?);
+ if item.is_array() {
+ items.push((
+ Template::from_json(item.get(0).ok_or(aerr!("invalid item"))?)?,
+ item.get(1).ok_or(aerr!("invalid item"))?.as_bool().ok_or(aerr!("invalid item"))?
+ ));
+ } else {
+ items.push((Template::from_json(item)?, false));
+ }
}
Ok(Self {
id: PlayerId{name: val.get("name").ok_or(aerr!("player json does not have name"))?.as_str().ok_or(aerr!("player name not a string"))?.to_string()},
@@ -127,11 +134,11 @@ impl PlayerState {
ComponentWrapper::Visible(Visible{sprite: Sprite{name: "player".to_string()}, height: 1.2, name: self.id.name.clone()}),
ComponentWrapper::Player(Player::new(self.id.clone())),
ComponentWrapper::Inventory(Inventory{
- items: self.inventory.iter().map( |template| {
+ items: self.inventory.iter().map( |(template, equippable)| {
let item_ent = encyclopedia.construct(template).unwrap();
for component in item_ent {
if let ComponentWrapper::Item(item) = component {
- return (item, false);
+ return (item, *equippable);
}
}
panic!("Item in inventory does not have item component")
diff --git a/src/room.rs b/src/room.rs
index 926abd1..e78cbd5 100644
--- a/src/room.rs
+++ b/src/room.rs
@@ -238,7 +238,7 @@ impl <'a, 'b>Room<'a, 'b> {
Some(PlayerState::create(
player.id.clone(),
self.id.clone(),
- inventory.items.iter().map(|(item, _)| item.ent.clone()).collect(),
+ inventory.items.iter().map(|(item, e)| (item.ent.clone(), *e)).collect(),
inventory.capacity,
health.health,
health.maxhealth,