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 ARCANE_BLAST: u32 = 30451;
16 pub(crate) const ARCANE_BARRAGE: u32 = 44425;
18 pub(crate) const ARCANE_MISSILES: u32 = 5143;
20 pub(crate) const ARCANE_MISSILES_DAMAGE: u32 = 7268;
22 pub(crate) const ARCANE_SURGE: u32 = 365_350;
24 pub(crate) const ARCANE_ORB: u32 = 153_626;
26 pub(crate) const ARCANE_ORB_BOLT: u32 = 153_640;
28 pub(crate) const ARCANE_SPLINTER: u32 = 443_763;
30 pub(crate) const TOUCH_OF_THE_MAGI: u32 = 321_507;
32 pub(crate) const TOUCH_OF_THE_MAGI_EXPLOSION: u32 = 210_833;
34 pub(crate) const TOUCH_OF_THE_ARCHMAGE: u32 = 1_258_134;
36 pub(crate) const EVOCATION: u32 = 12051;
38 pub(crate) const PRESENCE_OF_MIND: u32 = 205_025;
40 pub(crate) const ARCANE_EXPLOSION: u32 = 1449;
42 pub(crate) const ARCANE_PULSE: u32 = 1_241_462;
44 pub(crate) const PRISMATIC_BOLT: u32 = 1_295_924;
46 pub(crate) const ARCANE_INTELLECT: u32 = 1459;
48 pub(crate) const ARCANE_ASSAULT: u32 = 225_119;
50}
51pub(crate) mod AURA {
52 pub(crate) const ARCANE_CHARGE: u32 = 36032;
54 pub(crate) const ARCANE_SURGE: u32 = 365_362;
56 pub(crate) const CLEARCASTING: u32 = 263_725;
58 pub(crate) const ENLIGHTENED: u32 = 1_217_242;
60 pub(crate) const ARCANE_SALVO: u32 = 1_242_974;
62 pub(crate) const INTUITION: u32 = 1_223_797;
64 pub(crate) const PRESENCE_OF_MIND: u32 = 205_025;
66 pub(crate) const EVOCATION: u32 = 12051;
68 pub(crate) const TOUCH_OF_THE_MAGI: u32 = 210_824;
70 pub(crate) const NETHER_PRECISION: u32 = 383_783;
72 pub(crate) const OVERPOWERED_MISSILES: u32 = 1_277_009;
74 pub(crate) const ARCANE_INTELLECT_HIGHLIGHT: u32 = 1459;
76 pub(crate) const HIGH_VOLTAGE: u32 = 461_524;
78 pub(crate) const AMPLIFICATION: u32 = 236_628;
80 pub(crate) const SPELLFIRE_SALVO: u32 = 449_322;
82 pub(crate) const CUMULATIVE_POWER: u32 = 1_296_930;
84 pub(crate) const PRISMATIC_BOLT: u32 = 1_295_942;
86}
87pub(crate) mod TALENT {
88 pub(crate) const AEGWYNNS_TECHNIQUE: u32 = 1_243_507;
90 pub(crate) const AMPLIFICATION: u32 = 236_628;
92 pub(crate) const ARCANE_ECHO: u32 = 342_231;
94 pub(crate) const ARCANE_FAMILIAR: u32 = 205_022;
96 pub(crate) const ARCANE_MISSILES: u32 = 5143;
98 pub(crate) const ARCANE_ORB: u32 = 153_626;
100 pub(crate) const ARCANE_PULSE: u32 = 1_241_462;
102 pub(crate) const ARCANE_SALVO: u32 = 1_242_974;
104 pub(crate) const ARCANE_SALVO_DRIVER: u32 = 384_452;
106 pub(crate) const ARCANE_SURGE: u32 = 365_350;
108 pub(crate) const ARCING_CLEAVE: u32 = 231_564;
110 pub(crate) const ATTUNED_FAMILIAR: u32 = 1_261_106;
112 pub(crate) const AUGURY_ABOUNDS: u32 = 1_280_165;
114 pub(crate) const CHARGED_MISSILES: u32 = 461_251;
116 pub(crate) const CHARGED_ORB: u32 = 384_651;
118 pub(crate) const ENERGIZED_FAMILIAR: u32 = 452_997;
120 pub(crate) const ENLIGHTENED: u32 = 321_387;
122 pub(crate) const EUREKA: u32 = 452_198;
124 pub(crate) const EVOCATION: u32 = 12051;
126 pub(crate) const EXPANDED_MIND: u32 = 451_548;
128 pub(crate) const EXPANDED_MIND_DRIVER: u32 = 1_243_557;
130 pub(crate) const FOCUSING_CRYSTAL: u32 = 452_143;
132 pub(crate) const FORCE_OF_WILL_DRIVER: u32 = 444_719;
134 pub(crate) const HIGH_VOLTAGE: u32 = 461_248;
136 pub(crate) const ILLUMINATED_THOUGHTS: u32 = 384_060;
138 pub(crate) const IMPROVED_CLEARCASTING: u32 = 321_420;
140 pub(crate) const INFUSED_SPLINTERS: u32 = 1_261_080;
142 pub(crate) const INTUITION: u32 = 1_223_798;
144 pub(crate) const MANA_ADEPT: u32 = 321_526;
146 pub(crate) const MANA_BOMB: u32 = 449_906;
148 pub(crate) const MANA_BOMB_DRIVER: u32 = 457_521;
150 pub(crate) const ORB_BARRAGE: u32 = 384_858;
152 pub(crate) const ORB_MASTERY: u32 = 452_197;
154 pub(crate) const ORB_MASTERY_DRIVER: u32 = 1_243_435;
156 pub(crate) const OVERPOWERED_MISSILES: u32 = 451_728;
158 pub(crate) const OVERPOWERED_MISSILES_DRIVER: u32 = 1_244_329;
160 pub(crate) const PRESENCE_OF_MIND: u32 = 205_025;
162 pub(crate) const PRISMATIC_BOLT_1: u32 = 1_295_923;
164 pub(crate) const PRISMATIC_BOLT_2: u32 = 1_295_944;
166 pub(crate) const PRISMATIC_BOLT_3: u32 = 1_295_946;
168 pub(crate) const PRODIGIOUS_SAVANT: u32 = 384_612;
170 pub(crate) const RESONANCE: u32 = 205_028;
172 pub(crate) const REVERBERATE: u32 = 281_482;
174 pub(crate) const SLIPSTREAM: u32 = 236_457;
176 pub(crate) const SPELLFROST_TEACHINGS: u32 = 444_986;
178 pub(crate) const SPLINTERING_ORBS: u32 = 444_256;
180 pub(crate) const SPLINTERING_SORCERY: u32 = 443_739;
182 pub(crate) const SPLINTERSTORM: u32 = 443_783;
184 pub(crate) const TOUCH_OF_THE_ARCHMAGE: u32 = 1_257_950;
186 pub(crate) const TOUCH_OF_THE_MAGI: u32 = 321_507;
188}
189pub(crate) mod SET_BONUS {
190 pub(crate) const MID2_ARCANE_2PC: u32 = 1_296_581;
192 pub(crate) const MID2_ARCANE_4PC: u32 = 1_296_582;
194}
195pub(crate) mod REPORTED_SPELL {
196 pub(crate) const ARCANE_FAMILIAR: u32 = 210_126;
198 pub(crate) const ARCANE_MISSILES: u32 = 7268;
200 pub(crate) const PRISMATIC_BOLT: u32 = 1_295_924;
202 pub(crate) const PRISMATIC_BOLT_AOE: u32 = 1_295_939;
204}
205pub(crate) mod HERO {
206 pub(crate) mod SPELLSLINGER {
207 pub(crate) mod SPELL {
208 pub(crate) const CONTROLLED_INSTINCTS: u32 = 444_720;
210 pub(crate) const SPLINTER: u32 = 443_763;
212 }
213 pub(crate) mod AURA {
214 pub(crate) const SPLINTERSTORM: u32 = 443_783;
216 }
217 }
218 pub(crate) mod SUNFURY {
219 pub(crate) mod SPELL {
220 pub(crate) const METEORITE: u32 = 449_559;
222 pub(crate) const METEORITE_IMPACT: u32 = 449_569;
224 }
225 pub(crate) mod AURA {
226 pub(crate) const ARCANE_SOUL: u32 = 451_038;
228 pub(crate) const LESSER_TIME_WARP: u32 = 1_260_277;
230 pub(crate) const MANA_CASCADE: u32 = 449_322;
232 pub(crate) const SPELLFIRE_SPHERE: u32 = 448_604;
234 }
235 }
236}
237static HERO_TREE_SPELLSLINGER_SPELLS: &[(&str, u32)] = &[
238 ("CONTROLLED_INSTINCTS", 444_720),
239 ("SPLINTER", 443_763),
240];
241static HERO_TREE_SPELLSLINGER_AURAS: &[(&str, u32)] = &[("SPLINTERSTORM", 443_783)];
242static HERO_TREE_SUNFURY_SPELLS: &[(&str, u32)] = &[
243 ("METEORITE", 449_559),
244 ("METEORITE_IMPACT", 449_569),
245];
246static HERO_TREE_SUNFURY_AURAS: &[(&str, u32)] = &[
247 ("ARCANE_SOUL", 451_038),
248 ("LESSER_TIME_WARP", 1_260_277),
249 ("MANA_CASCADE", 449_322),
250 ("SPELLFIRE_SPHERE", 448_604),
251];
252pub(crate) mod DAMAGE_SPELL {
253 pub(crate) const ARCANE_BLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_30451;
254 pub(crate) const ARCANE_BARRAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_44425;
255 pub(crate) const ARCANE_MISSILES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_5143;
256 pub(crate) const ARCANE_MISSILES_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_7268;
257 pub(crate) const ARCANE_SURGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_365350;
258 pub(crate) const ARCANE_ORB: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_153626;
259 pub(crate) const ARCANE_ORB_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_153640;
260 pub(crate) const ARCANE_SPLINTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_443763;
261 pub(crate) const TOUCH_OF_THE_MAGI: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_321507;
262 pub(crate) const TOUCH_OF_THE_MAGI_EXPLOSION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_210833;
263 pub(crate) const TOUCH_OF_THE_ARCHMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1258134;
264 pub(crate) const EVOCATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_12051;
265 pub(crate) const PRESENCE_OF_MIND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_205025;
266 pub(crate) const ARCANE_EXPLOSION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1449;
267 pub(crate) const ARCANE_PULSE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1241462;
268 pub(crate) const PRISMATIC_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1295924;
269 pub(crate) const ARCANE_INTELLECT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1459;
270 pub(crate) const ARCANE_ASSAULT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_225119;
271 pub(crate) const CONTROLLED_INSTINCTS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_444720;
272 pub(crate) const SPLINTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_443763;
273 pub(crate) const METEORITE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_449559;
274 pub(crate) const METEORITE_IMPACT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_449569;
275}
276pub(crate) mod DAMAGE_AURA {
277 pub(crate) const ARCANE_CHARGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_36032;
278 pub(crate) const ARCANE_SURGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_365362;
279 pub(crate) const CLEARCASTING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_263725;
280 pub(crate) const ENLIGHTENED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1217242;
281 pub(crate) const ARCANE_SALVO: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1242974;
282 pub(crate) const INTUITION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1223797;
283 pub(crate) const PRESENCE_OF_MIND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_205025;
284 pub(crate) const EVOCATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_12051;
285 pub(crate) const TOUCH_OF_THE_MAGI: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_210824;
286 pub(crate) const NETHER_PRECISION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_383783;
287 pub(crate) const OVERPOWERED_MISSILES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1277009;
288 pub(crate) const ARCANE_INTELLECT_HIGHLIGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1459;
289 pub(crate) const HIGH_VOLTAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_461524;
290 pub(crate) const AMPLIFICATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_236628;
291 pub(crate) const SPELLFIRE_SALVO: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_449322;
292 pub(crate) const CUMULATIVE_POWER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1296930;
293 pub(crate) const PRISMATIC_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1295942;
294}
295pub(crate) mod DAMAGE_TALENT {
296 pub(crate) const AEGWYNNS_TECHNIQUE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1243507;
297 pub(crate) const AMPLIFICATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_236628;
298 pub(crate) const ARCANE_ECHO: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_342231;
299 pub(crate) const ARCANE_FAMILIAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_205022;
300 pub(crate) const ARCANE_MISSILES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_5143;
301 pub(crate) const ARCANE_ORB: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_153626;
302 pub(crate) const ARCANE_PULSE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1241462;
303 pub(crate) const ARCANE_SALVO: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1242974;
304 pub(crate) const ARCANE_SALVO_DRIVER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_384452;
305 pub(crate) const ARCANE_SURGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_365350;
306 pub(crate) const ARCING_CLEAVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_231564;
307 pub(crate) const ATTUNED_FAMILIAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1261106;
308 pub(crate) const AUGURY_ABOUNDS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1280165;
309 pub(crate) const CHARGED_MISSILES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_461251;
310 pub(crate) const CHARGED_ORB: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_384651;
311 pub(crate) const ENERGIZED_FAMILIAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_452997;
312 pub(crate) const ENLIGHTENED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_321387;
313 pub(crate) const EUREKA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_452198;
314 pub(crate) const EVOCATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_12051;
315 pub(crate) const EXPANDED_MIND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_451548;
316 pub(crate) const EXPANDED_MIND_DRIVER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1243557;
317 pub(crate) const FOCUSING_CRYSTAL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_452143;
318 pub(crate) const FORCE_OF_WILL_DRIVER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_444719;
319 pub(crate) const HIGH_VOLTAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_461248;
320 pub(crate) const ILLUMINATED_THOUGHTS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_384060;
321 pub(crate) const IMPROVED_CLEARCASTING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_321420;
322 pub(crate) const INFUSED_SPLINTERS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1261080;
323 pub(crate) const INTUITION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1223798;
324 pub(crate) const MANA_ADEPT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_321526;
325 pub(crate) const MANA_BOMB: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_449906;
326 pub(crate) const MANA_BOMB_DRIVER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_457521;
327 pub(crate) const ORB_BARRAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_384858;
328 pub(crate) const ORB_MASTERY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_452197;
329 pub(crate) const ORB_MASTERY_DRIVER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1243435;
330 pub(crate) const OVERPOWERED_MISSILES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_451728;
331 pub(crate) const OVERPOWERED_MISSILES_DRIVER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1244329;
332 pub(crate) const PRESENCE_OF_MIND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_205025;
333 pub(crate) const PRISMATIC_BOLT_1: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1295923;
334 pub(crate) const PRISMATIC_BOLT_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1295944;
335 pub(crate) const PRISMATIC_BOLT_3: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1295946;
336 pub(crate) const PRODIGIOUS_SAVANT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_384612;
337 pub(crate) const RESONANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_205028;
338 pub(crate) const REVERBERATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_281482;
339 pub(crate) const SLIPSTREAM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_236457;
340 pub(crate) const SPELLFROST_TEACHINGS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_444986;
341 pub(crate) const SPLINTERING_ORBS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_444256;
342 pub(crate) const SPLINTERING_SORCERY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_443739;
343 pub(crate) const SPLINTERSTORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_443783;
344 pub(crate) const TOUCH_OF_THE_ARCHMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1257950;
345 pub(crate) const TOUCH_OF_THE_MAGI: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_321507;
346}
347pub(crate) mod DAMAGE_REPORTED {
348 pub(crate) const ARCANE_FAMILIAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_210126;
349 pub(crate) const ARCANE_MISSILES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_7268;
350 pub(crate) const PRISMATIC_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1295924;
351 pub(crate) const PRISMATIC_BOLT_AOE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ACTION::SPELL_1295939;
352}
353pub(crate) mod DAMAGE_EFFECT {
354 pub(crate) const MID2_ARCANE_2PC_EXTRA_WAVES: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_1296581_EFFECT_1;
355 pub(crate) const AMPLIFICATION_WAVES: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_236628_EFFECT_2;
356 pub(crate) const ARCANE_ASSAULT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_225119_EFFECT_1;
357 pub(crate) const ARCANE_BARRAGE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_44425_EFFECT_1;
358 pub(crate) const ARCANE_BLAST_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_30451_EFFECT_1;
359 pub(crate) const ARCANE_CHARGE_BARRAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_36032_EFFECT_2;
360 pub(crate) const ARCANE_CHARGE_BLAST: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_36032_EFFECT_1;
361 pub(crate) const ARCANE_FAMILIAR_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_210126_EFFECT_1;
362 pub(crate) const ARCANE_MISSILES_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_7268_EFFECT_1;
363 pub(crate) const ARCANE_ORB_BOLT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_153640_EFFECT_1;
364 pub(crate) const ARCANE_ORB_TARGETS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_153626_EFFECT_1;
365 pub(crate) const ARCANE_PULSE_CHARGES_PER_TARGET: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_1295977_EFFECT_1;
366 pub(crate) const ARCANE_PULSE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_1241462_EFFECT_1;
367 pub(crate) const ARCANE_PULSE_REDUCED_TARGETS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_1241462_EFFECT_2;
368 pub(crate) const ARCANE_SALVO_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_1242974_EFFECT_1;
369 pub(crate) const ARCANE_SPLINTER_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_443763_EFFECT_1;
370 pub(crate) const ARCANE_SURGE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_365350_EFFECT_1;
371 pub(crate) const PRISMATIC_BOLT_AOE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_1295939_EFFECT_2;
372 pub(crate) const PRISMATIC_BOLT_AOE_TARGETS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_1295939_EFFECT_2;
373 pub(crate) const PRISMATIC_BOLT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_1295924_EFFECT_1;
374 pub(crate) const PRISMATIC_BOLT_CHARGES: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_1295924_EFFECT_3;
375 pub(crate) const PRISMATIC_BOLT_CLEARCASTING_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_1295944_EFFECT_1;
376 pub(crate) const PRISMATIC_BOLT_PROC_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_1295923_EFFECT_1;
377 pub(crate) const PRISMATIC_BOLT_PROC_CHANCE_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_1295946_EFFECT_2;
378 pub(crate) const PRISMATIC_BOLT_REDUCED_TARGETS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_1295924_EFFECT_4;
379 pub(crate) const ATTUNED_FAMILIAR_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_1261106_EFFECT_1;
380 pub(crate) const CHARGED_MISSILES_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_461251_EFFECT_1;
381 pub(crate) const CLEARCASTING_PROC: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_79684_EFFECT_2;
382 pub(crate) const ENERGIZED_FAMILIAR_ASSAULTS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_452997_EFFECT_1;
383 pub(crate) const ENERGIZED_FAMILIAR_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_452997_EFFECT_2;
384 pub(crate) const ENERGIZED_FAMILIAR_GAIN: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_454020_EFFECT_1;
385 pub(crate) const ENLIGHTENED_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_321387_EFFECT_2;
386 pub(crate) const ENLIGHTENED_REGEN: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_321387_EFFECT_3;
387 pub(crate) const FORCE_OF_WILL_BARRAGE_DIVISOR: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_444719_EFFECT_1;
388 pub(crate) const ILLUMINATED_THOUGHTS_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_384060_EFFECT_1;
389 pub(crate) const INTUITION_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_1223797_EFFECT_1;
390 pub(crate) const MANA_ADEPT_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_321526_EFFECT_1;
391 pub(crate) const ORB_MASTERY_COUNT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_1243435_EFFECT_1;
392 pub(crate) const ORB_MASTERY_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_1243435_EFFECT_2;
393 pub(crate) const SAVANT_BARRAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_190740_EFFECT_3;
394 pub(crate) const SAVANT_BASE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_190740_EFFECT_1;
395 pub(crate) const SAVANT_BLAST: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_190740_EFFECT_2;
396 pub(crate) const SAVANT_MASTERY_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_190740_EFFECT_5;
397 pub(crate) const SAVANT_SPLINTER_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::EFFECT::SPELL_190740_EFFECT_6;
398}
399pub(crate) const AURA_ARCANE_CHARGE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::AURA_ARCANE_CHARGE
400 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
401pub(crate) const AURA_ARCANE_SURGE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::AURA_ARCANE_SURGE
402 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
403pub(crate) const AURA_CLEARCASTING: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::AURA_CLEARCASTING
404 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
405pub(crate) const AURA_ENLIGHTENED: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::AURA_ENLIGHTENED
406 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
407pub(crate) const AURA_ARCANE_SALVO: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::AURA_ARCANE_SALVO
408 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
409pub(crate) const AURA_INTUITION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::AURA_INTUITION
410 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
411pub(crate) const AURA_PRESENCE_OF_MIND: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::AURA_PRESENCE_OF_MIND
412 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
413pub(crate) const AURA_EVOCATION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::AURA_EVOCATION
414 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
415pub(crate) const AURA_TOUCH_OF_THE_MAGI: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::AURA_TOUCH_OF_THE_MAGI
416 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
417pub(crate) const AURA_NETHER_PRECISION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::AURA_NETHER_PRECISION
418 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
419pub(crate) const AURA_OVERPOWERED_MISSILES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::AURA_OVERPOWERED_MISSILES
420 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
421pub(crate) const AURA_ARCANE_INTELLECT_HIGHLIGHT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::AURA_ARCANE_INTELLECT_HIGHLIGHT
422 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
423pub(crate) const AURA_HIGH_VOLTAGE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::AURA_HIGH_VOLTAGE
424 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
425pub(crate) const AURA_AMPLIFICATION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::AURA_AMPLIFICATION
426 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
427pub(crate) const AURA_SPELLFIRE_SALVO: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::AURA_SPELLFIRE_SALVO
428 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
429pub(crate) const AURA_CUMULATIVE_POWER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::AURA_CUMULATIVE_POWER
430 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
431pub(crate) const AURA_PRISMATIC_BOLT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::AURA_PRISMATIC_BOLT
432 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
433pub(crate) const AURA_COUNT: usize = 17;
434const _: () = assert!(
435 AURA_COUNT == 17, "AURA index ABI: count changed -- update positional hook consumers"
436);
437pub(crate) const SPELL_ARCANE_BLAST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::SPELL_ARCANE_BLAST
438 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
439pub(crate) const SPELL_ARCANE_BARRAGE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::SPELL_ARCANE_BARRAGE
440 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
441pub(crate) const SPELL_ARCANE_MISSILES: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::SPELL_ARCANE_MISSILES
442 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
443pub(crate) const SPELL_ARCANE_MISSILES_DAMAGE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::SPELL_ARCANE_MISSILES_DAMAGE
444 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
445pub(crate) const SPELL_ARCANE_SURGE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::SPELL_ARCANE_SURGE
446 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
447pub(crate) const SPELL_ARCANE_ORB: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::SPELL_ARCANE_ORB
448 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
449pub(crate) const SPELL_ARCANE_ORB_BOLT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::SPELL_ARCANE_ORB_BOLT
450 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
451pub(crate) const SPELL_ARCANE_SPLINTER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::SPELL_ARCANE_SPLINTER
452 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
453pub(crate) const SPELL_TOUCH_OF_THE_MAGI: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::SPELL_TOUCH_OF_THE_MAGI
454 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
455pub(crate) const SPELL_TOUCH_OF_THE_MAGI_EXPLOSION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::SPELL_TOUCH_OF_THE_MAGI_EXPLOSION
456 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
457pub(crate) const SPELL_TOUCH_OF_THE_ARCHMAGE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::SPELL_TOUCH_OF_THE_ARCHMAGE
458 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
459pub(crate) const SPELL_EVOCATION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::SPELL_EVOCATION
460 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
461pub(crate) const SPELL_PRESENCE_OF_MIND: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::SPELL_PRESENCE_OF_MIND
462 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
463pub(crate) const SPELL_ARCANE_EXPLOSION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::SPELL_ARCANE_EXPLOSION
464 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
465pub(crate) const SPELL_ARCANE_PULSE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::SPELL_ARCANE_PULSE
466 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
467pub(crate) const SPELL_PRISMATIC_BOLT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::SPELL_PRISMATIC_BOLT
468 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
469pub(crate) const SPELL_ARCANE_INTELLECT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::SPELL_ARCANE_INTELLECT
470 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
471pub(crate) const SPELL_ARCANE_ASSAULT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arcane_mage::SPELL_ARCANE_ASSAULT
472 .bind(wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF);
473pub(crate) const SPELL_COUNT: usize = 18;
474const _: () = assert!(
475 SPELL_COUNT == 18,
476 "SPELL index ABI: count changed -- update positional hook consumers"
477);
478pub(crate) mod EFFECT {
479 pub(crate) const MID2_ARCANE_2PC_EXTRA_WAVES: (u32, u8) = (1_296_581, 1);
481 pub(crate) const AMPLIFICATION_WAVES: (u32, u8) = (236_628, 2);
483 pub(crate) const ARCANE_ASSAULT_DAMAGE: (u32, u8) = (225_119, 1);
485 pub(crate) const ARCANE_BARRAGE_DAMAGE: (u32, u8) = (44425, 1);
487 pub(crate) const ARCANE_BLAST_DAMAGE: (u32, u8) = (30451, 1);
489 pub(crate) const ARCANE_CHARGE_BARRAGE: (u32, u8) = (36032, 2);
491 pub(crate) const ARCANE_CHARGE_BLAST: (u32, u8) = (36032, 1);
493 pub(crate) const ARCANE_FAMILIAR_BONUS: (u32, u8) = (210_126, 1);
495 pub(crate) const ARCANE_MISSILES_DAMAGE: (u32, u8) = (7268, 1);
497 pub(crate) const ARCANE_ORB_BOLT_DAMAGE: (u32, u8) = (153_640, 1);
499 pub(crate) const ARCANE_ORB_TARGETS: (u32, u8) = (153_626, 1);
501 pub(crate) const ARCANE_PULSE_CHARGES_PER_TARGET: (u32, u8) = (1_295_977, 1);
503 pub(crate) const ARCANE_PULSE_DAMAGE: (u32, u8) = (1_241_462, 1);
505 pub(crate) const ARCANE_PULSE_REDUCED_TARGETS: (u32, u8) = (1_241_462, 2);
507 pub(crate) const ARCANE_SALVO_DAMAGE: (u32, u8) = (1_242_974, 1);
509 pub(crate) const ARCANE_SPLINTER_DAMAGE: (u32, u8) = (443_763, 1);
511 pub(crate) const ARCANE_SURGE_DAMAGE: (u32, u8) = (365_350, 1);
513 pub(crate) const PRISMATIC_BOLT_AOE_DAMAGE: (u32, u8) = (1_295_939, 2);
515 pub(crate) const PRISMATIC_BOLT_AOE_TARGETS: (u32, u8) = (1_295_939, 2);
517 pub(crate) const PRISMATIC_BOLT_DAMAGE: (u32, u8) = (1_295_924, 1);
519 pub(crate) const PRISMATIC_BOLT_CHARGES: (u32, u8) = (1_295_924, 3);
521 pub(crate) const PRISMATIC_BOLT_CLEARCASTING_CHANCE: (u32, u8) = (1_295_944, 1);
523 pub(crate) const PRISMATIC_BOLT_PROC_CHANCE: (u32, u8) = (1_295_923, 1);
525 pub(crate) const PRISMATIC_BOLT_PROC_CHANCE_BONUS: (u32, u8) = (1_295_946, 2);
527 pub(crate) const PRISMATIC_BOLT_REDUCED_TARGETS: (u32, u8) = (1_295_924, 4);
529 pub(crate) const ATTUNED_FAMILIAR_CHANCE: (u32, u8) = (1_261_106, 1);
531 pub(crate) const CHARGED_MISSILES_DAMAGE: (u32, u8) = (461_251, 1);
533 pub(crate) const CLEARCASTING_PROC: (u32, u8) = (79684, 2);
535 pub(crate) const ENERGIZED_FAMILIAR_ASSAULTS: (u32, u8) = (452_997, 1);
537 pub(crate) const ENERGIZED_FAMILIAR_CHANCE: (u32, u8) = (452_997, 2);
539 pub(crate) const ENERGIZED_FAMILIAR_GAIN: (u32, u8) = (454_020, 1);
541 pub(crate) const ENLIGHTENED_DAMAGE: (u32, u8) = (321_387, 2);
543 pub(crate) const ENLIGHTENED_REGEN: (u32, u8) = (321_387, 3);
545 pub(crate) const FORCE_OF_WILL_BARRAGE_DIVISOR: (u32, u8) = (444_719, 1);
547 pub(crate) const ILLUMINATED_THOUGHTS_CHANCE: (u32, u8) = (384_060, 1);
549 pub(crate) const INTUITION_DAMAGE: (u32, u8) = (1_223_797, 1);
551 pub(crate) const MANA_ADEPT_BONUS: (u32, u8) = (321_526, 1);
553 pub(crate) const ORB_MASTERY_COUNT: (u32, u8) = (1_243_435, 1);
555 pub(crate) const ORB_MASTERY_DAMAGE: (u32, u8) = (1_243_435, 2);
557 pub(crate) const SAVANT_BARRAGE: (u32, u8) = (190_740, 3);
559 pub(crate) const SAVANT_BASE: (u32, u8) = (190_740, 1);
561 pub(crate) const SAVANT_BLAST: (u32, u8) = (190_740, 2);
563 pub(crate) const SAVANT_MASTERY_DAMAGE: (u32, u8) = (190_740, 5);
565 pub(crate) const SAVANT_SPLINTER_DAMAGE: (u32, u8) = (190_740, 6);
567}
568static REPORTED_SPELLS: &[(&str, u32)] = &[
569 ("arcane_familiar", 210_126),
570 ("arcane_missiles", 7268),
571 ("prismatic_bolt", 1_295_924),
572 ("prismatic_bolt_aoe", 1_295_939),
573];
574static DECLARED_SPELL_IDS: &[u32] = &[
575 30451, 44425, 5143, 7268, 365_350, 153_626, 153_640, 443_763, 321_507, 210_833,
576 1_258_134, 12051, 205_025, 1449, 1_241_462, 1_295_924, 1459, 225_119, 36032, 365_362,
577 263_725, 1_217_242, 1_242_974, 1_223_797, 210_824, 383_783, 1_277_009, 461_524,
578 236_628, 449_322, 1_296_930, 1_295_942, 1_243_507, 342_231, 205_022, 384_452,
579 231_564, 1_261_106, 1_280_165, 461_251, 384_651, 452_997, 321_387, 452_198, 451_548,
580 1_243_557, 452_143, 444_719, 461_248, 384_060, 321_420, 1_261_080, 1_223_798,
581 321_526, 449_906, 457_521, 384_858, 452_197, 1_243_435, 451_728, 1_244_329,
582 1_295_923, 1_295_944, 1_295_946, 384_612, 205_028, 281_482, 236_457, 444_986,
583 444_256, 443_739, 443_783, 1_257_950, 79684, 190_740, 210_126, 454_020, 1_295_939,
584 1_295_977, 1_296_581, 444_720, 449_559, 449_569, 451_038, 1_260_277, 448_604,
585];
586static DECLARED_AURA_IDS: &[u32] = &[
587 36032, 365_362, 263_725, 1_217_242, 1_242_974, 1_223_797, 205_025, 12051, 210_824,
588 383_783, 1_277_009, 1459, 461_524, 236_628, 449_322, 1_296_930, 1_295_942, 443_783,
589 451_038, 1_260_277, 449_322, 448_604,
590];
591static TALENTS: &[(&str, u32)] = &[
592 ("AEGWYNNS_TECHNIQUE", TALENT::AEGWYNNS_TECHNIQUE),
593 ("AMPLIFICATION", TALENT::AMPLIFICATION),
594 ("ARCANE_ECHO", TALENT::ARCANE_ECHO),
595 ("ARCANE_FAMILIAR", TALENT::ARCANE_FAMILIAR),
596 ("ARCANE_MISSILES", TALENT::ARCANE_MISSILES),
597 ("ARCANE_ORB", TALENT::ARCANE_ORB),
598 ("ARCANE_PULSE", TALENT::ARCANE_PULSE),
599 ("ARCANE_SALVO", TALENT::ARCANE_SALVO),
600 ("ARCANE_SALVO_DRIVER", TALENT::ARCANE_SALVO_DRIVER),
601 ("ARCANE_SURGE", TALENT::ARCANE_SURGE),
602 ("ARCING_CLEAVE", TALENT::ARCING_CLEAVE),
603 ("ATTUNED_FAMILIAR", TALENT::ATTUNED_FAMILIAR),
604 ("AUGURY_ABOUNDS", TALENT::AUGURY_ABOUNDS),
605 ("CHARGED_MISSILES", TALENT::CHARGED_MISSILES),
606 ("CHARGED_ORB", TALENT::CHARGED_ORB),
607 ("ENERGIZED_FAMILIAR", TALENT::ENERGIZED_FAMILIAR),
608 ("ENLIGHTENED", TALENT::ENLIGHTENED),
609 ("EUREKA", TALENT::EUREKA),
610 ("EVOCATION", TALENT::EVOCATION),
611 ("EXPANDED_MIND", TALENT::EXPANDED_MIND),
612 ("EXPANDED_MIND_DRIVER", TALENT::EXPANDED_MIND_DRIVER),
613 ("FOCUSING_CRYSTAL", TALENT::FOCUSING_CRYSTAL),
614 ("FORCE_OF_WILL_DRIVER", TALENT::FORCE_OF_WILL_DRIVER),
615 ("HIGH_VOLTAGE", TALENT::HIGH_VOLTAGE),
616 ("ILLUMINATED_THOUGHTS", TALENT::ILLUMINATED_THOUGHTS),
617 ("IMPROVED_CLEARCASTING", TALENT::IMPROVED_CLEARCASTING),
618 ("INFUSED_SPLINTERS", TALENT::INFUSED_SPLINTERS),
619 ("INTUITION", TALENT::INTUITION),
620 ("MANA_ADEPT", TALENT::MANA_ADEPT),
621 ("MANA_BOMB", TALENT::MANA_BOMB),
622 ("MANA_BOMB_DRIVER", TALENT::MANA_BOMB_DRIVER),
623 ("ORB_BARRAGE", TALENT::ORB_BARRAGE),
624 ("ORB_MASTERY", TALENT::ORB_MASTERY),
625 ("ORB_MASTERY_DRIVER", TALENT::ORB_MASTERY_DRIVER),
626 ("OVERPOWERED_MISSILES", TALENT::OVERPOWERED_MISSILES),
627 ("OVERPOWERED_MISSILES_DRIVER", TALENT::OVERPOWERED_MISSILES_DRIVER),
628 ("PRESENCE_OF_MIND", TALENT::PRESENCE_OF_MIND),
629 ("PRISMATIC_BOLT_1", TALENT::PRISMATIC_BOLT_1),
630 ("PRISMATIC_BOLT_2", TALENT::PRISMATIC_BOLT_2),
631 ("PRISMATIC_BOLT_3", TALENT::PRISMATIC_BOLT_3),
632 ("PRODIGIOUS_SAVANT", TALENT::PRODIGIOUS_SAVANT),
633 ("RESONANCE", TALENT::RESONANCE),
634 ("REVERBERATE", TALENT::REVERBERATE),
635 ("SLIPSTREAM", TALENT::SLIPSTREAM),
636 ("SPELLFROST_TEACHINGS", TALENT::SPELLFROST_TEACHINGS),
637 ("SPLINTERING_ORBS", TALENT::SPLINTERING_ORBS),
638 ("SPLINTERING_SORCERY", TALENT::SPLINTERING_SORCERY),
639 ("SPLINTERSTORM", TALENT::SPLINTERSTORM),
640 ("TOUCH_OF_THE_ARCHMAGE", TALENT::TOUCH_OF_THE_ARCHMAGE),
641 ("TOUCH_OF_THE_MAGI", TALENT::TOUCH_OF_THE_MAGI),
642];
643pub(crate) mod ARCANE_MAGE {
644 pub(crate) const ARCANE_BLAST_CASTS: u32 = 0;
645 pub(crate) const ARCANE_BARRAGE_CASTS: u32 = 1;
646 pub(crate) const ARCANE_MISSILES_CASTS: u32 = 2;
647 pub(crate) const ARCANE_SURGE_CASTS: u32 = 3;
648 pub(crate) const ARCANE_ORB_CASTS: u32 = 4;
649 pub(crate) const TOUCH_OF_THE_MAGI_CASTS: u32 = 5;
650 pub(crate) const ARCANE_SURGE_UPTIME_MS: u32 = 6;
651 pub(crate) const TOUCH_OF_THE_MAGI_UPTIME_MS: u32 = 7;
652}
653fn aura_arcane_charge(
654 a: AuraDefinitionDraft,
655 data: &ResolvedGameData,
656) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
657 Ok(
658 a
659 .on_player()
660 .apply_base_from_data(data, 36032)?
661 .max_stacks(
662 data
663 .require_aura_max_stacks(
664 wowlab_types::sim::SpellIdx::from_raw(36032),
665 )?,
666 ),
667 )
668}
669fn aura_arcane_surge(
670 a: AuraDefinitionDraft,
671 data: &ResolvedGameData,
672) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
673 Ok(
674 a
675 .on_player()
676 .apply_base_from_data(data, 365_362)?
677 .max_stacks(
678 data
679 .require_aura_max_stacks(
680 wowlab_types::sim::SpellIdx::from_raw(365_362),
681 )?,
682 ),
683 )
684}
685fn aura_clearcasting(
686 a: AuraDefinitionDraft,
687 data: &ResolvedGameData,
688) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
689 Ok(
690 a
691 .on_player()
692 .apply_base_from_data(data, 263_725)?
693 .max_stacks(
694 data
695 .require_aura_max_stacks(
696 wowlab_types::sim::SpellIdx::from_raw(263_725),
697 )?,
698 ),
699 )
700}
701fn aura_enlightened(
702 a: AuraDefinitionDraft,
703 data: &ResolvedGameData,
704) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
705 Ok(
706 a
707 .on_player()
708 .apply_base_from_data(data, 1_217_242)?
709 .max_stacks(
710 data
711 .require_aura_max_stacks(
712 wowlab_types::sim::SpellIdx::from_raw(1_217_242),
713 )?,
714 ),
715 )
716}
717fn aura_arcane_salvo(
718 a: AuraDefinitionDraft,
719 data: &ResolvedGameData,
720) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
721 Ok(
722 a
723 .on_player()
724 .apply_base_from_data(data, 1_242_974)?
725 .max_stacks(
726 data
727 .require_aura_max_stacks(
728 wowlab_types::sim::SpellIdx::from_raw(1_242_974),
729 )?,
730 ),
731 )
732}
733fn aura_intuition(
734 a: AuraDefinitionDraft,
735 data: &ResolvedGameData,
736) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
737 Ok(
738 a
739 .on_player()
740 .apply_base_from_data(data, 1_223_797)?
741 .max_stacks(
742 data
743 .require_aura_max_stacks(
744 wowlab_types::sim::SpellIdx::from_raw(1_223_797),
745 )?,
746 ),
747 )
748}
749fn aura_presence_of_mind(
750 a: AuraDefinitionDraft,
751 data: &ResolvedGameData,
752) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
753 Ok(
754 a
755 .on_player()
756 .apply_base_from_data(data, 205_025)?
757 .max_stacks(
758 data
759 .require_aura_max_stacks(
760 wowlab_types::sim::SpellIdx::from_raw(205_025),
761 )?,
762 ),
763 )
764}
765fn aura_evocation(
766 a: AuraDefinitionDraft,
767 data: &ResolvedGameData,
768) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
769 Ok(
770 a
771 .on_player()
772 .apply_base_from_data(data, 12051)?
773 .max_stacks(
774 data
775 .require_aura_max_stacks(
776 wowlab_types::sim::SpellIdx::from_raw(12051),
777 )?,
778 ),
779 )
780}
781fn aura_touch_of_the_magi(
782 a: AuraDefinitionDraft,
783 data: &ResolvedGameData,
784) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
785 Ok(
786 a
787 .on_target()
788 .apply_base_from_data(data, 210_824)?
789 .max_stacks(
790 data
791 .require_aura_max_stacks(
792 wowlab_types::sim::SpellIdx::from_raw(210_824),
793 )?,
794 )
795 .on_expire(crate::hooks::arcane_mage::touch_of_the_magi_expire_hook),
796 )
797}
798fn aura_nether_precision(
799 a: AuraDefinitionDraft,
800 data: &ResolvedGameData,
801) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
802 Ok(
803 a
804 .on_player()
805 .apply_base_from_data(data, 383_783)?
806 .max_stacks(
807 data
808 .require_aura_max_stacks(
809 wowlab_types::sim::SpellIdx::from_raw(383_783),
810 )?,
811 ),
812 )
813}
814fn aura_overpowered_missiles(
815 a: AuraDefinitionDraft,
816 data: &ResolvedGameData,
817) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
818 Ok(
819 a
820 .on_player()
821 .apply_base_from_data(data, 1_277_009)?
822 .max_stacks(
823 data
824 .require_aura_max_stacks(
825 wowlab_types::sim::SpellIdx::from_raw(1_277_009),
826 )?,
827 ),
828 )
829}
830fn aura_arcane_intellect_highlight(
831 a: AuraDefinitionDraft,
832 data: &ResolvedGameData,
833) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
834 Ok(
835 a
836 .on_player()
837 .apply_base_from_data(data, 1459)?
838 .max_stacks(
839 data
840 .require_aura_max_stacks(
841 wowlab_types::sim::SpellIdx::from_raw(1459),
842 )?,
843 ),
844 )
845}
846fn aura_high_voltage(
847 a: AuraDefinitionDraft,
848 data: &ResolvedGameData,
849) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
850 Ok(
851 a
852 .on_player()
853 .apply_base_from_data(data, 461_524)?
854 .max_stacks(
855 data
856 .require_aura_max_stacks(
857 wowlab_types::sim::SpellIdx::from_raw(461_524),
858 )?,
859 ),
860 )
861}
862fn aura_amplification(
863 a: AuraDefinitionDraft,
864 data: &ResolvedGameData,
865) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
866 Ok(
867 a
868 .on_player()
869 .apply_base_from_data(data, 236_628)?
870 .max_stacks(
871 data
872 .require_aura_max_stacks(
873 wowlab_types::sim::SpellIdx::from_raw(236_628),
874 )?,
875 ),
876 )
877}
878fn aura_spellfire_salvo(
879 a: AuraDefinitionDraft,
880 data: &ResolvedGameData,
881) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
882 Ok(
883 a
884 .on_player()
885 .apply_base_from_data(data, 449_322)?
886 .max_stacks(
887 data
888 .require_aura_max_stacks(
889 wowlab_types::sim::SpellIdx::from_raw(449_322),
890 )?,
891 ),
892 )
893}
894fn aura_cumulative_power(
895 a: AuraDefinitionDraft,
896 data: &ResolvedGameData,
897) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
898 Ok(
899 a
900 .on_player()
901 .apply_base_from_data(data, 1_296_930)?
902 .max_stacks(
903 data
904 .require_aura_max_stacks(
905 wowlab_types::sim::SpellIdx::from_raw(1_296_930),
906 )?,
907 ),
908 )
909}
910fn aura_prismatic_bolt(
911 a: AuraDefinitionDraft,
912 data: &ResolvedGameData,
913) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
914 Ok(
915 a
916 .on_player()
917 .apply_base_from_data(data, 1_295_942)?
918 .max_stacks(
919 data
920 .require_aura_max_stacks(
921 wowlab_types::sim::SpellIdx::from_raw(1_295_942),
922 )?,
923 ),
924 )
925}
926fn spell_arcane_blast(
927 s: SpellDefinitionDraft,
928 data: &ResolvedGameData,
929) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
930 Ok(
931 s
932 .apply_base_from_data(data, 30451)?
933 .apply_aoe_from_data(data)
934 .on_cast(crate::hooks::arcane_mage::arcane_blast_hook),
935 )
936}
937fn spell_arcane_barrage(
938 s: SpellDefinitionDraft,
939 data: &ResolvedGameData,
940) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
941 Ok(
942 s
943 .apply_base_from_data(data, 44425)?
944 .apply_aoe_from_data(data)
945 .on_cast(crate::hooks::arcane_mage::arcane_barrage_hook),
946 )
947}
948fn spell_arcane_missiles(
949 s: SpellDefinitionDraft,
950 data: &ResolvedGameData,
951) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
952 Ok(
953 s
954 .apply_base_from_data(data, 5143)?
955 .apply_aoe_from_data(data)
956 .on_cast(crate::hooks::arcane_mage::arcane_missiles_hook),
957 )
958}
959fn spell_arcane_missiles_damage(
960 s: SpellDefinitionDraft,
961 data: &ResolvedGameData,
962) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
963 Ok(s.apply_base_from_data(data, 7268)?.apply_aoe_from_data(data))
964}
965fn spell_arcane_surge(
966 s: SpellDefinitionDraft,
967 data: &ResolvedGameData,
968) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
969 Ok(
970 s
971 .apply_base_from_data(data, 365_350)?
972 .applies_aura(AURA_ARCANE_SURGE)
973 .apply_aoe_from_data(data)
974 .on_cast(crate::hooks::arcane_mage::arcane_surge_hook),
975 )
976}
977fn spell_arcane_orb(
978 s: SpellDefinitionDraft,
979 data: &ResolvedGameData,
980) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
981 Ok(
982 s
983 .apply_base_from_data(data, 153_626)?
984 .apply_aoe_from_data(data)
985 .on_cast(crate::hooks::arcane_mage::arcane_orb_hook),
986 )
987}
988fn spell_arcane_orb_bolt(
989 s: SpellDefinitionDraft,
990 data: &ResolvedGameData,
991) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
992 Ok(s.apply_base_from_data(data, 153_640)?.apply_aoe_from_data(data))
993}
994fn spell_arcane_splinter(
995 s: SpellDefinitionDraft,
996 data: &ResolvedGameData,
997) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
998 Ok(s.apply_base_from_data(data, 443_763)?.apply_aoe_from_data(data))
999}
1000fn spell_touch_of_the_magi(
1001 s: SpellDefinitionDraft,
1002 data: &ResolvedGameData,
1003) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1004 Ok(
1005 s
1006 .apply_base_from_data(data, 321_507)?
1007 .applies_aura(AURA_TOUCH_OF_THE_MAGI)
1008 .apply_aoe_from_data(data)
1009 .on_cast(crate::hooks::arcane_mage::touch_of_the_magi_hook),
1010 )
1011}
1012fn spell_touch_of_the_magi_explosion(
1013 s: SpellDefinitionDraft,
1014 data: &ResolvedGameData,
1015) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1016 Ok(s.apply_base_from_data(data, 210_833)?.apply_aoe_from_data(data))
1017}
1018fn spell_touch_of_the_archmage(
1019 s: SpellDefinitionDraft,
1020 data: &ResolvedGameData,
1021) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1022 Ok(s.apply_base_from_data(data, 1_258_134)?.apply_aoe_from_data(data))
1023}
1024fn spell_evocation(
1025 s: SpellDefinitionDraft,
1026 data: &ResolvedGameData,
1027) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1028 Ok(
1029 s
1030 .apply_base_from_data(data, 12051)?
1031 .applies_inferred_aura(AURA_EVOCATION, 12051)
1032 .apply_aoe_from_data(data),
1033 )
1034}
1035fn spell_presence_of_mind(
1036 s: SpellDefinitionDraft,
1037 data: &ResolvedGameData,
1038) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1039 Ok(
1040 s
1041 .apply_base_from_data(data, 205_025)?
1042 .applies_inferred_aura(AURA_PRESENCE_OF_MIND, 205_025)
1043 .apply_aoe_from_data(data),
1044 )
1045}
1046fn spell_arcane_explosion(
1047 s: SpellDefinitionDraft,
1048 data: &ResolvedGameData,
1049) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1050 Ok(s.apply_base_from_data(data, 1449)?.apply_aoe_from_data(data))
1051}
1052fn spell_arcane_pulse(
1053 s: SpellDefinitionDraft,
1054 data: &ResolvedGameData,
1055) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1056 Ok(
1057 s
1058 .apply_base_from_data(data, 1_241_462)?
1059 .apply_aoe_from_data(data)
1060 .on_cast(crate::hooks::arcane_mage::arcane_pulse_hook),
1061 )
1062}
1063fn spell_prismatic_bolt(
1064 s: SpellDefinitionDraft,
1065 data: &ResolvedGameData,
1066) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1067 Ok(
1068 s
1069 .apply_base_from_data(data, 1_295_924)?
1070 .applies_inferred_aura(AURA_PRISMATIC_BOLT, 1_295_942)
1071 .apply_aoe_from_data(data)
1072 .on_cast(crate::hooks::arcane_mage::prismatic_bolt_hook)
1073 .requires_aura_at_min_stacks(1_295_942, 0),
1074 )
1075}
1076fn spell_arcane_intellect(
1077 s: SpellDefinitionDraft,
1078 data: &ResolvedGameData,
1079) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1080 Ok(
1081 s
1082 .apply_base_from_data(data, 1459)?
1083 .without_data_damage()
1084 .applies_inferred_aura(AURA_ARCANE_INTELLECT_HIGHLIGHT, 1459)
1085 .apply_aoe_from_data(data),
1086 )
1087}
1088fn spell_arcane_assault(
1089 s: SpellDefinitionDraft,
1090 data: &ResolvedGameData,
1091) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1092 Ok(s.apply_base_from_data(data, 225_119)?.apply_aoe_from_data(data))
1093}
1094pub(crate) fn build_combat_system_draft(
1095 params: &wowlab_engine_ports::HandlerParams<'_>,
1096) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1097 let builder = CombatSystemBuilder::new(params.stats.clone())
1098 .spec_id(SpecId::Arcane)
1099 .spec_identity(
1100 wowlab_engine_combat::generated_identities::specs::arcane_mage::PROOF,
1101 )
1102 .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1103 .effect_identities(
1104 wowlab_engine_combat::generated_identities::specs::arcane_mage::damage::ALL,
1105 )
1106 .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1107 .mastery_spell(190_740)
1108 .mastery_hook(crate::hooks::arcane_mage::mastery)
1109 .resource(
1110 "mana",
1111 100_000.0,
1112 params
1113 .game_data
1114 .power_regen_for_max(0, 100_000.0)
1115 .ok_or_else(|| {
1116 wowlab_engine_ports::EngineError::spec_construction(
1117 "missing power-type power_regen_for_max for type_id 0",
1118 )
1119 })?,
1120 )
1121 .resource_type_id(0)
1122 .resource_start(100_000.0)
1123 .secondary_resource(
1124 "arcane_charges",
1125 params
1126 .game_data
1127 .power_max(16)
1128 .ok_or_else(|| {
1129 wowlab_engine_ports::EngineError::spec_construction(
1130 "missing power-type power_max for type_id 16",
1131 )
1132 })?,
1133 )
1134 .secondary_resource_type_id(16)
1135 .aura(
1136 "arcane_charge",
1137 AURA::ARCANE_CHARGE,
1138 |a| aura_arcane_charge(a, ¶ms.game_data),
1139 )
1140 .aura(
1141 "arcane_surge",
1142 AURA::ARCANE_SURGE,
1143 |a| aura_arcane_surge(a, ¶ms.game_data),
1144 )
1145 .aura(
1146 "clearcasting",
1147 AURA::CLEARCASTING,
1148 |a| aura_clearcasting(a, ¶ms.game_data),
1149 )
1150 .aura(
1151 "enlightened",
1152 AURA::ENLIGHTENED,
1153 |a| aura_enlightened(a, ¶ms.game_data),
1154 )
1155 .aura(
1156 "arcane_salvo",
1157 AURA::ARCANE_SALVO,
1158 |a| aura_arcane_salvo(a, ¶ms.game_data),
1159 )
1160 .aura("intuition", AURA::INTUITION, |a| aura_intuition(a, ¶ms.game_data))
1161 .aura(
1162 "presence_of_mind",
1163 AURA::PRESENCE_OF_MIND,
1164 |a| aura_presence_of_mind(a, ¶ms.game_data),
1165 )
1166 .aura("evocation", AURA::EVOCATION, |a| aura_evocation(a, ¶ms.game_data))
1167 .aura(
1168 "touch_of_the_magi",
1169 AURA::TOUCH_OF_THE_MAGI,
1170 |a| aura_touch_of_the_magi(a, ¶ms.game_data),
1171 )
1172 .aura(
1173 "nether_precision",
1174 AURA::NETHER_PRECISION,
1175 |a| aura_nether_precision(a, ¶ms.game_data),
1176 )
1177 .aura(
1178 "overpowered_missiles",
1179 AURA::OVERPOWERED_MISSILES,
1180 |a| aura_overpowered_missiles(a, ¶ms.game_data),
1181 )
1182 .aura(
1183 "arcane_intellect_highlight",
1184 AURA::ARCANE_INTELLECT_HIGHLIGHT,
1185 |a| aura_arcane_intellect_highlight(a, ¶ms.game_data),
1186 )
1187 .aura(
1188 "high_voltage",
1189 AURA::HIGH_VOLTAGE,
1190 |a| aura_high_voltage(a, ¶ms.game_data),
1191 )
1192 .aura(
1193 "amplification",
1194 AURA::AMPLIFICATION,
1195 |a| aura_amplification(a, ¶ms.game_data),
1196 )
1197 .aura(
1198 "spellfire_salvo",
1199 AURA::SPELLFIRE_SALVO,
1200 |a| aura_spellfire_salvo(a, ¶ms.game_data),
1201 )
1202 .aura(
1203 "cumulative_power",
1204 AURA::CUMULATIVE_POWER,
1205 |a| aura_cumulative_power(a, ¶ms.game_data),
1206 )
1207 .aura(
1208 "prismatic_bolt",
1209 AURA::PRISMATIC_BOLT,
1210 |a| aura_prismatic_bolt(a, ¶ms.game_data),
1211 )
1212 .spell(
1213 "arcane_blast",
1214 SPELL::ARCANE_BLAST,
1215 |s| spell_arcane_blast(s, ¶ms.game_data),
1216 )
1217 .spell(
1218 "arcane_barrage",
1219 SPELL::ARCANE_BARRAGE,
1220 |s| spell_arcane_barrage(s, ¶ms.game_data),
1221 )
1222 .spell(
1223 "arcane_missiles",
1224 SPELL::ARCANE_MISSILES,
1225 |s| spell_arcane_missiles(s, ¶ms.game_data),
1226 )
1227 .spell(
1228 "arcane_missiles_damage",
1229 SPELL::ARCANE_MISSILES_DAMAGE,
1230 |s| spell_arcane_missiles_damage(s, ¶ms.game_data),
1231 )
1232 .spell(
1233 "arcane_surge",
1234 SPELL::ARCANE_SURGE,
1235 |s| spell_arcane_surge(s, ¶ms.game_data),
1236 )
1237 .spell(
1238 "arcane_orb",
1239 SPELL::ARCANE_ORB,
1240 |s| spell_arcane_orb(s, ¶ms.game_data),
1241 )
1242 .spell(
1243 "arcane_orb_bolt",
1244 SPELL::ARCANE_ORB_BOLT,
1245 |s| spell_arcane_orb_bolt(s, ¶ms.game_data),
1246 )
1247 .spell(
1248 "arcane_splinter",
1249 SPELL::ARCANE_SPLINTER,
1250 |s| spell_arcane_splinter(s, ¶ms.game_data),
1251 )
1252 .spell(
1253 "touch_of_the_magi",
1254 SPELL::TOUCH_OF_THE_MAGI,
1255 |s| spell_touch_of_the_magi(s, ¶ms.game_data),
1256 )
1257 .spell(
1258 "touch_of_the_magi_explosion",
1259 SPELL::TOUCH_OF_THE_MAGI_EXPLOSION,
1260 |s| spell_touch_of_the_magi_explosion(s, ¶ms.game_data),
1261 )
1262 .spell(
1263 "touch_of_the_archmage",
1264 SPELL::TOUCH_OF_THE_ARCHMAGE,
1265 |s| spell_touch_of_the_archmage(s, ¶ms.game_data),
1266 )
1267 .spell("evocation", SPELL::EVOCATION, |s| spell_evocation(s, ¶ms.game_data))
1268 .spell(
1269 "presence_of_mind",
1270 SPELL::PRESENCE_OF_MIND,
1271 |s| spell_presence_of_mind(s, ¶ms.game_data),
1272 )
1273 .spell(
1274 "arcane_explosion",
1275 SPELL::ARCANE_EXPLOSION,
1276 |s| spell_arcane_explosion(s, ¶ms.game_data),
1277 )
1278 .spell(
1279 "arcane_pulse",
1280 SPELL::ARCANE_PULSE,
1281 |s| spell_arcane_pulse(s, ¶ms.game_data),
1282 )
1283 .spell(
1284 "prismatic_bolt",
1285 SPELL::PRISMATIC_BOLT,
1286 |s| spell_prismatic_bolt(s, ¶ms.game_data),
1287 )
1288 .spell(
1289 "arcane_intellect",
1290 SPELL::ARCANE_INTELLECT,
1291 |s| spell_arcane_intellect(s, ¶ms.game_data),
1292 )
1293 .spell(
1294 "arcane_assault",
1295 SPELL::ARCANE_ASSAULT,
1296 |s| spell_arcane_assault(s, ¶ms.game_data),
1297 )
1298 .game_data(params.game_data.clone())
1299 .talent_spell_ids(TALENTS)
1300 .talent_selections(params.talent_selections)
1301 .talent_companion_aura(TALENT::ENLIGHTENED, AURA_ENLIGHTENED)
1302 .set_bonus_auras(params.set_bonus_auras)
1303 .encounter(params.encounter.clone());
1304 let builder = crate::generated::items::register_equipped(
1305 builder,
1306 ¶ms.game_data,
1307 params.equipped_items,
1308 )?;
1309
1310 builder.into_draft()
1311}
1312fn new_handler(
1313 params: wowlab_engine_ports::HandlerParams<'_>,
1314) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1315 let handler = crate::composition::compose_handler(
1316 build_combat_system_draft,
1317 ¶ms,
1318 crate::hooks::arcane_mage::ArcaneHandler::new,
1319 )?;
1320
1321 Ok(Box::new(handler))
1322}
1323static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1324 primary_resource: ResourceType::Mana,
1325 secondary_resource: Some(ResourceType::ArcaneCharges),
1326 spell_ids: DECLARED_SPELL_IDS,
1327 aura_ids: DECLARED_AURA_IDS,
1328 server_proc_entries: &[],
1329 talents: TALENTS,
1330 rotation_field_schema: &[],
1331 metrics_plugin_id: None,
1332 hero_talent_trees: &[
1333 HeroTalentTreeDesc {
1334 name: "Spellslinger",
1335 spells: HERO_TREE_SPELLSLINGER_SPELLS,
1336 auras: HERO_TREE_SPELLSLINGER_AURAS,
1337 },
1338 HeroTalentTreeDesc {
1339 name: "Sunfury",
1340 spells: HERO_TREE_SUNFURY_SPELLS,
1341 auras: HERO_TREE_SUNFURY_AURAS,
1342 },
1343 ],
1344 reported_spells: REPORTED_SPELLS,
1345 masked_passive_effects: &[],
1346 passive_effect_overrides: &[],
1347};
1348pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1349 spec_id: SpecId::Arcane,
1350 display_name: "Arcane Mage",
1351 metadata: DECLARED_METADATA,
1352 handler_factory: new_handler,
1353};
1354wowlab_engine_combat::smoke_test!(build_combat_system_draft);