2020-04-04 05:40:00 +00:00
|
|
|
use super::item_imgs::{ItemImgs, ItemKey};
|
2020-04-06 15:25:45 +00:00
|
|
|
use crate::ui::slot::{self, SlotKey, SumSlot};
|
2020-04-04 17:51:41 +00:00
|
|
|
use common::comp::{item::ItemKind, Inventory, Loadout};
|
2020-04-04 05:40:00 +00:00
|
|
|
use conrod_core::image;
|
|
|
|
|
2020-04-10 02:36:35 +00:00
|
|
|
pub use common::comp::slot::{ArmorSlot, EquipSlot};
|
|
|
|
|
2020-04-04 05:40:00 +00:00
|
|
|
#[derive(Clone, Copy, PartialEq)]
|
2020-04-06 15:25:45 +00:00
|
|
|
pub enum SlotKind {
|
2020-04-04 05:40:00 +00:00
|
|
|
Inventory(InventorySlot),
|
2020-04-10 02:36:35 +00:00
|
|
|
Equip(EquipSlot),
|
2020-04-06 15:25:45 +00:00
|
|
|
/*Hotbar(HotbarSlot),
|
|
|
|
*Spellbook(SpellbookSlot), TODO */
|
2020-04-04 05:40:00 +00:00
|
|
|
}
|
|
|
|
|
2020-04-06 15:25:45 +00:00
|
|
|
pub type SlotManager = slot::SlotManager<SlotKind>;
|
2020-04-04 05:40:00 +00:00
|
|
|
|
|
|
|
#[derive(Clone, Copy, PartialEq)]
|
|
|
|
pub struct InventorySlot(pub usize);
|
|
|
|
|
2020-04-06 15:25:45 +00:00
|
|
|
/*#[derive(Clone, Copy, PartialEq)]
|
2020-04-04 05:40:00 +00:00
|
|
|
pub enum HotbarSlot {
|
|
|
|
One,
|
|
|
|
Two,
|
|
|
|
Three,
|
|
|
|
Four,
|
|
|
|
Five,
|
|
|
|
Six,
|
|
|
|
Seven,
|
|
|
|
Eight,
|
|
|
|
Nine,
|
|
|
|
Ten,
|
2020-04-06 15:25:45 +00:00
|
|
|
}*/
|
2020-04-04 05:40:00 +00:00
|
|
|
|
2020-04-06 15:25:45 +00:00
|
|
|
impl SlotKey<Inventory, ItemImgs> for InventorySlot {
|
2020-04-04 05:40:00 +00:00
|
|
|
type ImageKey = ItemKey;
|
|
|
|
|
2020-04-06 15:25:45 +00:00
|
|
|
fn image_key(&self, source: &Inventory) -> Option<Self::ImageKey> {
|
2020-04-04 05:40:00 +00:00
|
|
|
source.get(self.0).map(Into::into)
|
|
|
|
}
|
|
|
|
|
2020-04-06 15:25:45 +00:00
|
|
|
fn amount(&self, source: &Inventory) -> Option<u32> {
|
2020-04-04 05:40:00 +00:00
|
|
|
source
|
|
|
|
.get(self.0)
|
|
|
|
.and_then(|item| match item.kind {
|
2020-04-10 02:36:35 +00:00
|
|
|
ItemKind::Tool { .. } | ItemKind::Lantern(_) | ItemKind::Armor { .. } => None,
|
2020-04-04 05:40:00 +00:00
|
|
|
ItemKind::Utility { amount, .. }
|
|
|
|
| ItemKind::Consumable { amount, .. }
|
|
|
|
| ItemKind::Ingredient { amount, .. } => Some(amount),
|
|
|
|
})
|
|
|
|
.filter(|amount| *amount > 1)
|
|
|
|
}
|
|
|
|
|
2020-04-06 15:25:45 +00:00
|
|
|
fn image_id(key: &Self::ImageKey, source: &ItemImgs) -> image::Id {
|
2020-04-04 05:40:00 +00:00
|
|
|
source.img_id_or_not_found_img(key.clone())
|
|
|
|
}
|
2020-04-04 17:51:41 +00:00
|
|
|
}
|
|
|
|
|
2020-04-10 02:36:35 +00:00
|
|
|
impl SlotKey<Loadout, ItemImgs> for EquipSlot {
|
2020-04-04 17:51:41 +00:00
|
|
|
type ImageKey = ItemKey;
|
|
|
|
|
2020-04-06 15:25:45 +00:00
|
|
|
fn image_key(&self, source: &Loadout) -> Option<Self::ImageKey> {
|
2020-04-04 17:51:41 +00:00
|
|
|
let item = match self {
|
2020-04-10 02:36:35 +00:00
|
|
|
EquipSlot::Armor(ArmorSlot::Shoulders) => source.shoulder.as_ref(),
|
|
|
|
EquipSlot::Armor(ArmorSlot::Chest) => source.chest.as_ref(),
|
|
|
|
EquipSlot::Armor(ArmorSlot::Belt) => source.belt.as_ref(),
|
|
|
|
EquipSlot::Armor(ArmorSlot::Hands) => source.hand.as_ref(),
|
|
|
|
EquipSlot::Armor(ArmorSlot::Legs) => source.pants.as_ref(),
|
|
|
|
EquipSlot::Armor(ArmorSlot::Feet) => source.foot.as_ref(),
|
|
|
|
EquipSlot::Armor(ArmorSlot::Back) => source.back.as_ref(),
|
|
|
|
EquipSlot::Armor(ArmorSlot::Ring) => source.ring.as_ref(),
|
|
|
|
EquipSlot::Armor(ArmorSlot::Neck) => source.neck.as_ref(),
|
|
|
|
EquipSlot::Armor(ArmorSlot::Head) => source.head.as_ref(),
|
|
|
|
EquipSlot::Armor(ArmorSlot::Tabard) => source.tabard.as_ref(),
|
|
|
|
EquipSlot::Mainhand => source.active_item.as_ref().map(|i| &i.item),
|
|
|
|
EquipSlot::Offhand => source.second_item.as_ref().map(|i| &i.item),
|
|
|
|
EquipSlot::Lantern => source.lantern.as_ref(),
|
2020-04-04 17:51:41 +00:00
|
|
|
};
|
2020-04-04 05:40:00 +00:00
|
|
|
|
2020-04-04 17:51:41 +00:00
|
|
|
item.map(Into::into)
|
|
|
|
}
|
|
|
|
|
2020-04-06 15:25:45 +00:00
|
|
|
fn amount(&self, _: &Loadout) -> Option<u32> { None }
|
2020-04-04 17:51:41 +00:00
|
|
|
|
2020-04-06 15:25:45 +00:00
|
|
|
fn image_id(key: &Self::ImageKey, source: &ItemImgs) -> image::Id {
|
2020-04-04 17:51:41 +00:00
|
|
|
source.img_id_or_not_found_img(key.clone())
|
|
|
|
}
|
2020-04-04 05:40:00 +00:00
|
|
|
}
|
|
|
|
|
2020-04-06 15:25:45 +00:00
|
|
|
/*impl SlotKey<Hotbar, ItemImgs> for HotbarSlot {
|
|
|
|
type ImageKey = ItemKey;
|
|
|
|
|
|
|
|
fn image_key(&self, source: &Inventory) -> Option<Self::ImageKey> {
|
|
|
|
source.get(self.0).map(Into::into)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn amount(&self, source: &Inventory) -> Option<u32> {
|
|
|
|
source
|
|
|
|
.get(self.0)
|
|
|
|
.and_then(|item| match item.kind {
|
|
|
|
ItemKind::Tool { .. } | ItemKind::Armor { .. } => None,
|
|
|
|
ItemKind::Utility { amount, .. }
|
|
|
|
| ItemKind::Consumable { amount, .. }
|
|
|
|
| ItemKind::Ingredient { amount, .. } => Some(amount),
|
|
|
|
})
|
|
|
|
.filter(|amount| *amount > 1)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn image_id(key: &Self::ImageKey, source: &ItemImgs) -> image::Id {
|
|
|
|
source.img_id_or_not_found_img(key.clone())
|
|
|
|
}
|
|
|
|
}*/
|
|
|
|
|
|
|
|
impl From<InventorySlot> for SlotKind {
|
2020-04-04 05:40:00 +00:00
|
|
|
fn from(inventory: InventorySlot) -> Self { Self::Inventory(inventory) }
|
|
|
|
}
|
|
|
|
|
2020-04-10 02:36:35 +00:00
|
|
|
impl From<EquipSlot> for SlotKind {
|
|
|
|
fn from(equip: EquipSlot) -> Self { Self::Equip(equip) }
|
2020-04-04 05:40:00 +00:00
|
|
|
}
|
|
|
|
|
2020-04-06 15:25:45 +00:00
|
|
|
//impl From<HotbarSlot> for SlotKind {
|
|
|
|
// fn from(hotbar: HotbarSlot) -> Self { Self::Hotbar(hotbar) }
|
|
|
|
//}
|
2020-04-04 05:40:00 +00:00
|
|
|
|
2020-04-06 15:25:45 +00:00
|
|
|
impl SumSlot for SlotKind {}
|