engine/rpg_components/src/components/character_status.rs

110 lines
2.6 KiB
Rust
Raw Normal View History

2024-08-23 11:22:09 +00:00
use std::time::Duration;
use anyhow::Result;
use engine::prelude::*;
use super::statistics::*;
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct CharacterStatus {
pub current_health: Health,
pub current_mana: Mana,
pub last_tick: Option<Duration>,
}
impl CharacterStatus {
pub fn new_full(stats: &Statistics) -> Self {
CharacterStatus {
current_health: stats.health,
current_mana: stats.mana,
last_tick: None,
}
}
pub fn regen_tick(&mut self, stats: &Statistics) {
if !self.is_dead() {
self.add_health(stats.health_regeneration.raw(), stats);
self.add_mana(stats.mana_regeneration.raw(), stats);
}
}
pub fn use_ability(&mut self, cost: f32) -> bool {
self.use_mana(cost)
}
pub fn add_health(&mut self, health: impl Into<Health>, stats: &Statistics) {
let health_bonus = health.into();
self.current_health = if self.current_health + health_bonus > stats.health {
stats.health
} else {
self.current_health + health_bonus
}
}
pub fn add_mana(&mut self, mana: impl Into<Mana>, stats: &Statistics) {
let mana_bonus = mana.into();
self.current_mana = if self.current_mana + mana_bonus > stats.mana {
stats.mana
} else {
self.current_mana + mana_bonus
}
}
pub fn apply_damage(&mut self, cost: f32) -> bool {
self.reduce_health(cost)
}
// returns false if there isn't enough mana left, otherwise true
fn use_mana(&mut self, mana: impl Into<Mana>) -> bool {
let mana = mana.into();
if mana > self.current_mana {
return false;
}
self.current_mana = self.current_mana - mana;
true
}
// returns false if there isn't enough health present
fn reduce_health(&mut self, health: impl Into<Health>) -> bool {
let health = health.into();
if health > self.current_health {
self.current_health = Health::from(0.0);
return false;
}
self.current_health = self.current_health - health;
true
}
pub fn is_dead(&self) -> bool {
self.current_health == Health::from(0.0)
}
}
impl EntityComponent for CharacterStatus {
2025-02-28 07:39:15 +00:00
fn enable(&mut self, _world: &mut World) -> Result<()> {
2024-08-23 11:22:09 +00:00
self.last_tick = None;
Ok(())
}
fn name(&self) -> &str {
Self::debug_name()
}
}
impl ComponentDebug for CharacterStatus {
fn debug_name() -> &'static str {
"CharacterStatus"
}
}