Skip to main content

wowlab_engine_combat/systems/
mod.rs

1//! Combat system functions operating on [`crate::context::CombatCtx`] and typed buffer accessors.
2
3#[cfg(test)]
4macro_rules! process_single_aura_tick_fixture {
5    (
6        $state:expr,
7        $buf:expr,
8        $aura_id:expr,
9        $source:expr,
10        $target:expr,
11        $now:expr,
12        $rng:expr,
13        $sink:expr $(,)?
14    ) => {{
15        let mut ctx = $crate::CombatCtx {
16            program: $state,
17            instance: $buf,
18            sink: $sink,
19            now: $now,
20            rng: $rng,
21            source: $source,
22            target: $target,
23        };
24
25        $crate::systems::periodic::process_single_aura_tick_fixture(&mut ctx, $aura_id);
26    }};
27}
28#[cfg(test)]
29pub(crate) use process_single_aura_tick_fixture;
30
31mod absorbs;
32mod aoe;
33mod async_stacks;
34pub(crate) mod auras;
35mod auto_attack;
36pub(crate) mod buffs;
37pub(crate) use buffs::effective_periodic_interval_for_action;
38mod casting;
39pub(crate) mod channel;
40mod cooldowns;
41pub(crate) mod damage_pipeline;
42mod effects;
43mod ground_effects;
44mod guardians;
45mod healing_pipeline;
46mod health_thresholds;
47pub(crate) mod mastery;
48pub(crate) mod periodic;
49mod pet_actions;
50mod procs;
51pub(crate) use procs::{attempt_weapon_enchants, weapon_enchants_on_player_impact};
52pub(crate) mod resources;
53pub(crate) mod spell_gates;
54
55pub(crate) use async_stacks::expire_async_stacks_due;
56#[cfg(test)]
57pub(crate) use auras::aura_stacks_by_id;
58pub(crate) use auras::{
59    AuraBreakTrigger, add_aura_stack, apply_aura, apply_aura_with_duration,
60    apply_aura_with_rolling_multiplier, aura_key_for, aura_keys_for_application, aura_remaining_ms,
61    aura_stacks, break_auras_on_actor, break_auras_without_telemetry, break_stealth_if_active,
62    consume_aura, consume_aura_stack, consume_aura_stacks, drain_deferred_work, expire_aura,
63    expire_auras_on_actor, extend_aura, is_aura_active, reduce_aura, refresh_all_aura_projections,
64    refresh_aura_snapshot_multiplier, refresh_aura_time_rates_for,
65};
66pub(crate) use auto_attack::{
67    apply_auto_attack_action_lifecycle, earliest_auto_attack_time, phase_auto_attacks_for,
68    reproject_pet_auto_attack_speeds, reproject_player_auto_attack_speeds,
69};
70pub(crate) use buffs::{
71    active_form_combat_round_time_ms, active_targeting_value, actor_buff_totals,
72    base_optional_primary_spell_cost, base_primary_spell_cost, buff_totals, current_haste_mult,
73    current_mastery_points, current_rppm_scaling, effective_cast_time_ms, effective_gcd_ms,
74    effective_optional_spell_cost, effective_spell_cost, initialize_all_spell_costs,
75    refresh_spell_costs_for, sync_player_health_from_stamina,
76};
77#[cfg(test)]
78pub(crate) use casting::set_gcd;
79pub(crate) use casting::{
80    apply_cast_pushback, apply_movement_event, can_cast_while_moving, end_channel, interrupt_cast,
81    set_gcd_for_candidate,
82};
83pub(crate) use channel::process_channel_tick_for;
84pub(crate) use cooldowns::{
85    check_recharge, grant_charges, mutate_cooldown, reduce_cooldown, refresh_maximum_charges_for,
86    refresh_recharge_rates_for, reset_cooldown, reset_cooldown_for_lifecycle, start_cooldown,
87    start_cooldown_in_slot,
88};
89#[cfg(feature = "rotation-optimizations")]
90pub(crate) use cooldowns::{initialize_cooldown_projections, reset_cooldown_projections};
91pub(crate) use damage_pipeline::{
92    DamageFlags, DamagePayload, IncomingDamage, ProfiledDamageDef, damage_flags_from_binding,
93    damage_flags_from_data, damage_flags_from_local, deal_bound_damage_ap, deal_bound_damage_sp,
94    deal_bound_effect_damage_ap_with_geometry, deal_bound_profiled_damage_def,
95    deal_bound_resolved_damage, deal_damage_ap_at, deal_damage_base, deal_damage_def,
96    deal_damage_sp_at, deal_effect_damage_ap, deal_effect_damage_sp_with_geometry,
97    deal_incoming_damage, deal_profiled_damage_def_at, dynamic_base_powers,
98    resolve_spell_impact_flags,
99};
100pub(crate) use effects::{
101    EffectExecution, effect_range_is_hostile, execute_effect_range, execute_effect_range_for_actor,
102    execute_proc_effect_range_for_actor,
103};
104pub(crate) use ground_effects::{ground_pulse_anchor, process_ground_pulse};
105pub(crate) use guardians::{
106    active_guardian_count, command_guardians, dismiss_guardians, extend_guardians,
107    guardian_combat_coordinates, process_guardian_action, process_guardian_expire,
108    reproject_guardian_action_speeds, summon_guardian,
109};
110pub(crate) use healing_pipeline::{HealRequest, deal_heal};
111pub(crate) use health_thresholds::{
112    process_actor_health_change, process_health_threshold_application,
113};
114pub(crate) use mastery::{MasteryFn, no_crit_damage, no_damage_bonus};
115pub(crate) use periodic::{
116    fire_partial_tick_on_expiry_for, fire_partial_tick_on_expiry_without_target,
117    periodic_tick_target, process_single_aura_tick_for, reapply_if_flagged,
118};
119pub(crate) use pet_actions::{
120    begin_proc_heartbeat, ensure_initial_proc_heartbeat, ensure_recurring_proc_heartbeat,
121    gain_pet_resource, initialize_pet_actions, pet_stat_snapshot, process_pet_action,
122    refresh_pet_actions_after_aura_change, refresh_pet_stat_snapshots,
123};
124#[cfg(test)]
125pub(crate) use procs::fire_impact_procs;
126pub(crate) use procs::{
127    ResourceTelemetry, emit_resource, fire_aura_application_procs, fire_heartbeat_procs,
128    fire_spell_phase_procs, gain_hook_resource_with_procs, gain_resource_with_procs,
129};
130pub(crate) use resources::{
131    gain_resource_from, gain_secondary_resource_from, refresh_primary_resource_projection,
132    rune_time_to_regen, secondary_spends_all_points, spell_health_cost,
133    spend_all_secondary_resource, spend_health_cost, spend_resource, spend_secondary_resource,
134    sync_resource,
135};
136pub(crate) use spell_gates::{refresh_spell_gates_for, reset_spell_gates, set_spell_gate};