use crate::context::ResourceContext;
use async_trait::async_trait;
use super::events::LootSourceId;
use super::types::Rarity;
#[async_trait]
pub trait LootHook: Send + Sync {
async fn modify_drop_chance(
&self,
_source_id: &LootSourceId,
base_drop_rate: f32,
_resources: &ResourceContext,
) -> f32 {
base_drop_rate
}
async fn generate_loot(
&self,
_source_id: &LootSourceId,
_rarity: Rarity,
_resources: &ResourceContext,
) -> Vec<String> {
Vec::new()
}
async fn on_loot_generated(
&self,
_source_id: &LootSourceId,
_items: &[String],
_rarity: Rarity,
_resources: &mut ResourceContext,
) {
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct DefaultLootHook;
#[async_trait]
impl LootHook for DefaultLootHook {
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_default_hook_does_nothing() {
let hook = DefaultLootHook;
let source_id = "enemy_1".to_string();
let resources = ResourceContext::new();
let drop_rate = hook.modify_drop_chance(&source_id, 0.5, &resources).await;
assert_eq!(drop_rate, 0.5);
let items = hook
.generate_loot(&source_id, Rarity::Common, &resources)
.await;
assert!(items.is_empty());
let mut resources = ResourceContext::new();
hook.on_loot_generated(&source_id, &[], Rarity::Common, &mut resources)
.await;
}
}