Skip to main content

wowlab_engine_content/hooks/beast_mastery_hunter/
config.rs

1use wowlab_engine_combat::{
2    BuffEffect, BuiltCombatSystem, DamageEffectRef, DamageReplication, DamageSource,
3};
4use wowlab_engine_domain::dbc::ResolvedGameDataEffectExt as _;
5use wowlab_engine_ports::HandlerParams;
6use wowlab_types::{constants::HUNDRED};
7
8use crate::generated::specs::beast_mastery_hunter::{AURA_BEAST_CLEAVE, EFFECT};
9
10fn target_count(value: f64) -> Result<u8, wowlab_engine_ports::EngineError> {
11    if !value.is_finite()
12        || value < 0.0
13        || value > f64::from(u8::MAX)
14        || value.fract().abs() > f64::EPSILON
15    {
16        return Err(wowlab_engine_ports::EngineError::spec_construction(
17            "Beast Cleave reduced-target count must be an integer from 0 through 255",
18        ));
19    }
20
21    Ok(wowlab_types::numeric::f64_to_u8_saturating_trunc(value))
22}
23
24pub(super) fn register_beast_cleave(
25    built: &mut BuiltCombatSystem,
26    params: &HandlerParams<'_>,
27) -> Result<(), wowlab_engine_ports::EngineError> {
28    let data = &params.game_data;
29    let fraction = data.require_effect_base_points(EFFECT::BEAST_CLEAVE_FRACTION)? / HUNDRED;
30    let reduced_targets =
31        target_count(data.require_effect_base_points(EFFECT::BEAST_CLEAVE_REDUCED_TARGETS)?)?;
32
33    built.set_aura_effect(
34        AURA_BEAST_CLEAVE,
35        BuffEffect::DamageReplication(DamageReplication {
36            fraction,
37            effect: DamageEffectRef::new(
38                EFFECT::BEAST_CLEAVE_DAMAGE.0,
39                EFFECT::BEAST_CLEAVE_DAMAGE.1,
40            ),
41            source: DamageSource::Pet,
42            source_spells: &[],
43            include_magic: false,
44            include_indirect: false,
45            include_primary: false,
46            max_targets: 0,
47            reduced_targets,
48        }),
49    );
50
51    Ok(())
52}