Skip to main content

wowlab_engine_content/generated/specs/
unholy_death_knight.rs

1//! @generated by codegen-cli from manifests/specs/death_knight/unholy/manifest.toml -- do not edit by hand.
2// Generated code: naming follows game data conventions
3#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_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    ///<https://wowlab.gg/inspect/spell/85948>
15    pub(crate) const FESTERING_STRIKE: u32 = 85948;
16    ///<https://wowlab.gg/inspect/spell/55090>
17    pub(crate) const SCOURGE_STRIKE: u32 = 55090;
18    ///<https://wowlab.gg/inspect/spell/47541>
19    pub(crate) const DEATH_COIL: u32 = 47541;
20    ///<https://wowlab.gg/inspect/spell/212739>
21    pub(crate) const EPIDEMIC: u32 = 212_739;
22    ///<https://wowlab.gg/inspect/spell/343294>
23    pub(crate) const SOUL_REAPER: u32 = 343_294;
24    ///<https://wowlab.gg/inspect/spell/77575>
25    pub(crate) const OUTBREAK: u32 = 77575;
26    ///<https://wowlab.gg/inspect/spell/51963>
27    pub(crate) const GARGOYLE_STRIKE: u32 = 51963;
28    ///<https://wowlab.gg/inspect/spell/1233448>
29    pub(crate) const DARK_TRANSFORMATION: u32 = 1_233_448;
30    ///<https://wowlab.gg/inspect/spell/42650>
31    pub(crate) const ARMY_OF_THE_DEAD: u32 = 42650;
32    ///<https://wowlab.gg/inspect/spell/1247378>
33    pub(crate) const PUTREFY: u32 = 1_247_378;
34}
35pub(crate) mod AURA {
36    ///<https://wowlab.gg/inspect/spell/81340>
37    pub(crate) const SUDDEN_DOOM: u32 = 81340;
38    ///<https://wowlab.gg/inspect/spell/51460>
39    pub(crate) const RUNIC_CORRUPTION: u32 = 51460;
40    ///<https://wowlab.gg/inspect/spell/458123>
41    pub(crate) const FESTERING_SCYTHE: u32 = 458_123;
42    ///<https://wowlab.gg/inspect/spell/1241077>
43    pub(crate) const FESTERING_SCYTHE_TT: u32 = 1_241_077;
44    ///<https://wowlab.gg/inspect/spell/390271>
45    pub(crate) const COIL_OF_DEVASTATION: u32 = 390_271;
46    ///<https://wowlab.gg/inspect/spell/327095>
47    pub(crate) const APOCALYPSE_DEATH: u32 = 327_095;
48    ///<https://wowlab.gg/inspect/spell/327092>
49    pub(crate) const APOCALYPSE_FAMINE: u32 = 327_092;
50    ///<https://wowlab.gg/inspect/spell/327093>
51    pub(crate) const APOCALYPSE_PESTILENCE: u32 = 327_093;
52    ///<https://wowlab.gg/inspect/spell/327096>
53    pub(crate) const APOCALYPSE_WAR: u32 = 327_096;
54    ///<https://wowlab.gg/inspect/spell/1241521>
55    pub(crate) const SOUL_REAPER: u32 = 1_241_521;
56    ///<https://wowlab.gg/inspect/spell/444505>
57    pub(crate) const MOGRAINES_MIGHT: u32 = 444_505;
58    ///<https://wowlab.gg/inspect/spell/444763>
59    pub(crate) const APOCALYPTIC_CONQUEST: u32 = 444_763;
60    ///<https://wowlab.gg/inspect/spell/444828>
61    pub(crate) const TROLLBANE_CHAINS: u32 = 444_828;
62    ///<https://wowlab.gg/inspect/spell/444633>
63    pub(crate) const UNDEATH: u32 = 444_633;
64    ///<https://wowlab.gg/inspect/spell/1242654>
65    pub(crate) const REAPING: u32 = 1_242_654;
66    ///<https://wowlab.gg/inspect/spell/1242223>
67    pub(crate) const FORBIDDEN_KNOWLEDGE: u32 = 1_242_223;
68    ///<https://wowlab.gg/inspect/spell/1271975>
69    pub(crate) const BLIGHTFALL: u32 = 1_271_975;
70    ///<https://wowlab.gg/inspect/spell/194879>
71    pub(crate) const ICY_TALONS: u32 = 194_879;
72    ///<https://wowlab.gg/inspect/spell/374585>
73    pub(crate) const RUNE_MASTERY: u32 = 374_585;
74    ///<https://wowlab.gg/inspect/spell/374557>
75    pub(crate) const BRITTLE: u32 = 374_557;
76    ///<https://wowlab.gg/inspect/spell/191587>
77    pub(crate) const VIRULENT_PLAGUE: u32 = 191_587;
78    ///<https://wowlab.gg/inspect/spell/1240996>
79    pub(crate) const DREAD_PLAGUE: u32 = 1_240_996;
80    ///<https://wowlab.gg/inspect/spell/1241786>
81    pub(crate) const INFECTED_CLAWS: u32 = 1_241_786;
82    ///<https://wowlab.gg/inspect/spell/1254252>
83    pub(crate) const LESSER_GHOUL: u32 = 1_254_252;
84    ///<https://wowlab.gg/inspect/spell/1242998>
85    pub(crate) const LESSER_GHOUL_COUNTER: u32 = 1_242_998;
86    ///<https://wowlab.gg/inspect/spell/1270491>
87    pub(crate) const UNHOLY_DEVOTION: u32 = 1_270_491;
88    ///<https://wowlab.gg/inspect/spell/49206>
89    pub(crate) const GARGOYLE_ACTIVE: u32 = 49206;
90    ///<https://wowlab.gg/inspect/spell/211947>
91    pub(crate) const GARGOYLE_EMPOWERMENT: u32 = 211_947;
92    ///<https://wowlab.gg/inspect/spell/1235391>
93    pub(crate) const DARK_TRANSFORMATION: u32 = 1_235_391;
94    ///<https://wowlab.gg/inspect/spell/390260>
95    pub(crate) const COMMANDER_OF_THE_DEAD: u32 = 390_260;
96}
97pub(crate) mod TALENT {
98    ///<https://wowlab.gg/inspect/spell/444040>
99    pub(crate) const APOCALYPSE_NOW: u32 = 444_040;
100    ///<https://wowlab.gg/inspect/spell/42650>
101    pub(crate) const ARMY_OF_THE_DEAD: u32 = 42650;
102    ///<https://wowlab.gg/inspect/spell/1254552>
103    pub(crate) const BLIGHTBURST: u32 = 1_254_552;
104    ///<https://wowlab.gg/inspect/spell/374504>
105    pub(crate) const BRITTLE: u32 = 374_504;
106    ///<https://wowlab.gg/inspect/spell/1233448>
107    pub(crate) const DARK_TRANSFORMATION: u32 = 1_233_448;
108    ///<https://wowlab.gg/inspect/spell/1256565>
109    pub(crate) const FORBIDDEN_KNOWLEDGE_2: u32 = 1_256_565;
110    ///<https://wowlab.gg/inspect/spell/1256566>
111    pub(crate) const FORBIDDEN_KNOWLEDGE_3: u32 = 1_256_566;
112    ///<https://wowlab.gg/inspect/spell/444069>
113    pub(crate) const FURY_OF_THE_HORSEMEN: u32 = 444_069;
114    ///<https://wowlab.gg/inspect/spell/1238900>
115    pub(crate) const GRAVE_MASTERY: u32 = 1_238_900;
116    ///<https://wowlab.gg/inspect/spell/1265949>
117    pub(crate) const LET_TERROR_REIGN: u32 = 1_265_949;
118    ///<https://wowlab.gg/inspect/spell/1256813>
119    pub(crate) const LORD_OF_THE_DEAD: u32 = 1_256_813;
120    ///<https://wowlab.gg/inspect/spell/444052>
121    pub(crate) const NAZGRIMS_CONQUEST: u32 = 444_052;
122    ///<https://wowlab.gg/inspect/spell/77575>
123    pub(crate) const OUTBREAK: u32 = 77575;
124    ///<https://wowlab.gg/inspect/spell/1247378>
125    pub(crate) const PUTREFY: u32 = 1_247_378;
126    ///<https://wowlab.gg/inspect/spell/444005>
127    pub(crate) const RIDERS_CHAMPION: u32 = 444_005;
128    ///<https://wowlab.gg/inspect/spell/55090>
129    pub(crate) const SCOURGE_STRIKE: u32 = 55090;
130    ///<https://wowlab.gg/inspect/spell/343294>
131    pub(crate) const SOUL_REAPER: u32 = 343_294;
132    ///<https://wowlab.gg/inspect/spell/1242147>
133    pub(crate) const SUMMON_GARGOYLE: u32 = 1_242_147;
134    ///<https://wowlab.gg/inspect/spell/444097>
135    pub(crate) const TROLLBANES_ICY_FURY: u32 = 444_097;
136    ///<https://wowlab.gg/inspect/spell/1241858>
137    pub(crate) const UNHOLY_DEVOTION: u32 = 1_241_858;
138    ///<https://wowlab.gg/inspect/spell/444033>
139    pub(crate) const WHITEMANES_FAMINE: u32 = 444_033;
140}
141pub(crate) mod SET_BONUS {
142    ///<https://wowlab.gg/inspect/spell/1296654>
143    pub(crate) const MID2_UNHOLY_2PC: u32 = 1_296_654;
144    ///<https://wowlab.gg/inspect/spell/1296655>
145    pub(crate) const MID2_UNHOLY_4PC: u32 = 1_296_655;
146}
147pub(crate) mod REPORTED_SPELL {
148    ///<https://wowlab.gg/inspect/spell/6603>
149    pub(crate) const AUTO_ATTACK: u32 = 6603;
150    ///<https://wowlab.gg/inspect/spell/199373>
151    pub(crate) const CLAW: u32 = 199_373;
152    ///<https://wowlab.gg/inspect/spell/1251951>
153    pub(crate) const DEATH_AND_DECAY: u32 = 1_251_951;
154    ///<https://wowlab.gg/inspect/spell/1265949>
155    pub(crate) const DEATH_COIL_LET_TERROR_REIGN: u32 = 1_265_949;
156    ///<https://wowlab.gg/inspect/spell/1241171>
157    pub(crate) const DREAD_PLAGUE_ERUPT: u32 = 1_241_171;
158    ///<https://wowlab.gg/inspect/spell/458128>
159    pub(crate) const FESTERING_SCYTHE: u32 = 458_128;
160    ///<https://wowlab.gg/inspect/spell/445504>
161    pub(crate) const HEART_STRIKE: u32 = 445_504;
162    ///<https://wowlab.gg/inspect/spell/1297055>
163    pub(crate) const NECROTIC_BOLT: u32 = 1_297_055;
164    ///<https://wowlab.gg/inspect/spell/1242178>
165    pub(crate) const NECROTIC_COIL_SHADOW: u32 = 1_242_178;
166    ///<https://wowlab.gg/inspect/spell/445507>
167    pub(crate) const OBLITERATE: u32 = 445_507;
168    ///<https://wowlab.gg/inspect/spell/327093>
169    pub(crate) const PESTILENCE_RUNEFORGE: u32 = 327_093;
170    ///<https://wowlab.gg/inspect/spell/445509>
171    pub(crate) const SCOURGE_STRIKE_SHADOW: u32 = 445_509;
172    ///<https://wowlab.gg/inspect/spell/1278150>
173    pub(crate) const SWEEPING_CLAWS: u32 = 1_278_150;
174    ///<https://wowlab.gg/inspect/spell/444834>
175    pub(crate) const TROLLBANES_ICY_FURY: u32 = 444_834;
176    ///<https://wowlab.gg/inspect/spell/444633>
177    pub(crate) const UNDEATH: u32 = 444_633;
178    ///<https://wowlab.gg/inspect/spell/1241167>
179    pub(crate) const VIRULENT_PLAGUE_ERUPT: u32 = 1_241_167;
180    ///<https://wowlab.gg/inspect/spell/445513>
181    pub(crate) const WHITEMANE_DEATH_COIL: u32 = 445_513;
182    ///<https://wowlab.gg/inspect/spell/1297091>
183    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            ///<https://wowlab.gg/inspect/spell/91776>
189            pub(crate) const CLAW: u32 = 91776;
190            ///<https://wowlab.gg/inspect/spell/390271>
191            pub(crate) const COIL_OF_DEVASTATION: u32 = 390_271;
192            ///<https://wowlab.gg/inspect/spell/458128>
193            pub(crate) const FESTERING_SCYTHE_STRIKE: u32 = 458_128;
194            ///<https://wowlab.gg/inspect/spell/317792>
195            pub(crate) const FROSTBOLT: u32 = 317_792;
196            ///<https://wowlab.gg/inspect/spell/51963>
197            pub(crate) const GARGOYLE_STRIKE: u32 = 51963;
198            ///<https://wowlab.gg/inspect/spell/199373>
199            pub(crate) const LESSER_CLAW: u32 = 199_373;
200            ///<https://wowlab.gg/inspect/spell/1278150>
201            pub(crate) const LESSER_SWEEPING_CLAWS: u32 = 1_278_150;
202            ///<https://wowlab.gg/inspect/spell/6603>
203            pub(crate) const MELEE: u32 = 6603;
204            ///<https://wowlab.gg/inspect/spell/1242178>
205            pub(crate) const NECROTIC_COIL: u32 = 1_242_178;
206            ///<https://wowlab.gg/inspect/spell/1242172>
207            pub(crate) const NECROTIC_COIL_SHADOWSTRIKE: u32 = 1_242_172;
208            ///<https://wowlab.gg/inspect/spell/390220>
209            pub(crate) const PUTREFY_AOE: u32 = 390_220;
210            ///<https://wowlab.gg/inspect/spell/1277016>
211            pub(crate) const PUTREFY_ST: u32 = 1_277_016;
212            ///<https://wowlab.gg/inspect/spell/1247379>
213            pub(crate) const RUPTURED_VISCERA: u32 = 1_247_379;
214            ///<https://wowlab.gg/inspect/spell/317791>
215            pub(crate) const SHADOW_BOLT: u32 = 317_791;
216            ///<https://wowlab.gg/inspect/spell/49206>
217            pub(crate) const SUMMON_GARGOYLE: u32 = 49206;
218            ///<https://wowlab.gg/inspect/spell/91778>
219            pub(crate) const SWEEPING_CLAWS: u32 = 91778;
220        }
221    }
222    pub(crate) mod RIDERS {
223        pub(crate) mod SPELL {
224            ///<https://wowlab.gg/inspect/spell/444248>
225            pub(crate) const MOGRAINE: u32 = 444_248;
226            ///<https://wowlab.gg/inspect/spell/444252>
227            pub(crate) const NAZGRIM: u32 = 444_252;
228            ///<https://wowlab.gg/inspect/spell/454389>
229            pub(crate) const RANDOM_SUMMON: u32 = 454_389;
230            ///<https://wowlab.gg/inspect/spell/444254>
231            pub(crate) const TROLLBANE: u32 = 444_254;
232            ///<https://wowlab.gg/inspect/spell/444251>
233            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    ///<https://wowlab.gg/inspect/spell/444040>
525    pub(crate) const APOCALYPSE_NOW_DURATION: (u32, u8) = (444_040, 2);
526    ///<https://wowlab.gg/inspect/spell/42650>
527    pub(crate) const ARMY_GHOUL_COUNT: (u32, u8) = (42650, 1);
528    ///<https://wowlab.gg/inspect/spell/1254552>
529    pub(crate) const BLIGHTBURST_DAMAGE: (u32, u8) = (1_254_552, 2);
530    ///<https://wowlab.gg/inspect/spell/1254552>
531    pub(crate) const BLIGHTBURST_DURATION: (u32, u8) = (1_254_552, 1);
532    ///<https://wowlab.gg/inspect/spell/91776>
533    pub(crate) const CLAW: (u32, u8) = (91776, 1);
534    ///<https://wowlab.gg/inspect/spell/390270>
535    pub(crate) const COIL_OF_DEVASTATION_PCT: (u32, u8) = (390_270, 1);
536    ///<https://wowlab.gg/inspect/spell/390260>
537    pub(crate) const COMMANDER_PCT: (u32, u8) = (390_260, 3);
538    ///<https://wowlab.gg/inspect/spell/47632>
539    pub(crate) const DC_DAMAGE: (u32, u8) = (47632, 1);
540    ///<https://wowlab.gg/inspect/spell/1240996>
541    pub(crate) const DP_TICK: (u32, u8) = (1_240_996, 1);
542    ///<https://wowlab.gg/inspect/spell/77515>
543    pub(crate) const DREADBLADE_PET_CRIT: (u32, u8) = (77515, 6);
544    ///<https://wowlab.gg/inspect/spell/1233448>
545    pub(crate) const DT_ENERGY_PCT: (u32, u8) = (1_233_448, 4);
546    ///<https://wowlab.gg/inspect/spell/1233448>
547    pub(crate) const DT_PET_PCT: (u32, u8) = (1_233_448, 1);
548    ///<https://wowlab.gg/inspect/spell/390268>
549    pub(crate) const ETERNAL_AGONY_EXTENSION_MS: (u32, u8) = (390_268, 1);
550    ///<https://wowlab.gg/inspect/spell/207269>
551    pub(crate) const EBON_FEVER_PCT: (u32, u8) = (207_269, 1);
552    ///<https://wowlab.gg/inspect/spell/85948>
553    pub(crate) const FS_GHOULS_MAX: (u32, u8) = (85948, 4);
554    ///<https://wowlab.gg/inspect/spell/85948>
555    pub(crate) const FS_GHOULS_MIN: (u32, u8) = (85948, 3);
556    ///<https://wowlab.gg/inspect/spell/1256565>
557    pub(crate) const FORBIDDEN_KNOWLEDGE_READY_STACKS: (u32, u8) = (1_256_565, 2);
558    ///<https://wowlab.gg/inspect/spell/1256566>
559    pub(crate) const FORBIDDEN_KNOWLEDGE_PUTREFY_PCT: (u32, u8) = (1_256_566, 2);
560    ///<https://wowlab.gg/inspect/spell/1256566>
561    pub(crate) const FORBIDDEN_KNOWLEDGE_PROC_PCT: (u32, u8) = (1_256_566, 3);
562    ///<https://wowlab.gg/inspect/spell/444069>
563    pub(crate) const FURY_EXTENSION_SECONDS: (u32, u8) = (444_069, 3);
564    ///<https://wowlab.gg/inspect/spell/444069>
565    pub(crate) const FURY_MAX_SECONDS: (u32, u8) = (444_069, 2);
566    ///<https://wowlab.gg/inspect/spell/444069>
567    pub(crate) const FURY_RP_THRESHOLD: (u32, u8) = (444_069, 1);
568    ///<https://wowlab.gg/inspect/spell/51963>
569    pub(crate) const GARGOYLE_STRIKE: (u32, u8) = (51963, 1);
570    ///<https://wowlab.gg/inspect/spell/1238902>
571    pub(crate) const GRAVE_MASTERY_PCT: (u32, u8) = (1_238_902, 1);
572    ///<https://wowlab.gg/inspect/spell/276023>
573    pub(crate) const HARBINGER_SD_PCT: (u32, u8) = (276_023, 2);
574    ///<https://wowlab.gg/inspect/spell/444834>
575    pub(crate) const ICY_FURY_DAMAGE: (u32, u8) = (444_834, 2);
576    ///<https://wowlab.gg/inspect/spell/199373>
577    pub(crate) const LESSER_CLAW: (u32, u8) = (199_373, 1);
578    ///<https://wowlab.gg/inspect/spell/1278150>
579    pub(crate) const LESSER_SWEEPING: (u32, u8) = (1_278_150, 2);
580    ///<https://wowlab.gg/inspect/spell/317792>
581    pub(crate) const MAGUS_FROSTBOLT: (u32, u8) = (317_792, 1);
582    ///<https://wowlab.gg/inspect/spell/1297055>
583    pub(crate) const MAGUS_NECROTIC_BOLT: (u32, u8) = (1_297_055, 1);
584    ///<https://wowlab.gg/inspect/spell/317791>
585    pub(crate) const MAGUS_SHADOW_BOLT: (u32, u8) = (317_791, 1);
586    ///<https://wowlab.gg/inspect/spell/1297091>
587    pub(crate) const MAGUS_WITHERING_GRASP: (u32, u8) = (1_297_091, 1);
588    ///<https://wowlab.gg/inspect/spell/1256813>
589    pub(crate) const LORD_OF_THE_DEAD_CHANCE: (u32, u8) = (1_256_813, 1);
590    ///<https://wowlab.gg/inspect/spell/1256813>
591    pub(crate) const LORD_OF_THE_DEAD_DIRECT: (u32, u8) = (1_256_813, 4);
592    ///<https://wowlab.gg/inspect/spell/1256813>
593    pub(crate) const LORD_OF_THE_DEAD_PERIODIC: (u32, u8) = (1_256_813, 3);
594    ///<https://wowlab.gg/inspect/spell/1300330>
595    pub(crate) const EPIDEMIC_ORDER_DAMAGE: (u32, u8) = (1_300_330, 1);
596    ///<https://wowlab.gg/inspect/spell/1265949>
597    pub(crate) const LET_TERROR_REIGN_UNHOLY_PCT: (u32, u8) = (1_265_949, 2);
598    ///<https://wowlab.gg/inspect/spell/1251951>
599    pub(crate) const MOGRAINE_DND: (u32, u8) = (1_251_951, 1);
600    ///<https://wowlab.gg/inspect/spell/444474>
601    pub(crate) const MOGRAINE_DND_PERIOD: (u32, u8) = (444_474, 3);
602    ///<https://wowlab.gg/inspect/spell/445504>
603    pub(crate) const MOGRAINE_HEART_STRIKE: (u32, u8) = (445_504, 1);
604    ///<https://wowlab.gg/inspect/spell/444763>
605    pub(crate) const NAZGRIM_CONQUEST_BASE_PCT: (u32, u8) = (444_763, 1);
606    ///<https://wowlab.gg/inspect/spell/445508>
607    pub(crate) const NAZGRIM_SCOURGE_STRIKE: (u32, u8) = (445_508, 1);
608    ///<https://wowlab.gg/inspect/spell/445509>
609    pub(crate) const NAZGRIM_SCOURGE_STRIKE_SHADOW: (u32, u8) = (445_509, 1);
610    ///<https://wowlab.gg/inspect/spell/1242178>
611    pub(crate) const NECROTIC_SHADOW: (u32, u8) = (1_242_178, 1);
612    ///<https://wowlab.gg/inspect/spell/1242172>
613    pub(crate) const NECROTIC_STRIKE: (u32, u8) = (1_242_172, 1);
614    ///<https://wowlab.gg/inspect/spell/390220>
615    pub(crate) const PUTREFY_AOE: (u32, u8) = (390_220, 1);
616    ///<https://wowlab.gg/inspect/spell/1277016>
617    pub(crate) const PUTREFY_ST: (u32, u8) = (1_277_016, 1);
618    ///<https://wowlab.gg/inspect/spell/51462>
619    pub(crate) const RC_CHANCE_PCT: (u32, u8) = (51462, 1);
620    ///<https://wowlab.gg/inspect/spell/1247379>
621    pub(crate) const RUPTURED_VISCERA: (u32, u8) = (1_247_379, 1);
622    ///<https://wowlab.gg/inspect/spell/458128>
623    pub(crate) const SCYTHE_DAMAGE: (u32, u8) = (458_128, 1);
624    ///<https://wowlab.gg/inspect/spell/81340>
625    pub(crate) const SD_DC_PCT: (u32, u8) = (81340, 4);
626    ///<https://wowlab.gg/inspect/spell/343294>
627    pub(crate) const SR_GHOULS: (u32, u8) = (343_294, 3);
628    ///<https://wowlab.gg/inspect/spell/55090>
629    pub(crate) const SS_ERUPT_PCT: (u32, u8) = (55090, 2);
630    ///<https://wowlab.gg/inspect/spell/49530>
631    pub(crate) const SUDDEN_DOOM_PCT: (u32, u8) = (49530, 2);
632    ///<https://wowlab.gg/inspect/spell/91778>
633    pub(crate) const SWEEPING_MAIN: (u32, u8) = (91778, 2);
634    ///<https://wowlab.gg/inspect/spell/445507>
635    pub(crate) const TROLLBANE_OBLITERATE: (u32, u8) = (445_507, 1);
636    ///<https://wowlab.gg/inspect/spell/191587>
637    pub(crate) const VP_TICK: (u32, u8) = (191_587, 1);
638    ///<https://wowlab.gg/inspect/spell/445513>
639    pub(crate) const WHITEMANE_DEATH_COIL: (u32, u8) = (445_513, 1);
640    ///<https://wowlab.gg/inspect/spell/1296655>
641    pub(crate) const MID2_4PC_DIRECT_PCT: (u32, u8) = (1_296_655, 1);
642    ///<https://wowlab.gg/inspect/spell/1296655>
643    pub(crate) const MID2_4PC_PERIODIC_PCT: (u32, u8) = (1_296_655, 2);
644    ///<https://wowlab.gg/inspect/spell/1296655>
645    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, &params.game_data),
1368        )
1369        .aura(
1370            "runic_corruption",
1371            AURA::RUNIC_CORRUPTION,
1372            |a| aura_runic_corruption(a, &params.game_data),
1373        )
1374        .aura(
1375            "festering_scythe",
1376            AURA::FESTERING_SCYTHE,
1377            |a| aura_festering_scythe(a, &params.game_data),
1378        )
1379        .aura(
1380            "festering_scythe_tt",
1381            AURA::FESTERING_SCYTHE_TT,
1382            |a| aura_festering_scythe_tt(a, &params.game_data),
1383        )
1384        .aura(
1385            "coil_of_devastation",
1386            AURA::COIL_OF_DEVASTATION,
1387            |a| aura_coil_of_devastation(a, &params.game_data),
1388        )
1389        .aura(
1390            "apocalypse_death",
1391            AURA::APOCALYPSE_DEATH,
1392            |a| aura_apocalypse_death(a, &params.game_data),
1393        )
1394        .aura(
1395            "apocalypse_famine",
1396            AURA::APOCALYPSE_FAMINE,
1397            |a| aura_apocalypse_famine(a, &params.game_data),
1398        )
1399        .aura(
1400            "apocalypse_pestilence",
1401            AURA::APOCALYPSE_PESTILENCE,
1402            |a| aura_apocalypse_pestilence(a, &params.game_data),
1403        )
1404        .aura(
1405            "apocalypse_war",
1406            AURA::APOCALYPSE_WAR,
1407            |a| aura_apocalypse_war(a, &params.game_data),
1408        )
1409        .aura(
1410            "soul_reaper",
1411            AURA::SOUL_REAPER,
1412            |a| aura_soul_reaper(a, &params.game_data),
1413        )
1414        .aura(
1415            "mograines_might",
1416            AURA::MOGRAINES_MIGHT,
1417            |a| aura_mograines_might(a, &params.game_data),
1418        )
1419        .aura(
1420            "apocalyptic_conquest",
1421            AURA::APOCALYPTIC_CONQUEST,
1422            |a| aura_apocalyptic_conquest(a, &params.game_data),
1423        )
1424        .aura(
1425            "trollbane_chains",
1426            AURA::TROLLBANE_CHAINS,
1427            |a| aura_trollbane_chains(a, &params.game_data),
1428        )
1429        .aura("undeath", AURA::UNDEATH, |a| aura_undeath(a, &params.game_data))
1430        .aura("reaping", AURA::REAPING, |a| aura_reaping(a, &params.game_data))
1431        .aura(
1432            "forbidden_knowledge",
1433            AURA::FORBIDDEN_KNOWLEDGE,
1434            |a| aura_forbidden_knowledge(a, &params.game_data),
1435        )
1436        .aura("blightfall", AURA::BLIGHTFALL, |a| aura_blightfall(a, &params.game_data))
1437        .aura("icy_talons", AURA::ICY_TALONS, |a| aura_icy_talons(a, &params.game_data))
1438        .aura(
1439            "rune_mastery",
1440            AURA::RUNE_MASTERY,
1441            |a| aura_rune_mastery(a, &params.game_data),
1442        )
1443        .aura("brittle", AURA::BRITTLE, |a| aura_brittle(a, &params.game_data))
1444        .aura(
1445            "virulent_plague",
1446            AURA::VIRULENT_PLAGUE,
1447            |a| aura_virulent_plague(a, &params.game_data),
1448        )
1449        .aura(
1450            "dread_plague",
1451            AURA::DREAD_PLAGUE,
1452            |a| aura_dread_plague(a, &params.game_data),
1453        )
1454        .aura(
1455            "infected_claws",
1456            AURA::INFECTED_CLAWS,
1457            |a| aura_infected_claws(a, &params.game_data),
1458        )
1459        .aura(
1460            "lesser_ghoul",
1461            AURA::LESSER_GHOUL,
1462            |a| aura_lesser_ghoul(a, &params.game_data),
1463        )
1464        .aura(
1465            "lesser_ghoul_counter",
1466            AURA::LESSER_GHOUL_COUNTER,
1467            |a| aura_lesser_ghoul_counter(a, &params.game_data),
1468        )
1469        .aura(
1470            "unholy_devotion",
1471            AURA::UNHOLY_DEVOTION,
1472            |a| aura_unholy_devotion(a, &params.game_data),
1473        )
1474        .aura(
1475            "gargoyle_active",
1476            AURA::GARGOYLE_ACTIVE,
1477            |a| aura_gargoyle_active(a, &params.game_data),
1478        )
1479        .aura(
1480            "gargoyle_empowerment",
1481            AURA::GARGOYLE_EMPOWERMENT,
1482            |a| aura_gargoyle_empowerment(a, &params.game_data),
1483        )
1484        .aura(
1485            "dark_transformation",
1486            AURA::DARK_TRANSFORMATION,
1487            |a| aura_dark_transformation(a, &params.game_data),
1488        )
1489        .aura(
1490            "commander_of_the_dead",
1491            AURA::COMMANDER_OF_THE_DEAD,
1492            |a| aura_commander_of_the_dead(a, &params.game_data),
1493        )
1494        .spell(
1495            "festering_strike",
1496            SPELL::FESTERING_STRIKE,
1497            |s| spell_festering_strike(s, &params.game_data),
1498        )
1499        .spell(
1500            "scourge_strike",
1501            SPELL::SCOURGE_STRIKE,
1502            |s| spell_scourge_strike(s, &params.game_data),
1503        )
1504        .spell(
1505            "death_coil",
1506            SPELL::DEATH_COIL,
1507            |s| spell_death_coil(s, &params.game_data),
1508        )
1509        .spell("epidemic", SPELL::EPIDEMIC, |s| spell_epidemic(s, &params.game_data))
1510        .spell(
1511            "soul_reaper",
1512            SPELL::SOUL_REAPER,
1513            |s| spell_soul_reaper(s, &params.game_data),
1514        )
1515        .spell("outbreak", SPELL::OUTBREAK, |s| spell_outbreak(s, &params.game_data))
1516        .spell(
1517            "gargoyle_strike",
1518            SPELL::GARGOYLE_STRIKE,
1519            |s| spell_gargoyle_strike(s, &params.game_data),
1520        )
1521        .spell(
1522            "dark_transformation",
1523            SPELL::DARK_TRANSFORMATION,
1524            |s| spell_dark_transformation(s, &params.game_data),
1525        )
1526        .spell(
1527            "army_of_the_dead",
1528            SPELL::ARMY_OF_THE_DEAD,
1529            |s| spell_army_of_the_dead(s, &params.game_data),
1530        )
1531        .spell("putrefy", SPELL::PUTREFY, |s| spell_putrefy(s, &params.game_data))
1532        .auto_attack(|a| {
1533            a.spell_id(6603).swing_ms(3600).apply_base_from_data(&params.game_data)
1534        })
1535        .auto_attack(|a| {
1536            a
1537                .spell_id(6603)
1538                .swing_ms(2000)
1539                .apply_base_from_data(&params.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        &params.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        &params,
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);