use crate::context::ResourceContext;
use async_trait::async_trait;
use super::types::*;
#[async_trait]
pub trait TerritoryHook: Send + Sync {
async fn on_control_changed(
&self,
_territory: &Territory,
_change: &ControlChanged,
_resources: &mut ResourceContext,
) {
}
async fn calculate_development_cost(
&self,
_territory: &Territory,
current_level: u32,
_resources: &ResourceContext,
) -> Result<i64, String> {
Ok(100 * (current_level + 1) as i64)
}
async fn on_developed(
&self,
_territory: &Territory,
_developed: &Developed,
_resources: &mut ResourceContext,
) {
}
async fn calculate_effects(
&self,
_territory: &Territory,
base_effects: TerritoryEffects,
_resources: &ResourceContext,
) -> TerritoryEffects {
base_effects
}
}
#[derive(Default, Debug, Clone, Copy)]
pub struct DefaultTerritoryHook;
#[async_trait]
impl TerritoryHook for DefaultTerritoryHook {
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_default_hook() {
let hook = DefaultTerritoryHook;
let mut resources = ResourceContext::new();
let territory = Territory::new("test", "Test Territory");
let change = ControlChanged {
id: TerritoryId::new("test"),
old_control: 0.5,
new_control: 0.7,
delta: 0.2,
};
hook.on_control_changed(&territory, &change, &mut resources)
.await;
let cost = hook
.calculate_development_cost(&territory, 0, &resources)
.await;
assert!(cost.is_ok());
assert_eq!(cost.unwrap(), 100);
let developed = Developed {
id: TerritoryId::new("test"),
old_level: 0,
new_level: 1,
};
hook.on_developed(&territory, &developed, &mut resources)
.await;
let effects = TerritoryEffects::default();
let result = hook
.calculate_effects(&territory, effects.clone(), &resources)
.await;
assert_eq!(result.income_multiplier, effects.income_multiplier);
}
#[tokio::test]
async fn test_default_development_cost_scaling() {
let hook = DefaultTerritoryHook;
let resources = ResourceContext::new();
let territory = Territory::new("test", "Test");
let cost = hook
.calculate_development_cost(&territory, 0, &resources)
.await
.unwrap();
assert_eq!(cost, 100);
let cost = hook
.calculate_development_cost(&territory, 3, &resources)
.await
.unwrap();
assert_eq!(cost, 400); }
}