veloren/common/src/comp/inventory/item.rs

134 lines
3.0 KiB
Rust
Raw Normal View History

2019-07-26 21:01:41 +00:00
use specs::{Component, FlaggedStorage};
use specs_idvs::IDVStorage;
2019-06-28 23:42:51 +00:00
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
2019-07-29 13:44:16 +00:00
pub enum Tool {
2019-06-28 23:42:51 +00:00
Daggers,
SwordShield,
Sword,
Axe,
Hammer,
Bow,
Staff,
}
2019-07-29 13:44:16 +00:00
impl Tool {
pub fn name(&self) -> &'static str {
match self {
Tool::Daggers => "daggers",
Tool::SwordShield => "sword and shield",
Tool::Sword => "sword",
Tool::Axe => "axe",
Tool::Hammer => "hammer",
Tool::Bow => "bow",
Tool::Staff => "staff",
}
}
}
pub const ALL_TOOLS: [Tool; 7] = [
Tool::Daggers,
Tool::SwordShield,
Tool::Sword,
Tool::Axe,
Tool::Hammer,
Tool::Bow,
Tool::Staff,
2019-06-28 23:42:51 +00:00
];
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Armor {
// TODO: Don't make armor be a body part. Wearing enemy's head is funny but also creepy thing to do.
Helmet,
2019-06-28 23:42:51 +00:00
Shoulders,
Chestplate,
Belt,
Gloves,
Pants,
Boots,
Back,
Tabard,
Gem,
Necklace,
}
2019-07-29 13:44:16 +00:00
impl Armor {
pub fn name(&self) -> &'static str {
match self {
Armor::Helmet => "helmet",
Armor::Shoulders => "shoulder pads",
Armor::Chestplate => "chestplate",
Armor::Belt => "belt",
Armor::Gloves => "gloves",
Armor::Pants => "pants",
Armor::Boots => "boots",
Armor::Back => "back",
Armor::Tabard => "tabard",
Armor::Gem => "gem",
Armor::Necklace => "necklace",
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ConsumptionEffect {
Health(i32),
Xp(i32),
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Item {
2019-07-29 13:44:16 +00:00
Tool {
kind: Tool,
damage: i32,
strength: i32,
},
Armor {
2019-07-25 22:52:28 +00:00
kind: Armor,
defense: i32,
health_bonus: i32,
},
2019-07-29 13:44:16 +00:00
Consumable {
effect: ConsumptionEffect,
},
Ingredient,
}
impl Item {
pub fn name(&self) -> &'static str {
match self {
Item::Tool { kind, .. } => kind.name(),
Item::Armor { kind, .. } => kind.name(),
Item::Consumable { .. } => "<consumable>",
Item::Ingredient => "<ingredient>",
}
}
pub fn category(&self) -> &'static str {
match self {
Item::Tool { .. } => "tool",
Item::Armor { .. } => "armour",
Item::Consumable { .. } => "consumable",
Item::Ingredient => "ingredient",
}
}
pub fn description(&self) -> String {
format!("{} ({})", self.name(), self.category())
}
}
2019-07-25 22:52:28 +00:00
impl Default for Item {
fn default() -> Self {
2019-07-29 13:44:16 +00:00
Item::Tool {
kind: Tool::Hammer,
2019-07-25 22:52:28 +00:00
damage: 0,
strength: 0,
}
}
}
impl Component for Item {
2019-07-26 21:01:41 +00:00
type Storage = FlaggedStorage<Self, IDVStorage<Self>>;
}