wowlab_engine_content/hooks/devourer_demon_hunter/
handler.rs1use 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#[derive(Debug)]
18pub(crate) struct DevourerHandler {
19 inner: CombatHandler,
20 starting_souls: i32,
21}
22
23impl DevourerHandler {
24 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}