use crate::utils::FrameSummaryC;
use std::any::Any;
use std::fmt;
use std::hash::{Hash, Hasher};
pub mod builtin;
pub trait SideEffectsMonitor {
fn check(&self, frame_data: &FrameSummaryC) -> SideEffectDeltasC;
fn as_any(&self) -> &dyn Any;
}
#[derive(Copy, Clone, Debug, Default)]
pub struct SideEffectDeltasC {
pub body_temp_bonus: f32,
pub heart_rate_bonus: f32,
pub top_pressure_bonus: f32,
pub bottom_pressure_bonus: f32,
pub food_level_bonus: f32,
pub water_level_bonus: f32,
pub stamina_bonus: f32,
pub oxygen_level_bonus: f32,
pub fatigue_bonus: f32
}
impl fmt::Display for SideEffectDeltasC {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Side Effect deltas")
}
}
impl Eq for SideEffectDeltasC { }
impl PartialEq for SideEffectDeltasC {
fn eq(&self, other: &Self) -> bool {
const EPS: f32 = 0.0001;
f32::abs(self.body_temp_bonus - other.body_temp_bonus) < EPS &&
f32::abs(self.heart_rate_bonus - other.heart_rate_bonus) < EPS &&
f32::abs(self.top_pressure_bonus - other.top_pressure_bonus) < EPS &&
f32::abs(self.bottom_pressure_bonus - other.bottom_pressure_bonus) < EPS &&
f32::abs(self.food_level_bonus - other.food_level_bonus) < EPS &&
f32::abs(self.water_level_bonus - other.water_level_bonus) < EPS &&
f32::abs(self.stamina_bonus - other.stamina_bonus) < EPS &&
f32::abs(self.oxygen_level_bonus - other.oxygen_level_bonus) < EPS &&
f32::abs(self.fatigue_bonus - other.fatigue_bonus) < EPS
}
}
impl Hash for SideEffectDeltasC {
fn hash<H: Hasher>(&self, state: &mut H) {
state.write_u32(self.body_temp_bonus as u32);
state.write_u32(self.heart_rate_bonus as u32);
state.write_u32(self.top_pressure_bonus as u32);
state.write_u32(self.bottom_pressure_bonus as u32);
state.write_u32(self.food_level_bonus as u32);
state.write_u32(self.water_level_bonus as u32);
state.write_u32(self.stamina_bonus as u32);
state.write_u32(self.oxygen_level_bonus as u32);
state.write_u32(self.fatigue_bonus as u32);
}
}