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