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            state: $state,
17            buf: $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_ms;
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;
56pub(crate) use auras::{
57    AuraBreakTrigger, add_aura_stack, apply_aura, apply_aura_with_duration,
58    apply_aura_with_rolling_multiplier, aura_key_for, aura_keys_for_application, aura_remaining_ms,
59    aura_stacks, aura_stacks_by_id, break_auras_on_actor, break_auras_without_telemetry,
60    break_stealth_if_active, bypass_aura_active, consume_aura, consume_aura_stack,
61    consume_aura_stack_by_id, consume_aura_stacks, drain_deferred_work, expire_aura,
62    expire_auras_on_actor, extend_aura, is_aura_active, reduce_aura, refresh_aura_projections,
63    refresh_aura_snapshot_multiplier, take_aura_stacks,
64};
65pub(crate) use auto_attack::{
66    apply_auto_attack_action_lifecycle, earliest_auto_attack_time, phase_auto_attacks_for,
67};
68pub(crate) use buffs::{
69    accumulate_actor_buffs, accumulate_buffs, active_form_combat_round_time_ms,
70    active_stance_mask_exception, active_targeting_value, base_optional_primary_spell_cost,
71    base_primary_spell_cost, current_haste_mult, current_mastery_points, current_rppm_scaling,
72    effective_cast_time_ms, effective_gcd_ms, effective_optional_spell_cost, effective_spell_cost,
73    sync_player_health_from_stamina, sync_spell_costs,
74};
75pub(crate) use casting::{
76    apply_cast_pushback, apply_movement_event, can_cast_while_moving, effective_spell_ids,
77    end_channel, interrupt_cast, set_gcd,
78};
79pub(crate) use channel::process_channel_tick_for;
80pub(crate) use cooldowns::{
81    check_recharge, grant_charges, mutate_cooldown, reduce_cooldown, reset_cooldown,
82    start_cooldown, start_cooldown_in_slot, sync_max_charges, sync_recharge_rates,
83};
84pub(crate) use damage_pipeline::{
85    DamageFlags, DamagePayload, IncomingDamage, ProfiledDamageDef, damage_flags_from_data,
86    deal_damage_ap, deal_damage_ap_at, deal_damage_base, deal_damage_def, deal_damage_sp,
87    deal_damage_sp_at, deal_effect_damage_ap, deal_effect_damage_ap_with_geometry,
88    deal_effect_damage_sp_with_geometry, deal_incoming_damage, deal_profiled_damage_def,
89    deal_profiled_damage_def_at, deal_resolved_damage, dynamic_base_powers,
90    resolve_spell_impact_flags,
91};
92pub(crate) use effects::{
93    EffectExecution, effect_range_is_hostile, execute_effect_range, execute_effect_range_for_actor,
94    execute_proc_effect_range_for_actor,
95};
96pub(crate) use ground_effects::{
97    ground_pulse_anchor, process_ground_pulse, resolve_ground_effect_damage,
98};
99pub(crate) use guardians::{
100    active_guardian_count, command_guardians, dismiss_guardians, extend_guardians,
101    guardian_combat_coordinates, process_guardian_action, process_guardian_expire, summon_guardian,
102};
103pub(crate) use healing_pipeline::{HealRequest, deal_heal};
104pub(crate) use health_thresholds::{
105    process_actor_health_change, process_health_threshold_application,
106};
107pub(crate) use mastery::{MasteryFn, no_crit_damage, no_damage_bonus};
108pub(crate) use periodic::{
109    fire_partial_tick_on_expiry_for, fire_partial_tick_on_expiry_without_target,
110    periodic_tick_target, process_single_aura_tick_for, reapply_if_flagged,
111};
112pub(crate) use pet_actions::{
113    begin_proc_heartbeat, ensure_initial_proc_heartbeat, ensure_recurring_proc_heartbeat,
114    gain_pet_resource, initialize_pet_actions, pet_stat_snapshot, process_pet_action,
115    refresh_pet_actions_after_aura_change, refresh_pet_stat_snapshots,
116};
117#[cfg(test)]
118pub(crate) use procs::fire_impact_procs;
119pub(crate) use procs::{
120    ResourceTelemetry, emit_resource, fire_aura_application_procs, fire_heartbeat_procs,
121    fire_spell_phase_procs, gain_hook_resource_with_procs, gain_resource_with_procs,
122};
123pub(crate) use resources::{
124    gain_resource_from, gain_secondary_resource_from, rune_time_to_regen,
125    secondary_spends_all_points, spell_health_cost, spend_all_secondary_resource,
126    spend_health_cost, spend_resource, spend_secondary_resource, sync_resource,
127};
128pub(crate) use spell_gates::{
129    ignores_aura_state, reset_spell_gates, set_spell_gate, synchronize_active_spell_gates,
130};