use rltk::RGB; use serde::{Deserialize, Serialize}; use specs::error::NoError; use specs::prelude::*; use specs::saveload::{ConvertSaveload, Marker}; use specs_derive::*; use std::collections::HashMap; // Serialization helper code. We need to implement ConvertSaveload for each type that contains an // Entity. pub struct SerializeMe; // Special component that exists to help serialize the game data #[derive(Component, Serialize, Deserialize, Clone)] pub struct SerializationHelper { pub map: super::map::Map, } #[derive(Component, Serialize, Deserialize, Clone)] pub struct DMSerializationHelper { pub map: super::map::MasterDungeonMap, pub log: Vec>, pub events: HashMap, } #[derive(Component, ConvertSaveload, Clone)] pub struct Position { pub x: i32, pub y: i32, } #[derive(Component, Serialize, Deserialize, Clone)] pub struct OtherLevelPosition { pub x: i32, pub y: i32, pub id: i32, } #[derive(Component, ConvertSaveload, Clone)] pub struct Renderable { pub glyph: rltk::FontCharType, pub fg: RGB, pub bg: RGB, pub render_order: i32, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Player {} #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Prop {} #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Monster {} #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct LootTable { pub table: String, pub chance: f32, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Energy { pub current: i32, pub speed: i32, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Clock {} #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct TakingTurn {} #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Bystander {} #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Quips { pub available: Vec, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Mind {} #[derive(Component, ConvertSaveload, Clone)] pub struct Viewshed { pub visible_tiles: Vec, pub range: i32, pub dirty: bool, } #[derive(Component, ConvertSaveload, Clone)] pub struct Telepath { pub telepath_tiles: Vec, pub range: i32, pub dirty: bool, } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct Name { pub name: String, pub plural: String, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct BlocksTile {} #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct BlocksVisibility {} #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Door { pub open: bool, } #[derive(Serialize, Deserialize, Copy, Clone, PartialEq)] pub enum HungerState { Satiated, Normal, Hungry, Weak, Fainting, } #[derive(Component, Serialize, Deserialize, Clone)] pub struct HungerClock { pub state: HungerState, pub duration: i32, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct ProvidesNutrition {} #[derive(Debug, Serialize, Deserialize, Clone)] pub struct Pool { pub max: i32, pub current: i32, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Pools { pub hit_points: Pool, pub mana: Pool, pub xp: i32, pub bac: i32, pub level: i32, pub weight: f32, pub god: bool, } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct Attribute { pub base: i32, pub modifiers: i32, pub bonus: i32, } #[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq, Hash)] pub enum Skill { Melee, Defence, Magic, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Skills { pub skills: HashMap, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Attributes { pub strength: Attribute, pub dexterity: Attribute, pub constitution: Attribute, pub intelligence: Attribute, pub wisdom: Attribute, pub charisma: Attribute, } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct WantsToMelee { pub target: Entity, } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct GrantsXP { pub amount: i32, } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct SufferDamage { pub amount: Vec<(i32, bool)>, } impl SufferDamage { pub fn new_damage(store: &mut WriteStorage, victim: Entity, amount: i32, from_player: bool) { if let Some(suffering) = store.get_mut(victim) { suffering.amount.push((amount, from_player)); } else { let dmg = SufferDamage { amount: vec![(amount, from_player)] }; store.insert(victim, dmg).expect("Unable to insert damage."); } } } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Item { pub weight: f32, // in lbs pub value: f32, // base } #[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq, Hash)] pub enum MagicItemClass { Common, Uncommon, Rare, VeryRare, Legendary, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct MagicItem { pub class: MagicItemClass, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct ObfuscatedName { pub name: String, pub plural: String, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct EquipmentChanged {} #[derive(PartialEq, Copy, Clone, Serialize, Deserialize)] pub enum BurdenLevel { Burdened, Strained, Overloaded, } #[derive(Component, Serialize, Deserialize, Clone)] pub struct Burden { pub level: BurdenLevel, } #[derive(PartialEq, Copy, Clone, Serialize, Deserialize)] pub enum EquipmentSlot { Melee, Shield, Head, Body, Hands, Feet, Neck, Back, } #[derive(PartialEq, Copy, Clone, Serialize, Deserialize)] pub enum WeaponAttribute { Strength, Dexterity, Finesse, } #[derive(Component, Serialize, Deserialize, Clone)] pub struct MeleeWeapon { pub attribute: WeaponAttribute, pub damage_n_dice: i32, pub damage_die_type: i32, pub damage_bonus: i32, pub hit_bonus: i32, } #[derive(Serialize, Deserialize, Clone)] pub struct NaturalAttack { pub name: String, pub damage_n_dice: i32, pub damage_die_type: i32, pub damage_bonus: i32, pub hit_bonus: i32, } #[derive(Component, Serialize, Deserialize, Clone)] pub struct NaturalAttacks { pub attacks: Vec, } #[derive(Component, ConvertSaveload, Clone)] pub struct ArmourClassBonus { pub amount: i32, } #[derive(Component, Serialize, Deserialize, Clone)] pub struct Equippable { pub slot: EquipmentSlot, } #[derive(Component, ConvertSaveload, Clone)] pub struct Equipped { pub owner: Entity, pub slot: EquipmentSlot, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Cursed {} #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct ProvidesHealing { pub amount: i32, } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct InflictsDamage { pub amount: i32, } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct Ranged { pub range: i32, } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct AOE { pub radius: i32, } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct Confusion { pub turns: i32, } #[derive(Component, Serialize, Deserialize, Clone)] pub struct MagicMapper {} #[derive(Component, Debug, ConvertSaveload)] pub struct InBackpack { pub owner: Entity, } #[derive(Component, Debug, ConvertSaveload)] pub struct WantsToPickupItem { pub collected_by: Entity, pub item: Entity, } #[derive(Component, Debug, ConvertSaveload)] pub struct WantsToDropItem { pub item: Entity, } #[derive(Component, Debug, ConvertSaveload)] pub struct WantsToRemoveItem { pub item: Entity, } #[derive(Component, Debug, ConvertSaveload)] pub struct WantsToUseItem { pub item: Entity, pub target: Option, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Consumable {} #[derive(Component, Debug, ConvertSaveload)] pub struct Wand { pub uses: i32, pub max_uses: i32, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Destructible {} #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Digger {} #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Hidden {} #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct SingleActivation {} #[derive(Component, Clone, ConvertSaveload)] pub struct ParticleLifetime { pub lifetime_ms: f32, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct EntryTrigger {} #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct EntityMoved {} #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct MultiAttack {}