probably trying too hard
This commit is contained in:
parent
23448ffcdb
commit
755ff575cc
@ -163,11 +163,35 @@ pub enum InventoryItemConsumeError {
|
|||||||
InvalidAmount,
|
InvalidAmount,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ConsumedItem {
|
pub struct IndividualConsumedItem {
|
||||||
pub entity_ids: Vec<ItemEntityId>,
|
pub entity_ids: ItemEntityId,
|
||||||
pub item: ItemDetail
|
pub item: ItemDetail,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct StackedConsumedItem {
|
||||||
|
pub entity_ids: Vec<ItemEntityId>,
|
||||||
|
pub tool: Tool
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum ConsumedItem {
|
||||||
|
Individual(IndividualConsumedItem),
|
||||||
|
Stacked(StackedConsumedItem),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ConsumedItem {
|
||||||
|
pub fn entity_ids(&self) -> Vec<ItemEntityId> {
|
||||||
|
match self {
|
||||||
|
ConsumedItem::Individual(individual_consumed_item) => {
|
||||||
|
vec![individual_consumed_item.entity_id]
|
||||||
|
},
|
||||||
|
ConsumedItem::Stacked(stacked_consumed_item) => {
|
||||||
|
stacked_consumed_item.entity_ids
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
pub struct InventoryItemHandle<'a> {
|
pub struct InventoryItemHandle<'a> {
|
||||||
inventory: &'a mut CharacterInventory,
|
inventory: &'a mut CharacterInventory,
|
||||||
slot: usize,
|
slot: usize,
|
||||||
@ -185,27 +209,27 @@ impl<'a> InventoryItemHandle<'a> {
|
|||||||
pub fn consume(self, amount: usize) -> Result<ConsumedItem, InventoryItemConsumeError> {
|
pub fn consume(self, amount: usize) -> Result<ConsumedItem, InventoryItemConsumeError> {
|
||||||
enum RemoveMethod {
|
enum RemoveMethod {
|
||||||
EntireThing(ConsumedItem),
|
EntireThing(ConsumedItem),
|
||||||
Partial(ItemDetail),
|
Partial(Tool),
|
||||||
}
|
}
|
||||||
|
|
||||||
let inventory_item = self.inventory.0.get(self.slot).ok_or(InventoryItemConsumeError::InconsistentState)?;
|
let inventory_item = self.inventory.0.get(self.slot).ok_or(InventoryItemConsumeError::InconsistentState)?;
|
||||||
let remove_method = match inventory_item {
|
let remove_method = match inventory_item {
|
||||||
InventoryItem::Individual(individual_inventory_item) => {
|
InventoryItem::Individual(individual_inventory_item) => {
|
||||||
RemoveMethod::EntireThing(ConsumedItem {
|
RemoveMethod::EntireThing(ConsumedItem::Individual(IndividualConsumedItem {
|
||||||
entity_ids: vec![individual_inventory_item.entity_id],
|
entity_ids: individual_inventory_item.entity_id,
|
||||||
item: individual_inventory_item.item.clone()
|
item: individual_inventory_item.item.clone()
|
||||||
})
|
}))
|
||||||
},
|
},
|
||||||
InventoryItem::Stacked(stacked_inventory_item) => {
|
InventoryItem::Stacked(stacked_inventory_item) => {
|
||||||
match stacked_inventory_item.count().cmp(&amount) {
|
match stacked_inventory_item.count().cmp(&amount) {
|
||||||
Ordering::Equal => {
|
Ordering::Equal => {
|
||||||
RemoveMethod::EntireThing(ConsumedItem {
|
RemoveMethod::EntireThing(ConsumedItem::Stacked(StackedConsumedItem {
|
||||||
entity_ids: stacked_inventory_item.entity_ids.clone(),
|
entity_ids: stacked_inventory_item.entity_ids.clone(),
|
||||||
item: ItemDetail::Tool(stacked_inventory_item.tool),
|
tool: stacked_inventory_item.tool,
|
||||||
})
|
}))
|
||||||
},
|
},
|
||||||
Ordering::Greater => {
|
Ordering::Greater => {
|
||||||
RemoveMethod::Partial(ItemDetail::Tool(stacked_inventory_item.tool))
|
RemoveMethod::Partial(stacked_inventory_item.tool)
|
||||||
},
|
},
|
||||||
Ordering::Less => {
|
Ordering::Less => {
|
||||||
return Err(InventoryItemConsumeError::InvalidAmount)
|
return Err(InventoryItemConsumeError::InvalidAmount)
|
||||||
@ -219,7 +243,7 @@ impl<'a> InventoryItemHandle<'a> {
|
|||||||
self.inventory.0.remove(self.slot);
|
self.inventory.0.remove(self.slot);
|
||||||
Ok(consumed_item)
|
Ok(consumed_item)
|
||||||
},
|
},
|
||||||
RemoveMethod::Partial(item_detail) => {
|
RemoveMethod::Partial(tool) => {
|
||||||
let entity_ids = self.inventory.0.get_mut(self.slot)
|
let entity_ids = self.inventory.0.get_mut(self.slot)
|
||||||
.and_then(|item| {
|
.and_then(|item| {
|
||||||
if let InventoryItem::Stacked(stacked_inventory_item) = item {
|
if let InventoryItem::Stacked(stacked_inventory_item) = item {
|
||||||
@ -230,10 +254,10 @@ impl<'a> InventoryItemHandle<'a> {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
.ok_or(InventoryItemConsumeError::InvalidAmount)?;
|
.ok_or(InventoryItemConsumeError::InvalidAmount)?;
|
||||||
Ok(ConsumedItem {
|
Ok(ConsumedItem::Stacked(StackedConsumedItem {
|
||||||
entity_ids: entity_ids,
|
entity_ids: entity_ids,
|
||||||
item: item_detail,
|
tool: tool,
|
||||||
})
|
}))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -501,7 +501,7 @@ impl ItemManager {
|
|||||||
let used_item = inventory.get_item_handle_by_id(item_id).ok_or(ItemManagerError::NoSuchItemId(item_id))?;
|
let used_item = inventory.get_item_handle_by_id(item_id).ok_or(ItemManagerError::NoSuchItemId(item_id))?;
|
||||||
let consumed_item = used_item.consume(amount)?;
|
let consumed_item = used_item.consume(amount)?;
|
||||||
|
|
||||||
for entity_id in consumed_item.entity_ids {
|
for entity_id in consumed_item.entity_ids() {
|
||||||
entity_gateway.change_item_location(&entity_id,
|
entity_gateway.change_item_location(&entity_id,
|
||||||
ItemLocation::Consumed).await;
|
ItemLocation::Consumed).await;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user