1#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_domain::dbc::ProcAttributes;
6use wowlab_engine_combat::{
7 CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
8 LocalSpellIdx, SpellDefinitionDraft,
9};
10use wowlab_engine_ports::{
11 DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
12 DeclaredServerProcEntry,
13};
14use wowlab_engine_gamedata::ResolvedGameData;
15pub(crate) mod SPELL {
16 pub(crate) const LIVING_FLAME: u32 = 361_469;
18 pub(crate) const AZURE_STRIKE: u32 = 362_969;
20 pub(crate) const DISINTEGRATE: u32 = 356_995;
22 pub(crate) const FIRE_BREATH: u32 = 357_208;
24 pub(crate) const ETERNITY_SURGE: u32 = 359_073;
26 pub(crate) const PYRE: u32 = 357_211;
28 pub(crate) const DRAGONRAGE: u32 = 375_087;
30 pub(crate) const UNBOUND_FLAME: u32 = 1_292_321;
32 pub(crate) const TIP_THE_SCALES: u32 = 370_553;
34 pub(crate) const SCINTILLATION: u32 = 370_821;
36 pub(crate) const SHATTERING_STAR: u32 = 1_265_804;
38 pub(crate) const BLESSING_OF_THE_BRONZE: u32 = 381_748;
40 pub(crate) const DEEP_BREATH: u32 = 357_210;
42}
43pub(crate) mod AURA {
44 pub(crate) const DRAGONRAGE: u32 = 375_087;
46 pub(crate) const ESSENCE_BURST: u32 = 359_618;
48 pub(crate) const BURNOUT: u32 = 375_802;
50 pub(crate) const CHARGED_BLAST: u32 = 370_454;
52 pub(crate) const IRIDESCENCE_BLUE: u32 = 386_399;
54 pub(crate) const IRIDESCENCE_RED: u32 = 386_353;
56 pub(crate) const LEAPING_FLAMES: u32 = 370_901;
58 pub(crate) const ANCIENT_FLAME: u32 = 375_583;
60 pub(crate) const TIP_THE_SCALES: u32 = 370_553;
62 pub(crate) const POWER_SWELL: u32 = 376_850;
64 pub(crate) const IMMINENT_DESTRUCTION: u32 = 411_055;
66 pub(crate) const FIRE_BREATH: u32 = 357_209;
68 pub(crate) const CONSUME_FLAME: u32 = 444_088;
70 pub(crate) const AZURE_SWEEP: u32 = 1_265_871;
72 pub(crate) const RECALL: u32 = 371_807;
74 pub(crate) const BLESSING_OF_THE_BRONZE: u32 = 381_748;
76 pub(crate) const RISING_FURY: u32 = 1_271_783;
78 pub(crate) const UNBOUND_FLAME: u32 = 1_292_323;
80 pub(crate) const DEEP_BREATH_TRIGGER: u32 = 353_759;
82 pub(crate) const MELT_ARMOR_DOT: u32 = 441_172;
84 pub(crate) const STRAFING_RUN: u32 = 1_266_165;
86 pub(crate) const BOMBARDMENTS: u32 = 434_473;
88 pub(crate) const MASS_DISINTEGRATE: u32 = 436_336;
90}
91pub(crate) mod TALENT {
92 pub(crate) const ANIMOSITY: u32 = 375_797;
94 pub(crate) const AZURE_CELERITY: u32 = 1_219_723;
96 pub(crate) const AZURE_ESSENCE_BURST: u32 = 375_721;
98 pub(crate) const AZURE_SWEEP: u32 = 1_265_867;
100 pub(crate) const BLAST_FURNACE: u32 = 375_510;
102 pub(crate) const BOMBARDMENTS_GATE: u32 = 434_300;
104 pub(crate) const BURNOUT: u32 = 375_801;
106 pub(crate) const CATALYZE: u32 = 386_283;
108 pub(crate) const CAUSALITY: u32 = 375_777;
110 pub(crate) const CHARGED_BLAST: u32 = 370_455;
112 pub(crate) const DRAGONRAGE: u32 = 375_087;
114 pub(crate) const ESSENCE_ATTUNEMENT: u32 = 375_722;
116 pub(crate) const ETERNITY_SPAN: u32 = 375_757;
118 pub(crate) const ETERNITY_SURGE: u32 = 359_073;
120 pub(crate) const EYE_OF_INFINITY: u32 = 411_165;
122 pub(crate) const FEED_THE_FLAMES: u32 = 369_846;
124 pub(crate) const FONT_OF_MAGIC: u32 = 411_212;
126 pub(crate) const IMMINENT_DESTRUCTION: u32 = 370_781;
128 pub(crate) const IRIDESCENCE: u32 = 370_867;
130 pub(crate) const LEAPING_FLAMES: u32 = 369_939;
132 pub(crate) const MANEUVERABILITY_GATE: u32 = 433_871;
134 pub(crate) const MASS_DISINTEGRATE_GATE: u32 = 436_335;
136 pub(crate) const MELT_ARMOR_GATE: u32 = 441_176;
138 pub(crate) const POWER_NEXUS: u32 = 369_908;
140 pub(crate) const POWER_SWELL: u32 = 370_839;
142 pub(crate) const PYRE: u32 = 357_211;
144 pub(crate) const RISING_FURY: u32 = 1_271_687;
146 pub(crate) const RISING_FURY_2: u32 = 1_271_796;
148 pub(crate) const RISING_FURY_3: u32 = 1_271_788;
150 pub(crate) const RUBY_ESSENCE_BURST: u32 = 376_872;
152 pub(crate) const SCINTILLATION: u32 = 370_821;
154 pub(crate) const SCORCHING_EMBERS: u32 = 370_819;
156 pub(crate) const SHATTERING_STARS: u32 = 1_265_802;
158 pub(crate) const STRAFING_RUN_GATE: u32 = 1_266_151;
160 pub(crate) const TIP_THE_SCALES: u32 = 370_553;
162 pub(crate) const TITANIC_WRATH: u32 = 386_272;
164 pub(crate) const TYRANNY: u32 = 376_888;
166 pub(crate) const VOLATILITY: u32 = 369_089;
168}
169pub(crate) mod SET_BONUS {
170 pub(crate) const MID2_DEVASTATION_2PC: u32 = 1_296_639;
172 pub(crate) const MID2_DEVASTATION_4PC: u32 = 1_296_640;
174}
175pub(crate) mod REPORTED_SPELL {
176 pub(crate) const ETERNITY_SURGE_DAMAGE: u32 = 359_077;
178 pub(crate) const FIRE_BREATH_DAMAGE: u32 = 357_209;
180 pub(crate) const LIVING_FLAME_DAMAGE: u32 = 361_500;
182 pub(crate) const PYRE_DAMAGE: u32 = 357_212;
184 pub(crate) const UNBOUND_FLAME_DAMAGE: u32 = 1_292_322;
186}
187pub(crate) mod HERO {
188 pub(crate) mod FLAMESHAPER {
189 pub(crate) mod SPELL {
190 pub(crate) const ENKINDLE: u32 = 444_017;
192 pub(crate) const TWIN_FLAME: u32 = 1_265_980;
194 }
195 pub(crate) mod AURA {
196 pub(crate) const BURNOUT: u32 = 375_802;
198 pub(crate) const CONSUME_FLAME: u32 = 444_088;
200 pub(crate) const ESSENCE_WELL: u32 = 1_265_993;
202 pub(crate) const INNER_FLAME: u32 = 1_236_776;
204 }
205 }
206 pub(crate) mod CHRONOWARDEN {
207 pub(crate) mod SPELL {
208 pub(crate) const CHRONO_FLAME: u32 = 431_583;
210 pub(crate) const TEMPORAL_BURST: u32 = 431_698;
212 }
213 pub(crate) mod AURA {
214 pub(crate) const PRIMACY: u32 = 431_654;
216 pub(crate) const TEMPORAL_BURST: u32 = 431_698;
218 pub(crate) const TIME_CONVERGENCE: u32 = 431_991;
220 }
221 }
222 pub(crate) mod SCALECOMMANDER {
223 pub(crate) mod SPELL {
224 pub(crate) const BOMBARDMENTS_DAMAGE: u32 = 434_481;
226 pub(crate) const MASS_DISINTEGRATE: u32 = 436_336;
228 pub(crate) const MELT_ARMOR_DOT: u32 = 441_172;
230 }
231 pub(crate) mod AURA {
232 pub(crate) const BOMBARDMENTS: u32 = 434_473;
234 pub(crate) const MASS_DISINTEGRATE: u32 = 436_336;
236 pub(crate) const MELT_ARMOR: u32 = 441_172;
238 pub(crate) const STRAFING_RUN: u32 = 1_266_165;
240 pub(crate) const UNRELENTING_SIEGE: u32 = 441_248;
242 }
243 }
244}
245static HERO_TREE_FLAMESHAPER_SPELLS: &[(&str, u32)] = &[
246 ("ENKINDLE", 444_017),
247 ("TWIN_FLAME", 1_265_980),
248];
249static HERO_TREE_FLAMESHAPER_AURAS: &[(&str, u32)] = &[
250 ("BURNOUT", 375_802),
251 ("CONSUME_FLAME", 444_088),
252 ("ESSENCE_WELL", 1_265_993),
253 ("INNER_FLAME", 1_236_776),
254];
255static HERO_TREE_CHRONOWARDEN_SPELLS: &[(&str, u32)] = &[
256 ("CHRONO_FLAME", 431_583),
257 ("TEMPORAL_BURST", 431_698),
258];
259static HERO_TREE_CHRONOWARDEN_AURAS: &[(&str, u32)] = &[
260 ("PRIMACY", 431_654),
261 ("TEMPORAL_BURST", 431_698),
262 ("TIME_CONVERGENCE", 431_991),
263];
264static HERO_TREE_SCALECOMMANDER_SPELLS: &[(&str, u32)] = &[
265 ("BOMBARDMENTS_DAMAGE", 434_481),
266 ("MASS_DISINTEGRATE", 436_336),
267 ("MELT_ARMOR_DOT", 441_172),
268];
269static HERO_TREE_SCALECOMMANDER_AURAS: &[(&str, u32)] = &[
270 ("BOMBARDMENTS", 434_473),
271 ("MASS_DISINTEGRATE", 436_336),
272 ("MELT_ARMOR", 441_172),
273 ("STRAFING_RUN", 1_266_165),
274 ("UNRELENTING_SIEGE", 441_248),
275];
276pub(crate) mod DAMAGE_SPELL {
277 pub(crate) const LIVING_FLAME: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_361469;
278 pub(crate) const AZURE_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_362969;
279 pub(crate) const DISINTEGRATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_356995;
280 pub(crate) const FIRE_BREATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_357208;
281 pub(crate) const ETERNITY_SURGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_359073;
282 pub(crate) const PYRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_357211;
283 pub(crate) const DRAGONRAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_375087;
284 pub(crate) const UNBOUND_FLAME: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_1292321;
285 pub(crate) const TIP_THE_SCALES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_370553;
286 pub(crate) const SCINTILLATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_370821;
287 pub(crate) const SHATTERING_STAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_1265804;
288 pub(crate) const BLESSING_OF_THE_BRONZE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_381748;
289 pub(crate) const DEEP_BREATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_357210;
290 pub(crate) const ENKINDLE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_444017;
291 pub(crate) const TWIN_FLAME: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_1265980;
292 pub(crate) const CHRONO_FLAME: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_431583;
293 pub(crate) const TEMPORAL_BURST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_431698;
294 pub(crate) const BOMBARDMENTS_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_434481;
295 pub(crate) const MASS_DISINTEGRATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_436336;
296 pub(crate) const MELT_ARMOR_DOT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_441172;
297}
298pub(crate) mod DAMAGE_AURA {
299 pub(crate) const DRAGONRAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_375087;
300 pub(crate) const ESSENCE_BURST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_359618;
301 pub(crate) const BURNOUT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_375802;
302 pub(crate) const CHARGED_BLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_370454;
303 pub(crate) const IRIDESCENCE_BLUE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_386399;
304 pub(crate) const IRIDESCENCE_RED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_386353;
305 pub(crate) const LEAPING_FLAMES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_370901;
306 pub(crate) const ANCIENT_FLAME: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_375583;
307 pub(crate) const TIP_THE_SCALES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_370553;
308 pub(crate) const POWER_SWELL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_376850;
309 pub(crate) const IMMINENT_DESTRUCTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_411055;
310 pub(crate) const FIRE_BREATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_357209;
311 pub(crate) const CONSUME_FLAME: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_444088;
312 pub(crate) const AZURE_SWEEP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_1265871;
313 pub(crate) const RECALL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_371807;
314 pub(crate) const BLESSING_OF_THE_BRONZE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_381748;
315 pub(crate) const RISING_FURY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_1271783;
316 pub(crate) const UNBOUND_FLAME: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_1292323;
317 pub(crate) const DEEP_BREATH_TRIGGER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_353759;
318 pub(crate) const MELT_ARMOR_DOT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_441172;
319 pub(crate) const STRAFING_RUN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_1266165;
320 pub(crate) const BOMBARDMENTS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_434473;
321 pub(crate) const MASS_DISINTEGRATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_436336;
322}
323pub(crate) mod DAMAGE_TALENT {
324 pub(crate) const ANIMOSITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_375797;
325 pub(crate) const AZURE_CELERITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_1219723;
326 pub(crate) const AZURE_ESSENCE_BURST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_375721;
327 pub(crate) const AZURE_SWEEP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_1265867;
328 pub(crate) const BLAST_FURNACE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_375510;
329 pub(crate) const BOMBARDMENTS_GATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_434300;
330 pub(crate) const BURNOUT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_375801;
331 pub(crate) const CATALYZE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_386283;
332 pub(crate) const CAUSALITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_375777;
333 pub(crate) const CHARGED_BLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_370455;
334 pub(crate) const DRAGONRAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_375087;
335 pub(crate) const ESSENCE_ATTUNEMENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_375722;
336 pub(crate) const ETERNITY_SPAN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_375757;
337 pub(crate) const ETERNITY_SURGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_359073;
338 pub(crate) const EYE_OF_INFINITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_411165;
339 pub(crate) const FEED_THE_FLAMES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_369846;
340 pub(crate) const FONT_OF_MAGIC: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_411212;
341 pub(crate) const IMMINENT_DESTRUCTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_370781;
342 pub(crate) const IRIDESCENCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_370867;
343 pub(crate) const LEAPING_FLAMES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_369939;
344 pub(crate) const MANEUVERABILITY_GATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_433871;
345 pub(crate) const MASS_DISINTEGRATE_GATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_436335;
346 pub(crate) const MELT_ARMOR_GATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_441176;
347 pub(crate) const POWER_NEXUS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_369908;
348 pub(crate) const POWER_SWELL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_370839;
349 pub(crate) const PYRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_357211;
350 pub(crate) const RISING_FURY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_1271687;
351 pub(crate) const RISING_FURY_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_1271796;
352 pub(crate) const RISING_FURY_3: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_1271788;
353 pub(crate) const RUBY_ESSENCE_BURST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_376872;
354 pub(crate) const SCINTILLATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_370821;
355 pub(crate) const SCORCHING_EMBERS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_370819;
356 pub(crate) const SHATTERING_STARS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_1265802;
357 pub(crate) const STRAFING_RUN_GATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_1266151;
358 pub(crate) const TIP_THE_SCALES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_370553;
359 pub(crate) const TITANIC_WRATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_386272;
360 pub(crate) const TYRANNY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_376888;
361 pub(crate) const VOLATILITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_369089;
362}
363pub(crate) mod DAMAGE_REPORTED {
364 pub(crate) const ETERNITY_SURGE_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_359077;
365 pub(crate) const FIRE_BREATH_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_357209;
366 pub(crate) const LIVING_FLAME_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_361500;
367 pub(crate) const PYRE_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_357212;
368 pub(crate) const UNBOUND_FLAME_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ACTION::SPELL_1292322;
369}
370pub(crate) mod DAMAGE_EFFECT {
371 pub(crate) const BLAST_FURNACE_DURATION: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_375510_EFFECT_1;
372 pub(crate) const DEEP_BREATH_PATH: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_353759_EFFECT_1;
373 pub(crate) const PYRE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_357212_EFFECT_1;
374 pub(crate) const SCINTILLATION_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_370821_EFFECT_2;
375 pub(crate) const SCINTILLATION_POWER: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_370821_EFFECT_1;
376 pub(crate) const ETERNITY_SURGE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_359077_EFFECT_2;
377 pub(crate) const SHATTERING_STAR: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_1265804_EFFECT_1;
378 pub(crate) const CAUSALITY_DISINTEGRATE_CDR: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_375777_EFFECT_1;
379 pub(crate) const ANIMOSITY_EXTEND: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_375797_EFFECT_1;
380 pub(crate) const AZURE_EB_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_375721_EFFECT_1;
381 pub(crate) const RUBY_EB_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_376872_EFFECT_1;
382 pub(crate) const BURNOUT_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_375801_EFFECT_1;
383 pub(crate) const IRIDESCENCE_BLUE_MULT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_386399_EFFECT_1;
384 pub(crate) const IRIDESCENCE_RED_MULT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_386353_EFFECT_1;
385 pub(crate) const TITANIC_WRATH_MULT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_386272_EFFECT_1;
386 pub(crate) const SHATTERING_STARS_PER_RANK: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_1265802_EFFECT_1;
387 pub(crate) const MID2_2PC_SHATTERING_STAR_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_1296639_EFFECT_1;
388 pub(crate) const MID2_4PC_CAUSALITY_CDR: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_1296640_EFFECT_1;
389 pub(crate) const MID2_4PC_ETERNITY_SURGE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_1296640_EFFECT_3;
390 pub(crate) const UNBOUND_FLAME_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_1292322_EFFECT_1;
391 pub(crate) const RISING_FURY_PERSIST_MS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::EFFECT::SPELL_1271788_EFFECT_1;
392}
393pub(crate) const AURA_DRAGONRAGE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_DRAGONRAGE
394 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
395pub(crate) const AURA_ESSENCE_BURST: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_ESSENCE_BURST
396 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
397pub(crate) const AURA_BURNOUT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_BURNOUT
398 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
399pub(crate) const AURA_CHARGED_BLAST: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_CHARGED_BLAST
400 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
401pub(crate) const AURA_IRIDESCENCE_BLUE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_IRIDESCENCE_BLUE
402 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
403pub(crate) const AURA_IRIDESCENCE_RED: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_IRIDESCENCE_RED
404 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
405pub(crate) const AURA_LEAPING_FLAMES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_LEAPING_FLAMES
406 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
407pub(crate) const AURA_ANCIENT_FLAME: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_ANCIENT_FLAME
408 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
409pub(crate) const AURA_TIP_THE_SCALES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_TIP_THE_SCALES
410 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
411pub(crate) const AURA_POWER_SWELL: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_POWER_SWELL
412 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
413pub(crate) const AURA_IMMINENT_DESTRUCTION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_IMMINENT_DESTRUCTION
414 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
415pub(crate) const AURA_FIRE_BREATH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_FIRE_BREATH
416 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
417pub(crate) const AURA_CONSUME_FLAME: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_CONSUME_FLAME
418 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
419pub(crate) const AURA_AZURE_SWEEP: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_AZURE_SWEEP
420 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
421pub(crate) const AURA_RECALL: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_RECALL
422 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
423pub(crate) const AURA_BLESSING_OF_THE_BRONZE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_BLESSING_OF_THE_BRONZE
424 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
425pub(crate) const AURA_RISING_FURY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_RISING_FURY
426 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
427pub(crate) const AURA_UNBOUND_FLAME: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_UNBOUND_FLAME
428 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
429pub(crate) const AURA_DEEP_BREATH_TRIGGER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_DEEP_BREATH_TRIGGER
430 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
431pub(crate) const AURA_MELT_ARMOR_DOT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_MELT_ARMOR_DOT
432 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
433pub(crate) const AURA_STRAFING_RUN: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_STRAFING_RUN
434 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
435pub(crate) const AURA_BOMBARDMENTS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_BOMBARDMENTS
436 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
437pub(crate) const AURA_MASS_DISINTEGRATE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::AURA_MASS_DISINTEGRATE
438 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
439pub(crate) const AURA_COUNT: usize = 23;
440const _: () = assert!(
441 AURA_COUNT == 23, "AURA index ABI: count changed -- update positional hook consumers"
442);
443pub(crate) const SPELL_LIVING_FLAME: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::SPELL_LIVING_FLAME
444 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
445pub(crate) const SPELL_AZURE_STRIKE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::SPELL_AZURE_STRIKE
446 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
447pub(crate) const SPELL_DISINTEGRATE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::SPELL_DISINTEGRATE
448 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
449pub(crate) const SPELL_FIRE_BREATH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::SPELL_FIRE_BREATH
450 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
451pub(crate) const SPELL_ETERNITY_SURGE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::SPELL_ETERNITY_SURGE
452 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
453pub(crate) const SPELL_PYRE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::SPELL_PYRE
454 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
455pub(crate) const SPELL_DRAGONRAGE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::SPELL_DRAGONRAGE
456 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
457pub(crate) const SPELL_UNBOUND_FLAME: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::SPELL_UNBOUND_FLAME
458 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
459pub(crate) const SPELL_TIP_THE_SCALES: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::SPELL_TIP_THE_SCALES
460 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
461pub(crate) const SPELL_SCINTILLATION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::SPELL_SCINTILLATION
462 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
463pub(crate) const SPELL_SHATTERING_STAR: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::SPELL_SHATTERING_STAR
464 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
465pub(crate) const SPELL_BLESSING_OF_THE_BRONZE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::SPELL_BLESSING_OF_THE_BRONZE
466 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
467pub(crate) const SPELL_DEEP_BREATH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::devastation_evoker::SPELL_DEEP_BREATH
468 .bind(wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF);
469pub(crate) const SPELL_COUNT: usize = 13;
470const _: () = assert!(
471 SPELL_COUNT == 13,
472 "SPELL index ABI: count changed -- update positional hook consumers"
473);
474pub(crate) mod EFFECT {
475 pub(crate) const BLAST_FURNACE_DURATION: (u32, u8) = (375_510, 1);
477 pub(crate) const DEEP_BREATH_PATH: (u32, u8) = (353_759, 1);
479 pub(crate) const PYRE_DAMAGE: (u32, u8) = (357_212, 1);
481 pub(crate) const SCINTILLATION_CHANCE: (u32, u8) = (370_821, 2);
483 pub(crate) const SCINTILLATION_POWER: (u32, u8) = (370_821, 1);
485 pub(crate) const ETERNITY_SURGE_DAMAGE: (u32, u8) = (359_077, 2);
487 pub(crate) const SHATTERING_STAR: (u32, u8) = (1_265_804, 1);
489 pub(crate) const CAUSALITY_DISINTEGRATE_CDR: (u32, u8) = (375_777, 1);
491 pub(crate) const ANIMOSITY_EXTEND: (u32, u8) = (375_797, 1);
493 pub(crate) const AZURE_EB_CHANCE: (u32, u8) = (375_721, 1);
495 pub(crate) const RUBY_EB_CHANCE: (u32, u8) = (376_872, 1);
497 pub(crate) const BURNOUT_CHANCE: (u32, u8) = (375_801, 1);
499 pub(crate) const IRIDESCENCE_BLUE_MULT: (u32, u8) = (386_399, 1);
501 pub(crate) const IRIDESCENCE_RED_MULT: (u32, u8) = (386_353, 1);
503 pub(crate) const TITANIC_WRATH_MULT: (u32, u8) = (386_272, 1);
505 pub(crate) const SHATTERING_STARS_PER_RANK: (u32, u8) = (1_265_802, 1);
507 pub(crate) const MID2_2PC_SHATTERING_STAR_DAMAGE: (u32, u8) = (1_296_639, 1);
509 pub(crate) const MID2_4PC_CAUSALITY_CDR: (u32, u8) = (1_296_640, 1);
511 pub(crate) const MID2_4PC_ETERNITY_SURGE_DAMAGE: (u32, u8) = (1_296_640, 3);
513 pub(crate) const UNBOUND_FLAME_DAMAGE: (u32, u8) = (1_292_322, 1);
515 pub(crate) const RISING_FURY_PERSIST_MS: (u32, u8) = (1_271_788, 1);
517}
518static REPORTED_SPELLS: &[(&str, u32)] = &[
519 ("eternity_surge_damage", 359_077),
520 ("fire_breath_damage", 357_209),
521 ("living_flame_damage", 361_500),
522 ("pyre_damage", 357_212),
523 ("unbound_flame_damage", 1_292_322),
524];
525static DECLARED_SPELL_IDS: &[u32] = &[
526 361_469, 362_969, 356_995, 357_208, 359_073, 357_211, 375_087, 1_292_321, 370_553,
527 370_821, 1_265_804, 381_748, 357_210, 359_618, 375_802, 370_454, 386_399, 386_353,
528 370_901, 375_583, 376_850, 411_055, 357_209, 444_088, 1_265_871, 371_807, 1_271_783,
529 1_292_323, 353_759, 441_172, 1_266_165, 434_473, 436_336, 375_797, 1_219_723,
530 375_721, 1_265_867, 375_510, 434_300, 375_801, 386_283, 375_777, 370_455, 375_722,
531 375_757, 411_165, 369_846, 411_212, 370_781, 370_867, 369_939, 433_871, 436_335,
532 441_176, 369_908, 370_839, 1_271_687, 1_271_796, 1_271_788, 376_872, 370_819,
533 1_265_802, 1_266_151, 386_272, 376_888, 369_089, 357_212, 359_077, 361_500, 362_980,
534 434_481, 443_788, 1_292_322, 1_296_639, 1_296_640, 444_017, 1_265_980, 1_265_993,
535 1_236_776, 431_583, 431_698, 431_654, 431_991, 441_248,
536];
537static DECLARED_AURA_IDS: &[u32] = &[
538 375_087, 359_618, 375_802, 370_454, 386_399, 386_353, 370_901, 375_583, 370_553,
539 376_850, 411_055, 357_209, 444_088, 1_265_871, 371_807, 381_748, 1_271_783,
540 1_292_323, 353_759, 441_172, 1_266_165, 434_473, 436_336, 375_802, 444_088,
541 1_265_993, 1_236_776, 431_654, 431_698, 431_991, 434_473, 436_336, 441_172,
542 1_266_165, 441_248,
543];
544static TALENTS: &[(&str, u32)] = &[
545 ("ANIMOSITY", TALENT::ANIMOSITY),
546 ("AZURE_CELERITY", TALENT::AZURE_CELERITY),
547 ("AZURE_ESSENCE_BURST", TALENT::AZURE_ESSENCE_BURST),
548 ("AZURE_SWEEP", TALENT::AZURE_SWEEP),
549 ("BLAST_FURNACE", TALENT::BLAST_FURNACE),
550 ("BOMBARDMENTS_GATE", TALENT::BOMBARDMENTS_GATE),
551 ("BURNOUT", TALENT::BURNOUT),
552 ("CATALYZE", TALENT::CATALYZE),
553 ("CAUSALITY", TALENT::CAUSALITY),
554 ("CHARGED_BLAST", TALENT::CHARGED_BLAST),
555 ("DRAGONRAGE", TALENT::DRAGONRAGE),
556 ("ESSENCE_ATTUNEMENT", TALENT::ESSENCE_ATTUNEMENT),
557 ("ETERNITY_SPAN", TALENT::ETERNITY_SPAN),
558 ("ETERNITY_SURGE", TALENT::ETERNITY_SURGE),
559 ("EYE_OF_INFINITY", TALENT::EYE_OF_INFINITY),
560 ("FEED_THE_FLAMES", TALENT::FEED_THE_FLAMES),
561 ("FONT_OF_MAGIC", TALENT::FONT_OF_MAGIC),
562 ("IMMINENT_DESTRUCTION", TALENT::IMMINENT_DESTRUCTION),
563 ("IRIDESCENCE", TALENT::IRIDESCENCE),
564 ("LEAPING_FLAMES", TALENT::LEAPING_FLAMES),
565 ("MANEUVERABILITY_GATE", TALENT::MANEUVERABILITY_GATE),
566 ("MASS_DISINTEGRATE_GATE", TALENT::MASS_DISINTEGRATE_GATE),
567 ("MELT_ARMOR_GATE", TALENT::MELT_ARMOR_GATE),
568 ("POWER_NEXUS", TALENT::POWER_NEXUS),
569 ("POWER_SWELL", TALENT::POWER_SWELL),
570 ("PYRE", TALENT::PYRE),
571 ("RISING_FURY", TALENT::RISING_FURY),
572 ("RISING_FURY_2", TALENT::RISING_FURY_2),
573 ("RISING_FURY_3", TALENT::RISING_FURY_3),
574 ("RUBY_ESSENCE_BURST", TALENT::RUBY_ESSENCE_BURST),
575 ("SCINTILLATION", TALENT::SCINTILLATION),
576 ("SCORCHING_EMBERS", TALENT::SCORCHING_EMBERS),
577 ("SHATTERING_STARS", TALENT::SHATTERING_STARS),
578 ("STRAFING_RUN_GATE", TALENT::STRAFING_RUN_GATE),
579 ("TIP_THE_SCALES", TALENT::TIP_THE_SCALES),
580 ("TITANIC_WRATH", TALENT::TITANIC_WRATH),
581 ("TYRANNY", TALENT::TYRANNY),
582 ("VOLATILITY", TALENT::VOLATILITY),
583];
584pub(crate) mod DEVASTATION_EVOKER {
585 pub(crate) const LIVING_FLAME_CASTS: u32 = 0;
586 pub(crate) const AZURE_STRIKE_CASTS: u32 = 1;
587 pub(crate) const DISINTEGRATE_CASTS: u32 = 2;
588 pub(crate) const FIRE_BREATH_CASTS: u32 = 3;
589 pub(crate) const ETERNITY_SURGE_CASTS: u32 = 4;
590 pub(crate) const PYRE_CASTS: u32 = 5;
591 pub(crate) const DRAGONRAGE_CASTS: u32 = 6;
592 pub(crate) const DRAGONRAGE_UPTIME_MS: u32 = 7;
593}
594fn aura_dragonrage(
595 a: AuraDefinitionDraft,
596 data: &ResolvedGameData,
597) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
598 Ok(
599 a
600 .on_player()
601 .apply_base_from_data(data, 375_087)?
602 .max_stacks(
603 data
604 .require_aura_max_stacks(
605 wowlab_types::sim::SpellIdx::from_raw(375_087),
606 )?,
607 )
608 .damage_multiplier(1.2)?
609 .on_expire(crate::hooks::devastation_evoker::dragonrage_expire_hook),
610 )
611}
612fn aura_essence_burst(
613 a: AuraDefinitionDraft,
614 data: &ResolvedGameData,
615) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
616 Ok(
617 a
618 .on_player()
619 .apply_base_from_data(data, 359_618)?
620 .max_stacks(
621 data
622 .require_aura_max_stacks(
623 wowlab_types::sim::SpellIdx::from_raw(359_618),
624 )?,
625 ),
626 )
627}
628fn aura_burnout(
629 a: AuraDefinitionDraft,
630 data: &ResolvedGameData,
631) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
632 Ok(
633 a
634 .on_player()
635 .apply_base_from_data(data, 375_802)?
636 .max_stacks(
637 data
638 .require_aura_max_stacks(
639 wowlab_types::sim::SpellIdx::from_raw(375_802),
640 )?,
641 ),
642 )
643}
644fn aura_charged_blast(
645 a: AuraDefinitionDraft,
646 data: &ResolvedGameData,
647) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
648 Ok(
649 a
650 .on_player()
651 .apply_base_from_data(data, 370_454)?
652 .max_stacks(
653 data
654 .require_aura_max_stacks(
655 wowlab_types::sim::SpellIdx::from_raw(370_454),
656 )?,
657 ),
658 )
659}
660fn aura_iridescence_blue(
661 a: AuraDefinitionDraft,
662 data: &ResolvedGameData,
663) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
664 a.on_player()
665 .apply_base_from_data(data, 386_399)?
666 .max_stacks(
667 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(386_399))?,
668 )
669 .damage_percent_spells(
670 data.base_points(wowlab_types::sim::SpellIdx::from_raw(386_399), 1),
671 &[356_995, 362_969, 370_821, 1_265_804],
672 )
673}
674fn aura_iridescence_red(
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, 386_353)?
682 .max_stacks(
683 data
684 .require_aura_max_stacks(
685 wowlab_types::sim::SpellIdx::from_raw(386_353),
686 )?,
687 ),
688 )
689}
690fn aura_leaping_flames(
691 a: AuraDefinitionDraft,
692 data: &ResolvedGameData,
693) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
694 Ok(
695 a
696 .on_player()
697 .apply_base_from_data(data, 370_901)?
698 .max_stacks(
699 data
700 .require_aura_max_stacks(
701 wowlab_types::sim::SpellIdx::from_raw(370_901),
702 )?,
703 ),
704 )
705}
706fn aura_ancient_flame(
707 a: AuraDefinitionDraft,
708 data: &ResolvedGameData,
709) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
710 Ok(
711 a
712 .on_player()
713 .apply_base_from_data(data, 375_583)?
714 .max_stacks(
715 data
716 .require_aura_max_stacks(
717 wowlab_types::sim::SpellIdx::from_raw(375_583),
718 )?,
719 ),
720 )
721}
722fn aura_tip_the_scales(
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, 370_553)?
730 .max_stacks(
731 data
732 .require_aura_max_stacks(
733 wowlab_types::sim::SpellIdx::from_raw(370_553),
734 )?,
735 ),
736 )
737}
738fn aura_power_swell(
739 a: AuraDefinitionDraft,
740 data: &ResolvedGameData,
741) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
742 Ok(
743 a
744 .on_player()
745 .apply_base_from_data(data, 376_850)?
746 .max_stacks(
747 data
748 .require_aura_max_stacks(
749 wowlab_types::sim::SpellIdx::from_raw(376_850),
750 )?,
751 ),
752 )
753}
754fn aura_imminent_destruction(
755 a: AuraDefinitionDraft,
756 data: &ResolvedGameData,
757) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
758 Ok(
759 a
760 .on_player()
761 .apply_base_from_data(data, 411_055)?
762 .max_stacks(
763 data
764 .require_aura_max_stacks(
765 wowlab_types::sim::SpellIdx::from_raw(411_055),
766 )?,
767 ),
768 )
769}
770fn aura_fire_breath(
771 a: AuraDefinitionDraft,
772 data: &ResolvedGameData,
773) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
774 Ok(
775 a
776 .on_target()
777 .apply_base_from_data(data, 357_209)?
778 .max_stacks(
779 data
780 .require_aura_max_stacks(
781 wowlab_types::sim::SpellIdx::from_raw(357_209),
782 )?,
783 ),
784 )
785}
786fn aura_consume_flame(
787 a: AuraDefinitionDraft,
788 data: &ResolvedGameData,
789) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
790 Ok(
791 a
792 .on_player()
793 .apply_base_from_data(data, 444_088)?
794 .max_stacks(
795 data
796 .require_aura_max_stacks(
797 wowlab_types::sim::SpellIdx::from_raw(444_088),
798 )?,
799 ),
800 )
801}
802fn aura_azure_sweep(
803 a: AuraDefinitionDraft,
804 data: &ResolvedGameData,
805) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
806 Ok(
807 a
808 .on_player()
809 .apply_base_from_data(data, 1_265_871)?
810 .max_stacks(
811 data
812 .require_aura_max_stacks(
813 wowlab_types::sim::SpellIdx::from_raw(1_265_871),
814 )?,
815 ),
816 )
817}
818fn aura_recall(
819 a: AuraDefinitionDraft,
820 data: &ResolvedGameData,
821) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
822 Ok(
823 a
824 .on_player()
825 .apply_base_from_data(data, 371_807)?
826 .max_stacks(
827 data
828 .require_aura_max_stacks(
829 wowlab_types::sim::SpellIdx::from_raw(371_807),
830 )?,
831 ),
832 )
833}
834fn aura_blessing_of_the_bronze(
835 a: AuraDefinitionDraft,
836 data: &ResolvedGameData,
837) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
838 Ok(
839 a
840 .on_player()
841 .apply_base_from_data(data, 381_748)?
842 .max_stacks(
843 data
844 .require_aura_max_stacks(
845 wowlab_types::sim::SpellIdx::from_raw(381_748),
846 )?,
847 ),
848 )
849}
850fn aura_rising_fury(
851 a: AuraDefinitionDraft,
852 data: &ResolvedGameData,
853) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
854 a.on_player()
855 .apply_base_from_data(data, 1_271_783)?
856 .max_stacks(
857 data
858 .require_aura_max_stacks(
859 wowlab_types::sim::SpellIdx::from_raw(1_271_783),
860 )?,
861 )
862 .periodic_apply_aura(
863 wowlab_engine_combat::validated_milliseconds(
864 data.period(wowlab_types::sim::SpellIdx::from_raw(1_271_783), 4),
865 1_271_783,
866 "periodic_apply_aura.tick_ms",
867 )?,
868 16,
869 )
870 .apply_periodic_behavior_from_data(data, 1_271_783)
871}
872fn aura_unbound_flame(
873 a: AuraDefinitionDraft,
874 data: &ResolvedGameData,
875) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
876 Ok(
877 a
878 .on_player()
879 .apply_base_from_data(data, 1_292_323)?
880 .max_stacks(
881 data
882 .require_aura_max_stacks(
883 wowlab_types::sim::SpellIdx::from_raw(1_292_323),
884 )?,
885 )
886 .reverse(),
887 )
888}
889fn aura_deep_breath_trigger(
890 a: AuraDefinitionDraft,
891 data: &ResolvedGameData,
892) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
893 Ok(
894 a
895 .on_target()
896 .apply_base_from_data(data, 353_759)?
897 .max_stacks(
898 data
899 .require_aura_max_stacks(
900 wowlab_types::sim::SpellIdx::from_raw(353_759),
901 )?,
902 ),
903 )
904}
905fn aura_melt_armor_dot(
906 a: AuraDefinitionDraft,
907 data: &ResolvedGameData,
908) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
909 Ok(
910 a
911 .on_target()
912 .apply_base_from_data(data, 441_172)?
913 .max_stacks(
914 data
915 .require_aura_max_stacks(
916 wowlab_types::sim::SpellIdx::from_raw(441_172),
917 )?,
918 ),
919 )
920}
921fn aura_strafing_run(
922 a: AuraDefinitionDraft,
923 data: &ResolvedGameData,
924) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
925 Ok(
926 a
927 .on_player()
928 .apply_base_from_data(data, 1_266_165)?
929 .max_stacks(
930 data
931 .require_aura_max_stacks(
932 wowlab_types::sim::SpellIdx::from_raw(1_266_165),
933 )?,
934 ),
935 )
936}
937fn aura_bombardments(
938 a: AuraDefinitionDraft,
939 data: &ResolvedGameData,
940) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
941 a.on_target()
942 .apply_base_from_data(data, 434_473)?
943 .max_stacks(
944 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(434_473))?,
945 )
946 .periodic_damage_sp_from_spell(
947 wowlab_engine_combat::validated_milliseconds(
948 f64::from(
949 data
950 .require_proc_category_recovery_ms(
951 wowlab_types::sim::SpellIdx::from_raw(443_788),
952 )?,
953 ),
954 434_473,
955 "periodic_damage.tick_ms",
956 )?,
957 wowlab_engine_combat::DamagePayload::new(
958 434_481,
959 data.sp_coef(wowlab_types::sim::SpellIdx::from_raw(434_481), 1),
960 wowlab_engine_combat::DamageFlags::empty(),
961 ),
962 )
963 .apply_periodic_behavior_from_data(data, 434_473)
964}
965fn aura_mass_disintegrate(
966 a: AuraDefinitionDraft,
967 data: &ResolvedGameData,
968) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
969 Ok(
970 a
971 .on_player()
972 .apply_base_from_data(data, 436_336)?
973 .max_stacks(
974 wowlab_engine_combat::validated_max_stacks(
975 3.0,
976 436_336,
977 "aura.max_stacks",
978 )?,
979 ),
980 )
981}
982fn spell_living_flame(
983 s: SpellDefinitionDraft,
984 data: &ResolvedGameData,
985) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
986 Ok(
987 s
988 .apply_base_from_data(data, 361_469)?
989 .damage_sp_from_data(
990 wowlab_engine_domain::dbc::EffectLookup::new(
991 data,
992 wowlab_types::sim::EffectRef::new(
993 wowlab_types::sim::SpellIdx::from_raw(361_500),
994 1,
995 ),
996 ),
997 )?
998 .apply_aoe_from_data(data)
999 .on_cast(crate::hooks::devastation_evoker::living_flame_hook),
1000 )
1001}
1002fn spell_azure_strike(
1003 s: SpellDefinitionDraft,
1004 data: &ResolvedGameData,
1005) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1006 Ok(
1007 s
1008 .apply_base_from_data(data, 362_969)?
1009 .apply_aoe_from_data(data)
1010 .on_cast(crate::hooks::devastation_evoker::azure_strike_hook),
1011 )
1012}
1013fn spell_disintegrate(
1014 s: SpellDefinitionDraft,
1015 data: &ResolvedGameData,
1016) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1017 Ok(
1018 s
1019 .apply_base_from_data(data, 356_995)?
1020 .apply_aoe_from_data(data)
1021 .channel(
1022 wowlab_engine_combat::validated_channel_tick_count(
1023 5.0,
1024 356_995,
1025 "channel.tick_count",
1026 )?,
1027 )
1028 .channel_tick_damage_sp_from_data(
1029 wowlab_engine_domain::dbc::EffectLookup::new(
1030 data,
1031 wowlab_types::sim::EffectRef::new(
1032 wowlab_types::sim::SpellIdx::from_raw(356_995),
1033 1,
1034 ),
1035 ),
1036 )?
1037 .on_channel_tick(crate::hooks::devastation_evoker::disintegrate_tick_hook)
1038 .on_cast(crate::hooks::devastation_evoker::disintegrate_hook)
1039 .cost_free_when_aura(359_618)
1040 .consume_aura_on_cast(411_055),
1041 )
1042}
1043fn spell_fire_breath(
1044 s: SpellDefinitionDraft,
1045 data: &ResolvedGameData,
1046) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1047 Ok(
1048 s
1049 .apply_base_from_data(data, 357_208)?
1050 .max_empower_when_aura(AURA::TIP_THE_SCALES)
1051 .on_empower_release(
1052 crate::hooks::devastation_evoker::fire_breath_empower_release,
1053 )
1054 .damage_sp_from_data(
1055 wowlab_engine_domain::dbc::EffectLookup::new(
1056 data,
1057 wowlab_types::sim::EffectRef::new(
1058 wowlab_types::sim::SpellIdx::from_raw(357_209),
1059 1,
1060 ),
1061 ),
1062 )?
1063 .applies_inferred_aura(AURA_FIRE_BREATH, 357_209)
1064 .apply_aoe_from_data(data)
1065 .on_cast(crate::hooks::devastation_evoker::fire_breath_hook),
1066 )
1067}
1068fn spell_eternity_surge(
1069 s: SpellDefinitionDraft,
1070 data: &ResolvedGameData,
1071) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1072 Ok(
1073 s
1074 .apply_base_from_data(data, 359_073)?
1075 .max_empower_when_aura(AURA::TIP_THE_SCALES)
1076 .damage_sp_from_data(
1077 wowlab_engine_domain::dbc::EffectLookup::new(
1078 data,
1079 wowlab_types::sim::EffectRef::new(
1080 wowlab_types::sim::SpellIdx::from_raw(359_077),
1081 2,
1082 ),
1083 ),
1084 )?
1085 .apply_aoe_from_data(data)
1086 .on_cast(crate::hooks::devastation_evoker::eternity_surge_hook),
1087 )
1088}
1089fn spell_pyre(
1090 s: SpellDefinitionDraft,
1091 data: &ResolvedGameData,
1092) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1093 Ok(
1094 s
1095 .apply_base_from_data(data, 357_211)?
1096 .damage_sp_from_data(
1097 wowlab_engine_domain::dbc::EffectLookup::new(
1098 data,
1099 wowlab_types::sim::EffectRef::new(
1100 wowlab_types::sim::SpellIdx::from_raw(357_212),
1101 1,
1102 ),
1103 ),
1104 )?
1105 .apply_aoe_from_data(data)
1106 .on_cast(crate::hooks::devastation_evoker::pyre_hook)
1107 .cost_free_when_aura(359_618)
1108 .consume_aura_on_cast(411_055),
1109 )
1110}
1111fn spell_dragonrage(
1112 s: SpellDefinitionDraft,
1113 data: &ResolvedGameData,
1114) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1115 Ok(
1116 s
1117 .apply_base_from_data(data, 375_087)?
1118 .applies_inferred_aura(AURA_DRAGONRAGE, 375_087)
1119 .apply_aoe_from_data(data)
1120 .on_cast(crate::hooks::devastation_evoker::dragonrage_hook),
1121 )
1122}
1123fn spell_unbound_flame(
1124 s: SpellDefinitionDraft,
1125 data: &ResolvedGameData,
1126) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1127 Ok(
1128 s
1129 .apply_base_from_data(data, 1_292_321)?
1130 .damage_sp(0.0, wowlab_engine_combat::DamageFlags::empty())
1131 .applies_inferred_aura(AURA_UNBOUND_FLAME, 1_292_323)
1132 .apply_aoe_from_data(data)
1133 .on_cast(crate::hooks::devastation_evoker::unbound_flame_hook)
1134 .requires_aura_at_min_stacks(1_292_323, 0),
1135 )
1136}
1137fn spell_tip_the_scales(
1138 s: SpellDefinitionDraft,
1139 data: &ResolvedGameData,
1140) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1141 Ok(
1142 s
1143 .apply_base_from_data(data, 370_553)?
1144 .applies_aura(AURA_TIP_THE_SCALES)
1145 .apply_aoe_from_data(data),
1146 )
1147}
1148fn spell_scintillation(
1149 s: SpellDefinitionDraft,
1150 data: &ResolvedGameData,
1151) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1152 Ok(s.apply_base_from_data(data, 370_821)?.apply_aoe_from_data(data))
1153}
1154fn spell_shattering_star(
1155 s: SpellDefinitionDraft,
1156 data: &ResolvedGameData,
1157) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1158 Ok(s.apply_base_from_data(data, 1_265_804)?.apply_aoe_from_data(data))
1159}
1160fn spell_blessing_of_the_bronze(
1161 s: SpellDefinitionDraft,
1162 data: &ResolvedGameData,
1163) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1164 Ok(
1165 s
1166 .apply_base_from_data(data, 381_748)?
1167 .applies_inferred_aura(AURA_BLESSING_OF_THE_BRONZE, 381_748)
1168 .apply_aoe_from_data(data),
1169 )
1170}
1171fn spell_deep_breath(
1172 s: SpellDefinitionDraft,
1173 data: &ResolvedGameData,
1174) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1175 Ok(
1176 s
1177 .apply_base_from_data(data, 357_210)?
1178 .apply_aoe_from_data(data)
1179 .on_cast(crate::hooks::devastation_evoker::deep_breath_hook),
1180 )
1181}
1182pub(crate) fn build_combat_system_draft(
1183 params: &wowlab_engine_ports::HandlerParams<'_>,
1184) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1185 let builder = CombatSystemBuilder::new(params.stats.clone())
1186 .spec_id(SpecId::Devastation)
1187 .spec_identity(
1188 wowlab_engine_combat::generated_identities::specs::devastation_evoker::PROOF,
1189 )
1190 .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1191 .effect_identities(
1192 wowlab_engine_combat::generated_identities::specs::devastation_evoker::damage::ALL,
1193 )
1194 .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1195 .mastery_spell(362_980)
1196 .mastery_hook(crate::hooks::devastation_evoker::mastery)
1197 .resource(
1198 "essence",
1199 params
1200 .game_data
1201 .power_max(19)
1202 .ok_or_else(|| {
1203 wowlab_engine_ports::EngineError::spec_construction(
1204 "missing power-type power_max for type_id 19",
1205 )
1206 })?,
1207 0.2,
1208 )
1209 .resource_type_id(19)
1210 .resource_start(
1211 params
1212 .game_data
1213 .power_default(19)
1214 .ok_or_else(|| {
1215 wowlab_engine_ports::EngineError::spec_construction(
1216 "missing power-type power_default for type_id 19",
1217 )
1218 })?,
1219 )
1220 .aura("dragonrage", AURA::DRAGONRAGE, |a| aura_dragonrage(a, ¶ms.game_data))
1221 .aura(
1222 "essence_burst",
1223 AURA::ESSENCE_BURST,
1224 |a| aura_essence_burst(a, ¶ms.game_data),
1225 )
1226 .aura("burnout", AURA::BURNOUT, |a| aura_burnout(a, ¶ms.game_data))
1227 .aura(
1228 "charged_blast",
1229 AURA::CHARGED_BLAST,
1230 |a| aura_charged_blast(a, ¶ms.game_data),
1231 )
1232 .aura(
1233 "iridescence_blue",
1234 AURA::IRIDESCENCE_BLUE,
1235 |a| aura_iridescence_blue(a, ¶ms.game_data),
1236 )
1237 .aura(
1238 "iridescence_red",
1239 AURA::IRIDESCENCE_RED,
1240 |a| aura_iridescence_red(a, ¶ms.game_data),
1241 )
1242 .aura(
1243 "leaping_flames",
1244 AURA::LEAPING_FLAMES,
1245 |a| aura_leaping_flames(a, ¶ms.game_data),
1246 )
1247 .aura(
1248 "ancient_flame",
1249 AURA::ANCIENT_FLAME,
1250 |a| aura_ancient_flame(a, ¶ms.game_data),
1251 )
1252 .aura(
1253 "tip_the_scales",
1254 AURA::TIP_THE_SCALES,
1255 |a| aura_tip_the_scales(a, ¶ms.game_data),
1256 )
1257 .aura(
1258 "power_swell",
1259 AURA::POWER_SWELL,
1260 |a| aura_power_swell(a, ¶ms.game_data),
1261 )
1262 .aura(
1263 "imminent_destruction",
1264 AURA::IMMINENT_DESTRUCTION,
1265 |a| aura_imminent_destruction(a, ¶ms.game_data),
1266 )
1267 .aura(
1268 "fire_breath",
1269 AURA::FIRE_BREATH,
1270 |a| aura_fire_breath(a, ¶ms.game_data),
1271 )
1272 .aura(
1273 "consume_flame",
1274 AURA::CONSUME_FLAME,
1275 |a| aura_consume_flame(a, ¶ms.game_data),
1276 )
1277 .aura(
1278 "azure_sweep",
1279 AURA::AZURE_SWEEP,
1280 |a| aura_azure_sweep(a, ¶ms.game_data),
1281 )
1282 .aura("recall", AURA::RECALL, |a| aura_recall(a, ¶ms.game_data))
1283 .aura(
1284 "blessing_of_the_bronze",
1285 AURA::BLESSING_OF_THE_BRONZE,
1286 |a| aura_blessing_of_the_bronze(a, ¶ms.game_data),
1287 )
1288 .aura(
1289 "rising_fury",
1290 AURA::RISING_FURY,
1291 |a| aura_rising_fury(a, ¶ms.game_data),
1292 )
1293 .aura(
1294 "unbound_flame",
1295 AURA::UNBOUND_FLAME,
1296 |a| aura_unbound_flame(a, ¶ms.game_data),
1297 )
1298 .aura(
1299 "deep_breath_trigger",
1300 AURA::DEEP_BREATH_TRIGGER,
1301 |a| aura_deep_breath_trigger(a, ¶ms.game_data),
1302 )
1303 .aura(
1304 "melt_armor_dot",
1305 AURA::MELT_ARMOR_DOT,
1306 |a| aura_melt_armor_dot(a, ¶ms.game_data),
1307 )
1308 .aura(
1309 "strafing_run",
1310 AURA::STRAFING_RUN,
1311 |a| aura_strafing_run(a, ¶ms.game_data),
1312 )
1313 .aura(
1314 "bombardments",
1315 AURA::BOMBARDMENTS,
1316 |a| aura_bombardments(a, ¶ms.game_data),
1317 )
1318 .aura(
1319 "mass_disintegrate",
1320 AURA::MASS_DISINTEGRATE,
1321 |a| aura_mass_disintegrate(a, ¶ms.game_data),
1322 )
1323 .spell(
1324 "living_flame",
1325 SPELL::LIVING_FLAME,
1326 |s| spell_living_flame(s, ¶ms.game_data),
1327 )
1328 .spell(
1329 "azure_strike",
1330 SPELL::AZURE_STRIKE,
1331 |s| spell_azure_strike(s, ¶ms.game_data),
1332 )
1333 .spell(
1334 "disintegrate",
1335 SPELL::DISINTEGRATE,
1336 |s| spell_disintegrate(s, ¶ms.game_data),
1337 )
1338 .spell(
1339 "fire_breath",
1340 SPELL::FIRE_BREATH,
1341 |s| spell_fire_breath(s, ¶ms.game_data),
1342 )
1343 .spell(
1344 "eternity_surge",
1345 SPELL::ETERNITY_SURGE,
1346 |s| spell_eternity_surge(s, ¶ms.game_data),
1347 )
1348 .spell("pyre", SPELL::PYRE, |s| spell_pyre(s, ¶ms.game_data))
1349 .spell(
1350 "dragonrage",
1351 SPELL::DRAGONRAGE,
1352 |s| spell_dragonrage(s, ¶ms.game_data),
1353 )
1354 .spell(
1355 "unbound_flame",
1356 SPELL::UNBOUND_FLAME,
1357 |s| spell_unbound_flame(s, ¶ms.game_data),
1358 )
1359 .spell(
1360 "tip_the_scales",
1361 SPELL::TIP_THE_SCALES,
1362 |s| spell_tip_the_scales(s, ¶ms.game_data),
1363 )
1364 .spell(
1365 "scintillation",
1366 SPELL::SCINTILLATION,
1367 |s| spell_scintillation(s, ¶ms.game_data),
1368 )
1369 .spell(
1370 "shattering_star",
1371 SPELL::SHATTERING_STAR,
1372 |s| spell_shattering_star(s, ¶ms.game_data),
1373 )
1374 .spell(
1375 "blessing_of_the_bronze",
1376 SPELL::BLESSING_OF_THE_BRONZE,
1377 |s| spell_blessing_of_the_bronze(s, ¶ms.game_data),
1378 )
1379 .spell(
1380 "deep_breath",
1381 SPELL::DEEP_BREATH,
1382 |s| spell_deep_breath(s, ¶ms.game_data),
1383 )
1384 .game_data(params.game_data.clone())
1385 .talent_spell_ids(TALENTS)
1386 .talent_selections(params.talent_selections)
1387 .set_bonus_auras(params.set_bonus_auras)
1388 .encounter(params.encounter.clone());
1389 let builder = crate::generated::items::register_equipped(
1390 builder,
1391 ¶ms.game_data,
1392 params.equipped_items,
1393 )?;
1394
1395 builder.into_draft()
1396}
1397fn new_handler(
1398 params: wowlab_engine_ports::HandlerParams<'_>,
1399) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1400 let handler = crate::composition::compose_handler(
1401 build_combat_system_draft,
1402 ¶ms,
1403 crate::hooks::devastation_evoker::DevastationHandler::new,
1404 )?;
1405
1406 Ok(Box::new(handler))
1407}
1408static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1409 primary_resource: ResourceType::Essence,
1410 secondary_resource: None,
1411 spell_ids: DECLARED_SPELL_IDS,
1412 aura_ids: DECLARED_AURA_IDS,
1413 server_proc_entries: &[
1414 DeclaredServerProcEntry {
1415 spell_id: 359_618,
1416 attributes: ProcAttributes::REQUIRE_SPELL_MODIFIER.bits()
1417 | ProcAttributes::USE_STACKS_FOR_CHARGES.bits(),
1418 },
1419 DeclaredServerProcEntry {
1420 spell_id: 375_802,
1421 attributes: ProcAttributes::REQUIRE_SPELL_MODIFIER.bits()
1422 | ProcAttributes::USE_STACKS_FOR_CHARGES.bits(),
1423 },
1424 ],
1425 talents: TALENTS,
1426 rotation_field_schema: &[],
1427 metrics_plugin_id: None,
1428 hero_talent_trees: &[
1429 HeroTalentTreeDesc {
1430 name: "Flameshaper",
1431 spells: HERO_TREE_FLAMESHAPER_SPELLS,
1432 auras: HERO_TREE_FLAMESHAPER_AURAS,
1433 },
1434 HeroTalentTreeDesc {
1435 name: "Chronowarden",
1436 spells: HERO_TREE_CHRONOWARDEN_SPELLS,
1437 auras: HERO_TREE_CHRONOWARDEN_AURAS,
1438 },
1439 HeroTalentTreeDesc {
1440 name: "Scalecommander",
1441 spells: HERO_TREE_SCALECOMMANDER_SPELLS,
1442 auras: HERO_TREE_SCALECOMMANDER_AURAS,
1443 },
1444 ],
1445 reported_spells: REPORTED_SPELLS,
1446 masked_passive_effects: &[],
1447 passive_effect_overrides: &[],
1448};
1449pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1450 spec_id: SpecId::Devastation,
1451 display_name: "Devastation Evoker",
1452 metadata: DECLARED_METADATA,
1453 handler_factory: new_handler,
1454};
1455wowlab_engine_combat::smoke_test!(build_combat_system_draft);