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 FESTERING_STRIKE: u32 = 85948;
16 pub(crate) const SCOURGE_STRIKE: u32 = 55090;
18 pub(crate) const DEATH_COIL: u32 = 47541;
20 pub(crate) const EPIDEMIC: u32 = 212_739;
22 pub(crate) const SOUL_REAPER: u32 = 343_294;
24 pub(crate) const OUTBREAK: u32 = 77575;
26 pub(crate) const GARGOYLE_STRIKE: u32 = 51963;
28 pub(crate) const DARK_TRANSFORMATION: u32 = 1_233_448;
30 pub(crate) const ARMY_OF_THE_DEAD: u32 = 42650;
32 pub(crate) const PUTREFY: u32 = 1_247_378;
34}
35pub(crate) mod AURA {
36 pub(crate) const SUDDEN_DOOM: u32 = 81340;
38 pub(crate) const RUNIC_CORRUPTION: u32 = 51460;
40 pub(crate) const FESTERING_SCYTHE: u32 = 458_123;
42 pub(crate) const FESTERING_SCYTHE_TT: u32 = 1_241_077;
44 pub(crate) const COIL_OF_DEVASTATION: u32 = 390_271;
46 pub(crate) const APOCALYPSE_DEATH: u32 = 327_095;
48 pub(crate) const APOCALYPSE_FAMINE: u32 = 327_092;
50 pub(crate) const APOCALYPSE_PESTILENCE: u32 = 327_093;
52 pub(crate) const APOCALYPSE_WAR: u32 = 327_096;
54 pub(crate) const SOUL_REAPER: u32 = 1_241_521;
56 pub(crate) const MOGRAINES_MIGHT: u32 = 444_505;
58 pub(crate) const APOCALYPTIC_CONQUEST: u32 = 444_763;
60 pub(crate) const TROLLBANE_CHAINS: u32 = 444_828;
62 pub(crate) const UNDEATH: u32 = 444_633;
64 pub(crate) const REAPING: u32 = 1_242_654;
66 pub(crate) const FORBIDDEN_KNOWLEDGE: u32 = 1_242_223;
68 pub(crate) const BLIGHTFALL: u32 = 1_271_975;
70 pub(crate) const ICY_TALONS: u32 = 194_879;
72 pub(crate) const RUNE_MASTERY: u32 = 374_585;
74 pub(crate) const BRITTLE: u32 = 374_557;
76 pub(crate) const VIRULENT_PLAGUE: u32 = 191_587;
78 pub(crate) const DREAD_PLAGUE: u32 = 1_240_996;
80 pub(crate) const INFECTED_CLAWS: u32 = 1_241_786;
82 pub(crate) const LESSER_GHOUL: u32 = 1_254_252;
84 pub(crate) const LESSER_GHOUL_COUNTER: u32 = 1_242_998;
86 pub(crate) const UNHOLY_DEVOTION: u32 = 1_270_491;
88 pub(crate) const GARGOYLE_ACTIVE: u32 = 49206;
90 pub(crate) const GARGOYLE_EMPOWERMENT: u32 = 211_947;
92 pub(crate) const DARK_TRANSFORMATION: u32 = 1_235_391;
94 pub(crate) const COMMANDER_OF_THE_DEAD: u32 = 390_260;
96}
97pub(crate) mod TALENT {
98 pub(crate) const APOCALYPSE_NOW: u32 = 444_040;
100 pub(crate) const ARMY_OF_THE_DEAD: u32 = 42650;
102 pub(crate) const BLIGHTBURST: u32 = 1_254_552;
104 pub(crate) const BRITTLE: u32 = 374_504;
106 pub(crate) const DARK_TRANSFORMATION: u32 = 1_233_448;
108 pub(crate) const FORBIDDEN_KNOWLEDGE_2: u32 = 1_256_565;
110 pub(crate) const FORBIDDEN_KNOWLEDGE_3: u32 = 1_256_566;
112 pub(crate) const FURY_OF_THE_HORSEMEN: u32 = 444_069;
114 pub(crate) const GRAVE_MASTERY: u32 = 1_238_900;
116 pub(crate) const LET_TERROR_REIGN: u32 = 1_265_949;
118 pub(crate) const LORD_OF_THE_DEAD: u32 = 1_256_813;
120 pub(crate) const NAZGRIMS_CONQUEST: u32 = 444_052;
122 pub(crate) const OUTBREAK: u32 = 77575;
124 pub(crate) const PUTREFY: u32 = 1_247_378;
126 pub(crate) const RIDERS_CHAMPION: u32 = 444_005;
128 pub(crate) const SCOURGE_STRIKE: u32 = 55090;
130 pub(crate) const SOUL_REAPER: u32 = 343_294;
132 pub(crate) const SUMMON_GARGOYLE: u32 = 1_242_147;
134 pub(crate) const TROLLBANES_ICY_FURY: u32 = 444_097;
136 pub(crate) const UNHOLY_DEVOTION: u32 = 1_241_858;
138 pub(crate) const WHITEMANES_FAMINE: u32 = 444_033;
140}
141pub(crate) mod SET_BONUS {
142 pub(crate) const MID2_UNHOLY_2PC: u32 = 1_296_654;
144 pub(crate) const MID2_UNHOLY_4PC: u32 = 1_296_655;
146}
147pub(crate) mod REPORTED_SPELL {
148 pub(crate) const AUTO_ATTACK: u32 = 6603;
150 pub(crate) const CLAW: u32 = 199_373;
152 pub(crate) const DEATH_AND_DECAY: u32 = 1_251_951;
154 pub(crate) const DEATH_COIL_LET_TERROR_REIGN: u32 = 1_265_949;
156 pub(crate) const DREAD_PLAGUE_ERUPT: u32 = 1_241_171;
158 pub(crate) const FESTERING_SCYTHE: u32 = 458_128;
160 pub(crate) const HEART_STRIKE: u32 = 445_504;
162 pub(crate) const NECROTIC_BOLT: u32 = 1_297_055;
164 pub(crate) const NECROTIC_COIL_SHADOW: u32 = 1_242_178;
166 pub(crate) const OBLITERATE: u32 = 445_507;
168 pub(crate) const PESTILENCE_RUNEFORGE: u32 = 327_093;
170 pub(crate) const SCOURGE_STRIKE_SHADOW: u32 = 445_509;
172 pub(crate) const SWEEPING_CLAWS: u32 = 1_278_150;
174 pub(crate) const TROLLBANES_ICY_FURY: u32 = 444_834;
176 pub(crate) const UNDEATH: u32 = 444_633;
178 pub(crate) const VIRULENT_PLAGUE_ERUPT: u32 = 1_241_167;
180 pub(crate) const WHITEMANE_DEATH_COIL: u32 = 445_513;
182 pub(crate) const WITHERING_GRASP: u32 = 1_297_091;
184}
185pub(crate) mod HERO {
186 pub(crate) mod UNHOLY_PETS {
187 pub(crate) mod SPELL {
188 pub(crate) const CLAW: u32 = 91776;
190 pub(crate) const COIL_OF_DEVASTATION: u32 = 390_271;
192 pub(crate) const FESTERING_SCYTHE_STRIKE: u32 = 458_128;
194 pub(crate) const FROSTBOLT: u32 = 317_792;
196 pub(crate) const GARGOYLE_STRIKE: u32 = 51963;
198 pub(crate) const LESSER_CLAW: u32 = 199_373;
200 pub(crate) const LESSER_SWEEPING_CLAWS: u32 = 1_278_150;
202 pub(crate) const MELEE: u32 = 6603;
204 pub(crate) const NECROTIC_COIL: u32 = 1_242_178;
206 pub(crate) const NECROTIC_COIL_SHADOWSTRIKE: u32 = 1_242_172;
208 pub(crate) const PUTREFY_AOE: u32 = 390_220;
210 pub(crate) const PUTREFY_ST: u32 = 1_277_016;
212 pub(crate) const RUPTURED_VISCERA: u32 = 1_247_379;
214 pub(crate) const SHADOW_BOLT: u32 = 317_791;
216 pub(crate) const SUMMON_GARGOYLE: u32 = 49206;
218 pub(crate) const SWEEPING_CLAWS: u32 = 91778;
220 }
221 }
222 pub(crate) mod RIDERS {
223 pub(crate) mod SPELL {
224 pub(crate) const MOGRAINE: u32 = 444_248;
226 pub(crate) const NAZGRIM: u32 = 444_252;
228 pub(crate) const RANDOM_SUMMON: u32 = 454_389;
230 pub(crate) const TROLLBANE: u32 = 444_254;
232 pub(crate) const WHITEMANE: u32 = 444_251;
234 }
235 }
236}
237static HERO_TREE_UNHOLY_PETS_SPELLS: &[(&str, u32)] = &[
238 ("CLAW", 91776),
239 ("COIL_OF_DEVASTATION", 390_271),
240 ("FESTERING_SCYTHE_STRIKE", 458_128),
241 ("FROSTBOLT", 317_792),
242 ("GARGOYLE_STRIKE", 51963),
243 ("LESSER_CLAW", 199_373),
244 ("LESSER_SWEEPING_CLAWS", 1_278_150),
245 ("MELEE", 6603),
246 ("NECROTIC_COIL", 1_242_178),
247 ("NECROTIC_COIL_SHADOWSTRIKE", 1_242_172),
248 ("PUTREFY_AOE", 390_220),
249 ("PUTREFY_ST", 1_277_016),
250 ("RUPTURED_VISCERA", 1_247_379),
251 ("SHADOW_BOLT", 317_791),
252 ("SUMMON_GARGOYLE", 49206),
253 ("SWEEPING_CLAWS", 91778),
254];
255static HERO_TREE_UNHOLY_PETS_AURAS: &[(&str, u32)] = &[];
256static HERO_TREE_RIDERS_SPELLS: &[(&str, u32)] = &[
257 ("MOGRAINE", 444_248),
258 ("NAZGRIM", 444_252),
259 ("RANDOM_SUMMON", 454_389),
260 ("TROLLBANE", 444_254),
261 ("WHITEMANE", 444_251),
262];
263static HERO_TREE_RIDERS_AURAS: &[(&str, u32)] = &[];
264pub(crate) mod DAMAGE_SPELL {
265 pub(crate) const FESTERING_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_85948;
266 pub(crate) const SCOURGE_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_55090;
267 pub(crate) const DEATH_COIL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_47541;
268 pub(crate) const EPIDEMIC: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_212739;
269 pub(crate) const SOUL_REAPER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_343294;
270 pub(crate) const OUTBREAK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_77575;
271 pub(crate) const GARGOYLE_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_51963;
272 pub(crate) const DARK_TRANSFORMATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1233448;
273 pub(crate) const ARMY_OF_THE_DEAD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_42650;
274 pub(crate) const PUTREFY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1247378;
275 pub(crate) const CLAW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_91776;
276 pub(crate) const COIL_OF_DEVASTATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_390271;
277 pub(crate) const FESTERING_SCYTHE_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_458128;
278 pub(crate) const FROSTBOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_317792;
279 pub(crate) const LESSER_CLAW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_199373;
280 pub(crate) const LESSER_SWEEPING_CLAWS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1278150;
281 pub(crate) const MELEE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_6603;
282 pub(crate) const NECROTIC_COIL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1242178;
283 pub(crate) const NECROTIC_COIL_SHADOWSTRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1242172;
284 pub(crate) const PUTREFY_AOE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_390220;
285 pub(crate) const PUTREFY_ST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1277016;
286 pub(crate) const RUPTURED_VISCERA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1247379;
287 pub(crate) const SHADOW_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_317791;
288 pub(crate) const SUMMON_GARGOYLE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_49206;
289 pub(crate) const SWEEPING_CLAWS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_91778;
290 pub(crate) const MOGRAINE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_444248;
291 pub(crate) const NAZGRIM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_444252;
292 pub(crate) const RANDOM_SUMMON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_454389;
293 pub(crate) const TROLLBANE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_444254;
294 pub(crate) const WHITEMANE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_444251;
295}
296pub(crate) mod DAMAGE_AURA {
297 pub(crate) const SUDDEN_DOOM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_81340;
298 pub(crate) const RUNIC_CORRUPTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_51460;
299 pub(crate) const FESTERING_SCYTHE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_458123;
300 pub(crate) const FESTERING_SCYTHE_TT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1241077;
301 pub(crate) const COIL_OF_DEVASTATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_390271;
302 pub(crate) const APOCALYPSE_DEATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_327095;
303 pub(crate) const APOCALYPSE_FAMINE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_327092;
304 pub(crate) const APOCALYPSE_PESTILENCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_327093;
305 pub(crate) const APOCALYPSE_WAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_327096;
306 pub(crate) const SOUL_REAPER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1241521;
307 pub(crate) const MOGRAINES_MIGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_444505;
308 pub(crate) const APOCALYPTIC_CONQUEST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_444763;
309 pub(crate) const TROLLBANE_CHAINS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_444828;
310 pub(crate) const UNDEATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_444633;
311 pub(crate) const REAPING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1242654;
312 pub(crate) const FORBIDDEN_KNOWLEDGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1242223;
313 pub(crate) const BLIGHTFALL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1271975;
314 pub(crate) const ICY_TALONS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_194879;
315 pub(crate) const RUNE_MASTERY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_374585;
316 pub(crate) const BRITTLE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_374557;
317 pub(crate) const VIRULENT_PLAGUE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_191587;
318 pub(crate) const DREAD_PLAGUE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1240996;
319 pub(crate) const INFECTED_CLAWS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1241786;
320 pub(crate) const LESSER_GHOUL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1254252;
321 pub(crate) const LESSER_GHOUL_COUNTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1242998;
322 pub(crate) const UNHOLY_DEVOTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1270491;
323 pub(crate) const GARGOYLE_ACTIVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_49206;
324 pub(crate) const GARGOYLE_EMPOWERMENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_211947;
325 pub(crate) const DARK_TRANSFORMATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1235391;
326 pub(crate) const COMMANDER_OF_THE_DEAD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_390260;
327}
328pub(crate) mod DAMAGE_TALENT {
329 pub(crate) const APOCALYPSE_NOW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_444040;
330 pub(crate) const ARMY_OF_THE_DEAD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_42650;
331 pub(crate) const BLIGHTBURST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1254552;
332 pub(crate) const BRITTLE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_374504;
333 pub(crate) const DARK_TRANSFORMATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1233448;
334 pub(crate) const FORBIDDEN_KNOWLEDGE_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1256565;
335 pub(crate) const FORBIDDEN_KNOWLEDGE_3: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1256566;
336 pub(crate) const FURY_OF_THE_HORSEMEN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_444069;
337 pub(crate) const GRAVE_MASTERY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1238900;
338 pub(crate) const LET_TERROR_REIGN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1265949;
339 pub(crate) const LORD_OF_THE_DEAD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1256813;
340 pub(crate) const NAZGRIMS_CONQUEST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_444052;
341 pub(crate) const OUTBREAK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_77575;
342 pub(crate) const PUTREFY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1247378;
343 pub(crate) const RIDERS_CHAMPION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_444005;
344 pub(crate) const SCOURGE_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_55090;
345 pub(crate) const SOUL_REAPER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_343294;
346 pub(crate) const SUMMON_GARGOYLE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1242147;
347 pub(crate) const TROLLBANES_ICY_FURY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_444097;
348 pub(crate) const UNHOLY_DEVOTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1241858;
349 pub(crate) const WHITEMANES_FAMINE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_444033;
350}
351pub(crate) mod DAMAGE_REPORTED {
352 pub(crate) const AUTO_ATTACK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_6603;
353 pub(crate) const CLAW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_199373;
354 pub(crate) const DEATH_AND_DECAY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1251951;
355 pub(crate) const DEATH_COIL_LET_TERROR_REIGN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1265949;
356 pub(crate) const DREAD_PLAGUE_ERUPT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1241171;
357 pub(crate) const FESTERING_SCYTHE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_458128;
358 pub(crate) const HEART_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_445504;
359 pub(crate) const NECROTIC_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1297055;
360 pub(crate) const NECROTIC_COIL_SHADOW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1242178;
361 pub(crate) const OBLITERATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_445507;
362 pub(crate) const PESTILENCE_RUNEFORGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_327093;
363 pub(crate) const SCOURGE_STRIKE_SHADOW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_445509;
364 pub(crate) const SWEEPING_CLAWS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1278150;
365 pub(crate) const TROLLBANES_ICY_FURY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_444834;
366 pub(crate) const UNDEATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_444633;
367 pub(crate) const VIRULENT_PLAGUE_ERUPT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1241167;
368 pub(crate) const WHITEMANE_DEATH_COIL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_445513;
369 pub(crate) const WITHERING_GRASP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ACTION::SPELL_1297091;
370}
371pub(crate) mod DAMAGE_EFFECT {
372 pub(crate) const APOCALYPSE_NOW_DURATION: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_444040_EFFECT_2;
373 pub(crate) const ARMY_GHOUL_COUNT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_42650_EFFECT_1;
374 pub(crate) const BLIGHTBURST_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1254552_EFFECT_2;
375 pub(crate) const BLIGHTBURST_DURATION: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1254552_EFFECT_1;
376 pub(crate) const CLAW: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_91776_EFFECT_1;
377 pub(crate) const COIL_OF_DEVASTATION_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_390270_EFFECT_1;
378 pub(crate) const COMMANDER_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_390260_EFFECT_3;
379 pub(crate) const DC_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_47632_EFFECT_1;
380 pub(crate) const DP_TICK: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1240996_EFFECT_1;
381 pub(crate) const DREADBLADE_PET_CRIT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_77515_EFFECT_6;
382 pub(crate) const DT_ENERGY_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1233448_EFFECT_4;
383 pub(crate) const DT_PET_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1233448_EFFECT_1;
384 pub(crate) const ETERNAL_AGONY_EXTENSION_MS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_390268_EFFECT_1;
385 pub(crate) const EBON_FEVER_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_207269_EFFECT_1;
386 pub(crate) const FS_GHOULS_MAX: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_85948_EFFECT_4;
387 pub(crate) const FS_GHOULS_MIN: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_85948_EFFECT_3;
388 pub(crate) const FORBIDDEN_KNOWLEDGE_READY_STACKS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1256565_EFFECT_2;
389 pub(crate) const FORBIDDEN_KNOWLEDGE_PUTREFY_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1256566_EFFECT_2;
390 pub(crate) const FORBIDDEN_KNOWLEDGE_PROC_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1256566_EFFECT_3;
391 pub(crate) const FURY_EXTENSION_SECONDS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_444069_EFFECT_3;
392 pub(crate) const FURY_MAX_SECONDS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_444069_EFFECT_2;
393 pub(crate) const FURY_RP_THRESHOLD: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_444069_EFFECT_1;
394 pub(crate) const GARGOYLE_STRIKE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_51963_EFFECT_1;
395 pub(crate) const GRAVE_MASTERY_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1238902_EFFECT_1;
396 pub(crate) const HARBINGER_SD_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_276023_EFFECT_2;
397 pub(crate) const ICY_FURY_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_444834_EFFECT_2;
398 pub(crate) const LESSER_CLAW: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_199373_EFFECT_1;
399 pub(crate) const LESSER_SWEEPING: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1278150_EFFECT_2;
400 pub(crate) const MAGUS_FROSTBOLT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_317792_EFFECT_1;
401 pub(crate) const MAGUS_NECROTIC_BOLT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1297055_EFFECT_1;
402 pub(crate) const MAGUS_SHADOW_BOLT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_317791_EFFECT_1;
403 pub(crate) const MAGUS_WITHERING_GRASP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1297091_EFFECT_1;
404 pub(crate) const LORD_OF_THE_DEAD_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1256813_EFFECT_1;
405 pub(crate) const LORD_OF_THE_DEAD_DIRECT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1256813_EFFECT_4;
406 pub(crate) const LORD_OF_THE_DEAD_PERIODIC: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1256813_EFFECT_3;
407 pub(crate) const EPIDEMIC_ORDER_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1300330_EFFECT_1;
408 pub(crate) const LET_TERROR_REIGN_UNHOLY_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1265949_EFFECT_2;
409 pub(crate) const MOGRAINE_DND: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1251951_EFFECT_1;
410 pub(crate) const MOGRAINE_DND_PERIOD: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_444474_EFFECT_3;
411 pub(crate) const MOGRAINE_HEART_STRIKE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_445504_EFFECT_1;
412 pub(crate) const NAZGRIM_CONQUEST_BASE_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_444763_EFFECT_1;
413 pub(crate) const NAZGRIM_SCOURGE_STRIKE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_445508_EFFECT_1;
414 pub(crate) const NAZGRIM_SCOURGE_STRIKE_SHADOW: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_445509_EFFECT_1;
415 pub(crate) const NECROTIC_SHADOW: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1242178_EFFECT_1;
416 pub(crate) const NECROTIC_STRIKE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1242172_EFFECT_1;
417 pub(crate) const PUTREFY_AOE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_390220_EFFECT_1;
418 pub(crate) const PUTREFY_ST: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1277016_EFFECT_1;
419 pub(crate) const RC_CHANCE_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_51462_EFFECT_1;
420 pub(crate) const RUPTURED_VISCERA: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1247379_EFFECT_1;
421 pub(crate) const SCYTHE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_458128_EFFECT_1;
422 pub(crate) const SD_DC_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_81340_EFFECT_4;
423 pub(crate) const SR_GHOULS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_343294_EFFECT_3;
424 pub(crate) const SS_ERUPT_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_55090_EFFECT_2;
425 pub(crate) const SUDDEN_DOOM_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_49530_EFFECT_2;
426 pub(crate) const SWEEPING_MAIN: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_91778_EFFECT_2;
427 pub(crate) const TROLLBANE_OBLITERATE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_445507_EFFECT_1;
428 pub(crate) const VP_TICK: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_191587_EFFECT_1;
429 pub(crate) const WHITEMANE_DEATH_COIL: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_445513_EFFECT_1;
430 pub(crate) const MID2_4PC_DIRECT_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1296655_EFFECT_1;
431 pub(crate) const MID2_4PC_PERIODIC_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1296655_EFFECT_2;
432 pub(crate) const MID2_4PC_EXECUTE_THRESHOLD: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::EFFECT::SPELL_1296655_EFFECT_3;
433}
434pub(crate) const AURA_SUDDEN_DOOM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_SUDDEN_DOOM
435 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
436pub(crate) const AURA_RUNIC_CORRUPTION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_RUNIC_CORRUPTION
437 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
438pub(crate) const AURA_FESTERING_SCYTHE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_FESTERING_SCYTHE
439 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
440pub(crate) const AURA_FESTERING_SCYTHE_TT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_FESTERING_SCYTHE_TT
441 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
442pub(crate) const AURA_COIL_OF_DEVASTATION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_COIL_OF_DEVASTATION
443 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
444pub(crate) const AURA_APOCALYPSE_DEATH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_APOCALYPSE_DEATH
445 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
446pub(crate) const AURA_APOCALYPSE_FAMINE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_APOCALYPSE_FAMINE
447 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
448pub(crate) const AURA_APOCALYPSE_PESTILENCE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_APOCALYPSE_PESTILENCE
449 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
450pub(crate) const AURA_APOCALYPSE_WAR: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_APOCALYPSE_WAR
451 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
452pub(crate) const AURA_SOUL_REAPER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_SOUL_REAPER
453 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
454pub(crate) const AURA_MOGRAINES_MIGHT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_MOGRAINES_MIGHT
455 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
456pub(crate) const AURA_APOCALYPTIC_CONQUEST: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_APOCALYPTIC_CONQUEST
457 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
458pub(crate) const AURA_TROLLBANE_CHAINS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_TROLLBANE_CHAINS
459 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
460pub(crate) const AURA_UNDEATH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_UNDEATH
461 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
462pub(crate) const AURA_REAPING: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_REAPING
463 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
464pub(crate) const AURA_FORBIDDEN_KNOWLEDGE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_FORBIDDEN_KNOWLEDGE
465 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
466pub(crate) const AURA_BLIGHTFALL: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_BLIGHTFALL
467 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
468pub(crate) const AURA_ICY_TALONS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_ICY_TALONS
469 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
470pub(crate) const AURA_RUNE_MASTERY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_RUNE_MASTERY
471 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
472pub(crate) const AURA_BRITTLE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_BRITTLE
473 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
474pub(crate) const AURA_VIRULENT_PLAGUE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_VIRULENT_PLAGUE
475 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
476pub(crate) const AURA_DREAD_PLAGUE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_DREAD_PLAGUE
477 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
478pub(crate) const AURA_INFECTED_CLAWS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_INFECTED_CLAWS
479 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
480pub(crate) const AURA_LESSER_GHOUL: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_LESSER_GHOUL
481 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
482pub(crate) const AURA_LESSER_GHOUL_COUNTER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_LESSER_GHOUL_COUNTER
483 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
484pub(crate) const AURA_UNHOLY_DEVOTION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_UNHOLY_DEVOTION
485 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
486pub(crate) const AURA_GARGOYLE_ACTIVE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_GARGOYLE_ACTIVE
487 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
488pub(crate) const AURA_GARGOYLE_EMPOWERMENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_GARGOYLE_EMPOWERMENT
489 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
490pub(crate) const AURA_DARK_TRANSFORMATION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_DARK_TRANSFORMATION
491 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
492pub(crate) const AURA_COMMANDER_OF_THE_DEAD: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::AURA_COMMANDER_OF_THE_DEAD
493 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
494pub(crate) const AURA_COUNT: usize = 30;
495const _: () = assert!(
496 AURA_COUNT == 30, "AURA index ABI: count changed -- update positional hook consumers"
497);
498pub(crate) const SPELL_FESTERING_STRIKE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::SPELL_FESTERING_STRIKE
499 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
500pub(crate) const SPELL_SCOURGE_STRIKE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::SPELL_SCOURGE_STRIKE
501 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
502pub(crate) const SPELL_DEATH_COIL: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::SPELL_DEATH_COIL
503 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
504pub(crate) const SPELL_EPIDEMIC: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::SPELL_EPIDEMIC
505 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
506pub(crate) const SPELL_SOUL_REAPER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::SPELL_SOUL_REAPER
507 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
508pub(crate) const SPELL_OUTBREAK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::SPELL_OUTBREAK
509 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
510pub(crate) const SPELL_GARGOYLE_STRIKE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::SPELL_GARGOYLE_STRIKE
511 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
512pub(crate) const SPELL_DARK_TRANSFORMATION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::SPELL_DARK_TRANSFORMATION
513 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
514pub(crate) const SPELL_ARMY_OF_THE_DEAD: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::SPELL_ARMY_OF_THE_DEAD
515 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
516pub(crate) const SPELL_PUTREFY: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::unholy_death_knight::SPELL_PUTREFY
517 .bind(wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF);
518pub(crate) const SPELL_COUNT: usize = 10;
519const _: () = assert!(
520 SPELL_COUNT == 10,
521 "SPELL index ABI: count changed -- update positional hook consumers"
522);
523pub(crate) mod EFFECT {
524 pub(crate) const APOCALYPSE_NOW_DURATION: (u32, u8) = (444_040, 2);
526 pub(crate) const ARMY_GHOUL_COUNT: (u32, u8) = (42650, 1);
528 pub(crate) const BLIGHTBURST_DAMAGE: (u32, u8) = (1_254_552, 2);
530 pub(crate) const BLIGHTBURST_DURATION: (u32, u8) = (1_254_552, 1);
532 pub(crate) const CLAW: (u32, u8) = (91776, 1);
534 pub(crate) const COIL_OF_DEVASTATION_PCT: (u32, u8) = (390_270, 1);
536 pub(crate) const COMMANDER_PCT: (u32, u8) = (390_260, 3);
538 pub(crate) const DC_DAMAGE: (u32, u8) = (47632, 1);
540 pub(crate) const DP_TICK: (u32, u8) = (1_240_996, 1);
542 pub(crate) const DREADBLADE_PET_CRIT: (u32, u8) = (77515, 6);
544 pub(crate) const DT_ENERGY_PCT: (u32, u8) = (1_233_448, 4);
546 pub(crate) const DT_PET_PCT: (u32, u8) = (1_233_448, 1);
548 pub(crate) const ETERNAL_AGONY_EXTENSION_MS: (u32, u8) = (390_268, 1);
550 pub(crate) const EBON_FEVER_PCT: (u32, u8) = (207_269, 1);
552 pub(crate) const FS_GHOULS_MAX: (u32, u8) = (85948, 4);
554 pub(crate) const FS_GHOULS_MIN: (u32, u8) = (85948, 3);
556 pub(crate) const FORBIDDEN_KNOWLEDGE_READY_STACKS: (u32, u8) = (1_256_565, 2);
558 pub(crate) const FORBIDDEN_KNOWLEDGE_PUTREFY_PCT: (u32, u8) = (1_256_566, 2);
560 pub(crate) const FORBIDDEN_KNOWLEDGE_PROC_PCT: (u32, u8) = (1_256_566, 3);
562 pub(crate) const FURY_EXTENSION_SECONDS: (u32, u8) = (444_069, 3);
564 pub(crate) const FURY_MAX_SECONDS: (u32, u8) = (444_069, 2);
566 pub(crate) const FURY_RP_THRESHOLD: (u32, u8) = (444_069, 1);
568 pub(crate) const GARGOYLE_STRIKE: (u32, u8) = (51963, 1);
570 pub(crate) const GRAVE_MASTERY_PCT: (u32, u8) = (1_238_902, 1);
572 pub(crate) const HARBINGER_SD_PCT: (u32, u8) = (276_023, 2);
574 pub(crate) const ICY_FURY_DAMAGE: (u32, u8) = (444_834, 2);
576 pub(crate) const LESSER_CLAW: (u32, u8) = (199_373, 1);
578 pub(crate) const LESSER_SWEEPING: (u32, u8) = (1_278_150, 2);
580 pub(crate) const MAGUS_FROSTBOLT: (u32, u8) = (317_792, 1);
582 pub(crate) const MAGUS_NECROTIC_BOLT: (u32, u8) = (1_297_055, 1);
584 pub(crate) const MAGUS_SHADOW_BOLT: (u32, u8) = (317_791, 1);
586 pub(crate) const MAGUS_WITHERING_GRASP: (u32, u8) = (1_297_091, 1);
588 pub(crate) const LORD_OF_THE_DEAD_CHANCE: (u32, u8) = (1_256_813, 1);
590 pub(crate) const LORD_OF_THE_DEAD_DIRECT: (u32, u8) = (1_256_813, 4);
592 pub(crate) const LORD_OF_THE_DEAD_PERIODIC: (u32, u8) = (1_256_813, 3);
594 pub(crate) const EPIDEMIC_ORDER_DAMAGE: (u32, u8) = (1_300_330, 1);
596 pub(crate) const LET_TERROR_REIGN_UNHOLY_PCT: (u32, u8) = (1_265_949, 2);
598 pub(crate) const MOGRAINE_DND: (u32, u8) = (1_251_951, 1);
600 pub(crate) const MOGRAINE_DND_PERIOD: (u32, u8) = (444_474, 3);
602 pub(crate) const MOGRAINE_HEART_STRIKE: (u32, u8) = (445_504, 1);
604 pub(crate) const NAZGRIM_CONQUEST_BASE_PCT: (u32, u8) = (444_763, 1);
606 pub(crate) const NAZGRIM_SCOURGE_STRIKE: (u32, u8) = (445_508, 1);
608 pub(crate) const NAZGRIM_SCOURGE_STRIKE_SHADOW: (u32, u8) = (445_509, 1);
610 pub(crate) const NECROTIC_SHADOW: (u32, u8) = (1_242_178, 1);
612 pub(crate) const NECROTIC_STRIKE: (u32, u8) = (1_242_172, 1);
614 pub(crate) const PUTREFY_AOE: (u32, u8) = (390_220, 1);
616 pub(crate) const PUTREFY_ST: (u32, u8) = (1_277_016, 1);
618 pub(crate) const RC_CHANCE_PCT: (u32, u8) = (51462, 1);
620 pub(crate) const RUPTURED_VISCERA: (u32, u8) = (1_247_379, 1);
622 pub(crate) const SCYTHE_DAMAGE: (u32, u8) = (458_128, 1);
624 pub(crate) const SD_DC_PCT: (u32, u8) = (81340, 4);
626 pub(crate) const SR_GHOULS: (u32, u8) = (343_294, 3);
628 pub(crate) const SS_ERUPT_PCT: (u32, u8) = (55090, 2);
630 pub(crate) const SUDDEN_DOOM_PCT: (u32, u8) = (49530, 2);
632 pub(crate) const SWEEPING_MAIN: (u32, u8) = (91778, 2);
634 pub(crate) const TROLLBANE_OBLITERATE: (u32, u8) = (445_507, 1);
636 pub(crate) const VP_TICK: (u32, u8) = (191_587, 1);
638 pub(crate) const WHITEMANE_DEATH_COIL: (u32, u8) = (445_513, 1);
640 pub(crate) const MID2_4PC_DIRECT_PCT: (u32, u8) = (1_296_655, 1);
642 pub(crate) const MID2_4PC_PERIODIC_PCT: (u32, u8) = (1_296_655, 2);
644 pub(crate) const MID2_4PC_EXECUTE_THRESHOLD: (u32, u8) = (1_296_655, 3);
646}
647static REPORTED_SPELLS: &[(&str, u32)] = &[
648 ("auto_attack", 6603),
649 ("claw", 199_373),
650 ("death_and_decay", 1_251_951),
651 ("death_coil_let_terror_reign", 1_265_949),
652 ("dread_plague_erupt", 1_241_171),
653 ("festering_scythe", 458_128),
654 ("heart_strike", 445_504),
655 ("necrotic_bolt", 1_297_055),
656 ("necrotic_coil_shadow", 1_242_178),
657 ("obliterate", 445_507),
658 ("pestilence_runeforge", 327_093),
659 ("scourge_strike_shadow", 445_509),
660 ("sweeping_claws", 1_278_150),
661 ("trollbanes_icy_fury", 444_834),
662 ("undeath", 444_633),
663 ("virulent_plague_erupt", 1_241_167),
664 ("whitemane_death_coil", 445_513),
665 ("withering_grasp", 1_297_091),
666];
667static DECLARED_SPELL_IDS: &[u32] = &[
668 85948, 55090, 47541, 212_739, 343_294, 77575, 51963, 1_233_448, 42650, 1_247_378,
669 81340, 51460, 458_123, 1_241_077, 390_271, 327_095, 327_092, 327_093, 327_096,
670 1_241_521, 444_505, 444_763, 444_828, 444_633, 1_242_654, 1_242_223, 1_271_975,
671 194_879, 374_585, 374_557, 191_587, 1_240_996, 1_241_786, 1_254_252, 1_242_998,
672 1_270_491, 49206, 211_947, 1_235_391, 390_260, 444_040, 1_254_552, 374_504,
673 1_256_565, 1_256_566, 444_069, 1_238_900, 1_265_949, 1_256_813, 444_052, 444_005,
674 1_242_147, 444_097, 1_241_858, 444_033, 6603, 47632, 49530, 51462, 77515, 91776,
675 91778, 199_373, 207_269, 276_023, 317_791, 317_792, 390_220, 390_268, 390_270,
676 444_474, 444_834, 445_504, 445_507, 445_508, 445_509, 445_513, 458_128, 1_238_902,
677 1_241_167, 1_241_171, 1_242_172, 1_242_178, 1_247_379, 1_251_951, 1_277_016,
678 1_278_150, 1_296_655, 1_297_055, 1_297_091, 1_300_330, 444_248, 444_252, 454_389,
679 444_254, 444_251,
680];
681static DECLARED_AURA_IDS: &[u32] = &[
682 81340, 51460, 458_123, 1_241_077, 390_271, 327_095, 327_092, 327_093, 327_096,
683 1_241_521, 444_505, 444_763, 444_828, 444_633, 1_242_654, 1_242_223, 1_271_975,
684 194_879, 374_585, 374_557, 191_587, 1_240_996, 1_241_786, 1_254_252, 1_242_998,
685 1_270_491, 49206, 211_947, 1_235_391, 390_260,
686];
687static TALENTS: &[(&str, u32)] = &[
688 ("APOCALYPSE_NOW", TALENT::APOCALYPSE_NOW),
689 ("ARMY_OF_THE_DEAD", TALENT::ARMY_OF_THE_DEAD),
690 ("BLIGHTBURST", TALENT::BLIGHTBURST),
691 ("BRITTLE", TALENT::BRITTLE),
692 ("DARK_TRANSFORMATION", TALENT::DARK_TRANSFORMATION),
693 ("FORBIDDEN_KNOWLEDGE_2", TALENT::FORBIDDEN_KNOWLEDGE_2),
694 ("FORBIDDEN_KNOWLEDGE_3", TALENT::FORBIDDEN_KNOWLEDGE_3),
695 ("FURY_OF_THE_HORSEMEN", TALENT::FURY_OF_THE_HORSEMEN),
696 ("GRAVE_MASTERY", TALENT::GRAVE_MASTERY),
697 ("LET_TERROR_REIGN", TALENT::LET_TERROR_REIGN),
698 ("LORD_OF_THE_DEAD", TALENT::LORD_OF_THE_DEAD),
699 ("NAZGRIMS_CONQUEST", TALENT::NAZGRIMS_CONQUEST),
700 ("OUTBREAK", TALENT::OUTBREAK),
701 ("PUTREFY", TALENT::PUTREFY),
702 ("RIDERS_CHAMPION", TALENT::RIDERS_CHAMPION),
703 ("SCOURGE_STRIKE", TALENT::SCOURGE_STRIKE),
704 ("SOUL_REAPER", TALENT::SOUL_REAPER),
705 ("SUMMON_GARGOYLE", TALENT::SUMMON_GARGOYLE),
706 ("TROLLBANES_ICY_FURY", TALENT::TROLLBANES_ICY_FURY),
707 ("UNHOLY_DEVOTION", TALENT::UNHOLY_DEVOTION),
708 ("WHITEMANES_FAMINE", TALENT::WHITEMANES_FAMINE),
709];
710pub(crate) mod UNHOLY_DK {
711 pub(crate) const FESTERING_STRIKE_CASTS: u32 = 0;
712 pub(crate) const SCOURGE_STRIKE_CASTS: u32 = 1;
713 pub(crate) const DEATH_COIL_CASTS: u32 = 2;
714 pub(crate) const DARK_TRANSFORMATION_CASTS: u32 = 3;
715 pub(crate) const ARMY_OF_THE_DEAD_CASTS: u32 = 4;
716 pub(crate) const SOUL_REAPER_CASTS: u32 = 5;
717 pub(crate) const PUTREFY_CASTS: u32 = 6;
718 pub(crate) const DARK_TRANSFORMATION_UPTIME_MS: u32 = 7;
719 pub(crate) const VIRULENT_PLAGUE_UPTIME_MS: u32 = 8;
720}
721fn aura_sudden_doom(
722 a: AuraDefinitionDraft,
723 data: &ResolvedGameData,
724) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
725 Ok(
726 a
727 .on_player()
728 .apply_base_from_data(data, 81340)?
729 .max_stacks(
730 data
731 .require_aura_max_stacks(
732 wowlab_types::sim::SpellIdx::from_raw(81340),
733 )?,
734 ),
735 )
736}
737fn aura_runic_corruption(
738 a: AuraDefinitionDraft,
739 data: &ResolvedGameData,
740) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
741 Ok(
742 a
743 .on_player()
744 .apply_base_from_data(data, 51460)?
745 .max_stacks(
746 data
747 .require_aura_max_stacks(
748 wowlab_types::sim::SpellIdx::from_raw(51460),
749 )?,
750 ),
751 )
752}
753fn aura_festering_scythe(
754 a: AuraDefinitionDraft,
755 data: &ResolvedGameData,
756) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
757 Ok(
758 a
759 .on_player()
760 .apply_base_from_data(data, 458_123)?
761 .max_stacks(
762 data
763 .require_aura_max_stacks(
764 wowlab_types::sim::SpellIdx::from_raw(458_123),
765 )?,
766 ),
767 )
768}
769fn aura_festering_scythe_tt(
770 a: AuraDefinitionDraft,
771 data: &ResolvedGameData,
772) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
773 Ok(
774 a
775 .on_player()
776 .apply_base_from_data(data, 1_241_077)?
777 .max_stacks(
778 data
779 .require_aura_max_stacks(
780 wowlab_types::sim::SpellIdx::from_raw(1_241_077),
781 )?,
782 ),
783 )
784}
785fn aura_coil_of_devastation(
786 a: AuraDefinitionDraft,
787 data: &ResolvedGameData,
788) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
789 a.on_target()
790 .apply_base_from_data(data, 390_271)?
791 .max_stacks(
792 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(390_271))?,
793 )
794 .periodic_residual_damage(
795 wowlab_engine_combat::validated_milliseconds(
796 data.period(wowlab_types::sim::SpellIdx::from_raw(390_271), 1),
797 390_271,
798 "periodic_residual_damage.tick_ms",
799 )?,
800 )
801 .apply_periodic_behavior_from_data(data, 390_271)
802}
803fn aura_apocalypse_death(
804 a: AuraDefinitionDraft,
805 data: &ResolvedGameData,
806) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
807 Ok(
808 a
809 .on_target()
810 .apply_base_from_data(data, 327_095)?
811 .max_stacks(
812 data
813 .require_aura_max_stacks(
814 wowlab_types::sim::SpellIdx::from_raw(327_095),
815 )?,
816 ),
817 )
818}
819fn aura_apocalypse_famine(
820 a: AuraDefinitionDraft,
821 data: &ResolvedGameData,
822) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
823 Ok(
824 a
825 .on_target()
826 .apply_base_from_data(data, 327_092)?
827 .max_stacks(
828 data
829 .require_aura_max_stacks(
830 wowlab_types::sim::SpellIdx::from_raw(327_092),
831 )?,
832 ),
833 )
834}
835fn aura_apocalypse_pestilence(
836 a: AuraDefinitionDraft,
837 data: &ResolvedGameData,
838) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
839 Ok(
840 a
841 .on_target()
842 .apply_base_from_data(data, 327_093)?
843 .max_stacks(
844 data
845 .require_aura_max_stacks(
846 wowlab_types::sim::SpellIdx::from_raw(327_093),
847 )?,
848 )
849 .async_stacks(),
850 )
851}
852fn aura_apocalypse_war(
853 a: AuraDefinitionDraft,
854 data: &ResolvedGameData,
855) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
856 Ok(
857 a
858 .on_target()
859 .apply_base_from_data(data, 327_096)?
860 .max_stacks(
861 data
862 .require_aura_max_stacks(
863 wowlab_types::sim::SpellIdx::from_raw(327_096),
864 )?,
865 ),
866 )
867}
868fn aura_soul_reaper(
869 a: AuraDefinitionDraft,
870 data: &ResolvedGameData,
871) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
872 Ok(
873 a
874 .on_target()
875 .apply_base_from_data(data, 1_241_521)?
876 .max_stacks(
877 data
878 .require_aura_max_stacks(
879 wowlab_types::sim::SpellIdx::from_raw(1_241_521),
880 )?,
881 ),
882 )
883}
884fn aura_mograines_might(
885 a: AuraDefinitionDraft,
886 data: &ResolvedGameData,
887) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
888 Ok(
889 a
890 .on_player()
891 .apply_base_from_data(data, 444_505)?
892 .max_stacks(
893 data
894 .require_aura_max_stacks(
895 wowlab_types::sim::SpellIdx::from_raw(444_505),
896 )?,
897 ),
898 )
899}
900fn aura_apocalyptic_conquest(
901 a: AuraDefinitionDraft,
902 data: &ResolvedGameData,
903) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
904 a.on_player()
905 .apply_base_from_data(data, 444_763)?
906 .max_stacks(
907 wowlab_engine_combat::validated_max_stacks(
908 255.0,
909 444_763,
910 "aura.max_stacks",
911 )?,
912 )
913 .primary_pct_per_stack(
914 data.base_points(wowlab_types::sim::SpellIdx::from_raw(444_052), 2),
915 )
916}
917fn aura_trollbane_chains(
918 a: AuraDefinitionDraft,
919 data: &ResolvedGameData,
920) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
921 Ok(
922 a
923 .on_target()
924 .apply_base_from_data(data, 444_828)?
925 .max_stacks(
926 data
927 .require_aura_max_stacks(
928 wowlab_types::sim::SpellIdx::from_raw(444_828),
929 )?,
930 ),
931 )
932}
933fn aura_undeath(
934 a: AuraDefinitionDraft,
935 data: &ResolvedGameData,
936) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
937 Ok(
938 a
939 .on_target()
940 .apply_base_from_data(data, 444_633)?
941 .max_stacks(
942 wowlab_engine_combat::validated_max_stacks(
943 255.0,
944 444_633,
945 "aura.max_stacks",
946 )?,
947 )
948 .periodic_damage_scales_with_stacks()
949 .periodic_hook(
950 wowlab_engine_combat::validated_milliseconds(
951 data.period(wowlab_types::sim::SpellIdx::from_raw(444_633), 1),
952 444_633,
953 "periodic_hook.tick_ms",
954 )?,
955 )
956 .apply_periodic_behavior_from_data(data, 444_633)?
957 .tick_hook(crate::hooks::unholy_death_knight::undeath_tick_hook),
958 )
959}
960fn aura_reaping(
961 a: AuraDefinitionDraft,
962 data: &ResolvedGameData,
963) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
964 Ok(
965 a
966 .on_player()
967 .apply_base_from_data(data, 1_242_654)?
968 .max_stacks(
969 data
970 .require_aura_max_stacks(
971 wowlab_types::sim::SpellIdx::from_raw(1_242_654),
972 )?,
973 ),
974 )
975}
976fn aura_forbidden_knowledge(
977 a: AuraDefinitionDraft,
978 data: &ResolvedGameData,
979) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
980 Ok(
981 a
982 .on_player()
983 .apply_base_from_data(data, 1_242_223)?
984 .max_stacks(
985 data
986 .require_aura_max_stacks(
987 wowlab_types::sim::SpellIdx::from_raw(1_242_223),
988 )?,
989 ),
990 )
991}
992fn aura_blightfall(
993 a: AuraDefinitionDraft,
994 data: &ResolvedGameData,
995) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
996 Ok(
997 a
998 .on_player()
999 .apply_base_from_data(data, 1_271_975)?
1000 .max_stacks(
1001 data
1002 .require_aura_max_stacks(
1003 wowlab_types::sim::SpellIdx::from_raw(1_271_975),
1004 )?,
1005 ),
1006 )
1007}
1008fn aura_icy_talons(
1009 a: AuraDefinitionDraft,
1010 data: &ResolvedGameData,
1011) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1012 Ok(
1013 a
1014 .on_player()
1015 .apply_base_from_data(data, 194_879)?
1016 .max_stacks(
1017 data
1018 .require_aura_max_stacks(
1019 wowlab_types::sim::SpellIdx::from_raw(194_879),
1020 )?,
1021 ),
1022 )
1023}
1024fn aura_rune_mastery(
1025 a: AuraDefinitionDraft,
1026 data: &ResolvedGameData,
1027) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1028 a.on_player()
1029 .apply_base_from_data(data, 374_585)?
1030 .max_stacks(
1031 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(374_585))?,
1032 )
1033 .primary_pct_per_stack(
1034 data.base_points(wowlab_types::sim::SpellIdx::from_raw(374_585), 1),
1035 )
1036}
1037fn aura_brittle(
1038 a: AuraDefinitionDraft,
1039 data: &ResolvedGameData,
1040) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1041 Ok(
1042 a
1043 .on_target()
1044 .apply_base_from_data(data, 374_557)?
1045 .max_stacks(
1046 data
1047 .require_aura_max_stacks(
1048 wowlab_types::sim::SpellIdx::from_raw(374_557),
1049 )?,
1050 ),
1051 )
1052}
1053fn aura_virulent_plague(
1054 a: AuraDefinitionDraft,
1055 data: &ResolvedGameData,
1056) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1057 Ok(
1058 a
1059 .on_target()
1060 .apply_base_from_data(data, 191_587)?
1061 .max_stacks(
1062 data
1063 .require_aura_max_stacks(
1064 wowlab_types::sim::SpellIdx::from_raw(191_587),
1065 )?,
1066 )
1067 .periodic_hook(
1068 wowlab_engine_combat::validated_milliseconds(
1069 data.period(wowlab_types::sim::SpellIdx::from_raw(191_587), 1),
1070 191_587,
1071 "periodic_hook.tick_ms",
1072 )?,
1073 )
1074 .apply_periodic_behavior_from_data(data, 191_587)?
1075 .tick_hook(crate::hooks::unholy_death_knight::disease_tick_hook),
1076 )
1077}
1078fn aura_dread_plague(
1079 a: AuraDefinitionDraft,
1080 data: &ResolvedGameData,
1081) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1082 Ok(
1083 a
1084 .on_target()
1085 .apply_base_from_data(data, 1_240_996)?
1086 .max_stacks(
1087 data
1088 .require_aura_max_stacks(
1089 wowlab_types::sim::SpellIdx::from_raw(1_240_996),
1090 )?,
1091 )
1092 .periodic_hook(
1093 wowlab_engine_combat::validated_milliseconds(
1094 data.period(wowlab_types::sim::SpellIdx::from_raw(1_240_996), 1),
1095 1_240_996,
1096 "periodic_hook.tick_ms",
1097 )?,
1098 )
1099 .apply_periodic_behavior_from_data(data, 1_240_996)?
1100 .tick_hook(crate::hooks::unholy_death_knight::disease_tick_hook),
1101 )
1102}
1103fn aura_infected_claws(
1104 a: AuraDefinitionDraft,
1105 data: &ResolvedGameData,
1106) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1107 Ok(
1108 a
1109 .on_target()
1110 .apply_base_from_data(data, 1_241_786)?
1111 .max_stacks(
1112 data
1113 .require_aura_max_stacks(
1114 wowlab_types::sim::SpellIdx::from_raw(1_241_786),
1115 )?,
1116 ),
1117 )
1118}
1119fn aura_lesser_ghoul(
1120 a: AuraDefinitionDraft,
1121 data: &ResolvedGameData,
1122) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1123 Ok(
1124 a
1125 .on_player()
1126 .apply_base_from_data(data, 1_254_252)?
1127 .max_stacks(
1128 wowlab_engine_combat::validated_max_stacks(
1129 8.0,
1130 1_254_252,
1131 "aura.max_stacks",
1132 )?,
1133 ),
1134 )
1135}
1136fn aura_lesser_ghoul_counter(
1137 a: AuraDefinitionDraft,
1138 data: &ResolvedGameData,
1139) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1140 Ok(
1141 a
1142 .on_player()
1143 .apply_base_from_data(data, 1_242_998)?
1144 .max_stacks(
1145 wowlab_engine_combat::validated_max_stacks(
1146 20.0,
1147 1_242_998,
1148 "aura.max_stacks",
1149 )?,
1150 ),
1151 )
1152}
1153fn aura_unholy_devotion(
1154 a: AuraDefinitionDraft,
1155 data: &ResolvedGameData,
1156) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1157 Ok(
1158 a
1159 .on_pet()
1160 .apply_base_from_data(data, 1_270_491)?
1161 .max_stacks(
1162 data
1163 .require_aura_max_stacks(
1164 wowlab_types::sim::SpellIdx::from_raw(1_270_491),
1165 )?,
1166 )
1167 .async_stacks(),
1168 )
1169}
1170fn aura_gargoyle_active(
1171 a: AuraDefinitionDraft,
1172 data: &ResolvedGameData,
1173) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1174 a.on_player()
1175 .apply_base_from_data(data, 49206)?
1176 .no_pandemic()
1177 .max_stacks(
1178 wowlab_engine_combat::validated_max_stacks(1.0, 49206, "aura.max_stacks")?,
1179 )
1180 .crit_chance_spells(100.0, &[51963])
1181}
1182fn aura_gargoyle_empowerment(
1183 a: AuraDefinitionDraft,
1184 data: &ResolvedGameData,
1185) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1186 a.on_player()
1187 .apply_base_from_data(data, 211_947)?
1188 .max_stacks(
1189 wowlab_engine_combat::validated_max_stacks(
1190 255.0,
1191 211_947,
1192 "aura.max_stacks",
1193 )?,
1194 )
1195 .damage_percent_spells_linear(
1196 data.base_points(wowlab_types::sim::SpellIdx::from_raw(211_947), 1),
1197 &[51963],
1198 )
1199}
1200fn aura_dark_transformation(
1201 a: AuraDefinitionDraft,
1202 data: &ResolvedGameData,
1203) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1204 Ok(
1205 a
1206 .on_player()
1207 .apply_base_from_data(data, 1_235_391)?
1208 .max_stacks(
1209 data
1210 .require_aura_max_stacks(
1211 wowlab_types::sim::SpellIdx::from_raw(1_235_391),
1212 )?,
1213 ),
1214 )
1215}
1216fn aura_commander_of_the_dead(
1217 a: AuraDefinitionDraft,
1218 data: &ResolvedGameData,
1219) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1220 Ok(
1221 a
1222 .on_player()
1223 .apply_base_from_data(data, 390_260)?
1224 .max_stacks(
1225 data
1226 .require_aura_max_stacks(
1227 wowlab_types::sim::SpellIdx::from_raw(390_260),
1228 )?,
1229 ),
1230 )
1231}
1232fn spell_festering_strike(
1233 s: SpellDefinitionDraft,
1234 data: &ResolvedGameData,
1235) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1236 Ok(
1237 s
1238 .apply_base_from_data(data, 85948)?
1239 .apply_aoe_from_data(data)
1240 .on_cast(crate::hooks::unholy_death_knight::festering_strike_hook),
1241 )
1242}
1243fn spell_scourge_strike(
1244 s: SpellDefinitionDraft,
1245 data: &ResolvedGameData,
1246) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1247 Ok(
1248 s
1249 .apply_base_from_data(data, 55090)?
1250 .apply_aoe_from_data(data)
1251 .on_cast(crate::hooks::unholy_death_knight::scourge_strike_hook),
1252 )
1253}
1254fn spell_death_coil(
1255 s: SpellDefinitionDraft,
1256 data: &ResolvedGameData,
1257) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1258 Ok(
1259 s
1260 .apply_base_from_data(data, 47541)?
1261 .extends_aura(AURA_VIRULENT_PLAGUE, 1500)
1262 .extends_aura(AURA_DREAD_PLAGUE, 1500)
1263 .apply_aoe_from_data(data)
1264 .on_cast(crate::hooks::unholy_death_knight::death_coil_hook)
1265 .cost_free_when_aura(81340),
1266 )
1267}
1268fn spell_epidemic(
1269 s: SpellDefinitionDraft,
1270 data: &ResolvedGameData,
1271) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1272 Ok(
1273 s
1274 .apply_base_from_data(data, 212_739)?
1275 .apply_aoe_from_data(data)
1276 .on_cast(crate::hooks::unholy_death_knight::epidemic_hook),
1277 )
1278}
1279fn spell_soul_reaper(
1280 s: SpellDefinitionDraft,
1281 data: &ResolvedGameData,
1282) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1283 Ok(
1284 s
1285 .apply_base_from_data(data, 343_294)?
1286 .applies_inferred_aura(AURA_SOUL_REAPER, 1_241_521)
1287 .apply_aoe_from_data(data)
1288 .on_cast(crate::hooks::unholy_death_knight::soul_reaper_hook),
1289 )
1290}
1291fn spell_outbreak(
1292 s: SpellDefinitionDraft,
1293 data: &ResolvedGameData,
1294) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1295 Ok(
1296 s
1297 .apply_base_from_data(data, 77575)?
1298 .apply_aoe_from_data(data)
1299 .on_cast(crate::hooks::unholy_death_knight::outbreak_hook),
1300 )
1301}
1302fn spell_gargoyle_strike(
1303 s: SpellDefinitionDraft,
1304 data: &ResolvedGameData,
1305) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1306 Ok(s.apply_base_from_data(data, 51963)?.apply_aoe_from_data(data))
1307}
1308fn spell_dark_transformation(
1309 s: SpellDefinitionDraft,
1310 data: &ResolvedGameData,
1311) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1312 Ok(
1313 s
1314 .apply_base_from_data(data, 1_233_448)?
1315 .applies_aura(AURA_DARK_TRANSFORMATION)
1316 .apply_aoe_from_data(data)
1317 .on_cast(crate::hooks::unholy_death_knight::dark_transformation_hook),
1318 )
1319}
1320fn spell_army_of_the_dead(
1321 s: SpellDefinitionDraft,
1322 data: &ResolvedGameData,
1323) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1324 Ok(
1325 s
1326 .apply_base_from_data(data, 42650)?
1327 .apply_aoe_from_data(data)
1328 .on_cast(crate::hooks::unholy_death_knight::army_of_the_dead_hook),
1329 )
1330}
1331fn spell_putrefy(
1332 s: SpellDefinitionDraft,
1333 data: &ResolvedGameData,
1334) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1335 Ok(
1336 s
1337 .apply_base_from_data(data, 1_247_378)?
1338 .apply_aoe_from_data(data)
1339 .on_cast(crate::hooks::unholy_death_knight::putrefy_hook),
1340 )
1341}
1342pub(crate) fn build_combat_system_draft(
1343 params: &wowlab_engine_ports::HandlerParams<'_>,
1344) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1345 let builder = CombatSystemBuilder::new(params.stats.clone())
1346 .spec_id(SpecId::Unholy)
1347 .spec_identity(
1348 wowlab_engine_combat::generated_identities::specs::unholy_death_knight::PROOF,
1349 )
1350 .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1351 .effect_identities(
1352 wowlab_engine_combat::generated_identities::specs::unholy_death_knight::damage::ALL,
1353 )
1354 .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1355 .mastery_spell(77515)
1356 .mastery_hook(crate::hooks::unholy_death_knight::mastery)
1357 .resource("runes", 6.0, 0.0)
1358 .resource_type_id(5)
1359 .resource_start(6.0)
1360 .mastery_crit_damage_hook(crate::hooks::unholy_death_knight::crit_damage)
1361 .has_pet(true)
1362 .secondary_resource("runic_power", 100.0)
1363 .secondary_resource_type_id(6)
1364 .aura(
1365 "sudden_doom",
1366 AURA::SUDDEN_DOOM,
1367 |a| aura_sudden_doom(a, ¶ms.game_data),
1368 )
1369 .aura(
1370 "runic_corruption",
1371 AURA::RUNIC_CORRUPTION,
1372 |a| aura_runic_corruption(a, ¶ms.game_data),
1373 )
1374 .aura(
1375 "festering_scythe",
1376 AURA::FESTERING_SCYTHE,
1377 |a| aura_festering_scythe(a, ¶ms.game_data),
1378 )
1379 .aura(
1380 "festering_scythe_tt",
1381 AURA::FESTERING_SCYTHE_TT,
1382 |a| aura_festering_scythe_tt(a, ¶ms.game_data),
1383 )
1384 .aura(
1385 "coil_of_devastation",
1386 AURA::COIL_OF_DEVASTATION,
1387 |a| aura_coil_of_devastation(a, ¶ms.game_data),
1388 )
1389 .aura(
1390 "apocalypse_death",
1391 AURA::APOCALYPSE_DEATH,
1392 |a| aura_apocalypse_death(a, ¶ms.game_data),
1393 )
1394 .aura(
1395 "apocalypse_famine",
1396 AURA::APOCALYPSE_FAMINE,
1397 |a| aura_apocalypse_famine(a, ¶ms.game_data),
1398 )
1399 .aura(
1400 "apocalypse_pestilence",
1401 AURA::APOCALYPSE_PESTILENCE,
1402 |a| aura_apocalypse_pestilence(a, ¶ms.game_data),
1403 )
1404 .aura(
1405 "apocalypse_war",
1406 AURA::APOCALYPSE_WAR,
1407 |a| aura_apocalypse_war(a, ¶ms.game_data),
1408 )
1409 .aura(
1410 "soul_reaper",
1411 AURA::SOUL_REAPER,
1412 |a| aura_soul_reaper(a, ¶ms.game_data),
1413 )
1414 .aura(
1415 "mograines_might",
1416 AURA::MOGRAINES_MIGHT,
1417 |a| aura_mograines_might(a, ¶ms.game_data),
1418 )
1419 .aura(
1420 "apocalyptic_conquest",
1421 AURA::APOCALYPTIC_CONQUEST,
1422 |a| aura_apocalyptic_conquest(a, ¶ms.game_data),
1423 )
1424 .aura(
1425 "trollbane_chains",
1426 AURA::TROLLBANE_CHAINS,
1427 |a| aura_trollbane_chains(a, ¶ms.game_data),
1428 )
1429 .aura("undeath", AURA::UNDEATH, |a| aura_undeath(a, ¶ms.game_data))
1430 .aura("reaping", AURA::REAPING, |a| aura_reaping(a, ¶ms.game_data))
1431 .aura(
1432 "forbidden_knowledge",
1433 AURA::FORBIDDEN_KNOWLEDGE,
1434 |a| aura_forbidden_knowledge(a, ¶ms.game_data),
1435 )
1436 .aura("blightfall", AURA::BLIGHTFALL, |a| aura_blightfall(a, ¶ms.game_data))
1437 .aura("icy_talons", AURA::ICY_TALONS, |a| aura_icy_talons(a, ¶ms.game_data))
1438 .aura(
1439 "rune_mastery",
1440 AURA::RUNE_MASTERY,
1441 |a| aura_rune_mastery(a, ¶ms.game_data),
1442 )
1443 .aura("brittle", AURA::BRITTLE, |a| aura_brittle(a, ¶ms.game_data))
1444 .aura(
1445 "virulent_plague",
1446 AURA::VIRULENT_PLAGUE,
1447 |a| aura_virulent_plague(a, ¶ms.game_data),
1448 )
1449 .aura(
1450 "dread_plague",
1451 AURA::DREAD_PLAGUE,
1452 |a| aura_dread_plague(a, ¶ms.game_data),
1453 )
1454 .aura(
1455 "infected_claws",
1456 AURA::INFECTED_CLAWS,
1457 |a| aura_infected_claws(a, ¶ms.game_data),
1458 )
1459 .aura(
1460 "lesser_ghoul",
1461 AURA::LESSER_GHOUL,
1462 |a| aura_lesser_ghoul(a, ¶ms.game_data),
1463 )
1464 .aura(
1465 "lesser_ghoul_counter",
1466 AURA::LESSER_GHOUL_COUNTER,
1467 |a| aura_lesser_ghoul_counter(a, ¶ms.game_data),
1468 )
1469 .aura(
1470 "unholy_devotion",
1471 AURA::UNHOLY_DEVOTION,
1472 |a| aura_unholy_devotion(a, ¶ms.game_data),
1473 )
1474 .aura(
1475 "gargoyle_active",
1476 AURA::GARGOYLE_ACTIVE,
1477 |a| aura_gargoyle_active(a, ¶ms.game_data),
1478 )
1479 .aura(
1480 "gargoyle_empowerment",
1481 AURA::GARGOYLE_EMPOWERMENT,
1482 |a| aura_gargoyle_empowerment(a, ¶ms.game_data),
1483 )
1484 .aura(
1485 "dark_transformation",
1486 AURA::DARK_TRANSFORMATION,
1487 |a| aura_dark_transformation(a, ¶ms.game_data),
1488 )
1489 .aura(
1490 "commander_of_the_dead",
1491 AURA::COMMANDER_OF_THE_DEAD,
1492 |a| aura_commander_of_the_dead(a, ¶ms.game_data),
1493 )
1494 .spell(
1495 "festering_strike",
1496 SPELL::FESTERING_STRIKE,
1497 |s| spell_festering_strike(s, ¶ms.game_data),
1498 )
1499 .spell(
1500 "scourge_strike",
1501 SPELL::SCOURGE_STRIKE,
1502 |s| spell_scourge_strike(s, ¶ms.game_data),
1503 )
1504 .spell(
1505 "death_coil",
1506 SPELL::DEATH_COIL,
1507 |s| spell_death_coil(s, ¶ms.game_data),
1508 )
1509 .spell("epidemic", SPELL::EPIDEMIC, |s| spell_epidemic(s, ¶ms.game_data))
1510 .spell(
1511 "soul_reaper",
1512 SPELL::SOUL_REAPER,
1513 |s| spell_soul_reaper(s, ¶ms.game_data),
1514 )
1515 .spell("outbreak", SPELL::OUTBREAK, |s| spell_outbreak(s, ¶ms.game_data))
1516 .spell(
1517 "gargoyle_strike",
1518 SPELL::GARGOYLE_STRIKE,
1519 |s| spell_gargoyle_strike(s, ¶ms.game_data),
1520 )
1521 .spell(
1522 "dark_transformation",
1523 SPELL::DARK_TRANSFORMATION,
1524 |s| spell_dark_transformation(s, ¶ms.game_data),
1525 )
1526 .spell(
1527 "army_of_the_dead",
1528 SPELL::ARMY_OF_THE_DEAD,
1529 |s| spell_army_of_the_dead(s, ¶ms.game_data),
1530 )
1531 .spell("putrefy", SPELL::PUTREFY, |s| spell_putrefy(s, ¶ms.game_data))
1532 .auto_attack(|a| {
1533 a.spell_id(6603).swing_ms(3600).apply_base_from_data(¶ms.game_data)
1534 })
1535 .auto_attack(|a| {
1536 a
1537 .spell_id(6603)
1538 .swing_ms(2000)
1539 .apply_base_from_data(¶ms.game_data)
1540 .ap_coef(
1541 wowlab_engine_domain::damage::pet_swing_power_coefficient(
1542 0.474,
1543 2000,
1544 1.0,
1545 ),
1546 )
1547 .is_pet()
1548 .npc_id(26125)
1549 .on_swing(crate::hooks::unholy_death_knight::pet_swing)
1550 })
1551 .game_data(params.game_data.clone())
1552 .talent_spell_ids(TALENTS)
1553 .talent_selections(params.talent_selections)
1554 .set_bonus_auras(params.set_bonus_auras)
1555 .encounter(params.encounter.clone());
1556 let builder = crate::generated::items::register_equipped(
1557 builder,
1558 ¶ms.game_data,
1559 params.equipped_items,
1560 )?;
1561
1562 builder.into_draft()
1563}
1564fn new_handler(
1565 params: wowlab_engine_ports::HandlerParams<'_>,
1566) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1567 let handler = crate::composition::compose_handler(
1568 build_combat_system_draft,
1569 ¶ms,
1570 crate::hooks::unholy_death_knight::UnholyDkHandler::try_new,
1571 )?;
1572
1573 Ok(Box::new(handler))
1574}
1575static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1576 primary_resource: ResourceType::Runes,
1577 secondary_resource: Some(ResourceType::RunicPower),
1578 spell_ids: DECLARED_SPELL_IDS,
1579 aura_ids: DECLARED_AURA_IDS,
1580 server_proc_entries: &[],
1581 talents: TALENTS,
1582 rotation_field_schema: &[],
1583 metrics_plugin_id: None,
1584 hero_talent_trees: &[
1585 HeroTalentTreeDesc {
1586 name: "Unholy Pets",
1587 spells: HERO_TREE_UNHOLY_PETS_SPELLS,
1588 auras: HERO_TREE_UNHOLY_PETS_AURAS,
1589 },
1590 HeroTalentTreeDesc {
1591 name: "Riders",
1592 spells: HERO_TREE_RIDERS_SPELLS,
1593 auras: HERO_TREE_RIDERS_AURAS,
1594 },
1595 ],
1596 reported_spells: REPORTED_SPELLS,
1597 masked_passive_effects: &[],
1598 passive_effect_overrides: &[],
1599};
1600pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1601 spec_id: SpecId::Unholy,
1602 display_name: "Unholy Death Knight",
1603 metadata: DECLARED_METADATA,
1604 handler_factory: new_handler,
1605};
1606wowlab_engine_combat::smoke_test!(build_combat_system_draft);