1
0
Fork 0
roguelike-game/src/components.rs

546 lines
12 KiB
Rust

//! 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<Point> for Position {
fn from(p: Point) -> Self {
Position { x: p.x, y: p.y }
}
}
impl From<Position> 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<Point>,
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: ToString>(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<Point>,
}
#[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<i32>,
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<f32>,
pub proc_target: Option<String>,
}
#[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<Point>,
pub current_step: usize,
pub timer: f32,
}
#[derive(Component, Serialize, Deserialize, Clone)]
pub struct ParticleLifetime {
pub lifetime_ms: f32,
pub animation: Option<ParticleAnimation>,
}
#[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<String>,
}
#[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<Skill, i32>,
}
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<i32>,
pub attacks: Vec<NaturalAttack>,
}
#[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: ToString>(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<usize>,
}
#[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<String>,
}
#[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<i32>,
pub fitness: Option<i32>,
pub quickness: Option<i32>,
pub intelligence: Option<i32>,
}
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<KnownSpell>,
}
#[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<Point>,
}
#[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<SpecialAbility>,
}
#[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<SpecialAbility>,
}
#[derive(Component, Debug, ConvertSaveload, Clone)]
pub struct WantsToShoot {
pub target: Entity,
}