Skip to main content

wowlab_engine_content/hooks/devourer_demon_hunter/
handler.rs

1use wowlab_engine_combat::ResourceOps as _;
2use wowlab_engine_combat::AuraOps as _;
3use wowlab_engine_combat::CombatHandler;
4use wowlab_engine_domain::dbc::ResolvedGameDataEffectExt as _;
5use wowlab_engine_ports::{HandlerParams, SimContext};
6
7
8use crate::generated::specs::devourer_demon_hunter::{
9    AURA_FOCUSED_RAY, AURA_SOUL_FRAGMENTS, AURA_VOID_METAMORPHOSIS_STACK, EFFECT,
10};
11
12use super::config::register_devourer;
13
14const PRECOMBAT_CONSUME_FURY: f64 = 8.0;
15
16/// Devourer Demon Hunter combat handler.
17#[derive(Debug)]
18pub(crate) struct DevourerHandler {
19    inner: CombatHandler,
20    starting_souls: i32,
21}
22
23impl DevourerHandler {
24    /// Finishes the specialization handler from the shared-content composition stage.
25    pub(crate) fn try_new(
26        parts: crate::composition::ContentHandlerParts,
27        params: &HandlerParams<'_>,
28    ) -> Result<Self, wowlab_engine_ports::EngineError> {
29        let mut parts = parts;
30        let built = parts.draft_mut();
31
32        register_devourer(built, params)?;
33
34        let built = parts.finalize()?;
35
36        let starting_souls = wowlab_types::numeric::f64_to_i32_saturating_trunc(
37            params.game_data.effect_base_points(EFFECT::ENTROPY_STARTING_SOULS),
38        );
39
40        Ok(Self {
41            inner: CombatHandler::from_built(built),
42            starting_souls,
43        })
44    }
45}
46
47crate::hooks::define_spec_handler! {
48impl DevourerHandler(self, inner) {
49    fn on_sim_start(&mut self, ctx: &mut SimContext) {
50        self.inner.on_sim_start(ctx);
51
52        let starting_souls = self.starting_souls;
53
54        self.inner.with_hook_ctx(&mut *ctx.telemetry, wowlab_engine_combat::HookCtxRequest::targetless(wowlab_types::sim::SimTime::ZERO), |pre| {
55            pre.apply_aura(AURA_FOCUSED_RAY);
56            pre.apply_aura_n(AURA_VOID_METAMORPHOSIS_STACK, starting_souls);
57            pre.gain_resource(PRECOMBAT_CONSUME_FURY);
58            pre.apply_aura(AURA_SOUL_FRAGMENTS);
59            pre.apply_aura(AURA_VOID_METAMORPHOSIS_STACK);
60        });
61    }
62
63}
64}