steel_core/behavior/
consume_effect.rs1use std::ops::Deref;
4use std::sync::{Arc, OnceLock};
5
6use steel_registry::consume_effect::{ConsumeEffectData, ConsumeEffectTypeRef};
7use steel_registry::{REGISTRY, RegistryEntry, RegistryExt};
8
9use crate::entity::LivingEntity;
10use crate::entity::consume_effect::ConsumeEffectBehavior;
11use crate::world::World;
12
13struct NoopConsumeEffect;
16
17impl ConsumeEffectBehavior for NoopConsumeEffect {
18 fn apply(&self, _effect: &ConsumeEffectData, _world: &Arc<World>, _user: &dyn LivingEntity) {}
19}
20
21pub struct ConsumeEffectBehaviorLock(pub OnceLock<ConsumeEffectBehaviorRegistry>);
23
24impl Deref for ConsumeEffectBehaviorLock {
25 type Target = ConsumeEffectBehaviorRegistry;
26
27 fn deref(&self) -> &Self::Target {
28 self.0
29 .get()
30 .expect("Consume effect behaviors not initialized")
31 }
32}
33
34pub static CONSUME_EFFECT_BEHAVIORS: ConsumeEffectBehaviorLock =
39 ConsumeEffectBehaviorLock(OnceLock::new());
40
41pub struct ConsumeEffectBehaviorRegistry {
47 behaviors: Vec<Box<dyn ConsumeEffectBehavior>>,
48}
49
50impl ConsumeEffectBehaviorRegistry {
51 #[must_use]
53 pub fn new() -> Self {
54 let count = REGISTRY.consume_effect_types.len();
55 let mut behaviors: Vec<Box<dyn ConsumeEffectBehavior>> = Vec::with_capacity(count);
56
57 for _ in 0..count {
58 behaviors.push(Box::new(NoopConsumeEffect));
59 }
60
61 Self { behaviors }
62 }
63
64 pub fn set_behavior(
69 &mut self,
70 effect_type: ConsumeEffectTypeRef,
71 behavior: Box<dyn ConsumeEffectBehavior>,
72 ) {
73 self.behaviors[effect_type.id()] = behavior;
74 }
75
76 #[must_use]
81 pub fn get_behavior(&self, effect_type: ConsumeEffectTypeRef) -> &dyn ConsumeEffectBehavior {
82 self.behaviors[effect_type.id()].as_ref()
83 }
84}
85
86impl Default for ConsumeEffectBehaviorRegistry {
87 fn default() -> Self {
88 Self::new()
89 }
90}