wowlab_engine_combat/systems/cooldowns/
categories.rs1use 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}