1#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_combat::{
6 CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
7 LocalSpellIdx, SpellDefinitionDraft,
8};
9use wowlab_engine_ports::{
10 DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
11};
12use wowlab_engine_gamedata::ResolvedGameData;
13pub(crate) mod SPELL {
14 pub(crate) const SUMMON_FELHUNTER: u32 = 691;
16 pub(crate) const SUMMON_IMP: u32 = 688;
18 pub(crate) const GRIMOIRE_OF_SACRIFICE: u32 = 108_503;
20 pub(crate) const AGONY: u32 = 980;
22 pub(crate) const CORRUPTION: u32 = 172;
24 pub(crate) const UNSTABLE_AFFLICTION: u32 = 1_259_790;
26 pub(crate) const SEED_OF_CORRUPTION: u32 = 27243;
28 pub(crate) const HAUNT: u32 = 48181;
30 pub(crate) const SUMMON_DARKGLARE: u32 = 205_180;
32 pub(crate) const DARK_HARVEST: u32 = 1_257_052;
34 pub(crate) const SHADOW_BOLT: u32 = 686;
36 pub(crate) const DRAIN_SOUL: u32 = 198_590;
38 pub(crate) const MALEFIC_GRASP: u32 = 1_261_153;
40 pub(crate) const DRAIN_LIFE: u32 = 234_153;
42 pub(crate) const MALEVOLENCE: u32 = 430_014;
44}
45pub(crate) mod AURA {
46 pub(crate) const AGONY: u32 = 980;
48 pub(crate) const CORRUPTION: u32 = 146_739;
50 pub(crate) const UNSTABLE_AFFLICTION: u32 = 1_259_790;
52 pub(crate) const UNSTABLE_EMPOWERMENT: u32 = 1_305_774;
54 pub(crate) const SEED_OF_CORRUPTION: u32 = 27243;
56 pub(crate) const SEED_OF_CORRUPTION_IS_OUT_DNT: u32 = 1_279_998;
58 pub(crate) const RECENTLY_DEMON_HAS_BEEN_SUMMONED_DNT: u32 = 1_288_970;
60 pub(crate) const NIGHTFALL: u32 = 264_571;
62 pub(crate) const HAUNT: u32 = 48181;
64 pub(crate) const DARKGLARE_PRESENCE: u32 = 1_280_663;
66 pub(crate) const SHARD_INSTABILITY: u32 = 1_260_269;
68 pub(crate) const CASCADING_CALAMITY: u32 = 1_261_125;
70 pub(crate) const GRIMOIRE_OF_SACRIFICE: u32 = 196_099;
72 pub(crate) const WITHER: u32 = 445_474;
74 pub(crate) const MALEVOLENCE: u32 = 442_726;
76 pub(crate) const SUCCULENT_SOUL: u32 = 449_793;
78 pub(crate) const MANIFESTED_DEMONIC_SOUL: u32 = 1_269_042;
80 pub(crate) const SOUL_ANATHEMA: u32 = 450_538;
82 pub(crate) const TRACK_PETS: u32 = 462_599;
84}
85pub(crate) mod TALENT {
86 pub(crate) const ABSOLUTE_CORRUPTION: u32 = 196_103;
88 pub(crate) const CASCADING_CALAMITY: u32 = 1_261_124;
90 pub(crate) const CREEPING_DEATH: u32 = 264_000;
92 pub(crate) const CUNNING_CRUELTY: u32 = 453_172;
94 pub(crate) const DARK_HARVEST: u32 = 1_257_052;
96 pub(crate) const DEATHS_EMBRACE: u32 = 234_876;
98 pub(crate) const DEMONIACS_FERVOR: u32 = 449_629;
100 pub(crate) const DEMONIC_SOUL: u32 = 449_614;
102 pub(crate) const DRAIN_SOUL: u32 = 388_667;
104 pub(crate) const FATAL_ECHOES: u32 = 1_260_229;
106 pub(crate) const GRIMOIRE_OF_SACRIFICE: u32 = 108_503;
108 pub(crate) const HAUNT: u32 = 48181;
110 pub(crate) const IMPETUOUS_WRATH: u32 = 1_312_998;
112 pub(crate) const IMPROVED_SHADOW_BOLT: u32 = 453_080;
114 pub(crate) const MALEFIC_GRASP: u32 = 1_261_149;
116 pub(crate) const MALEVOLENCE: u32 = 430_014;
118 pub(crate) const MANIFESTED_AVARICE: u32 = 1_268_884;
120 pub(crate) const NIGHTFALL: u32 = 108_558;
122 pub(crate) const NOCTURNAL_YIELD: u32 = 1_260_271;
124 pub(crate) const RAVENOUS_AFFLICTIONS: u32 = 459_440;
126 pub(crate) const SHADOW_OF_DEATH: u32 = 449_638;
128 pub(crate) const SHADOW_OF_NATHREZA: u32 = 1_261_984;
130 pub(crate) const SHADOW_OF_NATHREZA_2: u32 = 1_261_990;
132 pub(crate) const SHADOW_OF_NATHREZA_3: u32 = 1_261_992;
134 pub(crate) const SHARD_INSTABILITY: u32 = 1_260_264;
136 pub(crate) const SOUL_ANATHEMA: u32 = 449_624;
138 pub(crate) const SUMMON_DARKGLARE: u32 = 205_180;
140 pub(crate) const WITHERING_BOLT: u32 = 386_976;
142}
143pub(crate) mod SET_BONUS {
144 pub(crate) const MID2_AFFLICTION_2PC: u32 = 1_296_568;
146 pub(crate) const MID2_AFFLICTION_4PC: u32 = 1_296_569;
148}
149pub(crate) mod REPORTED_SPELL {
150 pub(crate) const DARK_HARVEST_TICK: u32 = 1_257_065;
152 pub(crate) const DEMONIC_SOUL: u32 = 449_801;
154 pub(crate) const EYE_BEAM: u32 = 205_231;
156 pub(crate) const SHADOW_OF_NATHREZA: u32 = 1_262_710;
158 pub(crate) const SOUL_SWIPE: u32 = 1_269_049;
160 pub(crate) const WRATH_OF_NATHREZA: u32 = 1_278_047;
162}
163pub(crate) mod HERO {
164 pub(crate) mod HELLCALLER {
165 pub(crate) mod SPELL {
166 pub(crate) const BLACKENED_SOUL_DAMAGE: u32 = 445_736;
168 pub(crate) const BLACKENED_SOUL_TRIGGER: u32 = 445_731;
170 pub(crate) const MALEVOLENCE: u32 = 430_014;
172 pub(crate) const MALEVOLENCE_DAMAGE: u32 = 446_285;
174 pub(crate) const WITHER: u32 = 445_465;
176 pub(crate) const WITHER_DIRECT: u32 = 445_468;
178 }
179 pub(crate) mod AURA {
180 pub(crate) const BLACKENED_SOUL: u32 = 445_731;
182 pub(crate) const MALEVOLENCE_BUFF: u32 = 442_726;
184 pub(crate) const WITHER_DOT: u32 = 445_474;
186 }
187 }
188 pub(crate) mod SOUL_HARVESTER {
189 pub(crate) mod SPELL {
190 pub(crate) const DARK_HARVEST_ENERGIZE: u32 = 449_858;
192 pub(crate) const DEMONIC_SOUL_DAMAGE: u32 = 449_801;
194 pub(crate) const SHARED_FATE: u32 = 450_591;
196 pub(crate) const SOUL_ANATHEMA: u32 = 450_538;
198 pub(crate) const WICKED_REAPING: u32 = 449_826;
200 }
201 pub(crate) mod AURA {
202 pub(crate) const MANIFESTED_DEMONIC_SOUL: u32 = 1_269_042;
204 pub(crate) const SUCCULENT_SOUL: u32 = 449_793;
206 }
207 }
208}
209static HERO_TREE_HELLCALLER_SPELLS: &[(&str, u32)] = &[
210 ("BLACKENED_SOUL_DAMAGE", 445_736),
211 ("BLACKENED_SOUL_TRIGGER", 445_731),
212 ("MALEVOLENCE", 430_014),
213 ("MALEVOLENCE_DAMAGE", 446_285),
214 ("WITHER", 445_465),
215 ("WITHER_DIRECT", 445_468),
216];
217static HERO_TREE_HELLCALLER_AURAS: &[(&str, u32)] = &[
218 ("BLACKENED_SOUL", 445_731),
219 ("MALEVOLENCE_BUFF", 442_726),
220 ("WITHER_DOT", 445_474),
221];
222static HERO_TREE_SOUL_HARVESTER_SPELLS: &[(&str, u32)] = &[
223 ("DARK_HARVEST_ENERGIZE", 449_858),
224 ("DEMONIC_SOUL_DAMAGE", 449_801),
225 ("SHARED_FATE", 450_591),
226 ("SOUL_ANATHEMA", 450_538),
227 ("WICKED_REAPING", 449_826),
228];
229static HERO_TREE_SOUL_HARVESTER_AURAS: &[(&str, u32)] = &[
230 ("MANIFESTED_DEMONIC_SOUL", 1_269_042),
231 ("SUCCULENT_SOUL", 449_793),
232];
233pub(crate) mod DAMAGE_SPELL {
234 pub(crate) const SUMMON_FELHUNTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_691;
235 pub(crate) const SUMMON_IMP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_688;
236 pub(crate) const GRIMOIRE_OF_SACRIFICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_108503;
237 pub(crate) const AGONY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_980;
238 pub(crate) const CORRUPTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_172;
239 pub(crate) const UNSTABLE_AFFLICTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1259790;
240 pub(crate) const SEED_OF_CORRUPTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_27243;
241 pub(crate) const HAUNT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_48181;
242 pub(crate) const SUMMON_DARKGLARE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_205180;
243 pub(crate) const DARK_HARVEST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1257052;
244 pub(crate) const SHADOW_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_686;
245 pub(crate) const DRAIN_SOUL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_198590;
246 pub(crate) const MALEFIC_GRASP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1261153;
247 pub(crate) const DRAIN_LIFE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_234153;
248 pub(crate) const MALEVOLENCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_430014;
249 pub(crate) const BLACKENED_SOUL_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_445736;
250 pub(crate) const BLACKENED_SOUL_TRIGGER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_445731;
251 pub(crate) const MALEVOLENCE_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_446285;
252 pub(crate) const WITHER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_445465;
253 pub(crate) const WITHER_DIRECT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_445468;
254 pub(crate) const DARK_HARVEST_ENERGIZE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_449858;
255 pub(crate) const DEMONIC_SOUL_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_449801;
256 pub(crate) const SHARED_FATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_450591;
257 pub(crate) const SOUL_ANATHEMA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_450538;
258 pub(crate) const WICKED_REAPING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_449826;
259}
260pub(crate) mod DAMAGE_AURA {
261 pub(crate) const AGONY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_980;
262 pub(crate) const CORRUPTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_146739;
263 pub(crate) const UNSTABLE_AFFLICTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1259790;
264 pub(crate) const UNSTABLE_EMPOWERMENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1305774;
265 pub(crate) const SEED_OF_CORRUPTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_27243;
266 pub(crate) const SEED_OF_CORRUPTION_IS_OUT_DNT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1279998;
267 pub(crate) const RECENTLY_DEMON_HAS_BEEN_SUMMONED_DNT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1288970;
268 pub(crate) const NIGHTFALL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_264571;
269 pub(crate) const HAUNT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_48181;
270 pub(crate) const DARKGLARE_PRESENCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1280663;
271 pub(crate) const SHARD_INSTABILITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1260269;
272 pub(crate) const CASCADING_CALAMITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1261125;
273 pub(crate) const GRIMOIRE_OF_SACRIFICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_196099;
274 pub(crate) const WITHER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_445474;
275 pub(crate) const MALEVOLENCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_442726;
276 pub(crate) const SUCCULENT_SOUL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_449793;
277 pub(crate) const MANIFESTED_DEMONIC_SOUL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1269042;
278 pub(crate) const SOUL_ANATHEMA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_450538;
279 pub(crate) const TRACK_PETS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_462599;
280}
281pub(crate) mod DAMAGE_TALENT {
282 pub(crate) const ABSOLUTE_CORRUPTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_196103;
283 pub(crate) const CASCADING_CALAMITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1261124;
284 pub(crate) const CREEPING_DEATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_264000;
285 pub(crate) const CUNNING_CRUELTY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_453172;
286 pub(crate) const DARK_HARVEST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1257052;
287 pub(crate) const DEATHS_EMBRACE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_234876;
288 pub(crate) const DEMONIACS_FERVOR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_449629;
289 pub(crate) const DEMONIC_SOUL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_449614;
290 pub(crate) const DRAIN_SOUL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_388667;
291 pub(crate) const FATAL_ECHOES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1260229;
292 pub(crate) const GRIMOIRE_OF_SACRIFICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_108503;
293 pub(crate) const HAUNT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_48181;
294 pub(crate) const IMPETUOUS_WRATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1312998;
295 pub(crate) const IMPROVED_SHADOW_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_453080;
296 pub(crate) const MALEFIC_GRASP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1261149;
297 pub(crate) const MALEVOLENCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_430014;
298 pub(crate) const MANIFESTED_AVARICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1268884;
299 pub(crate) const NIGHTFALL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_108558;
300 pub(crate) const NOCTURNAL_YIELD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1260271;
301 pub(crate) const RAVENOUS_AFFLICTIONS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_459440;
302 pub(crate) const SHADOW_OF_DEATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_449638;
303 pub(crate) const SHADOW_OF_NATHREZA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1261984;
304 pub(crate) const SHADOW_OF_NATHREZA_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1261990;
305 pub(crate) const SHADOW_OF_NATHREZA_3: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1261992;
306 pub(crate) const SHARD_INSTABILITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1260264;
307 pub(crate) const SOUL_ANATHEMA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_449624;
308 pub(crate) const SUMMON_DARKGLARE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_205180;
309 pub(crate) const WITHERING_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_386976;
310}
311pub(crate) mod DAMAGE_REPORTED {
312 pub(crate) const DARK_HARVEST_TICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1257065;
313 pub(crate) const DEMONIC_SOUL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_449801;
314 pub(crate) const EYE_BEAM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_205231;
315 pub(crate) const SHADOW_OF_NATHREZA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1262710;
316 pub(crate) const SOUL_SWIPE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1269049;
317 pub(crate) const WRATH_OF_NATHREZA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1278047;
318}
319pub(crate) mod DAMAGE_EFFECT {
320 pub(crate) const POTENT_AFFLICTIONS_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_77215_EFFECT_1;
321 pub(crate) const POTENT_AFFLICTIONS_DIRECT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_77215_EFFECT_2;
322 pub(crate) const POTENT_AFFLICTIONS_LABEL_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_77215_EFFECT_3;
323 pub(crate) const MID2_AFFLICTION_2PC_CORRUPTION: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1296568_EFFECT_1;
324 pub(crate) const MID2_AFFLICTION_2PC_AGONY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1296568_EFFECT_2;
325 pub(crate) const MID2_AFFLICTION_4PC_SEED: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1296569_EFFECT_1;
326 pub(crate) const IMPETUOUS_WRATH_NORMAL: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1312998_EFFECT_1;
327 pub(crate) const IMPETUOUS_WRATH_HAUNT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1312998_EFFECT_2;
328 pub(crate) const IMPETUOUS_WRATH_DARK_HARVEST: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1312998_EFFECT_3;
329 pub(crate) const IMPETUOUS_WRATH_DARK_HARVEST_HAUNT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1312998_EFFECT_4;
330 pub(crate) const EYE_BEAM_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_205231_EFFECT_1;
331 pub(crate) const EYE_BEAM_PER_DOT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_205180_EFFECT_3;
332 pub(crate) const DEMONIC_SOUL_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_449801_EFFECT_1;
333 pub(crate) const DEMONIACS_FERVOR_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_449629_EFFECT_1;
334 pub(crate) const SOUL_SWIPE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1269049_EFFECT_1;
335 pub(crate) const SOUL_SWIPE_AOE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1269049_EFFECT_2;
336 pub(crate) const SHADOW_OF_NATHREZA_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1262710_EFFECT_1;
337 pub(crate) const WRATH_OF_NATHREZA_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1278047_EFFECT_1;
338 pub(crate) const SHADOW_OF_DEATH_SHARDS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_449638_EFFECT_2;
339}
340pub(crate) const AURA_AGONY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_AGONY
341 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
342pub(crate) const AURA_CORRUPTION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_CORRUPTION
343 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
344pub(crate) const AURA_UNSTABLE_AFFLICTION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_UNSTABLE_AFFLICTION
345 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
346pub(crate) const AURA_UNSTABLE_EMPOWERMENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_UNSTABLE_EMPOWERMENT
347 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
348pub(crate) const AURA_SEED_OF_CORRUPTION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_SEED_OF_CORRUPTION
349 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
350pub(crate) const AURA_SEED_OF_CORRUPTION_IS_OUT_DNT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_SEED_OF_CORRUPTION_IS_OUT_DNT
351 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
352pub(crate) const AURA_RECENTLY_DEMON_HAS_BEEN_SUMMONED_DNT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_RECENTLY_DEMON_HAS_BEEN_SUMMONED_DNT
353 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
354pub(crate) const AURA_NIGHTFALL: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_NIGHTFALL
355 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
356pub(crate) const AURA_HAUNT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_HAUNT
357 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
358pub(crate) const AURA_DARKGLARE_PRESENCE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_DARKGLARE_PRESENCE
359 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
360pub(crate) const AURA_SHARD_INSTABILITY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_SHARD_INSTABILITY
361 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
362pub(crate) const AURA_CASCADING_CALAMITY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_CASCADING_CALAMITY
363 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
364pub(crate) const AURA_GRIMOIRE_OF_SACRIFICE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_GRIMOIRE_OF_SACRIFICE
365 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
366pub(crate) const AURA_WITHER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_WITHER
367 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
368pub(crate) const AURA_MALEVOLENCE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_MALEVOLENCE
369 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
370pub(crate) const AURA_SUCCULENT_SOUL: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_SUCCULENT_SOUL
371 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
372pub(crate) const AURA_MANIFESTED_DEMONIC_SOUL: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_MANIFESTED_DEMONIC_SOUL
373 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
374pub(crate) const AURA_SOUL_ANATHEMA: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_SOUL_ANATHEMA
375 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
376pub(crate) const AURA_TRACK_PETS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_TRACK_PETS
377 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
378pub(crate) const AURA_COUNT: usize = 19;
379const _: () = assert!(
380 AURA_COUNT == 19, "AURA index ABI: count changed -- update positional hook consumers"
381);
382pub(crate) const SPELL_SUMMON_FELHUNTER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_SUMMON_FELHUNTER
383 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
384pub(crate) const SPELL_SUMMON_IMP: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_SUMMON_IMP
385 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
386pub(crate) const SPELL_GRIMOIRE_OF_SACRIFICE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_GRIMOIRE_OF_SACRIFICE
387 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
388pub(crate) const SPELL_AGONY: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_AGONY
389 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
390pub(crate) const SPELL_CORRUPTION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_CORRUPTION
391 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
392pub(crate) const SPELL_UNSTABLE_AFFLICTION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_UNSTABLE_AFFLICTION
393 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
394pub(crate) const SPELL_SEED_OF_CORRUPTION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_SEED_OF_CORRUPTION
395 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
396pub(crate) const SPELL_HAUNT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_HAUNT
397 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
398pub(crate) const SPELL_SUMMON_DARKGLARE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_SUMMON_DARKGLARE
399 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
400pub(crate) const SPELL_DARK_HARVEST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_DARK_HARVEST
401 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
402pub(crate) const SPELL_SHADOW_BOLT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_SHADOW_BOLT
403 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
404pub(crate) const SPELL_DRAIN_SOUL: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_DRAIN_SOUL
405 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
406pub(crate) const SPELL_MALEFIC_GRASP: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_MALEFIC_GRASP
407 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
408pub(crate) const SPELL_DRAIN_LIFE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_DRAIN_LIFE
409 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
410pub(crate) const SPELL_MALEVOLENCE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_MALEVOLENCE
411 .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
412pub(crate) const SPELL_COUNT: usize = 15;
413const _: () = assert!(
414 SPELL_COUNT == 15,
415 "SPELL index ABI: count changed -- update positional hook consumers"
416);
417pub(crate) mod EFFECT {
418 pub(crate) const POTENT_AFFLICTIONS_DAMAGE: (u32, u8) = (77215, 1);
420 pub(crate) const POTENT_AFFLICTIONS_DIRECT: (u32, u8) = (77215, 2);
422 pub(crate) const POTENT_AFFLICTIONS_LABEL_DAMAGE: (u32, u8) = (77215, 3);
424 pub(crate) const MID2_AFFLICTION_2PC_CORRUPTION: (u32, u8) = (1_296_568, 1);
426 pub(crate) const MID2_AFFLICTION_2PC_AGONY: (u32, u8) = (1_296_568, 2);
428 pub(crate) const MID2_AFFLICTION_4PC_SEED: (u32, u8) = (1_296_569, 1);
430 pub(crate) const IMPETUOUS_WRATH_NORMAL: (u32, u8) = (1_312_998, 1);
432 pub(crate) const IMPETUOUS_WRATH_HAUNT: (u32, u8) = (1_312_998, 2);
434 pub(crate) const IMPETUOUS_WRATH_DARK_HARVEST: (u32, u8) = (1_312_998, 3);
436 pub(crate) const IMPETUOUS_WRATH_DARK_HARVEST_HAUNT: (u32, u8) = (1_312_998, 4);
438 pub(crate) const EYE_BEAM_DAMAGE: (u32, u8) = (205_231, 1);
440 pub(crate) const EYE_BEAM_PER_DOT: (u32, u8) = (205_180, 3);
442 pub(crate) const DEMONIC_SOUL_DAMAGE: (u32, u8) = (449_801, 1);
444 pub(crate) const DEMONIACS_FERVOR_DAMAGE: (u32, u8) = (449_629, 1);
446 pub(crate) const SOUL_SWIPE_DAMAGE: (u32, u8) = (1_269_049, 1);
448 pub(crate) const SOUL_SWIPE_AOE_DAMAGE: (u32, u8) = (1_269_049, 2);
450 pub(crate) const SHADOW_OF_NATHREZA_DAMAGE: (u32, u8) = (1_262_710, 1);
452 pub(crate) const WRATH_OF_NATHREZA_DAMAGE: (u32, u8) = (1_278_047, 1);
454 pub(crate) const SHADOW_OF_DEATH_SHARDS: (u32, u8) = (449_638, 2);
456}
457static REPORTED_SPELLS: &[(&str, u32)] = &[
458 ("dark_harvest_tick", 1_257_065),
459 ("demonic_soul", 449_801),
460 ("eye_beam", 205_231),
461 ("shadow_of_nathreza", 1_262_710),
462 ("soul_swipe", 1_269_049),
463 ("wrath_of_nathreza", 1_278_047),
464];
465static DECLARED_SPELL_IDS: &[u32] = &[
466 691, 688, 108_503, 980, 172, 1_259_790, 27243, 48181, 205_180, 1_257_052, 686,
467 198_590, 1_261_153, 234_153, 430_014, 146_739, 1_305_774, 1_279_998, 1_288_970,
468 264_571, 1_280_663, 1_260_269, 1_261_125, 196_099, 445_474, 442_726, 449_793,
469 1_269_042, 450_538, 462_599, 196_103, 1_261_124, 264_000, 453_172, 234_876, 449_629,
470 449_614, 388_667, 1_260_229, 1_312_998, 453_080, 1_261_149, 1_268_884, 108_558,
471 1_260_271, 459_440, 449_638, 1_261_984, 1_261_990, 1_261_992, 1_260_264, 449_624,
472 386_976, 1, 77215, 205_231, 449_801, 1_257_065, 1_262_710, 1_269_049, 1_278_047,
473 1_296_568, 1_296_569, 445_736, 445_731, 446_285, 445_465, 445_468, 449_858, 450_591,
474 449_826,
475];
476static DECLARED_AURA_IDS: &[u32] = &[
477 980, 146_739, 1_259_790, 1_305_774, 27243, 1_279_998, 1_288_970, 264_571, 48181,
478 1_280_663, 1_260_269, 1_261_125, 196_099, 445_474, 442_726, 449_793, 1_269_042,
479 450_538, 462_599, 445_731, 442_726, 445_474, 1_269_042, 449_793,
480];
481static TALENTS: &[(&str, u32)] = &[
482 ("ABSOLUTE_CORRUPTION", TALENT::ABSOLUTE_CORRUPTION),
483 ("CASCADING_CALAMITY", TALENT::CASCADING_CALAMITY),
484 ("CREEPING_DEATH", TALENT::CREEPING_DEATH),
485 ("CUNNING_CRUELTY", TALENT::CUNNING_CRUELTY),
486 ("DARK_HARVEST", TALENT::DARK_HARVEST),
487 ("DEATHS_EMBRACE", TALENT::DEATHS_EMBRACE),
488 ("DEMONIACS_FERVOR", TALENT::DEMONIACS_FERVOR),
489 ("DEMONIC_SOUL", TALENT::DEMONIC_SOUL),
490 ("DRAIN_SOUL", TALENT::DRAIN_SOUL),
491 ("FATAL_ECHOES", TALENT::FATAL_ECHOES),
492 ("GRIMOIRE_OF_SACRIFICE", TALENT::GRIMOIRE_OF_SACRIFICE),
493 ("HAUNT", TALENT::HAUNT),
494 ("IMPETUOUS_WRATH", TALENT::IMPETUOUS_WRATH),
495 ("IMPROVED_SHADOW_BOLT", TALENT::IMPROVED_SHADOW_BOLT),
496 ("MALEFIC_GRASP", TALENT::MALEFIC_GRASP),
497 ("MALEVOLENCE", TALENT::MALEVOLENCE),
498 ("MANIFESTED_AVARICE", TALENT::MANIFESTED_AVARICE),
499 ("NIGHTFALL", TALENT::NIGHTFALL),
500 ("NOCTURNAL_YIELD", TALENT::NOCTURNAL_YIELD),
501 ("RAVENOUS_AFFLICTIONS", TALENT::RAVENOUS_AFFLICTIONS),
502 ("SHADOW_OF_DEATH", TALENT::SHADOW_OF_DEATH),
503 ("SHADOW_OF_NATHREZA", TALENT::SHADOW_OF_NATHREZA),
504 ("SHADOW_OF_NATHREZA_2", TALENT::SHADOW_OF_NATHREZA_2),
505 ("SHADOW_OF_NATHREZA_3", TALENT::SHADOW_OF_NATHREZA_3),
506 ("SHARD_INSTABILITY", TALENT::SHARD_INSTABILITY),
507 ("SOUL_ANATHEMA", TALENT::SOUL_ANATHEMA),
508 ("SUMMON_DARKGLARE", TALENT::SUMMON_DARKGLARE),
509 ("WITHERING_BOLT", TALENT::WITHERING_BOLT),
510];
511pub(crate) mod AFFLICTION_WARLOCK {
512 pub(crate) const AGONY_CASTS: u32 = 0;
513 pub(crate) const CORRUPTION_CASTS: u32 = 1;
514 pub(crate) const UNSTABLE_AFFLICTION_CASTS: u32 = 2;
515 pub(crate) const SHADOW_BOLT_CASTS: u32 = 3;
516 pub(crate) const HAUNT_CASTS: u32 = 4;
517 pub(crate) const SUMMON_DARKGLARE_CASTS: u32 = 5;
518 pub(crate) const DARK_HARVEST_CASTS: u32 = 6;
519 pub(crate) const AGONY_UPTIME_MS: u32 = 7;
520 pub(crate) const CORRUPTION_UPTIME_MS: u32 = 8;
521 pub(crate) const UNSTABLE_AFFLICTION_UPTIME_MS: u32 = 9;
522}
523fn aura_agony(
524 a: AuraDefinitionDraft,
525 data: &ResolvedGameData,
526) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
527 a.on_target()
528 .apply_base_from_data(data, 980)?
529 .max_stacks(
530 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(980))?,
531 )
532 .snapshot()
533 .periodic_damage_sp_from_data(
534 data,
535 wowlab_engine_combat::PeriodicDamageDataInput {
536 tick_ms: wowlab_engine_combat::validated_milliseconds(
537 data.period(wowlab_types::sim::SpellIdx::from_raw(980), 1),
538 980,
539 "periodic_damage.tick_ms",
540 )?,
541 spell_id: 980,
542 effect_index: 1,
543 multiplier: 8.0,
544 offset: -0.000_000_808_56,
545 round_decimals: Some(6),
546 },
547 )?
548 .apply_periodic_behavior_from_data(data, 980)
549}
550fn aura_corruption(
551 a: AuraDefinitionDraft,
552 data: &ResolvedGameData,
553) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
554 a.on_target()
555 .duration_ms(
556 wowlab_engine_combat::validated_milliseconds(
557 f64::from(
558 data
559 .require_aura_duration_ms(
560 wowlab_types::sim::SpellIdx::from_raw(196_103),
561 )?,
562 ),
563 146_739,
564 "aura.duration_ms",
565 )?,
566 )
567 .apply_periodic_effect_from_data(data, 146_739)?
568 .apply_duration_behavior_from_data(data, 196_103)?
569 .apply_timing_modifiers_from_data(data, 146_739)?
570 .max_stacks(
571 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(146_739))?,
572 )
573 .snapshot()
574 .periodic_damage_sp_from_data(
575 data,
576 wowlab_engine_combat::PeriodicDamageDataInput {
577 tick_ms: wowlab_engine_combat::validated_milliseconds(
578 data.period(wowlab_types::sim::SpellIdx::from_raw(146_739), 1),
579 146_739,
580 "periodic_damage.tick_ms",
581 )?,
582 spell_id: 146_739,
583 effect_index: 1,
584 multiplier: 1.15,
585 offset: 0.0,
586 round_decimals: Some(6),
587 },
588 )?
589 .apply_periodic_behavior_from_data(data, 146_739)
590}
591fn aura_unstable_affliction(
592 a: AuraDefinitionDraft,
593 data: &ResolvedGameData,
594) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
595 Ok(
596 a
597 .on_target()
598 .apply_base_from_data(data, 1_259_790)?
599 .max_stacks(
600 data
601 .require_aura_max_stacks(
602 wowlab_types::sim::SpellIdx::from_raw(1_259_790),
603 )?,
604 )
605 .snapshot()
606 .on_expire(crate::hooks::affliction_warlock::unstable_affliction_expire_hook),
607 )
608}
609fn aura_unstable_empowerment(
610 a: AuraDefinitionDraft,
611 data: &ResolvedGameData,
612) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
613 Ok(
614 a
615 .on_player()
616 .apply_base_from_data(data, 1_305_774)?
617 .max_stacks(
618 data
619 .require_aura_max_stacks(
620 wowlab_types::sim::SpellIdx::from_raw(1_305_774),
621 )?,
622 ),
623 )
624}
625fn aura_seed_of_corruption(
626 a: AuraDefinitionDraft,
627 data: &ResolvedGameData,
628) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
629 Ok(
630 a
631 .on_target()
632 .apply_base_from_data(data, 27243)?
633 .max_stacks(
634 data
635 .require_aura_max_stacks(
636 wowlab_types::sim::SpellIdx::from_raw(27243),
637 )?,
638 ),
639 )
640}
641fn aura_seed_of_corruption_is_out_dnt(
642 a: AuraDefinitionDraft,
643 data: &ResolvedGameData,
644) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
645 Ok(
646 a
647 .on_player()
648 .apply_base_from_data(data, 1_279_998)?
649 .max_stacks(
650 data
651 .require_aura_max_stacks(
652 wowlab_types::sim::SpellIdx::from_raw(1_279_998),
653 )?,
654 ),
655 )
656}
657fn aura_recently_demon_has_been_summoned_dnt(
658 a: AuraDefinitionDraft,
659 data: &ResolvedGameData,
660) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
661 Ok(
662 a
663 .on_player()
664 .apply_base_from_data(data, 1_288_970)?
665 .max_stacks(
666 data
667 .require_aura_max_stacks(
668 wowlab_types::sim::SpellIdx::from_raw(1_288_970),
669 )?,
670 ),
671 )
672}
673fn aura_nightfall(
674 a: AuraDefinitionDraft,
675 data: &ResolvedGameData,
676) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
677 Ok(
678 a
679 .on_player()
680 .apply_base_from_data(data, 264_571)?
681 .max_stacks(
682 data
683 .require_aura_max_stacks(
684 wowlab_types::sim::SpellIdx::from_raw(264_571),
685 )?,
686 ),
687 )
688}
689fn aura_haunt(
690 a: AuraDefinitionDraft,
691 data: &ResolvedGameData,
692) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
693 Ok(
694 a
695 .on_target()
696 .apply_base_from_data(data, 48181)?
697 .max_stacks(
698 data
699 .require_aura_max_stacks(
700 wowlab_types::sim::SpellIdx::from_raw(48181),
701 )?,
702 )
703 .periodic_hook(
704 wowlab_engine_combat::validated_milliseconds(
705 data.period(wowlab_types::sim::SpellIdx::from_raw(48181), 5),
706 48181,
707 "periodic_hook.tick_ms",
708 )?,
709 )
710 .apply_periodic_behavior_from_data(data, 48181)?
711 .tick_hook(crate::hooks::affliction_warlock::haunt_tick_hook),
712 )
713}
714fn aura_darkglare_presence(
715 a: AuraDefinitionDraft,
716 data: &ResolvedGameData,
717) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
718 Ok(
719 a
720 .on_player()
721 .apply_base_from_data(data, 1_280_663)?
722 .max_stacks(
723 data
724 .require_aura_max_stacks(
725 wowlab_types::sim::SpellIdx::from_raw(1_280_663),
726 )?,
727 ),
728 )
729}
730fn aura_shard_instability(
731 a: AuraDefinitionDraft,
732 data: &ResolvedGameData,
733) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
734 Ok(
735 a
736 .on_player()
737 .apply_base_from_data(data, 1_260_269)?
738 .max_stacks(
739 data
740 .require_aura_max_stacks(
741 wowlab_types::sim::SpellIdx::from_raw(1_260_269),
742 )?,
743 ),
744 )
745}
746fn aura_cascading_calamity(
747 a: AuraDefinitionDraft,
748 data: &ResolvedGameData,
749) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
750 Ok(
751 a
752 .on_player()
753 .apply_base_from_data(data, 1_261_125)?
754 .max_stacks(
755 data
756 .require_aura_max_stacks(
757 wowlab_types::sim::SpellIdx::from_raw(1_261_125),
758 )?,
759 ),
760 )
761}
762fn aura_grimoire_of_sacrifice(
763 a: AuraDefinitionDraft,
764 data: &ResolvedGameData,
765) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
766 Ok(
767 a
768 .on_player()
769 .apply_base_from_data(data, 196_099)?
770 .max_stacks(
771 data
772 .require_aura_max_stacks(
773 wowlab_types::sim::SpellIdx::from_raw(196_099),
774 )?,
775 ),
776 )
777}
778fn aura_wither(
779 a: AuraDefinitionDraft,
780 data: &ResolvedGameData,
781) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
782 a.on_target()
783 .apply_base_from_data(data, 445_474)?
784 .max_stacks(
785 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(445_474))?,
786 )
787 .snapshot()
788 .periodic_damage_sp(
789 wowlab_engine_combat::validated_milliseconds(
790 2000.0,
791 445_474,
792 "periodic_damage.tick_ms",
793 )?,
794 0.112,
795 wowlab_engine_combat::DamageFlags::empty(),
796 )
797 .apply_periodic_behavior_from_data(data, 445_474)
798}
799fn aura_malevolence(
800 a: AuraDefinitionDraft,
801 data: &ResolvedGameData,
802) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
803 Ok(
804 a
805 .on_player()
806 .apply_base_from_data(data, 442_726)?
807 .max_stacks(
808 data
809 .require_aura_max_stacks(
810 wowlab_types::sim::SpellIdx::from_raw(442_726),
811 )?,
812 ),
813 )
814}
815fn aura_succulent_soul(
816 a: AuraDefinitionDraft,
817 data: &ResolvedGameData,
818) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
819 Ok(
820 a
821 .on_player()
822 .apply_base_from_data(data, 449_793)?
823 .max_stacks(
824 data
825 .require_aura_max_stacks(
826 wowlab_types::sim::SpellIdx::from_raw(449_793),
827 )?,
828 ),
829 )
830}
831fn aura_manifested_demonic_soul(
832 a: AuraDefinitionDraft,
833 data: &ResolvedGameData,
834) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
835 Ok(
836 a
837 .on_player()
838 .apply_base_from_data(data, 1_269_042)?
839 .max_stacks(
840 data
841 .require_aura_max_stacks(
842 wowlab_types::sim::SpellIdx::from_raw(1_269_042),
843 )?,
844 ),
845 )
846}
847fn aura_soul_anathema(
848 a: AuraDefinitionDraft,
849 data: &ResolvedGameData,
850) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
851 Ok(
852 a
853 .on_target()
854 .apply_base_from_data(data, 450_538)?
855 .max_stacks(
856 data
857 .require_aura_max_stacks(
858 wowlab_types::sim::SpellIdx::from_raw(450_538),
859 )?,
860 ),
861 )
862}
863fn aura_track_pets(
864 a: AuraDefinitionDraft,
865 data: &ResolvedGameData,
866) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
867 Ok(
868 a
869 .on_player()
870 .apply_base_from_data(data, 462_599)?
871 .max_stacks(
872 data
873 .require_aura_max_stacks(
874 wowlab_types::sim::SpellIdx::from_raw(462_599),
875 )?,
876 ),
877 )
878}
879fn spell_summon_felhunter(
880 s: SpellDefinitionDraft,
881 data: &ResolvedGameData,
882) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
883 Ok(s.apply_base_from_data(data, 691)?.apply_aoe_from_data(data))
884}
885fn spell_summon_imp(
886 s: SpellDefinitionDraft,
887 data: &ResolvedGameData,
888) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
889 Ok(s.apply_base_from_data(data, 688)?.apply_aoe_from_data(data))
890}
891fn spell_grimoire_of_sacrifice(
892 s: SpellDefinitionDraft,
893 data: &ResolvedGameData,
894) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
895 Ok(
896 s
897 .apply_base_from_data(data, 108_503)?
898 .applies_aura(AURA_GRIMOIRE_OF_SACRIFICE)
899 .apply_aoe_from_data(data),
900 )
901}
902fn spell_agony(
903 s: SpellDefinitionDraft,
904 data: &ResolvedGameData,
905) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
906 Ok(
907 s
908 .apply_base_from_data(data, 980)?
909 .applies_inferred_aura(AURA_AGONY, 980)
910 .apply_aoe_from_data(data),
911 )
912}
913fn spell_corruption(
914 s: SpellDefinitionDraft,
915 data: &ResolvedGameData,
916) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
917 Ok(
918 s
919 .apply_base_from_data(data, 172)?
920 .applies_aura(AURA_CORRUPTION)
921 .apply_aoe_from_data(data),
922 )
923}
924fn spell_unstable_affliction(
925 s: SpellDefinitionDraft,
926 data: &ResolvedGameData,
927) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
928 Ok(
929 s
930 .apply_base_from_data(data, 1_259_790)?
931 .applies_inferred_aura(AURA_UNSTABLE_AFFLICTION, 1_259_790)
932 .apply_aoe_from_data(data)
933 .on_cast(crate::hooks::affliction_warlock::unstable_affliction_hook),
934 )
935}
936fn spell_seed_of_corruption(
937 s: SpellDefinitionDraft,
938 data: &ResolvedGameData,
939) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
940 Ok(
941 s
942 .apply_base_from_data(data, 27243)?
943 .applies_inferred_aura(AURA_SEED_OF_CORRUPTION, 27243)
944 .apply_aoe_from_data(data)
945 .on_cast(crate::hooks::affliction_warlock::seed_of_corruption_hook),
946 )
947}
948fn spell_haunt(
949 s: SpellDefinitionDraft,
950 data: &ResolvedGameData,
951) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
952 Ok(
953 s
954 .apply_base_from_data(data, 48181)?
955 .applies_inferred_aura(AURA_HAUNT, 48181)
956 .apply_aoe_from_data(data),
957 )
958}
959fn spell_summon_darkglare(
960 s: SpellDefinitionDraft,
961 data: &ResolvedGameData,
962) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
963 Ok(
964 s
965 .apply_base_from_data(data, 205_180)?
966 .apply_aoe_from_data(data)
967 .on_cast(crate::hooks::affliction_warlock::summon_darkglare_hook),
968 )
969}
970fn spell_dark_harvest(
971 s: SpellDefinitionDraft,
972 data: &ResolvedGameData,
973) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
974 Ok(
975 s
976 .apply_base_from_data(data, 1_257_052)?
977 .apply_aoe_from_data(data)
978 .channel(
979 wowlab_engine_combat::validated_channel_tick_count(
980 4.0,
981 1_257_052,
982 "channel.tick_count",
983 )?,
984 )
985 .channel_tick_damage_sp_from_data(
986 wowlab_engine_domain::dbc::EffectLookup::new(
987 data,
988 wowlab_types::sim::EffectRef::new(
989 wowlab_types::sim::SpellIdx::from_raw(1_257_065),
990 1,
991 ),
992 ),
993 )?
994 .on_channel_tick(crate::hooks::affliction_warlock::dark_harvest_tick_hook)
995 .on_cast(crate::hooks::affliction_warlock::dark_harvest_hook),
996 )
997}
998fn spell_shadow_bolt(
999 s: SpellDefinitionDraft,
1000 data: &ResolvedGameData,
1001) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1002 Ok(s.apply_base_from_data(data, 686)?.apply_aoe_from_data(data))
1003}
1004fn spell_drain_soul(
1005 s: SpellDefinitionDraft,
1006 data: &ResolvedGameData,
1007) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1008 Ok(s.apply_base_from_data(data, 198_590)?.apply_aoe_from_data(data))
1009}
1010fn spell_malefic_grasp(
1011 s: SpellDefinitionDraft,
1012 data: &ResolvedGameData,
1013) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1014 Ok(s.apply_base_from_data(data, 1_261_153)?.apply_aoe_from_data(data))
1015}
1016fn spell_drain_life(
1017 s: SpellDefinitionDraft,
1018 data: &ResolvedGameData,
1019) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1020 Ok(s.apply_base_from_data(data, 234_153)?.apply_aoe_from_data(data))
1021}
1022fn spell_malevolence(
1023 s: SpellDefinitionDraft,
1024 data: &ResolvedGameData,
1025) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1026 Ok(
1027 s
1028 .apply_base_from_data(data, 430_014)?
1029 .applies_aura(AURA_MALEVOLENCE)
1030 .apply_aoe_from_data(data),
1031 )
1032}
1033pub(crate) fn build_combat_system_draft(
1034 params: &wowlab_engine_ports::HandlerParams<'_>,
1035) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1036 let builder = CombatSystemBuilder::new(params.stats.clone())
1037 .spec_id(SpecId::Affliction)
1038 .spec_identity(
1039 wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF,
1040 )
1041 .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1042 .effect_identities(
1043 wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ALL,
1044 )
1045 .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1046 .mastery_spell(77215)
1047 .mastery_hook(crate::hooks::affliction_warlock::mastery)
1048 .resource(
1049 "soul_shards",
1050 5.0,
1051 params
1052 .game_data
1053 .power_regen_for_max(7, 5.0)
1054 .ok_or_else(|| {
1055 wowlab_engine_ports::EngineError::spec_construction(
1056 "missing power-type power_regen_for_max for type_id 7",
1057 )
1058 })?,
1059 )
1060 .resource_type_id(7)
1061 .resource_start(3.0)
1062 .has_pet(true)
1063 .aura("agony", AURA::AGONY, |a| aura_agony(a, ¶ms.game_data))
1064 .aura("corruption", AURA::CORRUPTION, |a| aura_corruption(a, ¶ms.game_data))
1065 .aura(
1066 "unstable_affliction",
1067 AURA::UNSTABLE_AFFLICTION,
1068 |a| aura_unstable_affliction(a, ¶ms.game_data),
1069 )
1070 .aura(
1071 "unstable_empowerment",
1072 AURA::UNSTABLE_EMPOWERMENT,
1073 |a| aura_unstable_empowerment(a, ¶ms.game_data),
1074 )
1075 .aura(
1076 "seed_of_corruption",
1077 AURA::SEED_OF_CORRUPTION,
1078 |a| aura_seed_of_corruption(a, ¶ms.game_data),
1079 )
1080 .aura(
1081 "seed_of_corruption_is_out_dnt",
1082 AURA::SEED_OF_CORRUPTION_IS_OUT_DNT,
1083 |a| aura_seed_of_corruption_is_out_dnt(a, ¶ms.game_data),
1084 )
1085 .aura(
1086 "recently_demon_has_been_summoned_dnt",
1087 AURA::RECENTLY_DEMON_HAS_BEEN_SUMMONED_DNT,
1088 |a| aura_recently_demon_has_been_summoned_dnt(a, ¶ms.game_data),
1089 )
1090 .aura("nightfall", AURA::NIGHTFALL, |a| aura_nightfall(a, ¶ms.game_data))
1091 .aura("haunt", AURA::HAUNT, |a| aura_haunt(a, ¶ms.game_data))
1092 .aura(
1093 "darkglare_presence",
1094 AURA::DARKGLARE_PRESENCE,
1095 |a| aura_darkglare_presence(a, ¶ms.game_data),
1096 )
1097 .aura(
1098 "shard_instability",
1099 AURA::SHARD_INSTABILITY,
1100 |a| aura_shard_instability(a, ¶ms.game_data),
1101 )
1102 .aura(
1103 "cascading_calamity",
1104 AURA::CASCADING_CALAMITY,
1105 |a| aura_cascading_calamity(a, ¶ms.game_data),
1106 )
1107 .aura(
1108 "grimoire_of_sacrifice",
1109 AURA::GRIMOIRE_OF_SACRIFICE,
1110 |a| aura_grimoire_of_sacrifice(a, ¶ms.game_data),
1111 )
1112 .aura("wither", AURA::WITHER, |a| aura_wither(a, ¶ms.game_data))
1113 .aura(
1114 "malevolence",
1115 AURA::MALEVOLENCE,
1116 |a| aura_malevolence(a, ¶ms.game_data),
1117 )
1118 .aura(
1119 "succulent_soul",
1120 AURA::SUCCULENT_SOUL,
1121 |a| aura_succulent_soul(a, ¶ms.game_data),
1122 )
1123 .aura(
1124 "manifested_demonic_soul",
1125 AURA::MANIFESTED_DEMONIC_SOUL,
1126 |a| aura_manifested_demonic_soul(a, ¶ms.game_data),
1127 )
1128 .aura(
1129 "soul_anathema",
1130 AURA::SOUL_ANATHEMA,
1131 |a| aura_soul_anathema(a, ¶ms.game_data),
1132 )
1133 .aura("track_pets", AURA::TRACK_PETS, |a| aura_track_pets(a, ¶ms.game_data))
1134 .spell(
1135 "summon_felhunter",
1136 SPELL::SUMMON_FELHUNTER,
1137 |s| spell_summon_felhunter(s, ¶ms.game_data),
1138 )
1139 .spell(
1140 "summon_imp",
1141 SPELL::SUMMON_IMP,
1142 |s| spell_summon_imp(s, ¶ms.game_data),
1143 )
1144 .spell(
1145 "grimoire_of_sacrifice",
1146 SPELL::GRIMOIRE_OF_SACRIFICE,
1147 |s| spell_grimoire_of_sacrifice(s, ¶ms.game_data),
1148 )
1149 .spell("agony", SPELL::AGONY, |s| spell_agony(s, ¶ms.game_data))
1150 .spell(
1151 "corruption",
1152 SPELL::CORRUPTION,
1153 |s| spell_corruption(s, ¶ms.game_data),
1154 )
1155 .spell(
1156 "unstable_affliction",
1157 SPELL::UNSTABLE_AFFLICTION,
1158 |s| spell_unstable_affliction(s, ¶ms.game_data),
1159 )
1160 .spell(
1161 "seed_of_corruption",
1162 SPELL::SEED_OF_CORRUPTION,
1163 |s| spell_seed_of_corruption(s, ¶ms.game_data),
1164 )
1165 .spell("haunt", SPELL::HAUNT, |s| spell_haunt(s, ¶ms.game_data))
1166 .spell(
1167 "summon_darkglare",
1168 SPELL::SUMMON_DARKGLARE,
1169 |s| spell_summon_darkglare(s, ¶ms.game_data),
1170 )
1171 .spell(
1172 "dark_harvest",
1173 SPELL::DARK_HARVEST,
1174 |s| spell_dark_harvest(s, ¶ms.game_data),
1175 )
1176 .spell(
1177 "shadow_bolt",
1178 SPELL::SHADOW_BOLT,
1179 |s| spell_shadow_bolt(s, ¶ms.game_data),
1180 )
1181 .spell(
1182 "drain_soul",
1183 SPELL::DRAIN_SOUL,
1184 |s| spell_drain_soul(s, ¶ms.game_data),
1185 )
1186 .spell(
1187 "malefic_grasp",
1188 SPELL::MALEFIC_GRASP,
1189 |s| spell_malefic_grasp(s, ¶ms.game_data),
1190 )
1191 .spell(
1192 "drain_life",
1193 SPELL::DRAIN_LIFE,
1194 |s| spell_drain_life(s, ¶ms.game_data),
1195 )
1196 .spell(
1197 "malevolence",
1198 SPELL::MALEVOLENCE,
1199 |s| spell_malevolence(s, ¶ms.game_data),
1200 )
1201 .auto_attack(|a| {
1202 a
1203 .spell_id(1)
1204 .swing_ms(2000)
1205 .apply_base_from_data(¶ms.game_data)
1206 .ap_coef(
1207 wowlab_engine_domain::damage::pet_swing_power_coefficient(
1208 0.575,
1209 2000,
1210 1.0,
1211 ),
1212 )
1213 .is_pet()
1214 .uses_spell_power()
1215 })
1216 .game_data(params.game_data.clone())
1217 .talent_spell_ids(TALENTS)
1218 .talent_selections(params.talent_selections)
1219 .register_impact_effect_proc(
1220 wowlab_engine_combat::ImpactEffectProcDefinition::new(
1221 wowlab_engine_combat::ImpactSource::Spell(SPELL::AGONY),
1222 )
1223 .chance(0.185)
1224 .periodic_only()
1225 .gain(1.0),
1226 )
1227 .set_bonus_auras(params.set_bonus_auras)
1228 .encounter(params.encounter.clone());
1229 let builder = crate::generated::items::register_equipped(
1230 builder,
1231 ¶ms.game_data,
1232 params.equipped_items,
1233 )?;
1234
1235 builder.into_draft()
1236}
1237fn new_handler(
1238 params: wowlab_engine_ports::HandlerParams<'_>,
1239) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1240 let handler = crate::composition::compose_handler(
1241 build_combat_system_draft,
1242 ¶ms,
1243 crate::hooks::affliction_warlock::AfflictionHandler::try_new,
1244 )?;
1245
1246 Ok(Box::new(handler))
1247}
1248static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1249 primary_resource: ResourceType::SoulShards,
1250 secondary_resource: None,
1251 spell_ids: DECLARED_SPELL_IDS,
1252 aura_ids: DECLARED_AURA_IDS,
1253 server_proc_entries: &[],
1254 talents: TALENTS,
1255 rotation_field_schema: &[],
1256 metrics_plugin_id: None,
1257 hero_talent_trees: &[
1258 HeroTalentTreeDesc {
1259 name: "Hellcaller",
1260 spells: HERO_TREE_HELLCALLER_SPELLS,
1261 auras: HERO_TREE_HELLCALLER_AURAS,
1262 },
1263 HeroTalentTreeDesc {
1264 name: "Soul Harvester",
1265 spells: HERO_TREE_SOUL_HARVESTER_SPELLS,
1266 auras: HERO_TREE_SOUL_HARVESTER_AURAS,
1267 },
1268 ],
1269 reported_spells: REPORTED_SPELLS,
1270 masked_passive_effects: &[],
1271 passive_effect_overrides: &[],
1272};
1273pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1274 spec_id: SpecId::Affliction,
1275 display_name: "Affliction Warlock",
1276 metadata: DECLARED_METADATA,
1277 handler_factory: new_handler,
1278};
1279wowlab_engine_combat::smoke_test!(build_combat_system_draft);