1#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_domain::dbc::ProcAttributes;
6use wowlab_engine_combat::{
7 CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
8 LocalSpellIdx, SpellDefinitionDraft,
9};
10use wowlab_engine_ports::{
11 DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
12 DeclaredServerProcEntry,
13};
14use wowlab_engine_gamedata::ResolvedGameData;
15pub(crate) mod SPELL {
16 pub(crate) const MOONKIN_FORM: u32 = 24858;
18 pub(crate) const MARK_OF_THE_WILD: u32 = 1126;
20 pub(crate) const WRATH: u32 = 190_984;
22 pub(crate) const STARFIRE: u32 = 194_153;
24 pub(crate) const SOLAR_ECLIPSE: u32 = 1_233_346;
26 pub(crate) const CELESTIAL_ALIGNMENT: u32 = 194_223;
28 pub(crate) const INCARNATION_CHOSEN_OF_ELUNE: u32 = 102_560;
30 pub(crate) const MOONFIRE: u32 = 8921;
32 pub(crate) const SUNFIRE: u32 = 93402;
34 pub(crate) const STARSURGE: u32 = 78674;
36 pub(crate) const STARFALL: u32 = 191_034;
38 pub(crate) const NEW_MOON: u32 = 274_281;
40 pub(crate) const FURY_OF_ELUNE: u32 = 202_770;
42 pub(crate) const FORCE_OF_NATURE: u32 = 205_636;
44 pub(crate) const CONVOKE_THE_SPIRITS: u32 = 391_528;
46 pub(crate) const WILD_MUSHROOM: u32 = 88747;
48}
49pub(crate) mod AURA {
50 pub(crate) const MOONKIN_FORM: u32 = 24858;
52 pub(crate) const MARK_OF_THE_WILD_HIGHLIGHT: u32 = 1126;
54 pub(crate) const HARMONY_OF_THE_GROVE: u32 = 428_737;
56 pub(crate) const DREAM_SURGE: u32 = 433_831;
58 pub(crate) const ATMOSPHERIC_EXPOSURE: u32 = 430_589;
60 pub(crate) const ECLIPSE_SOLAR: u32 = 48517;
62 pub(crate) const ECLIPSE_LUNAR: u32 = 48518;
64 pub(crate) const AKILZONS_CLARITY: u32 = 1_301_768;
66 pub(crate) const CELESTIAL_ALIGNMENT: u32 = 194_223;
68 pub(crate) const INCARNATION_CHOSEN_OF_ELUNE: u32 = 102_560;
70 pub(crate) const LUNAR_ECLIPSE_OVERRIDE: u32 = 1_233_353;
72 pub(crate) const ECLIPSE: u32 = 1_239_669;
74 pub(crate) const LUNAR_CALLING: u32 = 429_523;
76 pub(crate) const DREAMSTATE: u32 = 450_346;
78 pub(crate) const MOONFIRE: u32 = 164_812;
80 pub(crate) const SUNFIRE: u32 = 164_815;
82 pub(crate) const STARFALL: u32 = 191_034;
84 pub(crate) const STARLORD: u32 = 279_709;
86 pub(crate) const STARWEAVER_S_WARP: u32 = 393_942;
88 pub(crate) const STARWEAVER_S_WEFT: u32 = 393_944;
90 pub(crate) const TOUCH_THE_COSMOS: u32 = 450_360;
92 pub(crate) const SOLSTICE: u32 = 343_648;
94 pub(crate) const STELLAR_AMPLIFICATION: u32 = 450_214;
96 pub(crate) const BOAT_ARCANE: u32 = 394_050;
98 pub(crate) const BOAT_NATURE: u32 = 394_049;
100 pub(crate) const FUNGAL_GROWTH: u32 = 81281;
102 pub(crate) const NATURES_BALANCE: u32 = 202_430;
104 pub(crate) const FURY_OF_ELUNE_ENERGIZE: u32 = 202_770;
106 pub(crate) const FURY_OF_ELUNE_BEAM: u32 = 211_545;
108 pub(crate) const SUNDERED_FIRMAMENT_ENERGIZE: u32 = 394_108;
110 pub(crate) const SUNDERED_FIRMAMENT_BEAM: u32 = 394_111;
112 pub(crate) const SUNSEEKER_MUSHROOM_DRIVER: u32 = 468_938;
114}
115pub(crate) mod TALENT {
116 pub(crate) const ASCENDANT_ECLIPSES_2: u32 = 1_261_565;
118 pub(crate) const ATMOSPHERIC_EXPOSURE: u32 = 429_532;
120 pub(crate) const BALANCE_OF_ALL_THINGS: u32 = 394_048;
122 pub(crate) const CONVOKE_THE_SPIRITS: u32 = 391_528;
124 pub(crate) const ECLIPSE: u32 = 1_239_669;
126 pub(crate) const FORCE_OF_NATURE: u32 = 205_636;
128 pub(crate) const FURY_OF_ELUNE: u32 = 202_770;
130 pub(crate) const HAIL_OF_STARS: u32 = 469_004;
132 pub(crate) const IMPROVED_ECLIPSE: u32 = 1_240_906;
134 pub(crate) const INCARNATION_CHOSEN_OF_ELUNE: u32 = 102_560;
136 pub(crate) const LUNAR_CALLING: u32 = 429_523;
138 pub(crate) const MOON_GUARDIAN: u32 = 429_520;
140 pub(crate) const NATURE_S_BALANCE: u32 = 202_430;
142 pub(crate) const NEW_MOON: u32 = 274_281;
144 pub(crate) const POWER_OF_GOLDRINN: u32 = 394_046;
146 pub(crate) const RATTLE_THE_STARS: u32 = 393_954;
148 pub(crate) const SHOOTING_STARS: u32 = 202_342;
150 pub(crate) const SOLSTICE: u32 = 343_647;
152 pub(crate) const STARLORD: u32 = 202_345;
154 pub(crate) const STARWEAVER: u32 = 393_940;
156 pub(crate) const STAR_CASCADE: u32 = 1_271_206;
158 pub(crate) const STELLAR_AMPLIFICATION: u32 = 450_212;
160 pub(crate) const SUNDERED_FIRMAMENT: u32 = 394_094;
162 pub(crate) const SUNSEEKER_MUSHROOM: u32 = 468_936;
164 pub(crate) const TOUCH_THE_COSMOS: u32 = 450_356;
166 pub(crate) const UMBRAL_EMBRACE: u32 = 393_760;
168 pub(crate) const WHIRLING_STARS: u32 = 468_743;
170 pub(crate) const WILD_MUSHROOM: u32 = 88747;
172 pub(crate) const WILD_SURGES: u32 = 406_890;
174}
175pub(crate) mod SET_BONUS {
176 pub(crate) const MID2_BALANCE_2PC: u32 = 1_296_603;
178 pub(crate) const MID2_BALANCE_4PC: u32 = 1_296_604;
180}
181pub(crate) mod REPORTED_SPELL {
182 pub(crate) const ASTRAL_SMOLDER: u32 = 1_263_250;
184 pub(crate) const FUNGAL_GROWTH: u32 = 1_280_213;
186 pub(crate) const GOLDRINN: u32 = 394_047;
188 pub(crate) const MOONFIRE_PERIODIC: u32 = 164_812;
190 pub(crate) const SHOOTING_STARS: u32 = 202_497;
192 pub(crate) const STARFALL_INSTANT: u32 = 1_301_742;
194 pub(crate) const STARSURGE_CASCADE: u32 = 1_271_222;
196 pub(crate) const SUNFIRE_PERIODIC: u32 = 164_815;
198 pub(crate) const SUNSEEKER_MUSHROOM: u32 = 1_280_212;
200 pub(crate) const WILD_MUSHROOM: u32 = 88751;
202}
203pub(crate) mod HERO {
204 pub(crate) mod KEEPER_OF_THE_GROVE {
205 pub(crate) mod SPELL {
206 pub(crate) const DREAM_BURST: u32 = 433_850;
208 pub(crate) const FORCE_OF_NATURE: u32 = 205_636;
210 }
211 pub(crate) mod AURA {
212 pub(crate) const BLOOMING_INFUSION: u32 = 429_433;
214 pub(crate) const CENARIUS_MIGHT: u32 = 455_801;
216 pub(crate) const DREAM_SURGE: u32 = 433_831;
218 pub(crate) const HARMONY_OF_THE_GROVE: u32 = 428_737;
220 }
221 }
222 pub(crate) mod ELUNES_CHOSEN {
223 pub(crate) mod SPELL {
224 pub(crate) const LUNAR_BOLT: u32 = 1_261_700;
226 pub(crate) const ORBITAL_STRIKE: u32 = 361_237;
228 pub(crate) const SOLAR_BOLT: u32 = 1_261_573;
230 }
231 pub(crate) mod AURA {
232 pub(crate) const ASCENDANT_FIRES: u32 = 1_263_363;
234 pub(crate) const ASCENDANT_STARS: u32 = 1_263_382;
236 pub(crate) const ATMOSPHERIC_EXPOSURE: u32 = 430_589;
238 pub(crate) const LUNAR_CALLING: u32 = 429_523;
240 pub(crate) const PARTING_SKIES: u32 = 395_110;
242 }
243 }
244}
245static HERO_TREE_KEEPER_OF_THE_GROVE_SPELLS: &[(&str, u32)] = &[
246 ("DREAM_BURST", 433_850),
247 ("FORCE_OF_NATURE", 205_636),
248];
249static HERO_TREE_KEEPER_OF_THE_GROVE_AURAS: &[(&str, u32)] = &[
250 ("BLOOMING_INFUSION", 429_433),
251 ("CENARIUS_MIGHT", 455_801),
252 ("DREAM_SURGE", 433_831),
253 ("HARMONY_OF_THE_GROVE", 428_737),
254];
255static HERO_TREE_ELUNES_CHOSEN_SPELLS: &[(&str, u32)] = &[
256 ("LUNAR_BOLT", 1_261_700),
257 ("ORBITAL_STRIKE", 361_237),
258 ("SOLAR_BOLT", 1_261_573),
259];
260static HERO_TREE_ELUNES_CHOSEN_AURAS: &[(&str, u32)] = &[
261 ("ASCENDANT_FIRES", 1_263_363),
262 ("ASCENDANT_STARS", 1_263_382),
263 ("ATMOSPHERIC_EXPOSURE", 430_589),
264 ("LUNAR_CALLING", 429_523),
265 ("PARTING_SKIES", 395_110),
266];
267pub(crate) mod DAMAGE_SPELL {
268 pub(crate) const MOONKIN_FORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_24858;
269 pub(crate) const MARK_OF_THE_WILD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_1126;
270 pub(crate) const WRATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_190984;
271 pub(crate) const STARFIRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_194153;
272 pub(crate) const SOLAR_ECLIPSE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_1233346;
273 pub(crate) const CELESTIAL_ALIGNMENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_194223;
274 pub(crate) const INCARNATION_CHOSEN_OF_ELUNE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_102560;
275 pub(crate) const MOONFIRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_8921;
276 pub(crate) const SUNFIRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_93402;
277 pub(crate) const STARSURGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_78674;
278 pub(crate) const STARFALL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_191034;
279 pub(crate) const NEW_MOON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_274281;
280 pub(crate) const FURY_OF_ELUNE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_202770;
281 pub(crate) const FORCE_OF_NATURE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_205636;
282 pub(crate) const CONVOKE_THE_SPIRITS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_391528;
283 pub(crate) const WILD_MUSHROOM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_88747;
284 pub(crate) const DREAM_BURST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_433850;
285 pub(crate) const LUNAR_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_1261700;
286 pub(crate) const ORBITAL_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_361237;
287 pub(crate) const SOLAR_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_1261573;
288}
289pub(crate) mod DAMAGE_AURA {
290 pub(crate) const MOONKIN_FORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_24858;
291 pub(crate) const MARK_OF_THE_WILD_HIGHLIGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_1126;
292 pub(crate) const HARMONY_OF_THE_GROVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_428737;
293 pub(crate) const DREAM_SURGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_433831;
294 pub(crate) const ATMOSPHERIC_EXPOSURE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_430589;
295 pub(crate) const ECLIPSE_SOLAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_48517;
296 pub(crate) const ECLIPSE_LUNAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_48518;
297 pub(crate) const AKILZONS_CLARITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_1301768;
298 pub(crate) const CELESTIAL_ALIGNMENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_194223;
299 pub(crate) const INCARNATION_CHOSEN_OF_ELUNE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_102560;
300 pub(crate) const LUNAR_ECLIPSE_OVERRIDE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_1233353;
301 pub(crate) const ECLIPSE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_1239669;
302 pub(crate) const LUNAR_CALLING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_429523;
303 pub(crate) const DREAMSTATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_450346;
304 pub(crate) const MOONFIRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_164812;
305 pub(crate) const SUNFIRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_164815;
306 pub(crate) const STARFALL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_191034;
307 pub(crate) const STARLORD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_279709;
308 pub(crate) const STARWEAVER_S_WARP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_393942;
309 pub(crate) const STARWEAVER_S_WEFT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_393944;
310 pub(crate) const TOUCH_THE_COSMOS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_450360;
311 pub(crate) const SOLSTICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_343648;
312 pub(crate) const STELLAR_AMPLIFICATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_450214;
313 pub(crate) const BOAT_ARCANE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_394050;
314 pub(crate) const BOAT_NATURE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_394049;
315 pub(crate) const FUNGAL_GROWTH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_81281;
316 pub(crate) const NATURES_BALANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_202430;
317 pub(crate) const FURY_OF_ELUNE_ENERGIZE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_202770;
318 pub(crate) const FURY_OF_ELUNE_BEAM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_211545;
319 pub(crate) const SUNDERED_FIRMAMENT_ENERGIZE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_394108;
320 pub(crate) const SUNDERED_FIRMAMENT_BEAM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_394111;
321 pub(crate) const SUNSEEKER_MUSHROOM_DRIVER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_468938;
322}
323pub(crate) mod DAMAGE_TALENT {
324 pub(crate) const ASCENDANT_ECLIPSES_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_1261565;
325 pub(crate) const ATMOSPHERIC_EXPOSURE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_429532;
326 pub(crate) const BALANCE_OF_ALL_THINGS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_394048;
327 pub(crate) const CONVOKE_THE_SPIRITS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_391528;
328 pub(crate) const ECLIPSE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_1239669;
329 pub(crate) const FORCE_OF_NATURE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_205636;
330 pub(crate) const FURY_OF_ELUNE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_202770;
331 pub(crate) const HAIL_OF_STARS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_469004;
332 pub(crate) const IMPROVED_ECLIPSE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_1240906;
333 pub(crate) const INCARNATION_CHOSEN_OF_ELUNE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_102560;
334 pub(crate) const LUNAR_CALLING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_429523;
335 pub(crate) const MOON_GUARDIAN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_429520;
336 pub(crate) const NATURE_S_BALANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_202430;
337 pub(crate) const NEW_MOON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_274281;
338 pub(crate) const POWER_OF_GOLDRINN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_394046;
339 pub(crate) const RATTLE_THE_STARS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_393954;
340 pub(crate) const SHOOTING_STARS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_202342;
341 pub(crate) const SOLSTICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_343647;
342 pub(crate) const STARLORD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_202345;
343 pub(crate) const STARWEAVER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_393940;
344 pub(crate) const STAR_CASCADE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_1271206;
345 pub(crate) const STELLAR_AMPLIFICATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_450212;
346 pub(crate) const SUNDERED_FIRMAMENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_394094;
347 pub(crate) const SUNSEEKER_MUSHROOM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_468936;
348 pub(crate) const TOUCH_THE_COSMOS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_450356;
349 pub(crate) const UMBRAL_EMBRACE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_393760;
350 pub(crate) const WHIRLING_STARS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_468743;
351 pub(crate) const WILD_MUSHROOM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_88747;
352 pub(crate) const WILD_SURGES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_406890;
353}
354pub(crate) mod DAMAGE_REPORTED {
355 pub(crate) const ASTRAL_SMOLDER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_1263250;
356 pub(crate) const FUNGAL_GROWTH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_1280213;
357 pub(crate) const GOLDRINN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_394047;
358 pub(crate) const MOONFIRE_PERIODIC: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_164812;
359 pub(crate) const SHOOTING_STARS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_202497;
360 pub(crate) const STARFALL_INSTANT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_1301742;
361 pub(crate) const STARSURGE_CASCADE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_1271222;
362 pub(crate) const SUNFIRE_PERIODIC: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_164815;
363 pub(crate) const SUNSEEKER_MUSHROOM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_1280212;
364 pub(crate) const WILD_MUSHROOM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ACTION::SPELL_88751;
365}
366pub(crate) mod DAMAGE_EFFECT {
367 pub(crate) const AKILZONS_CLARITY_MAX: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_1301768_EFFECT_3;
368 pub(crate) const AKILZONS_CLARITY_MIN: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_1301768_EFFECT_4;
369 pub(crate) const ASTRAL_INVOCATION_ARCANE_DIRECT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_393014_EFFECT_1;
370 pub(crate) const ASTRAL_INVOCATION_ARCANE_PERIODIC: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_393014_EFFECT_2;
371 pub(crate) const ASTRAL_INVOCATION_NATURE_DIRECT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_393014_EFFECT_3;
372 pub(crate) const ASTRAL_INVOCATION_NATURE_PERIODIC: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_393014_EFFECT_4;
373 pub(crate) const ASTRAL_POWER_WRATH_AP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_197911_EFFECT_2;
374 pub(crate) const ASTRAL_SMOLDER_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_1261565_EFFECT_1;
375 pub(crate) const FUNGAL_GROWTH_SUNSEEKER: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_1280213_EFFECT_1;
376 pub(crate) const GOLDRINN_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_394047_EFFECT_1;
377 pub(crate) const HAIL_OF_STARS_MS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_469004_EFFECT_1;
378 pub(crate) const MOON_GUARDIAN_AP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_429520_EFFECT_1;
379 pub(crate) const NATURES_BALANCE_START: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_202430_EFFECT_2;
380 pub(crate) const RATTLE_COST_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_393954_EFFECT_2;
381 pub(crate) const SHOOTING_STARS_AP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_202497_EFFECT_2;
382 pub(crate) const SHOOTING_STARS_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_202342_EFFECT_1;
383 pub(crate) const SHOOTING_STARS_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_202497_EFFECT_1;
384 pub(crate) const STARFALL_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_191037_EFFECT_1;
385 pub(crate) const STARFALL_GEOMETRY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_50286_EFFECT_1;
386 pub(crate) const STARFALL_INSTANT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_1301742_EFFECT_1;
387 pub(crate) const SOLSTICE_RATE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_343647_EFFECT_1;
388 pub(crate) const STARSURGE_CASCADE_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_1271222_EFFECT_1;
389 pub(crate) const STAR_CASCADE_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_1271206_EFFECT_1;
390 pub(crate) const STAR_CASCADE_EFFECTIVENESS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_1271206_EFFECT_3;
391 pub(crate) const STELLAR_AMP_CAP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_450212_EFFECT_1;
392 pub(crate) const TTC_CHANCE_STARFIRE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_450356_EFFECT_2;
393 pub(crate) const TTC_CHANCE_WRATH: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_450356_EFFECT_1;
394 pub(crate) const WHIRLING_STARS_CDR: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_468743_EFFECT_3;
395 pub(crate) const WILD_MUSHROOM_AP_CAP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_88751_EFFECT_2;
396 pub(crate) const SUNSEEKER_MUSHROOM_AP_CAP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_1280212_EFFECT_2;
397 pub(crate) const WILD_SURGES_AP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::balance_druid::damage::EFFECT::SPELL_406890_EFFECT_2;
398}
399pub(crate) const AURA_MOONKIN_FORM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_MOONKIN_FORM
400 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
401pub(crate) const AURA_MARK_OF_THE_WILD_HIGHLIGHT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_MARK_OF_THE_WILD_HIGHLIGHT
402 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
403pub(crate) const AURA_HARMONY_OF_THE_GROVE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_HARMONY_OF_THE_GROVE
404 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
405pub(crate) const AURA_DREAM_SURGE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_DREAM_SURGE
406 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
407pub(crate) const AURA_ATMOSPHERIC_EXPOSURE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_ATMOSPHERIC_EXPOSURE
408 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
409pub(crate) const AURA_ECLIPSE_SOLAR: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_ECLIPSE_SOLAR
410 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
411pub(crate) const AURA_ECLIPSE_LUNAR: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_ECLIPSE_LUNAR
412 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
413pub(crate) const AURA_AKILZONS_CLARITY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_AKILZONS_CLARITY
414 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
415pub(crate) const AURA_CELESTIAL_ALIGNMENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_CELESTIAL_ALIGNMENT
416 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
417pub(crate) const AURA_INCARNATION_CHOSEN_OF_ELUNE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_INCARNATION_CHOSEN_OF_ELUNE
418 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
419pub(crate) const AURA_LUNAR_ECLIPSE_OVERRIDE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_LUNAR_ECLIPSE_OVERRIDE
420 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
421pub(crate) const AURA_ECLIPSE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_ECLIPSE
422 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
423pub(crate) const AURA_LUNAR_CALLING: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_LUNAR_CALLING
424 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
425pub(crate) const AURA_DREAMSTATE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_DREAMSTATE
426 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
427pub(crate) const AURA_MOONFIRE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_MOONFIRE
428 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
429pub(crate) const AURA_SUNFIRE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_SUNFIRE
430 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
431pub(crate) const AURA_STARFALL: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_STARFALL
432 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
433pub(crate) const AURA_STARLORD: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_STARLORD
434 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
435pub(crate) const AURA_STARWEAVER_S_WARP: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_STARWEAVER_S_WARP
436 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
437pub(crate) const AURA_STARWEAVER_S_WEFT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_STARWEAVER_S_WEFT
438 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
439pub(crate) const AURA_TOUCH_THE_COSMOS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_TOUCH_THE_COSMOS
440 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
441pub(crate) const AURA_SOLSTICE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_SOLSTICE
442 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
443pub(crate) const AURA_STELLAR_AMPLIFICATION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_STELLAR_AMPLIFICATION
444 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
445pub(crate) const AURA_BOAT_ARCANE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_BOAT_ARCANE
446 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
447pub(crate) const AURA_BOAT_NATURE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_BOAT_NATURE
448 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
449pub(crate) const AURA_FUNGAL_GROWTH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_FUNGAL_GROWTH
450 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
451pub(crate) const AURA_NATURES_BALANCE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_NATURES_BALANCE
452 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
453pub(crate) const AURA_FURY_OF_ELUNE_ENERGIZE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_FURY_OF_ELUNE_ENERGIZE
454 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
455pub(crate) const AURA_FURY_OF_ELUNE_BEAM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_FURY_OF_ELUNE_BEAM
456 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
457pub(crate) const AURA_SUNDERED_FIRMAMENT_ENERGIZE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_SUNDERED_FIRMAMENT_ENERGIZE
458 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
459pub(crate) const AURA_SUNDERED_FIRMAMENT_BEAM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_SUNDERED_FIRMAMENT_BEAM
460 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
461pub(crate) const AURA_SUNSEEKER_MUSHROOM_DRIVER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::AURA_SUNSEEKER_MUSHROOM_DRIVER
462 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
463pub(crate) const AURA_COUNT: usize = 32;
464const _: () = assert!(
465 AURA_COUNT == 32, "AURA index ABI: count changed -- update positional hook consumers"
466);
467pub(crate) const SPELL_MOONKIN_FORM: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::SPELL_MOONKIN_FORM
468 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
469pub(crate) const SPELL_MARK_OF_THE_WILD: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::SPELL_MARK_OF_THE_WILD
470 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
471pub(crate) const SPELL_WRATH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::SPELL_WRATH
472 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
473pub(crate) const SPELL_STARFIRE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::SPELL_STARFIRE
474 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
475pub(crate) const SPELL_SOLAR_ECLIPSE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::SPELL_SOLAR_ECLIPSE
476 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
477pub(crate) const SPELL_CELESTIAL_ALIGNMENT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::SPELL_CELESTIAL_ALIGNMENT
478 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
479pub(crate) const SPELL_INCARNATION_CHOSEN_OF_ELUNE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::SPELL_INCARNATION_CHOSEN_OF_ELUNE
480 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
481pub(crate) const SPELL_MOONFIRE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::SPELL_MOONFIRE
482 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
483pub(crate) const SPELL_SUNFIRE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::SPELL_SUNFIRE
484 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
485pub(crate) const SPELL_STARSURGE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::SPELL_STARSURGE
486 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
487pub(crate) const SPELL_STARFALL: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::SPELL_STARFALL
488 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
489pub(crate) const SPELL_NEW_MOON: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::SPELL_NEW_MOON
490 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
491pub(crate) const SPELL_FURY_OF_ELUNE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::SPELL_FURY_OF_ELUNE
492 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
493pub(crate) const SPELL_FORCE_OF_NATURE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::SPELL_FORCE_OF_NATURE
494 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
495pub(crate) const SPELL_CONVOKE_THE_SPIRITS: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::SPELL_CONVOKE_THE_SPIRITS
496 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
497pub(crate) const SPELL_WILD_MUSHROOM: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::balance_druid::SPELL_WILD_MUSHROOM
498 .bind(wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF);
499pub(crate) const SPELL_COUNT: usize = 16;
500const _: () = assert!(
501 SPELL_COUNT == 16,
502 "SPELL index ABI: count changed -- update positional hook consumers"
503);
504pub(crate) mod EFFECT {
505 pub(crate) const AKILZONS_CLARITY_MAX: (u32, u8) = (1_301_768, 3);
507 pub(crate) const AKILZONS_CLARITY_MIN: (u32, u8) = (1_301_768, 4);
509 pub(crate) const ASTRAL_INVOCATION_ARCANE_DIRECT: (u32, u8) = (393_014, 1);
511 pub(crate) const ASTRAL_INVOCATION_ARCANE_PERIODIC: (u32, u8) = (393_014, 2);
513 pub(crate) const ASTRAL_INVOCATION_NATURE_DIRECT: (u32, u8) = (393_014, 3);
515 pub(crate) const ASTRAL_INVOCATION_NATURE_PERIODIC: (u32, u8) = (393_014, 4);
517 pub(crate) const ASTRAL_POWER_WRATH_AP: (u32, u8) = (197_911, 2);
519 pub(crate) const ASTRAL_SMOLDER_PCT: (u32, u8) = (1_261_565, 1);
521 pub(crate) const FUNGAL_GROWTH_SUNSEEKER: (u32, u8) = (1_280_213, 1);
523 pub(crate) const GOLDRINN_DMG: (u32, u8) = (394_047, 1);
525 pub(crate) const HAIL_OF_STARS_MS: (u32, u8) = (469_004, 1);
527 pub(crate) const MOON_GUARDIAN_AP: (u32, u8) = (429_520, 1);
529 pub(crate) const NATURES_BALANCE_START: (u32, u8) = (202_430, 2);
531 pub(crate) const RATTLE_COST_PCT: (u32, u8) = (393_954, 2);
533 pub(crate) const SHOOTING_STARS_AP: (u32, u8) = (202_497, 2);
535 pub(crate) const SHOOTING_STARS_CHANCE: (u32, u8) = (202_342, 1);
537 pub(crate) const SHOOTING_STARS_DMG: (u32, u8) = (202_497, 1);
539 pub(crate) const STARFALL_DAMAGE: (u32, u8) = (191_037, 1);
541 pub(crate) const STARFALL_GEOMETRY: (u32, u8) = (50286, 1);
543 pub(crate) const STARFALL_INSTANT_DAMAGE: (u32, u8) = (1_301_742, 1);
545 pub(crate) const SOLSTICE_RATE: (u32, u8) = (343_647, 1);
547 pub(crate) const STARSURGE_CASCADE_DMG: (u32, u8) = (1_271_222, 1);
549 pub(crate) const STAR_CASCADE_CHANCE: (u32, u8) = (1_271_206, 1);
551 pub(crate) const STAR_CASCADE_EFFECTIVENESS: (u32, u8) = (1_271_206, 3);
553 pub(crate) const STELLAR_AMP_CAP: (u32, u8) = (450_212, 1);
555 pub(crate) const TTC_CHANCE_STARFIRE: (u32, u8) = (450_356, 2);
557 pub(crate) const TTC_CHANCE_WRATH: (u32, u8) = (450_356, 1);
559 pub(crate) const WHIRLING_STARS_CDR: (u32, u8) = (468_743, 3);
561 pub(crate) const WILD_MUSHROOM_AP_CAP: (u32, u8) = (88751, 2);
563 pub(crate) const SUNSEEKER_MUSHROOM_AP_CAP: (u32, u8) = (1_280_212, 2);
565 pub(crate) const WILD_SURGES_AP: (u32, u8) = (406_890, 2);
567}
568static REPORTED_SPELLS: &[(&str, u32)] = &[
569 ("astral_smolder", 1_263_250),
570 ("fungal_growth", 1_280_213),
571 ("goldrinn", 394_047),
572 ("moonfire_periodic", 164_812),
573 ("shooting_stars", 202_497),
574 ("starfall_instant", 1_301_742),
575 ("starsurge_cascade", 1_271_222),
576 ("sunfire_periodic", 164_815),
577 ("sunseeker_mushroom", 1_280_212),
578 ("wild_mushroom", 88751),
579];
580static DECLARED_SPELL_IDS: &[u32] = &[
581 24858, 1126, 190_984, 194_153, 1_233_346, 194_223, 102_560, 8921, 93402, 78674,
582 191_034, 274_281, 202_770, 205_636, 391_528, 88747, 428_737, 433_831, 430_589, 48517,
583 48518, 1_301_768, 1_233_353, 1_239_669, 429_523, 450_346, 164_812, 164_815, 279_709,
584 393_942, 393_944, 450_360, 343_648, 450_214, 394_050, 394_049, 81281, 202_430,
585 211_545, 394_108, 394_111, 468_938, 1_261_565, 429_532, 394_048, 469_004, 1_240_906,
586 429_520, 394_046, 393_954, 202_342, 343_647, 202_345, 393_940, 1_271_206, 450_212,
587 394_094, 468_936, 450_356, 393_760, 468_743, 406_890, 50286, 88751, 191_037, 197_911,
588 202_497, 393_014, 394_047, 394_106, 1_263_250, 1_271_222, 1_280_212, 1_280_213,
589 1_301_742, 433_850, 429_433, 455_801, 1_261_700, 361_237, 1_261_573, 1_263_363,
590 1_263_382, 395_110,
591];
592static DECLARED_AURA_IDS: &[u32] = &[
593 24858, 1126, 428_737, 433_831, 430_589, 48517, 48518, 1_301_768, 194_223, 102_560,
594 1_233_353, 1_239_669, 429_523, 450_346, 164_812, 164_815, 191_034, 279_709, 393_942,
595 393_944, 450_360, 343_648, 450_214, 394_050, 394_049, 81281, 202_430, 202_770,
596 211_545, 394_108, 394_111, 468_938, 429_433, 455_801, 433_831, 428_737, 1_263_363,
597 1_263_382, 430_589, 429_523, 395_110,
598];
599static TALENTS: &[(&str, u32)] = &[
600 ("ASCENDANT_ECLIPSES_2", TALENT::ASCENDANT_ECLIPSES_2),
601 ("ATMOSPHERIC_EXPOSURE", TALENT::ATMOSPHERIC_EXPOSURE),
602 ("BALANCE_OF_ALL_THINGS", TALENT::BALANCE_OF_ALL_THINGS),
603 ("CONVOKE_THE_SPIRITS", TALENT::CONVOKE_THE_SPIRITS),
604 ("ECLIPSE", TALENT::ECLIPSE),
605 ("FORCE_OF_NATURE", TALENT::FORCE_OF_NATURE),
606 ("FURY_OF_ELUNE", TALENT::FURY_OF_ELUNE),
607 ("HAIL_OF_STARS", TALENT::HAIL_OF_STARS),
608 ("IMPROVED_ECLIPSE", TALENT::IMPROVED_ECLIPSE),
609 ("INCARNATION_CHOSEN_OF_ELUNE", TALENT::INCARNATION_CHOSEN_OF_ELUNE),
610 ("LUNAR_CALLING", TALENT::LUNAR_CALLING),
611 ("MOON_GUARDIAN", TALENT::MOON_GUARDIAN),
612 ("NATURE_S_BALANCE", TALENT::NATURE_S_BALANCE),
613 ("NEW_MOON", TALENT::NEW_MOON),
614 ("POWER_OF_GOLDRINN", TALENT::POWER_OF_GOLDRINN),
615 ("RATTLE_THE_STARS", TALENT::RATTLE_THE_STARS),
616 ("SHOOTING_STARS", TALENT::SHOOTING_STARS),
617 ("SOLSTICE", TALENT::SOLSTICE),
618 ("STARLORD", TALENT::STARLORD),
619 ("STARWEAVER", TALENT::STARWEAVER),
620 ("STAR_CASCADE", TALENT::STAR_CASCADE),
621 ("STELLAR_AMPLIFICATION", TALENT::STELLAR_AMPLIFICATION),
622 ("SUNDERED_FIRMAMENT", TALENT::SUNDERED_FIRMAMENT),
623 ("SUNSEEKER_MUSHROOM", TALENT::SUNSEEKER_MUSHROOM),
624 ("TOUCH_THE_COSMOS", TALENT::TOUCH_THE_COSMOS),
625 ("UMBRAL_EMBRACE", TALENT::UMBRAL_EMBRACE),
626 ("WHIRLING_STARS", TALENT::WHIRLING_STARS),
627 ("WILD_MUSHROOM", TALENT::WILD_MUSHROOM),
628 ("WILD_SURGES", TALENT::WILD_SURGES),
629];
630pub(crate) mod BALANCE_DRUID {
631 pub(crate) const WRATH_CASTS: u32 = 0;
632 pub(crate) const STARFIRE_CASTS: u32 = 1;
633 pub(crate) const STARSURGE_CASTS: u32 = 2;
634 pub(crate) const STARFALL_CASTS: u32 = 3;
635 pub(crate) const MOONFIRE_CASTS: u32 = 4;
636 pub(crate) const SUNFIRE_CASTS: u32 = 5;
637 pub(crate) const CELESTIAL_ALIGNMENT_CASTS: u32 = 6;
638 pub(crate) const ECLIPSE_SOLAR_UPTIME_MS: u32 = 7;
639 pub(crate) const ECLIPSE_LUNAR_UPTIME_MS: u32 = 8;
640 pub(crate) const STARLORD_UPTIME_MS: u32 = 9;
641}
642fn aura_moonkin_form(
643 a: AuraDefinitionDraft,
644 data: &ResolvedGameData,
645) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
646 Ok(
647 a
648 .on_player()
649 .apply_base_from_data(data, 24858)?
650 .max_stacks(
651 data
652 .require_aura_max_stacks(
653 wowlab_types::sim::SpellIdx::from_raw(24858),
654 )?,
655 ),
656 )
657}
658fn aura_mark_of_the_wild_highlight(
659 a: AuraDefinitionDraft,
660 data: &ResolvedGameData,
661) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
662 Ok(
663 a
664 .on_player()
665 .apply_base_from_data(data, 1126)?
666 .max_stacks(
667 data
668 .require_aura_max_stacks(
669 wowlab_types::sim::SpellIdx::from_raw(1126),
670 )?,
671 ),
672 )
673}
674fn aura_harmony_of_the_grove(
675 a: AuraDefinitionDraft,
676 data: &ResolvedGameData,
677) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
678 Ok(
679 a
680 .on_player()
681 .apply_base_from_data(data, 428_737)?
682 .max_stacks(
683 data
684 .require_aura_max_stacks(
685 wowlab_types::sim::SpellIdx::from_raw(428_737),
686 )?,
687 ),
688 )
689}
690fn aura_dream_surge(
691 a: AuraDefinitionDraft,
692 data: &ResolvedGameData,
693) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
694 Ok(
695 a
696 .on_target()
697 .apply_base_from_data(data, 433_831)?
698 .max_stacks(
699 data
700 .require_aura_max_stacks(
701 wowlab_types::sim::SpellIdx::from_raw(433_831),
702 )?,
703 ),
704 )
705}
706fn aura_atmospheric_exposure(
707 a: AuraDefinitionDraft,
708 data: &ResolvedGameData,
709) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
710 Ok(
711 a
712 .on_target()
713 .apply_base_from_data(data, 430_589)?
714 .max_stacks(
715 data
716 .require_aura_max_stacks(
717 wowlab_types::sim::SpellIdx::from_raw(430_589),
718 )?,
719 ),
720 )
721}
722fn aura_eclipse_solar(
723 a: AuraDefinitionDraft,
724 data: &ResolvedGameData,
725) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
726 Ok(
727 a
728 .on_player()
729 .apply_base_from_data(data, 48517)?
730 .max_stacks(
731 data
732 .require_aura_max_stacks(
733 wowlab_types::sim::SpellIdx::from_raw(48517),
734 )?,
735 )
736 .on_expire(crate::hooks::balance_druid::eclipse_expire_hook),
737 )
738}
739fn aura_eclipse_lunar(
740 a: AuraDefinitionDraft,
741 data: &ResolvedGameData,
742) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
743 Ok(
744 a
745 .on_player()
746 .apply_base_from_data(data, 48518)?
747 .max_stacks(
748 data
749 .require_aura_max_stacks(
750 wowlab_types::sim::SpellIdx::from_raw(48518),
751 )?,
752 )
753 .on_expire(crate::hooks::balance_druid::eclipse_expire_hook),
754 )
755}
756fn aura_akilzons_clarity(
757 a: AuraDefinitionDraft,
758 data: &ResolvedGameData,
759) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
760 Ok(
761 a
762 .on_player()
763 .apply_base_from_data(data, 1_301_768)?
764 .max_stacks(
765 data
766 .require_aura_max_stacks(
767 wowlab_types::sim::SpellIdx::from_raw(1_301_768),
768 )?,
769 ),
770 )
771}
772fn aura_celestial_alignment(
773 a: AuraDefinitionDraft,
774 data: &ResolvedGameData,
775) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
776 Ok(
777 a
778 .on_player()
779 .apply_base_from_data(data, 194_223)?
780 .max_stacks(
781 data
782 .require_aura_max_stacks(
783 wowlab_types::sim::SpellIdx::from_raw(194_223),
784 )?,
785 ),
786 )
787}
788fn aura_incarnation_chosen_of_elune(
789 a: AuraDefinitionDraft,
790 data: &ResolvedGameData,
791) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
792 Ok(
793 a
794 .on_player()
795 .apply_base_from_data(data, 102_560)?
796 .max_stacks(
797 data
798 .require_aura_max_stacks(
799 wowlab_types::sim::SpellIdx::from_raw(102_560),
800 )?,
801 ),
802 )
803}
804fn aura_lunar_eclipse_override(
805 a: AuraDefinitionDraft,
806 data: &ResolvedGameData,
807) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
808 Ok(
809 a
810 .on_player()
811 .apply_base_from_data(data, 1_233_353)?
812 .max_stacks(
813 data
814 .require_aura_max_stacks(
815 wowlab_types::sim::SpellIdx::from_raw(1_233_353),
816 )?,
817 ),
818 )
819}
820fn aura_eclipse(
821 a: AuraDefinitionDraft,
822 data: &ResolvedGameData,
823) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
824 Ok(
825 a
826 .on_player()
827 .apply_base_from_data(data, 1_239_669)?
828 .max_stacks(
829 data
830 .require_aura_max_stacks(
831 wowlab_types::sim::SpellIdx::from_raw(1_239_669),
832 )?,
833 ),
834 )
835}
836fn aura_lunar_calling(
837 a: AuraDefinitionDraft,
838 data: &ResolvedGameData,
839) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
840 Ok(
841 a
842 .on_player()
843 .apply_base_from_data(data, 429_523)?
844 .max_stacks(
845 data
846 .require_aura_max_stacks(
847 wowlab_types::sim::SpellIdx::from_raw(429_523),
848 )?,
849 ),
850 )
851}
852fn aura_dreamstate(
853 a: AuraDefinitionDraft,
854 data: &ResolvedGameData,
855) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
856 Ok(
857 a
858 .on_player()
859 .apply_base_from_data(data, 450_346)?
860 .max_stacks(
861 data
862 .require_aura_max_stacks(
863 wowlab_types::sim::SpellIdx::from_raw(450_346),
864 )?,
865 ),
866 )
867}
868fn aura_moonfire(
869 a: AuraDefinitionDraft,
870 data: &ResolvedGameData,
871) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
872 Ok(
873 a
874 .on_target()
875 .apply_base_from_data(data, 164_812)?
876 .max_stacks(
877 data
878 .require_aura_max_stacks(
879 wowlab_types::sim::SpellIdx::from_raw(164_812),
880 )?,
881 ),
882 )
883}
884fn aura_sunfire(
885 a: AuraDefinitionDraft,
886 data: &ResolvedGameData,
887) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
888 Ok(
889 a
890 .on_target()
891 .apply_base_from_data(data, 164_815)?
892 .max_stacks(
893 data
894 .require_aura_max_stacks(
895 wowlab_types::sim::SpellIdx::from_raw(164_815),
896 )?,
897 ),
898 )
899}
900fn aura_starfall(
901 a: AuraDefinitionDraft,
902 data: &ResolvedGameData,
903) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
904 Ok(
905 a
906 .on_player()
907 .apply_base_from_data(data, 191_034)?
908 .max_stacks(
909 data
910 .require_aura_max_stacks(
911 wowlab_types::sim::SpellIdx::from_raw(191_034),
912 )?,
913 )
914 .periodic_hook(
915 wowlab_engine_combat::validated_milliseconds(
916 data.period(wowlab_types::sim::SpellIdx::from_raw(191_034), 3),
917 191_034,
918 "periodic_hook.tick_ms",
919 )?,
920 )
921 .apply_periodic_behavior_from_data(data, 191_034)?
922 .tick_hook(crate::hooks::balance_druid::starfall_tick_hook),
923 )
924}
925fn aura_starlord(
926 a: AuraDefinitionDraft,
927 data: &ResolvedGameData,
928) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
929 Ok(
930 a
931 .on_player()
932 .apply_base_from_data(data, 279_709)?
933 .max_stacks(
934 data
935 .require_aura_max_stacks(
936 wowlab_types::sim::SpellIdx::from_raw(279_709),
937 )?,
938 ),
939 )
940}
941fn aura_starweaver_s_warp(
942 a: AuraDefinitionDraft,
943 data: &ResolvedGameData,
944) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
945 Ok(
946 a
947 .on_player()
948 .apply_base_from_data(data, 393_942)?
949 .max_stacks(
950 data
951 .require_aura_max_stacks(
952 wowlab_types::sim::SpellIdx::from_raw(393_942),
953 )?,
954 ),
955 )
956}
957fn aura_starweaver_s_weft(
958 a: AuraDefinitionDraft,
959 data: &ResolvedGameData,
960) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
961 Ok(
962 a
963 .on_player()
964 .apply_base_from_data(data, 393_944)?
965 .max_stacks(
966 data
967 .require_aura_max_stacks(
968 wowlab_types::sim::SpellIdx::from_raw(393_944),
969 )?,
970 ),
971 )
972}
973fn aura_touch_the_cosmos(
974 a: AuraDefinitionDraft,
975 data: &ResolvedGameData,
976) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
977 Ok(
978 a
979 .on_player()
980 .apply_base_from_data(data, 450_360)?
981 .max_stacks(
982 data
983 .require_aura_max_stacks(
984 wowlab_types::sim::SpellIdx::from_raw(450_360),
985 )?,
986 ),
987 )
988}
989fn aura_solstice(
990 a: AuraDefinitionDraft,
991 data: &ResolvedGameData,
992) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
993 Ok(
994 a
995 .on_player()
996 .apply_base_from_data(data, 343_648)?
997 .max_stacks(
998 data
999 .require_aura_max_stacks(
1000 wowlab_types::sim::SpellIdx::from_raw(343_648),
1001 )?,
1002 ),
1003 )
1004}
1005fn aura_stellar_amplification(
1006 a: AuraDefinitionDraft,
1007 data: &ResolvedGameData,
1008) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1009 Ok(
1010 a
1011 .on_target()
1012 .apply_base_from_data(data, 450_214)?
1013 .max_stacks(
1014 data
1015 .require_aura_max_stacks(
1016 wowlab_types::sim::SpellIdx::from_raw(450_214),
1017 )?,
1018 ),
1019 )
1020}
1021fn aura_boat_arcane(
1022 a: AuraDefinitionDraft,
1023 data: &ResolvedGameData,
1024) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1025 Ok(
1026 a
1027 .on_player()
1028 .apply_base_from_data(data, 394_050)?
1029 .max_stacks(
1030 data
1031 .require_aura_max_stacks(
1032 wowlab_types::sim::SpellIdx::from_raw(394_050),
1033 )?,
1034 )
1035 .crit_per_stack(
1036 data.base_points(wowlab_types::sim::SpellIdx::from_raw(394_048), 1),
1037 )?
1038 .reverse()
1039 .periodic_stack_tick(
1040 wowlab_engine_combat::validated_milliseconds(
1041 data.period(wowlab_types::sim::SpellIdx::from_raw(394_049), 2),
1042 394_050,
1043 "aura.stack_tick_ms",
1044 )?,
1045 )
1046 .clip_tick_behavior(1),
1047 )
1048}
1049fn aura_boat_nature(
1050 a: AuraDefinitionDraft,
1051 data: &ResolvedGameData,
1052) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1053 Ok(
1054 a
1055 .on_player()
1056 .apply_base_from_data(data, 394_049)?
1057 .max_stacks(
1058 data
1059 .require_aura_max_stacks(
1060 wowlab_types::sim::SpellIdx::from_raw(394_049),
1061 )?,
1062 )
1063 .crit_per_stack(
1064 data.base_points(wowlab_types::sim::SpellIdx::from_raw(394_048), 1),
1065 )?
1066 .reverse()
1067 .periodic_stack_tick(
1068 wowlab_engine_combat::validated_milliseconds(
1069 data.period(wowlab_types::sim::SpellIdx::from_raw(394_050), 2),
1070 394_049,
1071 "aura.stack_tick_ms",
1072 )?,
1073 )
1074 .clip_tick_behavior(1),
1075 )
1076}
1077fn aura_fungal_growth(
1078 a: AuraDefinitionDraft,
1079 data: &ResolvedGameData,
1080) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1081 Ok(
1082 a
1083 .on_target()
1084 .apply_base_from_data(data, 81281)?
1085 .max_stacks(
1086 data
1087 .require_aura_max_stacks(
1088 wowlab_types::sim::SpellIdx::from_raw(81281),
1089 )?,
1090 ),
1091 )
1092}
1093fn aura_natures_balance(
1094 a: AuraDefinitionDraft,
1095 data: &ResolvedGameData,
1096) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1097 Ok(
1098 a
1099 .on_player()
1100 .apply_base_from_data(data, 202_430)?
1101 .max_stacks(
1102 data
1103 .require_aura_max_stacks(
1104 wowlab_types::sim::SpellIdx::from_raw(202_430),
1105 )?,
1106 ),
1107 )
1108}
1109fn aura_fury_of_elune_energize(
1110 a: AuraDefinitionDraft,
1111 data: &ResolvedGameData,
1112) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1113 Ok(
1114 a
1115 .on_player()
1116 .apply_base_from_data(data, 202_770)?
1117 .max_stacks(
1118 data
1119 .require_aura_max_stacks(
1120 wowlab_types::sim::SpellIdx::from_raw(202_770),
1121 )?,
1122 ),
1123 )
1124}
1125fn aura_fury_of_elune_beam(
1126 a: AuraDefinitionDraft,
1127 data: &ResolvedGameData,
1128) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1129 a.on_target()
1130 .duration_ms(
1131 wowlab_engine_combat::validated_milliseconds(
1132 f64::from(
1133 data
1134 .require_aura_duration_ms(
1135 wowlab_types::sim::SpellIdx::from_raw(202_770),
1136 )?,
1137 ),
1138 211_545,
1139 "aura.duration_ms",
1140 )?,
1141 )
1142 .apply_periodic_effect_from_data(data, 211_545)?
1143 .apply_duration_behavior_from_data(data, 202_770)?
1144 .apply_timing_modifiers_from_data(data, 211_545)?
1145 .max_stacks(
1146 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(211_545))?,
1147 )
1148 .periodic_damage_sp(
1149 wowlab_engine_combat::validated_milliseconds(
1150 500.0,
1151 211_545,
1152 "periodic_damage.tick_ms",
1153 )?,
1154 ((data.sp_coef(wowlab_types::sim::SpellIdx::from_raw(211_545), 1)) * 10000.0)
1155 .round() / 10000.0,
1156 wowlab_engine_combat::DamageFlags::empty(),
1157 )
1158 .apply_periodic_behavior_from_data(data, 202_770)
1159}
1160fn aura_sundered_firmament_energize(
1161 a: AuraDefinitionDraft,
1162 data: &ResolvedGameData,
1163) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1164 Ok(
1165 a
1166 .on_player()
1167 .apply_base_from_data(data, 394_108)?
1168 .max_stacks(
1169 data
1170 .require_aura_max_stacks(
1171 wowlab_types::sim::SpellIdx::from_raw(394_108),
1172 )?,
1173 ),
1174 )
1175}
1176fn aura_sundered_firmament_beam(
1177 a: AuraDefinitionDraft,
1178 data: &ResolvedGameData,
1179) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1180 a.on_target()
1181 .duration_ms(
1182 wowlab_engine_combat::validated_milliseconds(
1183 f64::from(
1184 data
1185 .require_aura_duration_ms(
1186 wowlab_types::sim::SpellIdx::from_raw(394_106),
1187 )?,
1188 ),
1189 394_111,
1190 "aura.duration_ms",
1191 )?,
1192 )
1193 .apply_periodic_effect_from_data(data, 394_111)?
1194 .apply_duration_behavior_from_data(data, 394_106)?
1195 .apply_timing_modifiers_from_data(data, 394_111)?
1196 .max_stacks(
1197 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(394_111))?,
1198 )
1199 .periodic_damage_sp(
1200 wowlab_engine_combat::validated_milliseconds(
1201 500.0,
1202 394_111,
1203 "periodic_damage.tick_ms",
1204 )?,
1205 (((data.sp_coef(wowlab_types::sim::SpellIdx::from_raw(394_111), 1)) * 0.25)
1206 * 1000.0)
1207 .round() / 1000.0,
1208 wowlab_engine_combat::DamageFlags::empty(),
1209 )
1210 .apply_periodic_behavior_from_data(data, 394_106)
1211}
1212fn aura_sunseeker_mushroom_driver(
1213 a: AuraDefinitionDraft,
1214 data: &ResolvedGameData,
1215) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1216 Ok(
1217 a
1218 .on_player()
1219 .apply_base_from_data(data, 468_938)?
1220 .max_stacks(
1221 data
1222 .require_aura_max_stacks(
1223 wowlab_types::sim::SpellIdx::from_raw(468_938),
1224 )?,
1225 ),
1226 )
1227}
1228fn spell_moonkin_form(
1229 s: SpellDefinitionDraft,
1230 data: &ResolvedGameData,
1231) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1232 Ok(
1233 s
1234 .apply_base_from_data(data, 24858)?
1235 .applies_inferred_aura(AURA_MOONKIN_FORM, 24858)
1236 .apply_aoe_from_data(data),
1237 )
1238}
1239fn spell_mark_of_the_wild(
1240 s: SpellDefinitionDraft,
1241 data: &ResolvedGameData,
1242) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1243 Ok(
1244 s
1245 .apply_base_from_data(data, 1126)?
1246 .applies_inferred_aura(AURA_MARK_OF_THE_WILD_HIGHLIGHT, 1126)
1247 .apply_aoe_from_data(data),
1248 )
1249}
1250fn spell_wrath(
1251 s: SpellDefinitionDraft,
1252 data: &ResolvedGameData,
1253) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1254 Ok(
1255 s
1256 .apply_base_from_data(data, 190_984)?
1257 .apply_aoe_from_data(data)
1258 .on_cast(crate::hooks::balance_druid::wrath_hook),
1259 )
1260}
1261fn spell_starfire(
1262 s: SpellDefinitionDraft,
1263 data: &ResolvedGameData,
1264) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1265 Ok(
1266 s
1267 .apply_base_from_data(data, 194_153)?
1268 .apply_aoe_from_data(data)
1269 .on_cast(crate::hooks::balance_druid::starfire_hook),
1270 )
1271}
1272fn spell_solar_eclipse(
1273 s: SpellDefinitionDraft,
1274 data: &ResolvedGameData,
1275) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1276 Ok(
1277 s
1278 .apply_base_from_data(data, 1_233_346)?
1279 .applies_aura(AURA_ECLIPSE_SOLAR)
1280 .apply_aoe_from_data(data)
1281 .on_cast(crate::hooks::balance_druid::eclipse_hook),
1282 )
1283}
1284fn spell_celestial_alignment(
1285 s: SpellDefinitionDraft,
1286 data: &ResolvedGameData,
1287) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1288 Ok(
1289 s
1290 .apply_base_from_data(data, 194_223)?
1291 .applies_aura(AURA_ECLIPSE_SOLAR)
1292 .applies_aura(AURA_ECLIPSE_LUNAR)
1293 .apply_aoe_from_data(data)
1294 .on_cast(crate::hooks::balance_druid::celestial_alignment_hook),
1295 )
1296}
1297fn spell_incarnation_chosen_of_elune(
1298 s: SpellDefinitionDraft,
1299 data: &ResolvedGameData,
1300) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1301 Ok(
1302 s
1303 .apply_base_from_data(data, 102_560)?
1304 .applies_aura(AURA_ECLIPSE_SOLAR)
1305 .applies_aura(AURA_ECLIPSE_LUNAR)
1306 .apply_aoe_from_data(data),
1307 )
1308}
1309fn spell_moonfire(
1310 s: SpellDefinitionDraft,
1311 data: &ResolvedGameData,
1312) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1313 Ok(
1314 s
1315 .apply_base_from_data(data, 8921)?
1316 .gain(
1317 (data.base_points(wowlab_types::sim::SpellIdx::from_raw(197_911), 3))
1318 * 0.1,
1319 )
1320 .damage_sp_from_data(
1321 wowlab_engine_domain::dbc::EffectLookup::new(
1322 data,
1323 wowlab_types::sim::EffectRef::new(
1324 wowlab_types::sim::SpellIdx::from_raw(164_812),
1325 1,
1326 ),
1327 ),
1328 )?
1329 .applies_aura(AURA_MOONFIRE)
1330 .apply_aoe_from_data(data),
1331 )
1332}
1333fn spell_sunfire(
1334 s: SpellDefinitionDraft,
1335 data: &ResolvedGameData,
1336) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1337 Ok(
1338 s
1339 .apply_base_from_data(data, 93402)?
1340 .gain(
1341 (data.base_points(wowlab_types::sim::SpellIdx::from_raw(197_911), 3))
1342 * 0.1,
1343 )
1344 .damage_sp_from_data(
1345 wowlab_engine_domain::dbc::EffectLookup::new(
1346 data,
1347 wowlab_types::sim::EffectRef::new(
1348 wowlab_types::sim::SpellIdx::from_raw(164_815),
1349 1,
1350 ),
1351 ),
1352 )?
1353 .applies_aura(AURA_SUNFIRE)
1354 .apply_aoe_from_data(data),
1355 )
1356}
1357fn spell_starsurge(
1358 s: SpellDefinitionDraft,
1359 data: &ResolvedGameData,
1360) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1361 Ok(
1362 s
1363 .apply_base_from_data(data, 78674)?
1364 .applies_aura(AURA_STARLORD)
1365 .apply_aoe_from_data(data)
1366 .on_cast(crate::hooks::balance_druid::starsurge_hook)
1367 .cost_free_when_aura(450_360),
1368 )
1369}
1370fn spell_starfall(
1371 s: SpellDefinitionDraft,
1372 data: &ResolvedGameData,
1373) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1374 Ok(
1375 s
1376 .apply_base_from_data(data, 191_034)?
1377 .applies_aura(AURA_STARLORD)
1378 .apply_aoe_from_data(data)
1379 .on_cast(crate::hooks::balance_druid::starfall_hook),
1380 )
1381}
1382fn spell_new_moon(
1383 s: SpellDefinitionDraft,
1384 data: &ResolvedGameData,
1385) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1386 Ok(s.apply_base_from_data(data, 274_281)?.apply_aoe_from_data(data))
1387}
1388fn spell_fury_of_elune(
1389 s: SpellDefinitionDraft,
1390 data: &ResolvedGameData,
1391) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1392 Ok(
1393 s
1394 .apply_base_from_data(data, 202_770)?
1395 .applies_aura(AURA_FURY_OF_ELUNE_BEAM)
1396 .apply_aoe_from_data(data),
1397 )
1398}
1399fn spell_force_of_nature(
1400 s: SpellDefinitionDraft,
1401 data: &ResolvedGameData,
1402) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1403 Ok(s.apply_base_from_data(data, 205_636)?.apply_aoe_from_data(data))
1404}
1405fn spell_convoke_the_spirits(
1406 s: SpellDefinitionDraft,
1407 data: &ResolvedGameData,
1408) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1409 Ok(s.apply_base_from_data(data, 391_528)?.apply_aoe_from_data(data))
1410}
1411fn spell_wild_mushroom(
1412 s: SpellDefinitionDraft,
1413 data: &ResolvedGameData,
1414) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1415 Ok(
1416 s
1417 .apply_base_from_data(data, 88747)?
1418 .without_primary_data_damage()
1419 .apply_aoe_from_data(data),
1420 )
1421}
1422pub(crate) fn build_combat_system_draft(
1423 params: &wowlab_engine_ports::HandlerParams<'_>,
1424) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1425 let builder = CombatSystemBuilder::new(params.stats.clone())
1426 .spec_id(SpecId::Balance)
1427 .spec_identity(
1428 wowlab_engine_combat::generated_identities::specs::balance_druid::PROOF,
1429 )
1430 .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1431 .effect_identities(
1432 wowlab_engine_combat::generated_identities::specs::balance_druid::damage::ALL,
1433 )
1434 .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1435 .mastery_spell(393_014)
1436 .mastery_hook(crate::hooks::balance_druid::mastery)
1437 .resource(
1438 "astral_power",
1439 100.0,
1440 params
1441 .game_data
1442 .power_regen_for_max(8, 100.0)
1443 .ok_or_else(|| {
1444 wowlab_engine_ports::EngineError::spec_construction(
1445 "missing power-type power_regen_for_max for type_id 8",
1446 )
1447 })?,
1448 )
1449 .resource_type_id(8)
1450 .resource_start(
1451 params
1452 .game_data
1453 .power_default(8)
1454 .ok_or_else(|| {
1455 wowlab_engine_ports::EngineError::spec_construction(
1456 "missing power-type power_default for type_id 8",
1457 )
1458 })?,
1459 )
1460 .aura(
1461 "moonkin_form",
1462 AURA::MOONKIN_FORM,
1463 |a| aura_moonkin_form(a, ¶ms.game_data),
1464 )
1465 .aura(
1466 "mark_of_the_wild_highlight",
1467 AURA::MARK_OF_THE_WILD_HIGHLIGHT,
1468 |a| aura_mark_of_the_wild_highlight(a, ¶ms.game_data),
1469 )
1470 .aura(
1471 "harmony_of_the_grove",
1472 AURA::HARMONY_OF_THE_GROVE,
1473 |a| aura_harmony_of_the_grove(a, ¶ms.game_data),
1474 )
1475 .aura(
1476 "dream_surge",
1477 AURA::DREAM_SURGE,
1478 |a| aura_dream_surge(a, ¶ms.game_data),
1479 )
1480 .aura(
1481 "atmospheric_exposure",
1482 AURA::ATMOSPHERIC_EXPOSURE,
1483 |a| aura_atmospheric_exposure(a, ¶ms.game_data),
1484 )
1485 .aura(
1486 "eclipse_solar",
1487 AURA::ECLIPSE_SOLAR,
1488 |a| aura_eclipse_solar(a, ¶ms.game_data),
1489 )
1490 .aura(
1491 "eclipse_lunar",
1492 AURA::ECLIPSE_LUNAR,
1493 |a| aura_eclipse_lunar(a, ¶ms.game_data),
1494 )
1495 .aura(
1496 "akilzons_clarity",
1497 AURA::AKILZONS_CLARITY,
1498 |a| aura_akilzons_clarity(a, ¶ms.game_data),
1499 )
1500 .aura(
1501 "celestial_alignment",
1502 AURA::CELESTIAL_ALIGNMENT,
1503 |a| aura_celestial_alignment(a, ¶ms.game_data),
1504 )
1505 .aura(
1506 "incarnation_chosen_of_elune",
1507 AURA::INCARNATION_CHOSEN_OF_ELUNE,
1508 |a| aura_incarnation_chosen_of_elune(a, ¶ms.game_data),
1509 )
1510 .aura(
1511 "lunar_eclipse_override",
1512 AURA::LUNAR_ECLIPSE_OVERRIDE,
1513 |a| aura_lunar_eclipse_override(a, ¶ms.game_data),
1514 )
1515 .aura("eclipse", AURA::ECLIPSE, |a| aura_eclipse(a, ¶ms.game_data))
1516 .aura(
1517 "lunar_calling",
1518 AURA::LUNAR_CALLING,
1519 |a| aura_lunar_calling(a, ¶ms.game_data),
1520 )
1521 .aura("dreamstate", AURA::DREAMSTATE, |a| aura_dreamstate(a, ¶ms.game_data))
1522 .aura("moonfire", AURA::MOONFIRE, |a| aura_moonfire(a, ¶ms.game_data))
1523 .aura("sunfire", AURA::SUNFIRE, |a| aura_sunfire(a, ¶ms.game_data))
1524 .aura("starfall", AURA::STARFALL, |a| aura_starfall(a, ¶ms.game_data))
1525 .aura("starlord", AURA::STARLORD, |a| aura_starlord(a, ¶ms.game_data))
1526 .aura(
1527 "starweavers_warp",
1528 AURA::STARWEAVER_S_WARP,
1529 |a| aura_starweaver_s_warp(a, ¶ms.game_data),
1530 )
1531 .aura(
1532 "starweavers_weft",
1533 AURA::STARWEAVER_S_WEFT,
1534 |a| aura_starweaver_s_weft(a, ¶ms.game_data),
1535 )
1536 .aura(
1537 "touch_the_cosmos",
1538 AURA::TOUCH_THE_COSMOS,
1539 |a| aura_touch_the_cosmos(a, ¶ms.game_data),
1540 )
1541 .aura("solstice", AURA::SOLSTICE, |a| aura_solstice(a, ¶ms.game_data))
1542 .aura(
1543 "stellar_amplification",
1544 AURA::STELLAR_AMPLIFICATION,
1545 |a| aura_stellar_amplification(a, ¶ms.game_data),
1546 )
1547 .aura(
1548 "boat_arcane",
1549 AURA::BOAT_ARCANE,
1550 |a| aura_boat_arcane(a, ¶ms.game_data),
1551 )
1552 .aura(
1553 "boat_nature",
1554 AURA::BOAT_NATURE,
1555 |a| aura_boat_nature(a, ¶ms.game_data),
1556 )
1557 .aura(
1558 "fungal_growth",
1559 AURA::FUNGAL_GROWTH,
1560 |a| aura_fungal_growth(a, ¶ms.game_data),
1561 )
1562 .aura(
1563 "natures_balance",
1564 AURA::NATURES_BALANCE,
1565 |a| aura_natures_balance(a, ¶ms.game_data),
1566 )
1567 .aura(
1568 "fury_of_elune_energize",
1569 AURA::FURY_OF_ELUNE_ENERGIZE,
1570 |a| aura_fury_of_elune_energize(a, ¶ms.game_data),
1571 )
1572 .aura(
1573 "fury_of_elune_beam",
1574 AURA::FURY_OF_ELUNE_BEAM,
1575 |a| aura_fury_of_elune_beam(a, ¶ms.game_data),
1576 )
1577 .aura(
1578 "sundered_firmament_energize",
1579 AURA::SUNDERED_FIRMAMENT_ENERGIZE,
1580 |a| aura_sundered_firmament_energize(a, ¶ms.game_data),
1581 )
1582 .aura(
1583 "sundered_firmament_beam",
1584 AURA::SUNDERED_FIRMAMENT_BEAM,
1585 |a| aura_sundered_firmament_beam(a, ¶ms.game_data),
1586 )
1587 .aura(
1588 "sunseeker_mushroom_driver",
1589 AURA::SUNSEEKER_MUSHROOM_DRIVER,
1590 |a| aura_sunseeker_mushroom_driver(a, ¶ms.game_data),
1591 )
1592 .spell(
1593 "moonkin_form",
1594 SPELL::MOONKIN_FORM,
1595 |s| spell_moonkin_form(s, ¶ms.game_data),
1596 )
1597 .spell(
1598 "mark_of_the_wild",
1599 SPELL::MARK_OF_THE_WILD,
1600 |s| spell_mark_of_the_wild(s, ¶ms.game_data),
1601 )
1602 .spell("wrath", SPELL::WRATH, |s| spell_wrath(s, ¶ms.game_data))
1603 .spell("starfire", SPELL::STARFIRE, |s| spell_starfire(s, ¶ms.game_data))
1604 .spell(
1605 "solar_eclipse",
1606 SPELL::SOLAR_ECLIPSE,
1607 |s| spell_solar_eclipse(s, ¶ms.game_data),
1608 )
1609 .spell(
1610 "celestial_alignment",
1611 SPELL::CELESTIAL_ALIGNMENT,
1612 |s| spell_celestial_alignment(s, ¶ms.game_data),
1613 )
1614 .spell(
1615 "incarnation_chosen_of_elune",
1616 SPELL::INCARNATION_CHOSEN_OF_ELUNE,
1617 |s| spell_incarnation_chosen_of_elune(s, ¶ms.game_data),
1618 )
1619 .spell("moonfire", SPELL::MOONFIRE, |s| spell_moonfire(s, ¶ms.game_data))
1620 .spell("sunfire", SPELL::SUNFIRE, |s| spell_sunfire(s, ¶ms.game_data))
1621 .spell("starsurge", SPELL::STARSURGE, |s| spell_starsurge(s, ¶ms.game_data))
1622 .spell("starfall", SPELL::STARFALL, |s| spell_starfall(s, ¶ms.game_data))
1623 .spell("new_moon", SPELL::NEW_MOON, |s| spell_new_moon(s, ¶ms.game_data))
1624 .spell(
1625 "fury_of_elune",
1626 SPELL::FURY_OF_ELUNE,
1627 |s| spell_fury_of_elune(s, ¶ms.game_data),
1628 )
1629 .spell(
1630 "force_of_nature",
1631 SPELL::FORCE_OF_NATURE,
1632 |s| spell_force_of_nature(s, ¶ms.game_data),
1633 )
1634 .spell(
1635 "convoke_the_spirits",
1636 SPELL::CONVOKE_THE_SPIRITS,
1637 |s| spell_convoke_the_spirits(s, ¶ms.game_data),
1638 )
1639 .spell(
1640 "wild_mushroom",
1641 SPELL::WILD_MUSHROOM,
1642 |s| spell_wild_mushroom(s, ¶ms.game_data),
1643 )
1644 .game_data(params.game_data.clone())
1645 .talent_spell_ids(TALENTS)
1646 .talent_selections(params.talent_selections)
1647 .talent_companion_aura(TALENT::LUNAR_CALLING, AURA_LUNAR_ECLIPSE_OVERRIDE)
1648 .talent_companion_aura(TALENT::NATURE_S_BALANCE, AURA_NATURES_BALANCE)
1649 .set_bonus_auras(params.set_bonus_auras)
1650 .encounter(params.encounter.clone());
1651 let builder = crate::generated::items::register_equipped(
1652 builder,
1653 ¶ms.game_data,
1654 params.equipped_items,
1655 )?;
1656
1657 builder.into_draft()
1658}
1659fn new_handler(
1660 params: wowlab_engine_ports::HandlerParams<'_>,
1661) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1662 let handler = crate::composition::compose_handler(
1663 build_combat_system_draft,
1664 ¶ms,
1665 crate::hooks::balance_druid::BalanceHandler::new,
1666 )?;
1667
1668 Ok(Box::new(handler))
1669}
1670static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1671 primary_resource: ResourceType::LunarPower,
1672 secondary_resource: None,
1673 spell_ids: DECLARED_SPELL_IDS,
1674 aura_ids: DECLARED_AURA_IDS,
1675 server_proc_entries: &[
1676 DeclaredServerProcEntry {
1677 spell_id: 450_346,
1678 attributes: ProcAttributes::REQUIRE_SPELL_MODIFIER.bits()
1679 | ProcAttributes::USE_STACKS_FOR_CHARGES.bits(),
1680 },
1681 ],
1682 talents: TALENTS,
1683 rotation_field_schema: &[],
1684 metrics_plugin_id: None,
1685 hero_talent_trees: &[
1686 HeroTalentTreeDesc {
1687 name: "Keeper Of The Grove",
1688 spells: HERO_TREE_KEEPER_OF_THE_GROVE_SPELLS,
1689 auras: HERO_TREE_KEEPER_OF_THE_GROVE_AURAS,
1690 },
1691 HeroTalentTreeDesc {
1692 name: "Elunes Chosen",
1693 spells: HERO_TREE_ELUNES_CHOSEN_SPELLS,
1694 auras: HERO_TREE_ELUNES_CHOSEN_AURAS,
1695 },
1696 ],
1697 reported_spells: REPORTED_SPELLS,
1698 masked_passive_effects: &[],
1699 passive_effect_overrides: &[],
1700};
1701pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1702 spec_id: SpecId::Balance,
1703 display_name: "Balance Druid",
1704 metadata: DECLARED_METADATA,
1705 handler_factory: new_handler,
1706};
1707wowlab_engine_combat::smoke_test!(build_combat_system_draft);