use super::types::MaterialType;
use crate::resources::Resource;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EntropyConfig {
pub global_decay_multiplier: f32,
pub auto_destroy_on_zero: bool,
pub max_decay_events: usize,
pub environment_modifiers: EnvironmentModifiers,
}
impl Default for EntropyConfig {
fn default() -> Self {
Self {
global_decay_multiplier: 1.0,
auto_destroy_on_zero: true,
max_decay_events: 1000,
environment_modifiers: EnvironmentModifiers::default(),
}
}
}
impl Resource for EntropyConfig {}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EnvironmentModifiers {
pub humidity_factors: HashMap<MaterialType, f32>,
pub pollution_factors: HashMap<MaterialType, f32>,
pub temperature_factors: HashMap<MaterialType, f32>,
}
impl Default for EnvironmentModifiers {
fn default() -> Self {
let mut humidity_factors = HashMap::new();
humidity_factors.insert(MaterialType::Organic, 0.5); humidity_factors.insert(MaterialType::Metal, 0.3); humidity_factors.insert(MaterialType::Electronic, 0.4); humidity_factors.insert(MaterialType::Plastic, 0.05); humidity_factors.insert(MaterialType::Stone, 0.01);
let mut pollution_factors = HashMap::new();
pollution_factors.insert(MaterialType::Organic, 0.2); pollution_factors.insert(MaterialType::Metal, 0.4); pollution_factors.insert(MaterialType::Electronic, 0.3); pollution_factors.insert(MaterialType::Plastic, 0.1); pollution_factors.insert(MaterialType::Stone, 0.05);
Self {
humidity_factors,
pollution_factors,
temperature_factors: HashMap::new(),
}
}
}
impl EnvironmentModifiers {
pub fn humidity_factor(&self, material: &MaterialType) -> f32 {
self.humidity_factors.get(material).copied().unwrap_or(0.1)
}
pub fn pollution_factor(&self, material: &MaterialType) -> f32 {
self.pollution_factors.get(material).copied().unwrap_or(0.1)
}
pub fn temperature_factor(&self, material: &MaterialType) -> f32 {
self.temperature_factors
.get(material)
.copied()
.unwrap_or(0.0)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_config() {
let config = EntropyConfig::default();
assert_eq!(config.global_decay_multiplier, 1.0);
assert!(config.auto_destroy_on_zero);
assert_eq!(config.max_decay_events, 1000);
}
#[test]
fn test_environment_modifiers() {
let modifiers = EnvironmentModifiers::default();
assert_eq!(modifiers.humidity_factor(&MaterialType::Organic), 0.5);
assert_eq!(modifiers.humidity_factor(&MaterialType::Stone), 0.01);
assert_eq!(
modifiers.humidity_factor(&MaterialType::Custom("unknown".to_string())),
0.1
);
}
}