2019-09-25 15:52:58 +00:00
|
|
|
use crate::{
|
2019-10-22 18:18:40 +00:00
|
|
|
assets::{self, Asset},
|
2019-09-25 15:52:58 +00:00
|
|
|
effect::Effect,
|
|
|
|
terrain::{Block, BlockKind},
|
|
|
|
};
|
2019-07-26 21:01:41 +00:00
|
|
|
use specs::{Component, FlaggedStorage};
|
2019-07-29 19:54:48 +00:00
|
|
|
use specs_idvs::IDVStorage;
|
2019-10-22 18:18:40 +00:00
|
|
|
use std::fs::File;
|
|
|
|
use std::io::BufReader;
|
2019-05-18 16:46:14 +00:00
|
|
|
|
2019-08-27 19:56:46 +00:00
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
|
2019-07-29 13:44:16 +00:00
|
|
|
pub enum Tool {
|
2019-10-09 19:28:05 +00:00
|
|
|
Dagger,
|
|
|
|
Shield,
|
2019-06-28 23:42:51 +00:00
|
|
|
Sword,
|
|
|
|
Axe,
|
|
|
|
Hammer,
|
|
|
|
Bow,
|
|
|
|
Staff,
|
2019-10-22 20:58:27 +00:00
|
|
|
Debug(Debug),
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
|
|
|
|
pub enum Debug {
|
|
|
|
Boost,
|
|
|
|
Possess,
|
2019-06-28 23:42:51 +00:00
|
|
|
}
|
2019-07-29 13:44:16 +00:00
|
|
|
|
2019-08-27 19:56:46 +00:00
|
|
|
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
|
2019-05-18 16:46:14 +00:00
|
|
|
pub enum Armor {
|
2019-10-09 19:28:05 +00:00
|
|
|
// TODO: Don't make armor be a body part. Wearing enemy's head is funny but also a creepy thing to do.
|
2019-06-28 08:24:13 +00:00
|
|
|
Helmet,
|
2019-06-28 23:42:51 +00:00
|
|
|
Shoulders,
|
|
|
|
Chestplate,
|
|
|
|
Belt,
|
|
|
|
Gloves,
|
|
|
|
Pants,
|
|
|
|
Boots,
|
2019-05-18 16:46:14 +00:00
|
|
|
Back,
|
|
|
|
Tabard,
|
|
|
|
Gem,
|
|
|
|
Necklace,
|
|
|
|
}
|
|
|
|
|
2019-09-25 14:56:57 +00:00
|
|
|
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
|
|
|
|
pub enum Consumable {
|
|
|
|
Apple,
|
|
|
|
Potion,
|
|
|
|
Mushroom,
|
2019-09-25 20:22:39 +00:00
|
|
|
Velorite,
|
2019-10-17 20:59:36 +00:00
|
|
|
VeloriteFrag,
|
2019-09-25 14:56:57 +00:00
|
|
|
}
|
|
|
|
|
2019-09-25 22:04:18 +00:00
|
|
|
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
|
|
|
|
pub enum Ingredient {
|
|
|
|
Flower,
|
|
|
|
Grass,
|
|
|
|
}
|
|
|
|
|
2019-08-30 20:42:43 +00:00
|
|
|
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
|
2019-10-22 18:18:40 +00:00
|
|
|
pub enum ItemKind {
|
|
|
|
Tool { kind: Tool, power: u32 },
|
|
|
|
Armor { kind: Armor, power: u32 },
|
|
|
|
Consumable { kind: Consumable, effect: Effect },
|
|
|
|
Ingredient(Ingredient),
|
2019-07-29 13:44:16 +00:00
|
|
|
}
|
|
|
|
|
2019-10-22 18:18:40 +00:00
|
|
|
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
|
|
|
|
pub struct Item {
|
|
|
|
name: String,
|
|
|
|
description: String,
|
|
|
|
pub kind: ItemKind,
|
|
|
|
}
|
2019-10-09 19:28:05 +00:00
|
|
|
|
2019-10-22 18:18:40 +00:00
|
|
|
impl Asset for Item {
|
|
|
|
const ENDINGS: &'static [&'static str] = &["ron"];
|
|
|
|
fn parse(buf_reader: BufReader<File>) -> Result<Self, assets::Error> {
|
|
|
|
Ok(ron::de::from_reader(buf_reader).unwrap())
|
2019-10-09 19:28:05 +00:00
|
|
|
}
|
2019-10-22 18:18:40 +00:00
|
|
|
}
|
2019-10-09 19:28:05 +00:00
|
|
|
|
2019-10-22 18:18:40 +00:00
|
|
|
impl Item {
|
|
|
|
pub fn name(&self) -> &str {
|
|
|
|
&self.name
|
2019-07-29 13:44:16 +00:00
|
|
|
}
|
2019-10-22 18:18:40 +00:00
|
|
|
pub fn description(&self) -> &str {
|
|
|
|
&self.description
|
2019-07-29 13:44:16 +00:00
|
|
|
}
|
2019-09-25 14:56:57 +00:00
|
|
|
pub fn try_reclaim_from_block(block: Block) -> Option<Self> {
|
|
|
|
match block.kind() {
|
2019-10-22 18:18:40 +00:00
|
|
|
BlockKind::Apple => Some(assets::load_expect_cloned("common.items.apple")),
|
|
|
|
BlockKind::Mushroom => Some(assets::load_expect_cloned("common.items.mushroom")),
|
|
|
|
BlockKind::Velorite => Some(assets::load_expect_cloned("common.items.velorite")),
|
|
|
|
BlockKind::BlueFlower => Some(assets::load_expect_cloned("common.items.flowers.blue")),
|
|
|
|
BlockKind::PinkFlower => Some(assets::load_expect_cloned("common.items.flowers.pink")),
|
|
|
|
BlockKind::PurpleFlower => {
|
|
|
|
Some(assets::load_expect_cloned("common.items.flowers.purple"))
|
|
|
|
}
|
|
|
|
BlockKind::RedFlower => Some(assets::load_expect_cloned("common.items.flowers.red")),
|
|
|
|
BlockKind::WhiteFlower => {
|
|
|
|
Some(assets::load_expect_cloned("common.items.flowers.white"))
|
|
|
|
}
|
|
|
|
BlockKind::YellowFlower => {
|
|
|
|
Some(assets::load_expect_cloned("common.items.flowers.yellow"))
|
|
|
|
}
|
|
|
|
BlockKind::Sunflower => Some(assets::load_expect_cloned("common.items.flowers.sun")),
|
|
|
|
BlockKind::LongGrass => Some(assets::load_expect_cloned("common.items.grasses.long")),
|
|
|
|
BlockKind::MediumGrass => {
|
|
|
|
Some(assets::load_expect_cloned("common.items.grasses.medium"))
|
|
|
|
}
|
|
|
|
BlockKind::ShortGrass => Some(assets::load_expect_cloned("common.items.grasses.short")),
|
2019-10-17 20:59:36 +00:00
|
|
|
BlockKind::Chest => Some(match rand::random::<usize>() % 4 {
|
2019-10-22 18:18:40 +00:00
|
|
|
0 => assets::load_expect_cloned("common.items.apple"),
|
|
|
|
1 => assets::load_expect_cloned("common.items.velorite"),
|
|
|
|
// TODO: Implement random asset loading
|
|
|
|
//2 => Item::Tool {
|
|
|
|
// kind: *(&ALL_TOOLS).choose(&mut rand::thread_rng()),
|
|
|
|
// power: 8 + rand::random::<u32>() % (rand::random::<u32>() % 29 + 1),
|
|
|
|
// stamina: 0,
|
|
|
|
// strength: 0,
|
|
|
|
// dexterity: 0,
|
|
|
|
// intelligence: 0,
|
|
|
|
//},
|
|
|
|
2 => assets::load_expect_cloned("common.items.apple"),
|
|
|
|
3 => assets::load_expect_cloned("common.items.veloritefrag"),
|
2019-10-09 19:28:05 +00:00
|
|
|
_ => unreachable!(),
|
|
|
|
}),
|
2019-09-25 14:56:57 +00:00
|
|
|
_ => None,
|
|
|
|
}
|
|
|
|
}
|
2019-07-25 22:52:28 +00:00
|
|
|
}
|
|
|
|
|
2019-05-18 16:46:14 +00:00
|
|
|
impl Component for Item {
|
2019-07-26 21:01:41 +00:00
|
|
|
type Storage = FlaggedStorage<Self, IDVStorage<Self>>;
|
2019-05-18 16:46:14 +00:00
|
|
|
}
|