Skip to main content

wowlab_engine_combat/systems/cooldowns/
categories.rs

1use super::{
2    CombatState, DenseBuffer, Event, LocalSpellIdx, SimTime, SpellData, project_members, spell_at,
3};
4
5pub(super) fn start_one_charge_category(
6    state: &mut CombatState,
7    buf: &mut DenseBuffer,
8    spell: &SpellData,
9    members: &[LocalSpellIdx],
10    recharge_ms: u32,
11    now: SimTime,
12) {
13    let Some(category) = spell
14        .cooldown
15        .charge_category
16        .filter(|_| !spell.is_charged())
17    else {
18        return;
19    };
20
21    if recharge_ms == 0 {
22        return;
23    }
24
25    let ready_at = state.runtime.pools.charge_category_ready_at.start_for(
26        category,
27        now,
28        SimTime::from_millis(recharge_ms),
29    );
30
31    for member in members.iter().copied() {
32        state.schedule(Event::CooldownReady {
33            t: ready_at,
34            cooldown_key: spell_at(state, member).idx(),
35        });
36    }
37
38    project_members(state, buf, members);
39}
40
41pub(super) fn start_regular_category(
42    state: &mut CombatState,
43    buf: &mut DenseBuffer,
44    spell: &SpellData,
45    category_cooldown_ms: u32,
46    now: SimTime,
47) {
48    let Some(category) = spell.cooldown.cooldown_category else {
49        return;
50    };
51
52    if category_cooldown_ms == 0 {
53        return;
54    }
55
56    let ready_at = state.runtime.pools.cooldown_category_ready_at.start_for(
57        category,
58        now,
59        SimTime::from_millis(category_cooldown_ms),
60    );
61    let members = state.index.cooldown_categories.members(&category).to_vec();
62
63    for member in members.iter().copied() {
64        state.schedule(Event::CooldownReady {
65            t: ready_at,
66            cooldown_key: spell_at(state, member).idx(),
67        });
68    }
69
70    project_members(state, buf, &members);
71}