Skip to main content

wowlab_engine_content/generated/specs/
balance_druid.rs

1//! @generated by codegen-cli from manifests/specs/druid/balance/manifest.toml -- do not edit by hand.
2// Generated code: naming follows game data conventions
3#![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    ///<https://wowlab.gg/inspect/spell/24858>
17    pub(crate) const MOONKIN_FORM: u32 = 24858;
18    ///<https://wowlab.gg/inspect/spell/1126>
19    pub(crate) const MARK_OF_THE_WILD: u32 = 1126;
20    ///<https://wowlab.gg/inspect/spell/190984>
21    pub(crate) const WRATH: u32 = 190_984;
22    ///<https://wowlab.gg/inspect/spell/194153>
23    pub(crate) const STARFIRE: u32 = 194_153;
24    ///<https://wowlab.gg/inspect/spell/1233346>
25    pub(crate) const SOLAR_ECLIPSE: u32 = 1_233_346;
26    ///<https://wowlab.gg/inspect/spell/194223>
27    pub(crate) const CELESTIAL_ALIGNMENT: u32 = 194_223;
28    ///<https://wowlab.gg/inspect/spell/102560>
29    pub(crate) const INCARNATION_CHOSEN_OF_ELUNE: u32 = 102_560;
30    ///<https://wowlab.gg/inspect/spell/8921>
31    pub(crate) const MOONFIRE: u32 = 8921;
32    ///<https://wowlab.gg/inspect/spell/93402>
33    pub(crate) const SUNFIRE: u32 = 93402;
34    ///<https://wowlab.gg/inspect/spell/78674>
35    pub(crate) const STARSURGE: u32 = 78674;
36    ///<https://wowlab.gg/inspect/spell/191034>
37    pub(crate) const STARFALL: u32 = 191_034;
38    ///<https://wowlab.gg/inspect/spell/274281>
39    pub(crate) const NEW_MOON: u32 = 274_281;
40    ///<https://wowlab.gg/inspect/spell/202770>
41    pub(crate) const FURY_OF_ELUNE: u32 = 202_770;
42    ///<https://wowlab.gg/inspect/spell/205636>
43    pub(crate) const FORCE_OF_NATURE: u32 = 205_636;
44    ///<https://wowlab.gg/inspect/spell/391528>
45    pub(crate) const CONVOKE_THE_SPIRITS: u32 = 391_528;
46    ///<https://wowlab.gg/inspect/spell/88747>
47    pub(crate) const WILD_MUSHROOM: u32 = 88747;
48}
49pub(crate) mod AURA {
50    ///<https://wowlab.gg/inspect/spell/24858>
51    pub(crate) const MOONKIN_FORM: u32 = 24858;
52    ///<https://wowlab.gg/inspect/spell/1126>
53    pub(crate) const MARK_OF_THE_WILD_HIGHLIGHT: u32 = 1126;
54    ///<https://wowlab.gg/inspect/spell/428737>
55    pub(crate) const HARMONY_OF_THE_GROVE: u32 = 428_737;
56    ///<https://wowlab.gg/inspect/spell/433831>
57    pub(crate) const DREAM_SURGE: u32 = 433_831;
58    ///<https://wowlab.gg/inspect/spell/430589>
59    pub(crate) const ATMOSPHERIC_EXPOSURE: u32 = 430_589;
60    ///<https://wowlab.gg/inspect/spell/48517>
61    pub(crate) const ECLIPSE_SOLAR: u32 = 48517;
62    ///<https://wowlab.gg/inspect/spell/48518>
63    pub(crate) const ECLIPSE_LUNAR: u32 = 48518;
64    ///<https://wowlab.gg/inspect/spell/1301768>
65    pub(crate) const AKILZONS_CLARITY: u32 = 1_301_768;
66    ///<https://wowlab.gg/inspect/spell/194223>
67    pub(crate) const CELESTIAL_ALIGNMENT: u32 = 194_223;
68    ///<https://wowlab.gg/inspect/spell/102560>
69    pub(crate) const INCARNATION_CHOSEN_OF_ELUNE: u32 = 102_560;
70    ///<https://wowlab.gg/inspect/spell/1233353>
71    pub(crate) const LUNAR_ECLIPSE_OVERRIDE: u32 = 1_233_353;
72    ///<https://wowlab.gg/inspect/spell/1239669>
73    pub(crate) const ECLIPSE: u32 = 1_239_669;
74    ///<https://wowlab.gg/inspect/spell/429523>
75    pub(crate) const LUNAR_CALLING: u32 = 429_523;
76    ///<https://wowlab.gg/inspect/spell/450346>
77    pub(crate) const DREAMSTATE: u32 = 450_346;
78    ///<https://wowlab.gg/inspect/spell/164812>
79    pub(crate) const MOONFIRE: u32 = 164_812;
80    ///<https://wowlab.gg/inspect/spell/164815>
81    pub(crate) const SUNFIRE: u32 = 164_815;
82    ///<https://wowlab.gg/inspect/spell/191034>
83    pub(crate) const STARFALL: u32 = 191_034;
84    ///<https://wowlab.gg/inspect/spell/279709>
85    pub(crate) const STARLORD: u32 = 279_709;
86    ///<https://wowlab.gg/inspect/spell/393942>
87    pub(crate) const STARWEAVER_S_WARP: u32 = 393_942;
88    ///<https://wowlab.gg/inspect/spell/393944>
89    pub(crate) const STARWEAVER_S_WEFT: u32 = 393_944;
90    ///<https://wowlab.gg/inspect/spell/450360>
91    pub(crate) const TOUCH_THE_COSMOS: u32 = 450_360;
92    ///<https://wowlab.gg/inspect/spell/343648>
93    pub(crate) const SOLSTICE: u32 = 343_648;
94    ///<https://wowlab.gg/inspect/spell/450214>
95    pub(crate) const STELLAR_AMPLIFICATION: u32 = 450_214;
96    ///<https://wowlab.gg/inspect/spell/394050>
97    pub(crate) const BOAT_ARCANE: u32 = 394_050;
98    ///<https://wowlab.gg/inspect/spell/394049>
99    pub(crate) const BOAT_NATURE: u32 = 394_049;
100    ///<https://wowlab.gg/inspect/spell/81281>
101    pub(crate) const FUNGAL_GROWTH: u32 = 81281;
102    ///<https://wowlab.gg/inspect/spell/202430>
103    pub(crate) const NATURES_BALANCE: u32 = 202_430;
104    ///<https://wowlab.gg/inspect/spell/202770>
105    pub(crate) const FURY_OF_ELUNE_ENERGIZE: u32 = 202_770;
106    ///<https://wowlab.gg/inspect/spell/211545>
107    pub(crate) const FURY_OF_ELUNE_BEAM: u32 = 211_545;
108    ///<https://wowlab.gg/inspect/spell/394108>
109    pub(crate) const SUNDERED_FIRMAMENT_ENERGIZE: u32 = 394_108;
110    ///<https://wowlab.gg/inspect/spell/394111>
111    pub(crate) const SUNDERED_FIRMAMENT_BEAM: u32 = 394_111;
112    ///<https://wowlab.gg/inspect/spell/468938>
113    pub(crate) const SUNSEEKER_MUSHROOM_DRIVER: u32 = 468_938;
114}
115pub(crate) mod TALENT {
116    ///<https://wowlab.gg/inspect/spell/1261565>
117    pub(crate) const ASCENDANT_ECLIPSES_2: u32 = 1_261_565;
118    ///<https://wowlab.gg/inspect/spell/429532>
119    pub(crate) const ATMOSPHERIC_EXPOSURE: u32 = 429_532;
120    ///<https://wowlab.gg/inspect/spell/394048>
121    pub(crate) const BALANCE_OF_ALL_THINGS: u32 = 394_048;
122    ///<https://wowlab.gg/inspect/spell/391528>
123    pub(crate) const CONVOKE_THE_SPIRITS: u32 = 391_528;
124    ///<https://wowlab.gg/inspect/spell/1239669>
125    pub(crate) const ECLIPSE: u32 = 1_239_669;
126    ///<https://wowlab.gg/inspect/spell/205636>
127    pub(crate) const FORCE_OF_NATURE: u32 = 205_636;
128    ///<https://wowlab.gg/inspect/spell/202770>
129    pub(crate) const FURY_OF_ELUNE: u32 = 202_770;
130    ///<https://wowlab.gg/inspect/spell/469004>
131    pub(crate) const HAIL_OF_STARS: u32 = 469_004;
132    ///<https://wowlab.gg/inspect/spell/1240906>
133    pub(crate) const IMPROVED_ECLIPSE: u32 = 1_240_906;
134    ///<https://wowlab.gg/inspect/spell/102560>
135    pub(crate) const INCARNATION_CHOSEN_OF_ELUNE: u32 = 102_560;
136    ///<https://wowlab.gg/inspect/spell/429523>
137    pub(crate) const LUNAR_CALLING: u32 = 429_523;
138    ///<https://wowlab.gg/inspect/spell/429520>
139    pub(crate) const MOON_GUARDIAN: u32 = 429_520;
140    ///<https://wowlab.gg/inspect/spell/202430>
141    pub(crate) const NATURE_S_BALANCE: u32 = 202_430;
142    ///<https://wowlab.gg/inspect/spell/274281>
143    pub(crate) const NEW_MOON: u32 = 274_281;
144    ///<https://wowlab.gg/inspect/spell/394046>
145    pub(crate) const POWER_OF_GOLDRINN: u32 = 394_046;
146    ///<https://wowlab.gg/inspect/spell/393954>
147    pub(crate) const RATTLE_THE_STARS: u32 = 393_954;
148    ///<https://wowlab.gg/inspect/spell/202342>
149    pub(crate) const SHOOTING_STARS: u32 = 202_342;
150    ///<https://wowlab.gg/inspect/spell/343647>
151    pub(crate) const SOLSTICE: u32 = 343_647;
152    ///<https://wowlab.gg/inspect/spell/202345>
153    pub(crate) const STARLORD: u32 = 202_345;
154    ///<https://wowlab.gg/inspect/spell/393940>
155    pub(crate) const STARWEAVER: u32 = 393_940;
156    ///<https://wowlab.gg/inspect/spell/1271206>
157    pub(crate) const STAR_CASCADE: u32 = 1_271_206;
158    ///<https://wowlab.gg/inspect/spell/450212>
159    pub(crate) const STELLAR_AMPLIFICATION: u32 = 450_212;
160    ///<https://wowlab.gg/inspect/spell/394094>
161    pub(crate) const SUNDERED_FIRMAMENT: u32 = 394_094;
162    ///<https://wowlab.gg/inspect/spell/468936>
163    pub(crate) const SUNSEEKER_MUSHROOM: u32 = 468_936;
164    ///<https://wowlab.gg/inspect/spell/450356>
165    pub(crate) const TOUCH_THE_COSMOS: u32 = 450_356;
166    ///<https://wowlab.gg/inspect/spell/393760>
167    pub(crate) const UMBRAL_EMBRACE: u32 = 393_760;
168    ///<https://wowlab.gg/inspect/spell/468743>
169    pub(crate) const WHIRLING_STARS: u32 = 468_743;
170    ///<https://wowlab.gg/inspect/spell/88747>
171    pub(crate) const WILD_MUSHROOM: u32 = 88747;
172    ///<https://wowlab.gg/inspect/spell/406890>
173    pub(crate) const WILD_SURGES: u32 = 406_890;
174}
175pub(crate) mod SET_BONUS {
176    ///<https://wowlab.gg/inspect/spell/1296603>
177    pub(crate) const MID2_BALANCE_2PC: u32 = 1_296_603;
178    ///<https://wowlab.gg/inspect/spell/1296604>
179    pub(crate) const MID2_BALANCE_4PC: u32 = 1_296_604;
180}
181pub(crate) mod REPORTED_SPELL {
182    ///<https://wowlab.gg/inspect/spell/1263250>
183    pub(crate) const ASTRAL_SMOLDER: u32 = 1_263_250;
184    ///<https://wowlab.gg/inspect/spell/1280213>
185    pub(crate) const FUNGAL_GROWTH: u32 = 1_280_213;
186    ///<https://wowlab.gg/inspect/spell/394047>
187    pub(crate) const GOLDRINN: u32 = 394_047;
188    ///<https://wowlab.gg/inspect/spell/164812>
189    pub(crate) const MOONFIRE_PERIODIC: u32 = 164_812;
190    ///<https://wowlab.gg/inspect/spell/202497>
191    pub(crate) const SHOOTING_STARS: u32 = 202_497;
192    ///<https://wowlab.gg/inspect/spell/1301742>
193    pub(crate) const STARFALL_INSTANT: u32 = 1_301_742;
194    ///<https://wowlab.gg/inspect/spell/1271222>
195    pub(crate) const STARSURGE_CASCADE: u32 = 1_271_222;
196    ///<https://wowlab.gg/inspect/spell/164815>
197    pub(crate) const SUNFIRE_PERIODIC: u32 = 164_815;
198    ///<https://wowlab.gg/inspect/spell/1280212>
199    pub(crate) const SUNSEEKER_MUSHROOM: u32 = 1_280_212;
200    ///<https://wowlab.gg/inspect/spell/88751>
201    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            ///<https://wowlab.gg/inspect/spell/433850>
207            pub(crate) const DREAM_BURST: u32 = 433_850;
208            ///<https://wowlab.gg/inspect/spell/205636>
209            pub(crate) const FORCE_OF_NATURE: u32 = 205_636;
210        }
211        pub(crate) mod AURA {
212            ///<https://wowlab.gg/inspect/spell/429433>
213            pub(crate) const BLOOMING_INFUSION: u32 = 429_433;
214            ///<https://wowlab.gg/inspect/spell/455801>
215            pub(crate) const CENARIUS_MIGHT: u32 = 455_801;
216            ///<https://wowlab.gg/inspect/spell/433831>
217            pub(crate) const DREAM_SURGE: u32 = 433_831;
218            ///<https://wowlab.gg/inspect/spell/428737>
219            pub(crate) const HARMONY_OF_THE_GROVE: u32 = 428_737;
220        }
221    }
222    pub(crate) mod ELUNES_CHOSEN {
223        pub(crate) mod SPELL {
224            ///<https://wowlab.gg/inspect/spell/1261700>
225            pub(crate) const LUNAR_BOLT: u32 = 1_261_700;
226            ///<https://wowlab.gg/inspect/spell/361237>
227            pub(crate) const ORBITAL_STRIKE: u32 = 361_237;
228            ///<https://wowlab.gg/inspect/spell/1261573>
229            pub(crate) const SOLAR_BOLT: u32 = 1_261_573;
230        }
231        pub(crate) mod AURA {
232            ///<https://wowlab.gg/inspect/spell/1263363>
233            pub(crate) const ASCENDANT_FIRES: u32 = 1_263_363;
234            ///<https://wowlab.gg/inspect/spell/1263382>
235            pub(crate) const ASCENDANT_STARS: u32 = 1_263_382;
236            ///<https://wowlab.gg/inspect/spell/430589>
237            pub(crate) const ATMOSPHERIC_EXPOSURE: u32 = 430_589;
238            ///<https://wowlab.gg/inspect/spell/429523>
239            pub(crate) const LUNAR_CALLING: u32 = 429_523;
240            ///<https://wowlab.gg/inspect/spell/395110>
241            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    ///<https://wowlab.gg/inspect/spell/1301768>
506    pub(crate) const AKILZONS_CLARITY_MAX: (u32, u8) = (1_301_768, 3);
507    ///<https://wowlab.gg/inspect/spell/1301768>
508    pub(crate) const AKILZONS_CLARITY_MIN: (u32, u8) = (1_301_768, 4);
509    ///<https://wowlab.gg/inspect/spell/393014>
510    pub(crate) const ASTRAL_INVOCATION_ARCANE_DIRECT: (u32, u8) = (393_014, 1);
511    ///<https://wowlab.gg/inspect/spell/393014>
512    pub(crate) const ASTRAL_INVOCATION_ARCANE_PERIODIC: (u32, u8) = (393_014, 2);
513    ///<https://wowlab.gg/inspect/spell/393014>
514    pub(crate) const ASTRAL_INVOCATION_NATURE_DIRECT: (u32, u8) = (393_014, 3);
515    ///<https://wowlab.gg/inspect/spell/393014>
516    pub(crate) const ASTRAL_INVOCATION_NATURE_PERIODIC: (u32, u8) = (393_014, 4);
517    ///<https://wowlab.gg/inspect/spell/197911>
518    pub(crate) const ASTRAL_POWER_WRATH_AP: (u32, u8) = (197_911, 2);
519    ///<https://wowlab.gg/inspect/spell/1261565>
520    pub(crate) const ASTRAL_SMOLDER_PCT: (u32, u8) = (1_261_565, 1);
521    ///<https://wowlab.gg/inspect/spell/1280213>
522    pub(crate) const FUNGAL_GROWTH_SUNSEEKER: (u32, u8) = (1_280_213, 1);
523    ///<https://wowlab.gg/inspect/spell/394047>
524    pub(crate) const GOLDRINN_DMG: (u32, u8) = (394_047, 1);
525    ///<https://wowlab.gg/inspect/spell/469004>
526    pub(crate) const HAIL_OF_STARS_MS: (u32, u8) = (469_004, 1);
527    ///<https://wowlab.gg/inspect/spell/429520>
528    pub(crate) const MOON_GUARDIAN_AP: (u32, u8) = (429_520, 1);
529    ///<https://wowlab.gg/inspect/spell/202430>
530    pub(crate) const NATURES_BALANCE_START: (u32, u8) = (202_430, 2);
531    ///<https://wowlab.gg/inspect/spell/393954>
532    pub(crate) const RATTLE_COST_PCT: (u32, u8) = (393_954, 2);
533    ///<https://wowlab.gg/inspect/spell/202497>
534    pub(crate) const SHOOTING_STARS_AP: (u32, u8) = (202_497, 2);
535    ///<https://wowlab.gg/inspect/spell/202342>
536    pub(crate) const SHOOTING_STARS_CHANCE: (u32, u8) = (202_342, 1);
537    ///<https://wowlab.gg/inspect/spell/202497>
538    pub(crate) const SHOOTING_STARS_DMG: (u32, u8) = (202_497, 1);
539    ///<https://wowlab.gg/inspect/spell/191037>
540    pub(crate) const STARFALL_DAMAGE: (u32, u8) = (191_037, 1);
541    ///<https://wowlab.gg/inspect/spell/50286>
542    pub(crate) const STARFALL_GEOMETRY: (u32, u8) = (50286, 1);
543    ///<https://wowlab.gg/inspect/spell/1301742>
544    pub(crate) const STARFALL_INSTANT_DAMAGE: (u32, u8) = (1_301_742, 1);
545    ///<https://wowlab.gg/inspect/spell/343647>
546    pub(crate) const SOLSTICE_RATE: (u32, u8) = (343_647, 1);
547    ///<https://wowlab.gg/inspect/spell/1271222>
548    pub(crate) const STARSURGE_CASCADE_DMG: (u32, u8) = (1_271_222, 1);
549    ///<https://wowlab.gg/inspect/spell/1271206>
550    pub(crate) const STAR_CASCADE_CHANCE: (u32, u8) = (1_271_206, 1);
551    ///<https://wowlab.gg/inspect/spell/1271206>
552    pub(crate) const STAR_CASCADE_EFFECTIVENESS: (u32, u8) = (1_271_206, 3);
553    ///<https://wowlab.gg/inspect/spell/450212>
554    pub(crate) const STELLAR_AMP_CAP: (u32, u8) = (450_212, 1);
555    ///<https://wowlab.gg/inspect/spell/450356>
556    pub(crate) const TTC_CHANCE_STARFIRE: (u32, u8) = (450_356, 2);
557    ///<https://wowlab.gg/inspect/spell/450356>
558    pub(crate) const TTC_CHANCE_WRATH: (u32, u8) = (450_356, 1);
559    ///<https://wowlab.gg/inspect/spell/468743>
560    pub(crate) const WHIRLING_STARS_CDR: (u32, u8) = (468_743, 3);
561    ///<https://wowlab.gg/inspect/spell/88751>
562    pub(crate) const WILD_MUSHROOM_AP_CAP: (u32, u8) = (88751, 2);
563    ///<https://wowlab.gg/inspect/spell/1280212>
564    pub(crate) const SUNSEEKER_MUSHROOM_AP_CAP: (u32, u8) = (1_280_212, 2);
565    ///<https://wowlab.gg/inspect/spell/406890>
566    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, &params.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, &params.game_data),
1469        )
1470        .aura(
1471            "harmony_of_the_grove",
1472            AURA::HARMONY_OF_THE_GROVE,
1473            |a| aura_harmony_of_the_grove(a, &params.game_data),
1474        )
1475        .aura(
1476            "dream_surge",
1477            AURA::DREAM_SURGE,
1478            |a| aura_dream_surge(a, &params.game_data),
1479        )
1480        .aura(
1481            "atmospheric_exposure",
1482            AURA::ATMOSPHERIC_EXPOSURE,
1483            |a| aura_atmospheric_exposure(a, &params.game_data),
1484        )
1485        .aura(
1486            "eclipse_solar",
1487            AURA::ECLIPSE_SOLAR,
1488            |a| aura_eclipse_solar(a, &params.game_data),
1489        )
1490        .aura(
1491            "eclipse_lunar",
1492            AURA::ECLIPSE_LUNAR,
1493            |a| aura_eclipse_lunar(a, &params.game_data),
1494        )
1495        .aura(
1496            "akilzons_clarity",
1497            AURA::AKILZONS_CLARITY,
1498            |a| aura_akilzons_clarity(a, &params.game_data),
1499        )
1500        .aura(
1501            "celestial_alignment",
1502            AURA::CELESTIAL_ALIGNMENT,
1503            |a| aura_celestial_alignment(a, &params.game_data),
1504        )
1505        .aura(
1506            "incarnation_chosen_of_elune",
1507            AURA::INCARNATION_CHOSEN_OF_ELUNE,
1508            |a| aura_incarnation_chosen_of_elune(a, &params.game_data),
1509        )
1510        .aura(
1511            "lunar_eclipse_override",
1512            AURA::LUNAR_ECLIPSE_OVERRIDE,
1513            |a| aura_lunar_eclipse_override(a, &params.game_data),
1514        )
1515        .aura("eclipse", AURA::ECLIPSE, |a| aura_eclipse(a, &params.game_data))
1516        .aura(
1517            "lunar_calling",
1518            AURA::LUNAR_CALLING,
1519            |a| aura_lunar_calling(a, &params.game_data),
1520        )
1521        .aura("dreamstate", AURA::DREAMSTATE, |a| aura_dreamstate(a, &params.game_data))
1522        .aura("moonfire", AURA::MOONFIRE, |a| aura_moonfire(a, &params.game_data))
1523        .aura("sunfire", AURA::SUNFIRE, |a| aura_sunfire(a, &params.game_data))
1524        .aura("starfall", AURA::STARFALL, |a| aura_starfall(a, &params.game_data))
1525        .aura("starlord", AURA::STARLORD, |a| aura_starlord(a, &params.game_data))
1526        .aura(
1527            "starweavers_warp",
1528            AURA::STARWEAVER_S_WARP,
1529            |a| aura_starweaver_s_warp(a, &params.game_data),
1530        )
1531        .aura(
1532            "starweavers_weft",
1533            AURA::STARWEAVER_S_WEFT,
1534            |a| aura_starweaver_s_weft(a, &params.game_data),
1535        )
1536        .aura(
1537            "touch_the_cosmos",
1538            AURA::TOUCH_THE_COSMOS,
1539            |a| aura_touch_the_cosmos(a, &params.game_data),
1540        )
1541        .aura("solstice", AURA::SOLSTICE, |a| aura_solstice(a, &params.game_data))
1542        .aura(
1543            "stellar_amplification",
1544            AURA::STELLAR_AMPLIFICATION,
1545            |a| aura_stellar_amplification(a, &params.game_data),
1546        )
1547        .aura(
1548            "boat_arcane",
1549            AURA::BOAT_ARCANE,
1550            |a| aura_boat_arcane(a, &params.game_data),
1551        )
1552        .aura(
1553            "boat_nature",
1554            AURA::BOAT_NATURE,
1555            |a| aura_boat_nature(a, &params.game_data),
1556        )
1557        .aura(
1558            "fungal_growth",
1559            AURA::FUNGAL_GROWTH,
1560            |a| aura_fungal_growth(a, &params.game_data),
1561        )
1562        .aura(
1563            "natures_balance",
1564            AURA::NATURES_BALANCE,
1565            |a| aura_natures_balance(a, &params.game_data),
1566        )
1567        .aura(
1568            "fury_of_elune_energize",
1569            AURA::FURY_OF_ELUNE_ENERGIZE,
1570            |a| aura_fury_of_elune_energize(a, &params.game_data),
1571        )
1572        .aura(
1573            "fury_of_elune_beam",
1574            AURA::FURY_OF_ELUNE_BEAM,
1575            |a| aura_fury_of_elune_beam(a, &params.game_data),
1576        )
1577        .aura(
1578            "sundered_firmament_energize",
1579            AURA::SUNDERED_FIRMAMENT_ENERGIZE,
1580            |a| aura_sundered_firmament_energize(a, &params.game_data),
1581        )
1582        .aura(
1583            "sundered_firmament_beam",
1584            AURA::SUNDERED_FIRMAMENT_BEAM,
1585            |a| aura_sundered_firmament_beam(a, &params.game_data),
1586        )
1587        .aura(
1588            "sunseeker_mushroom_driver",
1589            AURA::SUNSEEKER_MUSHROOM_DRIVER,
1590            |a| aura_sunseeker_mushroom_driver(a, &params.game_data),
1591        )
1592        .spell(
1593            "moonkin_form",
1594            SPELL::MOONKIN_FORM,
1595            |s| spell_moonkin_form(s, &params.game_data),
1596        )
1597        .spell(
1598            "mark_of_the_wild",
1599            SPELL::MARK_OF_THE_WILD,
1600            |s| spell_mark_of_the_wild(s, &params.game_data),
1601        )
1602        .spell("wrath", SPELL::WRATH, |s| spell_wrath(s, &params.game_data))
1603        .spell("starfire", SPELL::STARFIRE, |s| spell_starfire(s, &params.game_data))
1604        .spell(
1605            "solar_eclipse",
1606            SPELL::SOLAR_ECLIPSE,
1607            |s| spell_solar_eclipse(s, &params.game_data),
1608        )
1609        .spell(
1610            "celestial_alignment",
1611            SPELL::CELESTIAL_ALIGNMENT,
1612            |s| spell_celestial_alignment(s, &params.game_data),
1613        )
1614        .spell(
1615            "incarnation_chosen_of_elune",
1616            SPELL::INCARNATION_CHOSEN_OF_ELUNE,
1617            |s| spell_incarnation_chosen_of_elune(s, &params.game_data),
1618        )
1619        .spell("moonfire", SPELL::MOONFIRE, |s| spell_moonfire(s, &params.game_data))
1620        .spell("sunfire", SPELL::SUNFIRE, |s| spell_sunfire(s, &params.game_data))
1621        .spell("starsurge", SPELL::STARSURGE, |s| spell_starsurge(s, &params.game_data))
1622        .spell("starfall", SPELL::STARFALL, |s| spell_starfall(s, &params.game_data))
1623        .spell("new_moon", SPELL::NEW_MOON, |s| spell_new_moon(s, &params.game_data))
1624        .spell(
1625            "fury_of_elune",
1626            SPELL::FURY_OF_ELUNE,
1627            |s| spell_fury_of_elune(s, &params.game_data),
1628        )
1629        .spell(
1630            "force_of_nature",
1631            SPELL::FORCE_OF_NATURE,
1632            |s| spell_force_of_nature(s, &params.game_data),
1633        )
1634        .spell(
1635            "convoke_the_spirits",
1636            SPELL::CONVOKE_THE_SPIRITS,
1637            |s| spell_convoke_the_spirits(s, &params.game_data),
1638        )
1639        .spell(
1640            "wild_mushroom",
1641            SPELL::WILD_MUSHROOM,
1642            |s| spell_wild_mushroom(s, &params.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        &params.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        &params,
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);