//! The `C` in `ECS` mod enums; mod serialize; mod tags; use std::collections::HashMap; use ::bracket_lib::prelude::*; use ::serde::{Deserialize, Serialize}; use ::specs::error::NoError; use ::specs::prelude::*; use ::specs::saveload::{ConvertSaveload, Marker}; use ::specs_derive::*; pub use enums::*; pub use serialize::*; pub use tags::*; use crate::gamesystem::attr_bonus; #[derive(Component, ConvertSaveload, Default, Copy, Clone)] pub struct Position { pub x: i32, pub y: i32, } impl From<(i32, i32)> for Position { fn from(f: (i32, i32)) -> Self { let (x, y) = f; Position { x, y } } } impl From for Position { fn from(p: Point) -> Self { Position { x: p.x, y: p.y } } } impl From for Point { fn from(p: Position) -> Self { Point { x: p.x, y: p.y } } } #[derive(Component, ConvertSaveload, Clone)] pub struct Renderable { pub glyph: FontCharType, pub fg: RGB, pub bg: RGB, pub render_order: i32, } #[derive(Component, ConvertSaveload, Clone)] pub struct Viewshed { pub visible_tiles: Vec, pub range: i32, pub dirty: bool, } impl Default for Viewshed { fn default() -> Self { Viewshed { visible_tiles: Vec::new(), range: 8, dirty: true, } } } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct Name { pub name: String, } impl Name { pub fn from(s: S) -> Self { Name { name: s.to_string(), } } } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct WantsToMelee { pub target: Entity, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Item { pub initiative_penalty: f32, pub weight_lbs: f32, pub base_value: f32, } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct Ranged { pub range: i32, } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct InflictsDamage { pub damage: i32, } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct AreaOfEffect { pub radius: i32, } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct ProvidesHealing { pub heal_amount: i32, } #[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 WantsToUseItem { pub item: Entity, pub target: Option, } #[derive(Component, Debug, ConvertSaveload)] pub struct WantsToDropItem { pub item: Entity, } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct WantsToRemoveItem { pub item: Entity, } #[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, ConvertSaveload, Clone)] pub struct Weapon { pub range: Option, pub attribute: WeaponAttribute, pub damage_n_dice: i32, pub damage_die_type: i32, pub damage_bonus: i32, pub hit_bonus: i32, pub proc_chance: Option, pub proc_target: Option, } #[derive(Component, ConvertSaveload, Clone)] pub struct Wearable { pub armor_class: f32, pub slot: EquipmentSlot, } #[derive(Serialize, Deserialize, Clone)] pub struct ParticleAnimation { pub step_time: f32, pub path: Vec, pub current_step: usize, pub timer: f32, } #[derive(Component, Serialize, Deserialize, Clone)] pub struct ParticleLifetime { pub lifetime_ms: f32, pub animation: Option, } #[derive(Component, Serialize, Deserialize, Clone)] pub struct HungerClock { pub state: HungerState, pub duration: i32, } impl Default for HungerClock { fn default() -> Self { HungerClock { state: HungerState::WellFed, duration: 20, } } } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Door { pub open: bool, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Quips { pub available: Vec, } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct Attribute { pub base: i32, pub modifiers: i32, pub bonus: i32, } impl Attribute { pub fn new(base: i32) -> Self { Attribute { base, modifiers: 0, bonus: attr_bonus(base), } } } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Attributes { pub might: Attribute, pub fitness: Attribute, pub quickness: Attribute, pub intelligence: Attribute, } impl Attributes { pub fn new(base: i32) -> Self { Attributes { might: Attribute::new(base), fitness: Attribute::new(base), quickness: Attribute::new(base), intelligence: Attribute::new(base), } } } #[derive(Component, Debug, Default, Serialize, Deserialize, Clone)] pub struct Skills { pub skills: HashMap, } impl Skills { pub fn new(level: i32) -> Self { let mut skills = Skills::default(); skills.skills.insert(Skill::Melee, level); skills.skills.insert(Skill::Defense, level); skills.skills.insert(Skill::Magic, level); skills } } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct Pool { pub max: i32, pub current: i32, } impl Pool { pub fn new(default_value: i32) -> Pool { Pool { max: default_value, current: default_value, } } } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Pools { pub hit_points: Pool, pub mana: Pool, pub xp: i32, pub level: i32, pub total_weight: f32, pub total_initiative_penalty: f32, pub gold: f32, pub god_mode: bool, } impl Pools { pub fn player_pools() -> Self { use crate::gamesystem::{mana_at_level, player_hp_at_level}; Pools { hit_points: Pool::new(player_hp_at_level(11, 1)), mana: Pool::new(mana_at_level(11, 1)), xp: 0, level: 1, total_weight: 0., total_initiative_penalty: 0., gold: 0., god_mode: false, } } } #[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 NaturalAttackDefense { pub armor_class: Option, pub attacks: Vec, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct LootTable { pub table: String, } #[derive(Component, Serialize, Deserialize, Clone)] pub struct OtherLevelPosition { pub x: i32, pub y: i32, pub depth: i32, } #[derive(Component, Serialize, Deserialize, Clone)] pub struct LightSource { pub color: RGB, pub range: i32, } impl LightSource { pub fn torch_light() -> Self { LightSource { color: crate::colors::TORCH_LIGHT, range: 8, } } } #[derive(Component, Debug, Default, Serialize, Deserialize, Clone)] pub struct Initiative { pub current: i32, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Faction { pub name: String, } impl Faction { pub fn from(s: S) -> Self { Faction { name: s.to_string(), } } } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct WantsToApproach { pub idx: i32, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct WantsToFlee { pub indices: Vec, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct MoveMode { pub mode: Movement, } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct Chasing { pub target: Entity, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Vendor { pub categories: Vec, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct TeleportTo { pub x: i32, pub y: i32, pub depth: i32, pub player_only: bool, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct ApplyMove { pub dest_idx: usize, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct ApplyTeleport { pub dest_x: i32, pub dest_y: i32, pub dest_depth: i32, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct MagicItem { pub class: MagicItemClass, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct ObfuscatedName { pub name: String, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct IdentifiedItem { pub name: String, } #[derive(Component, Serialize, Deserialize, Clone)] pub struct SpawnParticleLine { pub glyph: FontCharType, pub color: RGB, pub lifetime_ms: f32, } #[derive(Component, Serialize, Deserialize, Clone)] pub struct SpawnParticleBurst { pub glyph: FontCharType, pub color: RGB, pub lifetime_ms: f32, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct AttributeBonus { pub might: Option, pub fitness: Option, pub quickness: Option, pub intelligence: Option, } impl AttributeBonus { pub fn hangover() -> Self { AttributeBonus { might: Some(-1), fitness: None, quickness: Some(-1), intelligence: Some(-1), } } } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Consumable { pub max_charges: i32, pub charges: i32, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Duration { pub turns: i32, } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct StatusEffect { pub target: Entity, } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct KnownSpell { pub display_name: String, pub mana_cost: i32, } #[derive(Component, Debug, Default, Serialize, Deserialize, Clone)] pub struct KnownSpells { pub spells: Vec, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct SpellTemplate { pub mana_cost: i32, } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct WantsToCastSpell { pub spell: Entity, pub target: Option, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct ProvidesMana { pub mana_amount: i32, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct TeachesSpell { pub spell: String, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Slow { pub initiative_penalty: f32, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct DamageOverTime { pub damage: i32, } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct SpecialAbility { pub spell: String, pub chance: f32, pub range: f32, pub min_range: f32, } #[derive(Component, Debug, Default, Serialize, Deserialize, Clone)] pub struct SpecialAbilities { pub abilities: Vec, } #[derive(Component, ConvertSaveload, Clone)] pub struct TileSize { pub x: i32, pub y: i32, } #[derive(Component, Debug, Default, Serialize, Deserialize, Clone)] pub struct OnDeath { pub abilities: Vec, } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct WantsToShoot { pub target: Entity, }