1#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_combat::{
6 CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
7 LocalSpellIdx, SpellDefinitionDraft,
8};
9use wowlab_engine_ports::{
10 DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
11};
12use wowlab_engine_gamedata::ResolvedGameData;
13pub(crate) mod SPELL {
14 pub(crate) const FIREBALL: u32 = 133;
16 pub(crate) const PYROBLAST: u32 = 11366;
18 pub(crate) const FIRE_BLAST: u32 = 108_853;
20 pub(crate) const FLAMESTRIKE: u32 = 2120;
22 pub(crate) const COMBUSTION: u32 = 190_319;
24 pub(crate) const METEOR: u32 = 153_561;
26 pub(crate) const SCORCH: u32 = 2948;
28 pub(crate) const FROSTFIRE_BOLT: u32 = 431_044;
30 pub(crate) const ARCANE_INTELLECT: u32 = 1459;
32 pub(crate) const IGNITE: u32 = 12654;
34 pub(crate) const INTENSIFYING_FLAME: u32 = 419_800;
36 pub(crate) const BURNOUT: u32 = 1_271_335;
38}
39pub(crate) mod AURA {
40 pub(crate) const HEATING_UP: u32 = 48107;
42 pub(crate) const HOT_STREAK: u32 = 48108;
44 pub(crate) const COMBUSTION: u32 = 190_319;
46 pub(crate) const IGNITE: u32 = 12654;
48 pub(crate) const CONTROLLED_DESTRUCTION: u32 = 453_268;
50 pub(crate) const HYPERTHERMIA: u32 = 383_874;
52 pub(crate) const HYPERTHERMIA_DAMAGE: u32 = 1_242_220;
54 pub(crate) const PYROTECHNICS: u32 = 157_644;
56 pub(crate) const PYROCLASM: u32 = 269_651;
58 pub(crate) const FEEL_THE_BURN: u32 = 383_395;
60 pub(crate) const FEVERED_INCANTATION: u32 = 383_811;
62 pub(crate) const FIRED_UP: u32 = 1_257_350;
64 pub(crate) const HEAT_SHIMMER: u32 = 458_964;
66 pub(crate) const FROSTFIRE_EMPOWERMENT: u32 = 431_177;
68 pub(crate) const ARCANE_INTELLECT_HIGHLIGHT: u32 = 1459;
70 pub(crate) const SPELLFIRE_SPHERE: u32 = 448_604;
72 pub(crate) const FIERY_RUSH_EFFECT: u32 = 383_637;
74}
75pub(crate) mod TALENT {
76 pub(crate) const BURNOUT: u32 = 1_271_177;
78 pub(crate) const BURN_IT_ALL: u32 = 1_254_512;
80 pub(crate) const CINDERSTORM: u32 = 1_254_865;
82 pub(crate) const CODEX_OF_THE_SUNSTRIDERS: u32 = 449_382;
84 pub(crate) const COMBUSTION: u32 = 190_319;
86 pub(crate) const CONFLAGRATION: u32 = 1_271_171;
88 pub(crate) const CONTROLLED_DESTRUCTION: u32 = 383_669;
90 pub(crate) const CRITICAL_MASS: u32 = 117_216;
92 pub(crate) const DEEP_IMPACT: u32 = 416_719;
94 pub(crate) const FEEL_THE_BURN: u32 = 383_391;
96 pub(crate) const FEVERED_INCANTATION: u32 = 383_810;
98 pub(crate) const FIERY_RUSH: u32 = 383_634;
100 pub(crate) const FIRED_UP_1: u32 = 1_257_343;
102 pub(crate) const FIRED_UP_2: u32 = 1_257_349;
104 pub(crate) const FIRED_UP_3: u32 = 1_257_348;
106 pub(crate) const FIRESTARTER: u32 = 205_026;
108 pub(crate) const FIRES_IRE: u32 = 450_831;
110 pub(crate) const FIRE_BLAST: u32 = 108_853;
112 pub(crate) const FLAMESTRIKE: u32 = 2120;
114 pub(crate) const FLAME_ON: u32 = 205_029;
116 pub(crate) const FROM_THE_ASHES: u32 = 342_344;
118 pub(crate) const FUEL_THE_FIRE: u32 = 383_550;
120 pub(crate) const HEAT_SHIMMER: u32 = 457_736;
122 pub(crate) const IGNITION: u32 = 383_549;
124 pub(crate) const INFLAME: u32 = 417_467;
126 pub(crate) const INTENSIFYING_FLAME: u32 = 416_714;
128 pub(crate) const INVOCATION_ARCANE_PHOENIX: u32 = 448_658;
130 pub(crate) const KINDLING: u32 = 155_148;
132 pub(crate) const MASTER_OF_FLAME: u32 = 384_174;
134 pub(crate) const MEMORY_OF_ALAR: u32 = 449_619;
136 pub(crate) const METEOR: u32 = 153_561;
138 pub(crate) const MOLTEN_FURY: u32 = 457_803;
140 pub(crate) const PYROBLAST: u32 = 11366;
142 pub(crate) const PYROCLASM: u32 = 269_650;
144 pub(crate) const PYROMANIAC: u32 = 451_466;
146 pub(crate) const SAVOR_THE_MOMENT: u32 = 449_412;
148 pub(crate) const SCALD: u32 = 450_746;
150 pub(crate) const SCORCH: u32 = 2948;
152 pub(crate) const SLOW_BURN: u32 = 383_967;
154 pub(crate) const SPONTANEOUS_COMBUSTION: u32 = 451_875;
156 pub(crate) const WILDFIRE: u32 = 383_489;
158}
159pub(crate) mod SET_BONUS {
160 pub(crate) const MID2_FIRE_2PC: u32 = 1_296_583;
162 pub(crate) const MID2_FIRE_4PC: u32 = 1_296_584;
164}
165pub(crate) mod REPORTED_SPELL {
166 pub(crate) const ARCANE_BARRAGE: u32 = 450_499;
168 pub(crate) const ARCANE_PHOENIX_CONTROLLER: u32 = 448_659;
170 pub(crate) const ARCANE_SURGE: u32 = 453_326;
172 pub(crate) const GREATER_PYROBLAST: u32 = 450_421;
174 pub(crate) const IGNITE: u32 = 12654;
176 pub(crate) const METEORITE_BUG_IMPACT: u32 = 449_560;
178 pub(crate) const METEORITE_IMPACT: u32 = 456_139;
180 pub(crate) const PHOENIX_PYROBLAST: u32 = 450_461;
182 pub(crate) const PYROBLAST_PYROMANIAC: u32 = 460_475;
184 pub(crate) const PYROMANIAC_CONTROLLER: u32 = 451_466;
186}
187pub(crate) mod HERO {
188 pub(crate) mod FROSTFIRE {
189 pub(crate) mod SPELL {
190 pub(crate) const DUALITY_GLACIAL_SPIKE: u32 = 1_236_209;
192 pub(crate) const FLASH_FREEZEBURN_DAMAGE: u32 = 1_278_079;
194 pub(crate) const FROSTFIRE_BOLT: u32 = 431_044;
196 pub(crate) const FROSTFIRE_EMPOWERMENT_DAMAGE: u32 = 431_186;
198 pub(crate) const MOLTEN_CHILL_IGNITE: u32 = 1_262_887;
200 }
201 pub(crate) mod AURA {
202 pub(crate) const FROSTFIRE_EMPOWERMENT: u32 = 431_177;
204 }
205 }
206 pub(crate) mod SUNFURY {
207 pub(crate) mod SPELL {
208 pub(crate) const METEORITE: u32 = 449_559;
210 pub(crate) const METEORITE_IMPACT: u32 = 449_569;
212 }
213 pub(crate) mod AURA {
214 pub(crate) const GLORIOUS_INCANDESCENCE: u32 = 451_073;
216 pub(crate) const HYPERTHERMIA: u32 = 383_874;
218 pub(crate) const HYPERTHERMIA_DAMAGE: u32 = 1_242_220;
220 pub(crate) const LESSER_TIME_WARP: u32 = 1_260_277;
222 pub(crate) const MANA_CASCADE: u32 = 449_314;
224 pub(crate) const SPELLFIRE_SPHERE: u32 = 448_604;
226 }
227 }
228}
229static HERO_TREE_FROSTFIRE_SPELLS: &[(&str, u32)] = &[
230 ("DUALITY_GLACIAL_SPIKE", 1_236_209),
231 ("FLASH_FREEZEBURN_DAMAGE", 1_278_079),
232 ("FROSTFIRE_BOLT", 431_044),
233 ("FROSTFIRE_EMPOWERMENT_DAMAGE", 431_186),
234 ("MOLTEN_CHILL_IGNITE", 1_262_887),
235];
236static HERO_TREE_FROSTFIRE_AURAS: &[(&str, u32)] = &[("FROSTFIRE_EMPOWERMENT", 431_177)];
237static HERO_TREE_SUNFURY_SPELLS: &[(&str, u32)] = &[
238 ("METEORITE", 449_559),
239 ("METEORITE_IMPACT", 449_569),
240];
241static HERO_TREE_SUNFURY_AURAS: &[(&str, u32)] = &[
242 ("GLORIOUS_INCANDESCENCE", 451_073),
243 ("HYPERTHERMIA", 383_874),
244 ("HYPERTHERMIA_DAMAGE", 1_242_220),
245 ("LESSER_TIME_WARP", 1_260_277),
246 ("MANA_CASCADE", 449_314),
247 ("SPELLFIRE_SPHERE", 448_604),
248];
249pub(crate) mod DAMAGE_SPELL {
250 pub(crate) const FIREBALL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_133;
251 pub(crate) const PYROBLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_11366;
252 pub(crate) const FIRE_BLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_108853;
253 pub(crate) const FLAMESTRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_2120;
254 pub(crate) const COMBUSTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_190319;
255 pub(crate) const METEOR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_153561;
256 pub(crate) const SCORCH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_2948;
257 pub(crate) const FROSTFIRE_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_431044;
258 pub(crate) const ARCANE_INTELLECT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_1459;
259 pub(crate) const IGNITE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_12654;
260 pub(crate) const INTENSIFYING_FLAME: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_419800;
261 pub(crate) const BURNOUT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_1271335;
262 pub(crate) const DUALITY_GLACIAL_SPIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_1236209;
263 pub(crate) const FLASH_FREEZEBURN_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_1278079;
264 pub(crate) const FROSTFIRE_EMPOWERMENT_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_431186;
265 pub(crate) const MOLTEN_CHILL_IGNITE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_1262887;
266 pub(crate) const METEORITE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_449559;
267 pub(crate) const METEORITE_IMPACT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_449569;
268}
269pub(crate) mod DAMAGE_AURA {
270 pub(crate) const HEATING_UP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_48107;
271 pub(crate) const HOT_STREAK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_48108;
272 pub(crate) const COMBUSTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_190319;
273 pub(crate) const IGNITE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_12654;
274 pub(crate) const CONTROLLED_DESTRUCTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_453268;
275 pub(crate) const HYPERTHERMIA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_383874;
276 pub(crate) const HYPERTHERMIA_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_1242220;
277 pub(crate) const PYROTECHNICS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_157644;
278 pub(crate) const PYROCLASM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_269651;
279 pub(crate) const FEEL_THE_BURN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_383395;
280 pub(crate) const FEVERED_INCANTATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_383811;
281 pub(crate) const FIRED_UP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_1257350;
282 pub(crate) const HEAT_SHIMMER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_458964;
283 pub(crate) const FROSTFIRE_EMPOWERMENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_431177;
284 pub(crate) const ARCANE_INTELLECT_HIGHLIGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_1459;
285 pub(crate) const SPELLFIRE_SPHERE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_448604;
286 pub(crate) const FIERY_RUSH_EFFECT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_383637;
287}
288pub(crate) mod DAMAGE_TALENT {
289 pub(crate) const BURNOUT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_1271177;
290 pub(crate) const BURN_IT_ALL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_1254512;
291 pub(crate) const CINDERSTORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_1254865;
292 pub(crate) const CODEX_OF_THE_SUNSTRIDERS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_449382;
293 pub(crate) const COMBUSTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_190319;
294 pub(crate) const CONFLAGRATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_1271171;
295 pub(crate) const CONTROLLED_DESTRUCTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_383669;
296 pub(crate) const CRITICAL_MASS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_117216;
297 pub(crate) const DEEP_IMPACT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_416719;
298 pub(crate) const FEEL_THE_BURN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_383391;
299 pub(crate) const FEVERED_INCANTATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_383810;
300 pub(crate) const FIERY_RUSH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_383634;
301 pub(crate) const FIRED_UP_1: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_1257343;
302 pub(crate) const FIRED_UP_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_1257349;
303 pub(crate) const FIRED_UP_3: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_1257348;
304 pub(crate) const FIRESTARTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_205026;
305 pub(crate) const FIRES_IRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_450831;
306 pub(crate) const FIRE_BLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_108853;
307 pub(crate) const FLAMESTRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_2120;
308 pub(crate) const FLAME_ON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_205029;
309 pub(crate) const FROM_THE_ASHES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_342344;
310 pub(crate) const FUEL_THE_FIRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_383550;
311 pub(crate) const HEAT_SHIMMER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_457736;
312 pub(crate) const IGNITION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_383549;
313 pub(crate) const INFLAME: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_417467;
314 pub(crate) const INTENSIFYING_FLAME: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_416714;
315 pub(crate) const INVOCATION_ARCANE_PHOENIX: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_448658;
316 pub(crate) const KINDLING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_155148;
317 pub(crate) const MASTER_OF_FLAME: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_384174;
318 pub(crate) const MEMORY_OF_ALAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_449619;
319 pub(crate) const METEOR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_153561;
320 pub(crate) const MOLTEN_FURY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_457803;
321 pub(crate) const PYROBLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_11366;
322 pub(crate) const PYROCLASM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_269650;
323 pub(crate) const PYROMANIAC: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_451466;
324 pub(crate) const SAVOR_THE_MOMENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_449412;
325 pub(crate) const SCALD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_450746;
326 pub(crate) const SCORCH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_2948;
327 pub(crate) const SLOW_BURN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_383967;
328 pub(crate) const SPONTANEOUS_COMBUSTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_451875;
329 pub(crate) const WILDFIRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_383489;
330}
331pub(crate) mod DAMAGE_REPORTED {
332 pub(crate) const ARCANE_BARRAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_450499;
333 pub(crate) const ARCANE_PHOENIX_CONTROLLER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_448659;
334 pub(crate) const ARCANE_SURGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_453326;
335 pub(crate) const GREATER_PYROBLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_450421;
336 pub(crate) const IGNITE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_12654;
337 pub(crate) const METEORITE_BUG_IMPACT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_449560;
338 pub(crate) const METEORITE_IMPACT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_456139;
339 pub(crate) const PHOENIX_PYROBLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_450461;
340 pub(crate) const PYROBLAST_PYROMANIAC: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_460475;
341 pub(crate) const PYROMANIAC_CONTROLLER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ACTION::SPELL_451466;
342}
343pub(crate) mod DAMAGE_EFFECT {
344 pub(crate) const FIRESTARTER_THRESHOLD: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_205026_EFFECT_1;
345 pub(crate) const IGNITE_MASTERY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_12846_EFFECT_1;
346 pub(crate) const METEOR_BURN_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_155158_EFFECT_1;
347 pub(crate) const METEOR_BURN_DURATION: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_175396_EFFECT_1;
348 pub(crate) const METEOR_DELAY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_177345_EFFECT_1;
349 pub(crate) const METEOR_IMPACT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_351140_EFFECT_1;
350 pub(crate) const METEORITE_IMPACT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_449569_EFFECT_1;
351 pub(crate) const PHOENIX_ARCANE_BARRAGE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_450499_EFFECT_1;
352 pub(crate) const PHOENIX_ARCANE_SURGE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_453326_EFFECT_1;
353 pub(crate) const PHOENIX_GREATER_PYROBLAST_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_450421_EFFECT_1;
354 pub(crate) const PHOENIX_METEORITE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_456139_EFFECT_1;
355 pub(crate) const PHOENIX_PYROBLAST_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_450461_EFFECT_1;
356 pub(crate) const PYROBLAST_PYROMANIAC_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_460475_EFFECT_1;
357 pub(crate) const PYROCLASM_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_269650_EFFECT_1;
358 pub(crate) const BURNOUT_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_1271177_EFFECT_1;
359 pub(crate) const INTENSIFYING_FLAME_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_416714_EFFECT_2;
360 pub(crate) const FIRED_UP_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_1257343_EFFECT_1;
361 pub(crate) const FIRED_UP_COMBUSTION_EXTEND_MS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_1257348_EFFECT_2;
362 pub(crate) const FIRED_UP_FIRE_BLAST_CDR_MS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_1257349_EFFECT_1;
363 pub(crate) const BURN_IT_ALL_BASE_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_1254512_EFFECT_2;
364 pub(crate) const BURN_IT_ALL_CRIT_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_1254512_EFFECT_1;
365 pub(crate) const CODEX_COMBUSTION_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_449382_EFFECT_2;
366 pub(crate) const CONTROLLED_DESTRUCTION_PCT_X100: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_383669_EFFECT_2;
367 pub(crate) const SAVOR_CAP_MS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_449412_EFFECT_2;
368 pub(crate) const SAVOR_PER_SPHERE_MS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fire_mage::damage::EFFECT::SPELL_449412_EFFECT_1;
369}
370pub(crate) const AURA_HEATING_UP: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::AURA_HEATING_UP
371 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
372pub(crate) const AURA_HOT_STREAK: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::AURA_HOT_STREAK
373 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
374pub(crate) const AURA_COMBUSTION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::AURA_COMBUSTION
375 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
376pub(crate) const AURA_IGNITE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::AURA_IGNITE
377 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
378pub(crate) const AURA_CONTROLLED_DESTRUCTION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::AURA_CONTROLLED_DESTRUCTION
379 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
380pub(crate) const AURA_HYPERTHERMIA: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::AURA_HYPERTHERMIA
381 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
382pub(crate) const AURA_HYPERTHERMIA_DAMAGE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::AURA_HYPERTHERMIA_DAMAGE
383 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
384pub(crate) const AURA_PYROTECHNICS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::AURA_PYROTECHNICS
385 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
386pub(crate) const AURA_PYROCLASM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::AURA_PYROCLASM
387 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
388pub(crate) const AURA_FEEL_THE_BURN: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::AURA_FEEL_THE_BURN
389 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
390pub(crate) const AURA_FEVERED_INCANTATION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::AURA_FEVERED_INCANTATION
391 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
392pub(crate) const AURA_FIRED_UP: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::AURA_FIRED_UP
393 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
394pub(crate) const AURA_HEAT_SHIMMER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::AURA_HEAT_SHIMMER
395 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
396pub(crate) const AURA_FROSTFIRE_EMPOWERMENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::AURA_FROSTFIRE_EMPOWERMENT
397 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
398pub(crate) const AURA_ARCANE_INTELLECT_HIGHLIGHT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::AURA_ARCANE_INTELLECT_HIGHLIGHT
399 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
400pub(crate) const AURA_SPELLFIRE_SPHERE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::AURA_SPELLFIRE_SPHERE
401 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
402pub(crate) const AURA_FIERY_RUSH_EFFECT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::AURA_FIERY_RUSH_EFFECT
403 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
404pub(crate) const AURA_COUNT: usize = 17;
405const _: () = assert!(
406 AURA_COUNT == 17, "AURA index ABI: count changed -- update positional hook consumers"
407);
408pub(crate) const SPELL_FIREBALL: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::SPELL_FIREBALL
409 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
410pub(crate) const SPELL_PYROBLAST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::SPELL_PYROBLAST
411 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
412pub(crate) const SPELL_FIRE_BLAST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::SPELL_FIRE_BLAST
413 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
414pub(crate) const SPELL_FLAMESTRIKE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::SPELL_FLAMESTRIKE
415 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
416pub(crate) const SPELL_COMBUSTION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::SPELL_COMBUSTION
417 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
418pub(crate) const SPELL_METEOR: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::SPELL_METEOR
419 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
420pub(crate) const SPELL_SCORCH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::SPELL_SCORCH
421 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
422pub(crate) const SPELL_FROSTFIRE_BOLT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::SPELL_FROSTFIRE_BOLT
423 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
424pub(crate) const SPELL_ARCANE_INTELLECT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::SPELL_ARCANE_INTELLECT
425 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
426pub(crate) const SPELL_IGNITE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::SPELL_IGNITE
427 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
428pub(crate) const SPELL_INTENSIFYING_FLAME: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::SPELL_INTENSIFYING_FLAME
429 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
430pub(crate) const SPELL_BURNOUT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fire_mage::SPELL_BURNOUT
431 .bind(wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF);
432pub(crate) const SPELL_COUNT: usize = 12;
433const _: () = assert!(
434 SPELL_COUNT == 12,
435 "SPELL index ABI: count changed -- update positional hook consumers"
436);
437pub(crate) mod EFFECT {
438 pub(crate) const FIRESTARTER_THRESHOLD: (u32, u8) = (205_026, 1);
440 pub(crate) const IGNITE_MASTERY: (u32, u8) = (12846, 1);
442 pub(crate) const METEOR_BURN_DAMAGE: (u32, u8) = (155_158, 1);
444 pub(crate) const METEOR_BURN_DURATION: (u32, u8) = (175_396, 1);
446 pub(crate) const METEOR_DELAY: (u32, u8) = (177_345, 1);
448 pub(crate) const METEOR_IMPACT_DAMAGE: (u32, u8) = (351_140, 1);
450 pub(crate) const METEORITE_IMPACT_DAMAGE: (u32, u8) = (449_569, 1);
452 pub(crate) const PHOENIX_ARCANE_BARRAGE_DAMAGE: (u32, u8) = (450_499, 1);
454 pub(crate) const PHOENIX_ARCANE_SURGE_DAMAGE: (u32, u8) = (453_326, 1);
456 pub(crate) const PHOENIX_GREATER_PYROBLAST_DAMAGE: (u32, u8) = (450_421, 1);
458 pub(crate) const PHOENIX_METEORITE_DAMAGE: (u32, u8) = (456_139, 1);
460 pub(crate) const PHOENIX_PYROBLAST_DAMAGE: (u32, u8) = (450_461, 1);
462 pub(crate) const PYROBLAST_PYROMANIAC_DAMAGE: (u32, u8) = (460_475, 1);
464 pub(crate) const PYROCLASM_CHANCE: (u32, u8) = (269_650, 1);
466 pub(crate) const BURNOUT_PCT: (u32, u8) = (1_271_177, 1);
468 pub(crate) const INTENSIFYING_FLAME_PCT: (u32, u8) = (416_714, 2);
470 pub(crate) const FIRED_UP_CHANCE: (u32, u8) = (1_257_343, 1);
472 pub(crate) const FIRED_UP_COMBUSTION_EXTEND_MS: (u32, u8) = (1_257_348, 2);
474 pub(crate) const FIRED_UP_FIRE_BLAST_CDR_MS: (u32, u8) = (1_257_349, 1);
476 pub(crate) const BURN_IT_ALL_BASE_PCT: (u32, u8) = (1_254_512, 2);
478 pub(crate) const BURN_IT_ALL_CRIT_PCT: (u32, u8) = (1_254_512, 1);
480 pub(crate) const CODEX_COMBUSTION_PCT: (u32, u8) = (449_382, 2);
482 pub(crate) const CONTROLLED_DESTRUCTION_PCT_X100: (u32, u8) = (383_669, 2);
484 pub(crate) const SAVOR_CAP_MS: (u32, u8) = (449_412, 2);
486 pub(crate) const SAVOR_PER_SPHERE_MS: (u32, u8) = (449_412, 1);
488}
489static REPORTED_SPELLS: &[(&str, u32)] = &[
490 ("arcane_barrage", 450_499),
491 ("arcane_phoenix_controller", 448_659),
492 ("arcane_surge", 453_326),
493 ("greater_pyroblast", 450_421),
494 ("ignite", 12654),
495 ("meteorite_bug_impact", 449_560),
496 ("meteorite_impact", 456_139),
497 ("phoenix_pyroblast", 450_461),
498 ("pyroblast_pyromaniac", 460_475),
499 ("pyromaniac_controller", 451_466),
500];
501static DECLARED_SPELL_IDS: &[u32] = &[
502 133, 11366, 108_853, 2120, 190_319, 153_561, 2948, 431_044, 1459, 12654, 419_800,
503 1_271_335, 48107, 48108, 453_268, 383_874, 1_242_220, 157_644, 269_651, 383_395,
504 383_811, 1_257_350, 458_964, 431_177, 448_604, 383_637, 1_271_177, 1_254_512,
505 1_254_865, 449_382, 1_271_171, 383_669, 117_216, 416_719, 383_391, 383_810, 383_634,
506 1_257_343, 1_257_349, 1_257_348, 205_026, 450_831, 205_029, 342_344, 383_550,
507 457_736, 383_549, 417_467, 416_714, 448_658, 155_148, 384_174, 449_619, 457_803,
508 269_650, 451_466, 449_412, 450_746, 383_967, 451_875, 383_489, 12846, 155_158,
509 175_396, 177_345, 351_140, 448_659, 449_560, 449_569, 450_421, 450_461, 450_499,
510 453_326, 456_139, 460_475, 1_236_209, 1_278_079, 431_186, 1_262_887, 449_559,
511 451_073, 1_260_277, 449_314,
512];
513static DECLARED_AURA_IDS: &[u32] = &[
514 48107, 48108, 190_319, 12654, 453_268, 383_874, 1_242_220, 157_644, 269_651, 383_395,
515 383_811, 1_257_350, 458_964, 431_177, 1459, 448_604, 383_637, 431_177, 451_073,
516 383_874, 1_242_220, 1_260_277, 449_314, 448_604,
517];
518static TALENTS: &[(&str, u32)] = &[
519 ("BURNOUT", TALENT::BURNOUT),
520 ("BURN_IT_ALL", TALENT::BURN_IT_ALL),
521 ("CINDERSTORM", TALENT::CINDERSTORM),
522 ("CODEX_OF_THE_SUNSTRIDERS", TALENT::CODEX_OF_THE_SUNSTRIDERS),
523 ("COMBUSTION", TALENT::COMBUSTION),
524 ("CONFLAGRATION", TALENT::CONFLAGRATION),
525 ("CONTROLLED_DESTRUCTION", TALENT::CONTROLLED_DESTRUCTION),
526 ("CRITICAL_MASS", TALENT::CRITICAL_MASS),
527 ("DEEP_IMPACT", TALENT::DEEP_IMPACT),
528 ("FEEL_THE_BURN", TALENT::FEEL_THE_BURN),
529 ("FEVERED_INCANTATION", TALENT::FEVERED_INCANTATION),
530 ("FIERY_RUSH", TALENT::FIERY_RUSH),
531 ("FIRED_UP_1", TALENT::FIRED_UP_1),
532 ("FIRED_UP_2", TALENT::FIRED_UP_2),
533 ("FIRED_UP_3", TALENT::FIRED_UP_3),
534 ("FIRESTARTER", TALENT::FIRESTARTER),
535 ("FIRES_IRE", TALENT::FIRES_IRE),
536 ("FIRE_BLAST", TALENT::FIRE_BLAST),
537 ("FLAMESTRIKE", TALENT::FLAMESTRIKE),
538 ("FLAME_ON", TALENT::FLAME_ON),
539 ("FROM_THE_ASHES", TALENT::FROM_THE_ASHES),
540 ("FUEL_THE_FIRE", TALENT::FUEL_THE_FIRE),
541 ("HEAT_SHIMMER", TALENT::HEAT_SHIMMER),
542 ("IGNITION", TALENT::IGNITION),
543 ("INFLAME", TALENT::INFLAME),
544 ("INTENSIFYING_FLAME", TALENT::INTENSIFYING_FLAME),
545 ("INVOCATION_ARCANE_PHOENIX", TALENT::INVOCATION_ARCANE_PHOENIX),
546 ("KINDLING", TALENT::KINDLING),
547 ("MASTER_OF_FLAME", TALENT::MASTER_OF_FLAME),
548 ("MEMORY_OF_ALAR", TALENT::MEMORY_OF_ALAR),
549 ("METEOR", TALENT::METEOR),
550 ("MOLTEN_FURY", TALENT::MOLTEN_FURY),
551 ("PYROBLAST", TALENT::PYROBLAST),
552 ("PYROCLASM", TALENT::PYROCLASM),
553 ("PYROMANIAC", TALENT::PYROMANIAC),
554 ("SAVOR_THE_MOMENT", TALENT::SAVOR_THE_MOMENT),
555 ("SCALD", TALENT::SCALD),
556 ("SCORCH", TALENT::SCORCH),
557 ("SLOW_BURN", TALENT::SLOW_BURN),
558 ("SPONTANEOUS_COMBUSTION", TALENT::SPONTANEOUS_COMBUSTION),
559 ("WILDFIRE", TALENT::WILDFIRE),
560];
561pub(crate) mod FIRE_MAGE {
562 pub(crate) const FIREBALL_CASTS: u32 = 0;
563 pub(crate) const PYROBLAST_CASTS: u32 = 1;
564 pub(crate) const FIRE_BLAST_CASTS: u32 = 2;
565 pub(crate) const COMBUSTION_CASTS: u32 = 3;
566 pub(crate) const METEOR_CASTS: u32 = 4;
567 pub(crate) const FLAMESTRIKE_CASTS: u32 = 5;
568 pub(crate) const COMBUSTION_UPTIME_MS: u32 = 6;
569 pub(crate) const IGNITE_UPTIME_MS: u32 = 7;
570}
571fn aura_heating_up(
572 a: AuraDefinitionDraft,
573 data: &ResolvedGameData,
574) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
575 Ok(
576 a
577 .on_player()
578 .apply_base_from_data(data, 48107)?
579 .max_stacks(
580 data
581 .require_aura_max_stacks(
582 wowlab_types::sim::SpellIdx::from_raw(48107),
583 )?,
584 ),
585 )
586}
587fn aura_hot_streak(
588 a: AuraDefinitionDraft,
589 data: &ResolvedGameData,
590) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
591 Ok(
592 a
593 .on_player()
594 .apply_base_from_data(data, 48108)?
595 .max_stacks(
596 data
597 .require_aura_max_stacks(
598 wowlab_types::sim::SpellIdx::from_raw(48108),
599 )?,
600 ),
601 )
602}
603fn aura_combustion(
604 a: AuraDefinitionDraft,
605 data: &ResolvedGameData,
606) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
607 Ok(
608 a
609 .on_player()
610 .apply_base_from_data(data, 190_319)?
611 .max_stacks(
612 data
613 .require_aura_max_stacks(
614 wowlab_types::sim::SpellIdx::from_raw(190_319),
615 )?,
616 )
617 .on_expire(crate::hooks::fire_mage::combustion_expire_hook),
618 )
619}
620fn aura_ignite(
621 a: AuraDefinitionDraft,
622 data: &ResolvedGameData,
623) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
624 a.on_target()
625 .apply_base_from_data(data, 12654)?
626 .max_stacks(
627 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(12654))?,
628 )
629 .periodic_residual_damage(
630 wowlab_engine_combat::validated_milliseconds(
631 data.period(wowlab_types::sim::SpellIdx::from_raw(12654), 1),
632 12654,
633 "periodic_residual_damage.tick_ms",
634 )?,
635 )
636 .apply_periodic_behavior_from_data(data, 12654)
637}
638fn aura_controlled_destruction(
639 a: AuraDefinitionDraft,
640 data: &ResolvedGameData,
641) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
642 Ok(
643 a
644 .on_target()
645 .apply_base_from_data(data, 453_268)?
646 .max_stacks(
647 data
648 .require_aura_max_stacks(
649 wowlab_types::sim::SpellIdx::from_raw(453_268),
650 )?,
651 ),
652 )
653}
654fn aura_hyperthermia(
655 a: AuraDefinitionDraft,
656 data: &ResolvedGameData,
657) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
658 Ok(
659 a
660 .on_player()
661 .duration_ms(
662 wowlab_engine_combat::validated_milliseconds(
663 (f64::from(
664 data
665 .require_aura_duration_ms(
666 wowlab_types::sim::SpellIdx::from_raw(383_874),
667 )?,
668 )) * 0.8,
669 383_874,
670 "aura.duration_ms",
671 )?,
672 )
673 .apply_periodic_effect_from_data(data, 383_874)?
674 .apply_duration_behavior_from_data(data, 383_874)?
675 .apply_timing_modifiers_from_data(data, 383_874)?
676 .max_stacks(
677 data
678 .require_aura_max_stacks(
679 wowlab_types::sim::SpellIdx::from_raw(383_874),
680 )?,
681 )
682 .crit_chance_spells(100.0, &[11366, 2120])?
683 .apply_periodic_behavior_from_data(data, 383_874)?
684 .on_expire(crate::hooks::fire_mage::hyperthermia_expire_hook),
685 )
686}
687fn aura_hyperthermia_damage(
688 a: AuraDefinitionDraft,
689 data: &ResolvedGameData,
690) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
691 Ok(
692 a
693 .on_player()
694 .apply_base_from_data(data, 1_242_220)?
695 .max_stacks(
696 data
697 .require_aura_max_stacks(
698 wowlab_types::sim::SpellIdx::from_raw(1_242_220),
699 )?,
700 ),
701 )
702}
703fn aura_pyrotechnics(
704 a: AuraDefinitionDraft,
705 data: &ResolvedGameData,
706) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
707 a.on_player()
708 .apply_base_from_data(data, 157_644)?
709 .max_stacks(
710 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(157_644))?,
711 )
712 .crit_chance_spells(20.0, &[133])
713}
714fn aura_pyroclasm(
715 a: AuraDefinitionDraft,
716 data: &ResolvedGameData,
717) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
718 Ok(
719 a
720 .on_player()
721 .apply_base_from_data(data, 269_651)?
722 .max_stacks(
723 wowlab_engine_combat::validated_max_stacks(
724 2.0,
725 269_651,
726 "aura.max_stacks",
727 )?,
728 ),
729 )
730}
731fn aura_feel_the_burn(
732 a: AuraDefinitionDraft,
733 data: &ResolvedGameData,
734) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
735 Ok(
736 a
737 .on_player()
738 .apply_base_from_data(data, 383_395)?
739 .max_stacks(
740 data
741 .require_aura_max_stacks(
742 wowlab_types::sim::SpellIdx::from_raw(383_395),
743 )?,
744 ),
745 )
746}
747fn aura_fevered_incantation(
748 a: AuraDefinitionDraft,
749 data: &ResolvedGameData,
750) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
751 a.on_player()
752 .apply_base_from_data(data, 383_811)?
753 .max_stacks(
754 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(383_811))?,
755 )
756 .crit_damage_spells(2.0, &[133, 11366, 108_853, 2120, 153_561, 2948, 431_044])
757}
758fn aura_fired_up(
759 a: AuraDefinitionDraft,
760 data: &ResolvedGameData,
761) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
762 Ok(
763 a
764 .on_player()
765 .apply_base_from_data(data, 1_257_350)?
766 .max_stacks(
767 data
768 .require_aura_max_stacks(
769 wowlab_types::sim::SpellIdx::from_raw(1_257_350),
770 )?,
771 )
772 .damage_multiplier_stacking(
773 (data.base_points(wowlab_types::sim::SpellIdx::from_raw(1_257_350), 1))
774 * 0.01,
775 (data.base_points(wowlab_types::sim::SpellIdx::from_raw(1_257_350), 1))
776 * 0.01,
777 )?
778 .async_stacks(),
779 )
780}
781fn aura_heat_shimmer(
782 a: AuraDefinitionDraft,
783 data: &ResolvedGameData,
784) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
785 Ok(
786 a
787 .on_player()
788 .apply_base_from_data(data, 458_964)?
789 .max_stacks(
790 data
791 .require_aura_max_stacks(
792 wowlab_types::sim::SpellIdx::from_raw(458_964),
793 )?,
794 ),
795 )
796}
797fn aura_frostfire_empowerment(
798 a: AuraDefinitionDraft,
799 data: &ResolvedGameData,
800) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
801 Ok(
802 a
803 .on_player()
804 .apply_base_from_data(data, 431_177)?
805 .max_stacks(
806 data
807 .require_aura_max_stacks(
808 wowlab_types::sim::SpellIdx::from_raw(431_177),
809 )?,
810 ),
811 )
812}
813fn aura_arcane_intellect_highlight(
814 a: AuraDefinitionDraft,
815 data: &ResolvedGameData,
816) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
817 Ok(
818 a
819 .on_player()
820 .apply_base_from_data(data, 1459)?
821 .max_stacks(
822 data
823 .require_aura_max_stacks(
824 wowlab_types::sim::SpellIdx::from_raw(1459),
825 )?,
826 ),
827 )
828}
829fn aura_spellfire_sphere(
830 a: AuraDefinitionDraft,
831 data: &ResolvedGameData,
832) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
833 Ok(
834 a
835 .on_player()
836 .duration_ms(
837 wowlab_engine_combat::validated_milliseconds(
838 0.0,
839 448_604,
840 "aura.duration_ms",
841 )?,
842 )
843 .apply_periodic_effect_from_data(data, 448_604)?
844 .max_stacks(
845 data
846 .require_aura_max_stacks(
847 wowlab_types::sim::SpellIdx::from_raw(448_604),
848 )?,
849 )
850 .apply_at_max_stacks(),
851 )
852}
853fn aura_fiery_rush_effect(
854 a: AuraDefinitionDraft,
855 data: &ResolvedGameData,
856) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
857 Ok(
858 a
859 .on_player()
860 .apply_base_from_data(data, 383_637)?
861 .max_stacks(
862 data
863 .require_aura_max_stacks(
864 wowlab_types::sim::SpellIdx::from_raw(383_637),
865 )?,
866 ),
867 )
868}
869fn spell_fireball(
870 s: SpellDefinitionDraft,
871 data: &ResolvedGameData,
872) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
873 Ok(
874 s
875 .apply_base_from_data(data, 133)?
876 .travel_time(
877 wowlab_engine_combat::validated_milliseconds(
878 200.0,
879 133,
880 "spell.travel_time_ms",
881 )?,
882 )
883 .apply_aoe_from_data(data)
884 .on_cast(crate::hooks::fire_mage::fireball_hook),
885 )
886}
887fn spell_pyroblast(
888 s: SpellDefinitionDraft,
889 data: &ResolvedGameData,
890) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
891 Ok(
892 s
893 .apply_base_from_data(data, 11366)?
894 .cast_time(
895 wowlab_engine_combat::validated_milliseconds(
896 4500.0,
897 11366,
898 "spell.cast_time_ms",
899 )?,
900 )
901 .apply_aoe_from_data(data)
902 .on_cast(crate::hooks::fire_mage::pyroblast_hook),
903 )
904}
905fn spell_fire_blast(
906 s: SpellDefinitionDraft,
907 data: &ResolvedGameData,
908) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
909 Ok(
910 s
911 .apply_base_from_data(data, 108_853)?
912 .usable_while_casting()
913 .guaranteed_crit()
914 .apply_aoe_from_data(data)
915 .on_cast(crate::hooks::fire_mage::fire_blast_hook),
916 )
917}
918fn spell_flamestrike(
919 s: SpellDefinitionDraft,
920 data: &ResolvedGameData,
921) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
922 Ok(
923 s
924 .apply_base_from_data(data, 2120)?
925 .apply_aoe_from_data(data)
926 .on_cast(crate::hooks::fire_mage::flamestrike_hook),
927 )
928}
929fn spell_combustion(
930 s: SpellDefinitionDraft,
931 data: &ResolvedGameData,
932) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
933 Ok(
934 s
935 .apply_base_from_data(data, 190_319)?
936 .applies_inferred_aura(AURA_COMBUSTION, 190_319)
937 .apply_aoe_from_data(data)
938 .on_cast(crate::hooks::fire_mage::combustion_hook),
939 )
940}
941fn spell_meteor(
942 s: SpellDefinitionDraft,
943 data: &ResolvedGameData,
944) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
945 Ok(
946 s
947 .apply_base_from_data(data, 153_561)?
948 .apply_aoe_from_data(data)
949 .on_cast(crate::hooks::fire_mage::meteor_hook),
950 )
951}
952fn spell_scorch(
953 s: SpellDefinitionDraft,
954 data: &ResolvedGameData,
955) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
956 Ok(s.apply_base_from_data(data, 2948)?.apply_aoe_from_data(data))
957}
958fn spell_frostfire_bolt(
959 s: SpellDefinitionDraft,
960 data: &ResolvedGameData,
961) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
962 Ok(s.apply_base_from_data(data, 431_044)?.apply_aoe_from_data(data))
963}
964fn spell_arcane_intellect(
965 s: SpellDefinitionDraft,
966 data: &ResolvedGameData,
967) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
968 Ok(
969 s
970 .apply_base_from_data(data, 1459)?
971 .without_data_damage()
972 .applies_inferred_aura(AURA_ARCANE_INTELLECT_HIGHLIGHT, 1459)
973 .apply_aoe_from_data(data),
974 )
975}
976fn spell_ignite(
977 s: SpellDefinitionDraft,
978 data: &ResolvedGameData,
979) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
980 Ok(
981 s
982 .apply_base_from_data(data, 12654)?
983 .applies_inferred_aura(AURA_IGNITE, 12654)
984 .apply_aoe_from_data(data),
985 )
986}
987fn spell_intensifying_flame(
988 s: SpellDefinitionDraft,
989 data: &ResolvedGameData,
990) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
991 Ok(s.apply_base_from_data(data, 419_800)?.apply_aoe_from_data(data))
992}
993fn spell_burnout(
994 s: SpellDefinitionDraft,
995 data: &ResolvedGameData,
996) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
997 Ok(s.apply_base_from_data(data, 1_271_335)?.apply_aoe_from_data(data))
998}
999pub(crate) fn build_combat_system_draft(
1000 params: &wowlab_engine_ports::HandlerParams<'_>,
1001) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1002 let builder = CombatSystemBuilder::new(params.stats.clone())
1003 .spec_id(SpecId::Fire)
1004 .spec_identity(
1005 wowlab_engine_combat::generated_identities::specs::fire_mage::PROOF,
1006 )
1007 .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1008 .effect_identities(
1009 wowlab_engine_combat::generated_identities::specs::fire_mage::damage::ALL,
1010 )
1011 .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1012 .mastery_spell(12846)
1013 .mastery_hook(crate::hooks::fire_mage::mastery)
1014 .resource(
1015 "mana",
1016 100_000.0,
1017 params
1018 .game_data
1019 .power_regen_for_max(0, 100_000.0)
1020 .ok_or_else(|| {
1021 wowlab_engine_ports::EngineError::spec_construction(
1022 "missing power-type power_regen_for_max for type_id 0",
1023 )
1024 })?,
1025 )
1026 .resource_type_id(0)
1027 .resource_start(100_000.0)
1028 .precombat_aura(AURA_SPELLFIRE_SPHERE)
1029 .aura("heating_up", AURA::HEATING_UP, |a| aura_heating_up(a, ¶ms.game_data))
1030 .aura("hot_streak", AURA::HOT_STREAK, |a| aura_hot_streak(a, ¶ms.game_data))
1031 .aura("combustion", AURA::COMBUSTION, |a| aura_combustion(a, ¶ms.game_data))
1032 .aura("ignite", AURA::IGNITE, |a| aura_ignite(a, ¶ms.game_data))
1033 .aura(
1034 "controlled_destruction",
1035 AURA::CONTROLLED_DESTRUCTION,
1036 |a| aura_controlled_destruction(a, ¶ms.game_data),
1037 )
1038 .aura(
1039 "hyperthermia",
1040 AURA::HYPERTHERMIA,
1041 |a| aura_hyperthermia(a, ¶ms.game_data),
1042 )
1043 .aura(
1044 "hyperthermia_damage",
1045 AURA::HYPERTHERMIA_DAMAGE,
1046 |a| aura_hyperthermia_damage(a, ¶ms.game_data),
1047 )
1048 .aura(
1049 "pyrotechnics",
1050 AURA::PYROTECHNICS,
1051 |a| aura_pyrotechnics(a, ¶ms.game_data),
1052 )
1053 .aura("pyroclasm", AURA::PYROCLASM, |a| aura_pyroclasm(a, ¶ms.game_data))
1054 .aura(
1055 "feel_the_burn",
1056 AURA::FEEL_THE_BURN,
1057 |a| aura_feel_the_burn(a, ¶ms.game_data),
1058 )
1059 .aura(
1060 "fevered_incantation",
1061 AURA::FEVERED_INCANTATION,
1062 |a| aura_fevered_incantation(a, ¶ms.game_data),
1063 )
1064 .aura("fired_up", AURA::FIRED_UP, |a| aura_fired_up(a, ¶ms.game_data))
1065 .aura(
1066 "heat_shimmer",
1067 AURA::HEAT_SHIMMER,
1068 |a| aura_heat_shimmer(a, ¶ms.game_data),
1069 )
1070 .aura(
1071 "frostfire_empowerment",
1072 AURA::FROSTFIRE_EMPOWERMENT,
1073 |a| aura_frostfire_empowerment(a, ¶ms.game_data),
1074 )
1075 .aura(
1076 "arcane_intellect_highlight",
1077 AURA::ARCANE_INTELLECT_HIGHLIGHT,
1078 |a| aura_arcane_intellect_highlight(a, ¶ms.game_data),
1079 )
1080 .aura(
1081 "spellfire_sphere",
1082 AURA::SPELLFIRE_SPHERE,
1083 |a| aura_spellfire_sphere(a, ¶ms.game_data),
1084 )
1085 .aura(
1086 "fiery_rush_effect",
1087 AURA::FIERY_RUSH_EFFECT,
1088 |a| aura_fiery_rush_effect(a, ¶ms.game_data),
1089 )
1090 .spell("fireball", SPELL::FIREBALL, |s| spell_fireball(s, ¶ms.game_data))
1091 .spell("pyroblast", SPELL::PYROBLAST, |s| spell_pyroblast(s, ¶ms.game_data))
1092 .spell(
1093 "fire_blast",
1094 SPELL::FIRE_BLAST,
1095 |s| spell_fire_blast(s, ¶ms.game_data),
1096 )
1097 .spell(
1098 "flamestrike",
1099 SPELL::FLAMESTRIKE,
1100 |s| spell_flamestrike(s, ¶ms.game_data),
1101 )
1102 .spell(
1103 "combustion",
1104 SPELL::COMBUSTION,
1105 |s| spell_combustion(s, ¶ms.game_data),
1106 )
1107 .spell("meteor", SPELL::METEOR, |s| spell_meteor(s, ¶ms.game_data))
1108 .spell("scorch", SPELL::SCORCH, |s| spell_scorch(s, ¶ms.game_data))
1109 .spell(
1110 "frostfire_bolt",
1111 SPELL::FROSTFIRE_BOLT,
1112 |s| spell_frostfire_bolt(s, ¶ms.game_data),
1113 )
1114 .spell(
1115 "arcane_intellect",
1116 SPELL::ARCANE_INTELLECT,
1117 |s| spell_arcane_intellect(s, ¶ms.game_data),
1118 )
1119 .spell("ignite", SPELL::IGNITE, |s| spell_ignite(s, ¶ms.game_data))
1120 .spell(
1121 "intensifying_flame",
1122 SPELL::INTENSIFYING_FLAME,
1123 |s| spell_intensifying_flame(s, ¶ms.game_data),
1124 )
1125 .spell("burnout", SPELL::BURNOUT, |s| spell_burnout(s, ¶ms.game_data))
1126 .game_data(params.game_data.clone())
1127 .talent_spell_ids(TALENTS)
1128 .talent_selections(params.talent_selections)
1129 .talent_gated_aura_effect(TALENT::FIERY_RUSH, AURA_COMBUSTION, 383_637, 1)
1130 .set_bonus_auras(params.set_bonus_auras)
1131 .encounter(params.encounter.clone());
1132 let builder = crate::generated::items::register_equipped(
1133 builder,
1134 ¶ms.game_data,
1135 params.equipped_items,
1136 )?;
1137
1138 builder.into_draft()
1139}
1140fn new_handler(
1141 params: wowlab_engine_ports::HandlerParams<'_>,
1142) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1143 let handler = crate::composition::compose_handler(
1144 build_combat_system_draft,
1145 ¶ms,
1146 crate::hooks::fire_mage::FireHandler::new,
1147 )?;
1148
1149 Ok(Box::new(handler))
1150}
1151static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1152 primary_resource: ResourceType::Mana,
1153 secondary_resource: None,
1154 spell_ids: DECLARED_SPELL_IDS,
1155 aura_ids: DECLARED_AURA_IDS,
1156 server_proc_entries: &[],
1157 talents: TALENTS,
1158 rotation_field_schema: &[],
1159 metrics_plugin_id: None,
1160 hero_talent_trees: &[
1161 HeroTalentTreeDesc {
1162 name: "Frostfire",
1163 spells: HERO_TREE_FROSTFIRE_SPELLS,
1164 auras: HERO_TREE_FROSTFIRE_AURAS,
1165 },
1166 HeroTalentTreeDesc {
1167 name: "Sunfury",
1168 spells: HERO_TREE_SUNFURY_SPELLS,
1169 auras: HERO_TREE_SUNFURY_AURAS,
1170 },
1171 ],
1172 reported_spells: REPORTED_SPELLS,
1173 masked_passive_effects: &[],
1174 passive_effect_overrides: &[],
1175};
1176pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1177 spec_id: SpecId::Fire,
1178 display_name: "Fire Mage",
1179 metadata: DECLARED_METADATA,
1180 handler_factory: new_handler,
1181};
1182wowlab_engine_combat::smoke_test!(build_combat_system_draft);