-
Notifications
You must be signed in to change notification settings - Fork 761
Expand file tree
/
Copy pathsc_demon_hunter.cpp
More file actions
12933 lines (10853 loc) · 433 KB
/
sc_demon_hunter.cpp
File metadata and controls
12933 lines (10853 loc) · 433 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
// ==========================================================================
// Dedmonwakeen's Raid DPS/TPS Simulator.
// Send questions to natehieter@gmail.com
// ==========================================================================
#include "action/parse_effects.hpp"
#include "class_modules/apl/apl_demon_hunter.hpp"
#include "report/charts.hpp"
#include "report/highchart.hpp"
#include <valarray>
#include "simulationcraft.hpp"
namespace
{
// UNNAMED NAMESPACE
// Forward Declarations
class demon_hunter_t;
struct soul_fragment_t;
namespace actions::attacks
{
struct relentless_onslaught_t;
}
// Target Data
class demon_hunter_td_t : public actor_target_data_t
{
public:
struct dots_t
{
// Shared
dot_t* the_hunt;
dot_t* sigil_of_flame;
dot_t* sigil_of_doom;
// Havoc
dot_t* burning_wound;
dot_t* trail_of_ruin;
// Vengeance
dot_t* fiery_brand;
// Annihilator
} dots;
struct debuffs_t
{
// Shared
// Devourer
buff_t* devourers_bite;
// Havoc
buff_t* burning_wound;
buff_t* essence_break;
buff_t* initiative_tracker;
buff_t* serrated_glaive;
// Vengeance
buff_t* frailty;
// Aldrachi Reaver
buff_t* reavers_mark;
// Set Bonuses
} debuffs;
demon_hunter_td_t( player_t* target, demon_hunter_t& p );
demon_hunter_t& dh()
{
return *debug_cast<demon_hunter_t*>( source );
}
const demon_hunter_t& dh() const
{
return *debug_cast<demon_hunter_t*>( source );
}
void target_demise();
};
constexpr unsigned MAX_SOUL_FRAGMENTS = 6;
constexpr unsigned HAVOC_MAX_SOUL_FRAGMENTS = 5;
constexpr unsigned DEVOURER_MAX_SOUL_FRAGMENTS = 10;
constexpr double VENGEFUL_RETREAT_DISTANCE = 20.0;
enum class soul_fragment : unsigned
{
GREATER = 0x01,
LESSER = 0x02,
GREATER_DEMON = 0x04,
EMPOWERED_DEMON = 0x08,
ANY_GREATER = ( GREATER | GREATER_DEMON | EMPOWERED_DEMON ),
ANY_DEMON = ( GREATER_DEMON | EMPOWERED_DEMON ),
ANY = 0xFF
};
soul_fragment operator&( soul_fragment l, soul_fragment r )
{
return static_cast<soul_fragment>( static_cast<unsigned>( l ) & static_cast<unsigned>( r ) );
}
[[maybe_unused]] soul_fragment operator|( soul_fragment l, soul_fragment r )
{
return static_cast<soul_fragment>( static_cast<unsigned>( l ) | static_cast<unsigned>( r ) );
}
const char* get_soul_fragment_str( soul_fragment type )
{
switch ( type )
{
case soul_fragment::ANY:
return "soul fragment";
case soul_fragment::GREATER:
return "greater soul fragment";
case soul_fragment::LESSER:
return "lesser soul fragment";
case soul_fragment::GREATER_DEMON:
return "greater demon fragment";
case soul_fragment::EMPOWERED_DEMON:
return "empowered demon fragment";
default:
return "";
}
}
struct movement_buff_t : public buff_t
{
double yards_from_melee;
double distance_moved;
demon_hunter_t* dh;
movement_buff_t( demon_hunter_t* p, util::string_view name, const spell_data_t* spell_data = spell_data_t::nil(),
const item_t* item = nullptr );
bool trigger( int s = 1, double v = DEFAULT_VALUE(), double c = -1.0, timespan_t d = timespan_t::min() ) override;
};
using data_t = std::pair<std::string, simple_sample_data_with_min_max_t>;
using simple_data_t = std::pair<std::string, simple_sample_data_t>;
// utility to create target_effect_t compatible functions from demon_hunter_td_t member references
template <typename T>
static std::function<int( actor_target_data_t* )> d_fn( T d, bool stack = true )
{
if constexpr ( std::is_invocable_v<T, demon_hunter_td_t::debuffs_t> )
{
if ( stack )
return [ d ]( actor_target_data_t* t ) {
return std::invoke( d, static_cast<demon_hunter_td_t*>( t )->debuffs )->check();
};
else
return [ d ]( actor_target_data_t* t ) {
return std::invoke( d, static_cast<demon_hunter_td_t*>( t )->debuffs )->check() > 0;
};
}
else if constexpr ( std::is_invocable_v<T, demon_hunter_td_t::dots_t> )
{
if ( stack )
return [ d ]( actor_target_data_t* t ) {
return std::invoke( d, static_cast<demon_hunter_td_t*>( t )->dots )->current_stack();
};
else
return [ d ]( actor_target_data_t* t ) {
return std::invoke( d, static_cast<demon_hunter_td_t*>( t )->dots )->is_ticking();
};
}
else
{
static_assert( static_false<T>, "Not a valid member of demon_hunter_td_t" );
return nullptr;
}
}
enum demonsurge_ability
{
SIGIL_OF_DOOM,
CONSUMING_FIRE,
ABYSSAL_GAZE,
ANNIHILATION,
DEATH_SWEEP,
ENTER_META
};
const std::vector<demonsurge_ability> demonsurge_abilities{
demonsurge_ability::SIGIL_OF_DOOM, demonsurge_ability::CONSUMING_FIRE, demonsurge_ability::ABYSSAL_GAZE,
demonsurge_ability::ANNIHILATION, demonsurge_ability::DEATH_SWEEP };
std::string demonsurge_ability_action_name( demonsurge_ability ability )
{
switch ( ability )
{
case demonsurge_ability::SIGIL_OF_DOOM:
return "demonsurge_sigil_of_doom";
case demonsurge_ability::CONSUMING_FIRE:
return "demonsurge_consuming_fire";
case demonsurge_ability::ABYSSAL_GAZE:
return "demonsurge_abyssal_gaze";
case demonsurge_ability::ANNIHILATION:
return "demonsurge_annihilation";
case demonsurge_ability::DEATH_SWEEP:
return "demonsurge_death_sweep";
case demonsurge_ability::ENTER_META:
return "demonsurge_enter_meta";
default:
return "demonsurge_unknown";
}
}
std::string demonsurge_ability_proc_name( demonsurge_ability ability )
{
switch ( ability )
{
case demonsurge_ability::SIGIL_OF_DOOM:
return "Demonsurge: Sigil of Doom";
case demonsurge_ability::CONSUMING_FIRE:
return "Demonsurge: Consuming Fire";
case demonsurge_ability::ABYSSAL_GAZE:
return "Demonsurge: Abyssal Gaze";
case demonsurge_ability::ANNIHILATION:
return "Demonsurge: Annihilation";
case demonsurge_ability::DEATH_SWEEP:
return "Demonsurge: Death Sweep";
case demonsurge_ability::ENTER_META:
return "Demonsurge: Volatile Instinct";
default:
return "demonsurge_unknown";
}
}
enum voidsurge_ability
{
PREDATORS_WAKE,
PIERCE_THE_VEIL,
REAPERS_TOLL,
VOLATILE_INSTINCT
};
const std::vector<voidsurge_ability> voidsurge_abilities{
voidsurge_ability::REAPERS_TOLL, voidsurge_ability::PREDATORS_WAKE, voidsurge_ability::PIERCE_THE_VEIL };
std::string voidsurge_ability_action_name( voidsurge_ability ability )
{
switch ( ability )
{
case voidsurge_ability::PREDATORS_WAKE:
return "voidsurge_predators_wake";
case voidsurge_ability::PIERCE_THE_VEIL:
return "voidsurge_pierce_the_veil";
case voidsurge_ability::REAPERS_TOLL:
return "voidsurge_reapers_toll";
case voidsurge_ability::VOLATILE_INSTINCT:
return "voidsurge_volatile_instinct";
default:
return "voidsurge_unknown";
}
}
std::string voidsurge_ability_proc_name( voidsurge_ability ability )
{
switch ( ability )
{
case voidsurge_ability::PREDATORS_WAKE:
return "Voidsurge: Predator's Wake";
case voidsurge_ability::PIERCE_THE_VEIL:
return "Voidsurge: Pierce the Veil";
case voidsurge_ability::REAPERS_TOLL:
return "Voidsurge: Reaper's Toll";
case voidsurge_ability::VOLATILE_INSTINCT:
return "Voidsurge: Volatile Instinct";
default:
return "Voidsurge: Unknown";
}
}
enum art_of_the_glaive_ability
{
GLAIVE_FLURRY,
RENDING_STRIKE
};
/* Demon Hunter class definition
*
* Derived from player_t. Contains everything that defines the Demon Hunter
* class.
*/
class demon_hunter_t : public parse_player_effects_t
{
public:
using base_t = parse_player_effects_t;
// Data collection for cooldown waste
auto_dispose<std::vector<data_t*>> cd_waste_exec, cd_waste_cumulative;
auto_dispose<std::vector<simple_data_t*>> cd_waste_iter;
// Autoattacks
attack_t* melee_main_hand;
attack_t* melee_off_hand;
double metamorphosis_health; // Vengeance temp health from meta;
double expected_max_health;
// Soul Fragments
unsigned next_fragment_spawn; // determines whether the next fragment spawn
// on the left or right
auto_dispose<std::vector<soul_fragment_t*>> soul_fragments;
event_t* soul_fragment_pick_up;
double frailty_accumulator; // Frailty healing accumulator
event_t* frailty_driver;
double feed_the_demon_accumulator;
double shattered_destiny_accumulator;
double wounded_quarry_accumulator;
player_t* last_reavers_mark_applied;
event_t* exit_melee_event; // Event to disable melee abilities mid-VR.
// Buffs
struct buffs_t
{
// General
buff_t* demon_soul;
buff_t* empowered_demon_soul;
buff_t* immolation_aura;
buff_t* metamorphosis;
buff_t* soul_fragments;
// Devourer
buff_t* reap;
buff_t* feast_of_souls;
buff_t* eradicate;
buff_t* moment_of_craving;
buff_t* emptiness;
buff_t* collapsing_star_stack;
buff_t* collapsing_star;
buff_t* void_metamorphosis_stack;
buff_t* rolling_torment;
buff_t* impending_apocalypse;
buff_t* hungering_slash;
buff_t* voidstep;
buff_t* voidrush;
// Havoc
buff_t* blind_fury;
buff_t* blur;
buff_t* chaos_theory;
buff_t* death_sweep;
buff_t* furious_gaze;
buff_t* inertia;
buff_t* inertia_trigger; // hidden buff that determines if we can trigger inertia
buff_t* initiative;
buff_t* inner_demon;
buff_t* exergy;
buff_t* out_of_range;
buff_t* tactical_retreat;
buff_t* unbound_chaos;
buff_t* cycle_of_hatred;
buff_t* empowered_eye_beam;
buff_t* eternal_hunt;
movement_buff_t* fel_rush_move;
movement_buff_t* vengeful_retreat_move;
movement_buff_t* metamorphosis_move;
// Vengeance
buff_t* demon_spikes;
buff_t* painbringer;
absorb_buff_t* soul_barrier;
buff_t* felfire_fist_in_combat;
buff_t* felfire_fist_out_of_combat;
buff_t* untethered_rage;
buff_t* seething_anger;
// Aldrachi Reaver
buff_t* reavers_glaive;
buff_t* art_of_the_glaive;
buff_t* glaive_flurry;
buff_t* rending_strike;
buff_t* warblades_hunger;
buff_t* thrill_of_the_fight_haste;
buff_t* thrill_of_the_fight_damage;
buff_t* art_of_the_glaive_first;
buff_t* art_of_the_glaive_second_rending_strike;
buff_t* art_of_the_glaive_second_glaive_flurry;
// Annihilator
buff_t* voidfall_building;
buff_t* voidfall_spending;
buff_t* voidfall_final_hour;
buff_t* dark_matter;
buff_t* doomsayer_in_combat;
buff_t* doomsayer_out_of_combat;
// Scarred
buff_t* monster_rising;
buff_t* student_of_suffering;
buff_t* enduring_torment;
buff_t* pursuit_of_angryness; // passive periodic updater buff
std::unordered_map<demonsurge_ability, buff_t*> demonsurge_abilities;
std::unordered_map<voidsurge_ability, buff_t*> voidsurge_abilities;
buff_t* demonsurge_demonsurge;
buff_t* demonsurge_demonic_intensity;
buff_t* demonsurge;
buff_t* voidsurge;
buff_t* volatile_instinct;
// Set Bonuses
} buff;
// Talents
struct talents_t
{
struct class_talents_t
{
player_talent_t vengeful_retreat;
player_talent_t felblade;
player_talent_t voidblade;
player_talent_t sigil_of_misery; // NYI
player_talent_t vengeful_bonds; // No Implementation
player_talent_t unrestrained_fury;
player_talent_t shattered_restoration;
player_talent_t improved_sigil_of_misery;
player_talent_t bouncing_glaives;
player_talent_t imprison; // No Implementation
player_talent_t charred_warblades; // NYI
player_talent_t chaos_nova;
player_talent_t void_nova; // NYI
player_talent_t improved_disrupt;
player_talent_t consume_magic;
player_talent_t aldrachi_design;
player_talent_t focused_ire; // No Implementation
player_talent_t master_of_the_glaive;
player_talent_t champion_of_the_glaive;
player_talent_t disrupting_fury;
player_talent_t blazing_path;
player_talent_t swallowed_anger;
player_talent_t aura_of_pain;
player_talent_t live_by_the_glaive; // NYI
player_talent_t pursuit;
player_talent_t soul_rending;
player_talent_t felfire_haste; // NYI
player_talent_t infernal_armor;
player_talent_t burn_it_out; // No Implementation
player_talent_t soul_cleanse; // No Implementation
player_talent_t lost_in_darkness; // No Implementation
player_talent_t illidari_knowledge;
player_talent_t felbound;
player_talent_t guile;
player_talent_t will_of_the_illidari; // NYI
player_talent_t internal_struggle;
player_talent_t furious;
player_talent_t remorseless;
player_talent_t first_in_last_out; // NYI
player_talent_t erratic_felheart;
player_talent_t final_breath;
player_talent_t darkness; // No Implementation
player_talent_t demon_muzzle; // No Implementation
player_talent_t soul_splitter;
player_talent_t wings_of_wrath; // No Implementation
player_talent_t long_night; // No Implementation
player_talent_t pitch_black; // No Implementation
player_talent_t demonic_resilience;
} demon_hunter;
struct devourer_talents_t
{
player_talent_t void_ray;
player_talent_t soul_immolation;
player_talent_t predators_thirst;
player_talent_t tempered_soul;
player_talent_t spontaneous_immolation;
player_talent_t void_metamorphosis;
player_talent_t feast_of_souls;
player_talent_t scythes_embrace;
player_talent_t duty_eternal;
player_talent_t collapsing_star;
player_talent_t moment_of_craving;
player_talent_t gift_of_the_void;
player_talent_t entropy;
player_talent_t waste_not;
player_talent_t soulshaper;
player_talent_t singed_spirit;
player_talent_t sweet_suffering;
player_talent_t second_helping;
player_talent_t umbral_blade;
player_talent_t improved_consume;
player_talent_t sweet_release;
player_talent_t voidpurge;
player_talent_t hungering_slash;
player_talent_t voidrage;
player_talent_t focused_ray;
player_talent_t soulforged_blades;
player_talent_t singular_strikes;
player_talent_t demonic_instinct;
player_talent_t devourers_edge;
player_talent_t voidglare_boon;
player_talent_t rolling_torment;
player_talent_t voidrush; // Partial implementation
player_talent_t devourers_bite;
player_talent_t impending_apocalypse;
player_talent_t calamitous;
player_talent_t star_fragments;
player_talent_t the_hunt;
player_talent_t emptiness;
player_talent_t soul_glutton;
player_talent_t eradicate;
player_talent_t midnight1;
player_talent_t midnight2;
player_talent_t midnight3;
} devourer;
struct havoc_talents_t
{
player_talent_t eye_beam;
player_talent_t critical_chaos;
player_talent_t burning_hatred;
player_talent_t dash_of_chaos; // NYI
player_talent_t improved_chaos_strike;
player_talent_t first_blood;
player_talent_t accelerated_blade;
player_talent_t demon_hide;
player_talent_t desperate_instincts; // No Implementation
player_talent_t netherwalk; // No Implementation
player_talent_t deflecting_dance; // No Implementation
player_talent_t mortal_dance; // No Implementation
player_talent_t initiative;
player_talent_t scars_of_suffering;
player_talent_t demonic;
player_talent_t furious_throws;
player_talent_t trail_of_ruin;
player_talent_t tactical_retreat;
player_talent_t blind_fury;
player_talent_t chaotic_transformation;
player_talent_t dancing_with_fate;
player_talent_t growing_inferno;
player_talent_t exergy;
player_talent_t inertia;
player_talent_t isolated_prey;
player_talent_t furious_gaze;
player_talent_t serrated_glaive; // Partially implemented
player_talent_t burning_wound;
player_talent_t unbound_chaos;
player_talent_t chaos_theory;
player_talent_t inner_demon;
player_talent_t the_hunt;
player_talent_t relentless_onslaught;
player_talent_t soulscar;
player_talent_t ragefire;
player_talent_t know_your_enemy;
player_talent_t cycle_of_hatred;
player_talent_t chaotic_disposition;
player_talent_t essence_break;
player_talent_t glaive_tempest;
player_talent_t shattered_destiny;
player_talent_t collective_anguish;
player_talent_t screaming_brutality;
player_talent_t a_fire_inside;
player_talent_t eternal_hunt_1;
player_talent_t eternal_hunt_2;
player_talent_t eternal_hunt_3;
} havoc;
struct vengeance_talents_t
{
player_talent_t fel_devastation;
player_talent_t spirit_bomb;
player_talent_t fiery_brand;
player_talent_t perfectly_balanced_glaive;
player_talent_t quickened_sigils;
player_talent_t ascending_flame;
player_talent_t tempered_steel;
player_talent_t calcified_spikes;
player_talent_t roaring_fire; // No Implementation
player_talent_t sigil_of_silence; // Partial Implementation
player_talent_t retaliation;
player_talent_t felfire_fist;
player_talent_t sigil_of_spite;
player_talent_t agonizing_flames;
player_talent_t feed_the_demon;
player_talent_t burning_blood;
player_talent_t revel_in_pain;
player_talent_t frailty;
player_talent_t feast_of_souls;
player_talent_t fallout;
player_talent_t ruinous_bulwark; // No Implementation
player_talent_t volatile_flameblood;
player_talent_t soul_barrier;
player_talent_t soul_sigils;
player_talent_t fel_flame_fortification; // No Implementation
player_talent_t void_reaver;
player_talent_t painbringer;
player_talent_t sigil_of_chains; // Partial Implementation
player_talent_t fiery_demise;
player_talent_t chains_of_anger;
player_talent_t focused_cleave;
player_talent_t soulmonger; // No Implementation
player_talent_t stoke_the_flames;
player_talent_t burning_alive;
player_talent_t cycle_of_binding;
player_talent_t vulnerability;
player_talent_t vengeful_beast;
player_talent_t charred_flesh;
player_talent_t soulcrush;
player_talent_t soul_carver;
player_talent_t last_resort; // NYI
player_talent_t darkglare_boon;
player_talent_t down_in_flames;
player_talent_t untethered_rage_1;
player_talent_t untethered_rage_2;
player_talent_t untethered_rage_3;
} vengeance;
struct aldrachi_reaver_talents_t
{
player_talent_t art_of_the_glaive;
player_talent_t fury_of_the_aldrachi;
player_talent_t evasive_action; // No Implementation
player_talent_t unhindered_assault;
player_talent_t reavers_mark;
player_talent_t broken_spirit;
player_talent_t aldrachi_tactics;
player_talent_t army_unto_oneself; // No Implementation
player_talent_t incorruptible_spirit; // No Implementation
player_talent_t wounded_quarry;
player_talent_t keen_edge;
player_talent_t incisive_blade;
player_talent_t keen_engagement;
player_talent_t preemptive_strike;
player_talent_t bladecraft;
player_talent_t warblades_hunger;
player_talent_t thrill_of_the_fight;
} aldrachi_reaver;
struct annihilator_talents_t
{
player_talent_t voidfall;
player_talent_t swift_erasure;
player_talent_t meteoric_rise;
player_talent_t catastrophe;
player_talent_t phase_shift;
player_talent_t path_to_oblivion; // No Implementation
player_talent_t state_of_matter; // No Implementation
player_talent_t mass_acceleration;
player_talent_t doomsayer;
player_talent_t harness_the_cosmos;
player_talent_t celestial_echoes;
player_talent_t final_hour;
player_talent_t meteoric_fall;
player_talent_t dark_matter;
player_talent_t otherworldly_focus;
player_talent_t world_killer;
} annihilator;
struct scarred_talents_t
{
player_talent_t demonsurge;
player_talent_t wave_of_debilitation; // No Implementation
player_talent_t pursuit_of_angriness;
player_talent_t focused_hatred;
player_talent_t set_fire_to_the_pain; // No Implementation
player_talent_t improved_soul_rending;
player_talent_t burning_blades;
player_talent_t violent_transformation;
player_talent_t enduring_torment;
player_talent_t untethered_fury;
player_talent_t student_of_suffering;
player_talent_t flamebound;
player_talent_t monster_rising;
player_talent_t blind_focus;
player_talent_t undying_embers;
player_talent_t volatile_instinct;
player_talent_t demonic_intensity;
} scarred;
} talent;
// Spell Data
struct spells_t
{
// Core Class Spells
const spell_data_t* chaos_brand;
const spell_data_t* disrupt;
const spell_data_t* immolation_aura;
const spell_data_t* throw_glaive;
const spell_data_t* spectral_sight;
// Class Passives
const spell_data_t* all_demon_hunter;
const spell_data_t* critical_strikes;
const spell_data_t* immolation_aura_2;
const spell_data_t* leather_specialization;
// Background Spells
const spell_data_t* demon_soul;
const spell_data_t* demon_soul_empowered;
const spell_data_t* felblade_damage;
const spell_data_t* immolation_aura_damage;
const spell_data_t* infernal_armor_damage;
const spell_data_t* soul_fragment;
// Cross-Expansion Override Spells
} spell;
// Specialization Spells
struct spec_t
{
// General
const spell_data_t* consume_soul;
const spell_data_t* consume_soul_greater_energize;
const spell_data_t* consume_soul_greater_heal;
const spell_data_t* consume_soul_lesser_energize;
const spell_data_t* consume_soul_lesser_heal;
const spell_data_t* demonic_wards;
const spell_data_t* metamorphosis;
const spell_data_t* metamorphosis_buff;
const spell_data_t* sigil_of_misery_debuff;
const spell_data_t* shattered_souls;
const spell_data_t* the_hunt;
const spell_data_t* the_hunt_impact;
const spell_data_t* the_hunt_dot;
const spell_data_t* blur;
// Devourer
const spell_data_t* devourer_demon_hunter;
const spell_data_t* consume;
const spell_data_t* consume_energize;
const spell_data_t* devour;
const spell_data_t* devour_energize;
const spell_data_t* voidblade;
const spell_data_t* soul_immolation_energize;
const spell_data_t* reap;
const spell_data_t* reap_damage;
const spell_data_t* reap_energize;
const spell_data_t* feast_of_souls_buff;
const spell_data_t* devourers_bite_debuff;
const spell_data_t* void_metamorphosis;
const spell_data_t* void_metamorphosis_stack;
const spell_data_t* cull;
const spell_data_t* cull_damage;
const spell_data_t* eradicate;
const spell_data_t* eradicate_buff;
const spell_data_t* eradicate_damage;
const spell_data_t* eradicate_damage_meta;
const spell_data_t* void_ray_tick;
const spell_data_t* void_ray_tick_meta;
const spell_data_t* moment_of_craving_buff;
const spell_data_t* void_buildup;
const spell_data_t* voidglare_boon_energize;
const spell_data_t* collapsing_star_damage;
const spell_data_t* collapsing_star_spell;
const spell_data_t* collapsing_star_buff;
const spell_data_t* collapsing_star_stacking_buff;
const spell_data_t* emptiness_buff;
const spell_data_t* impending_apocalypse_buff;
const spell_data_t* hungering_slash;
const spell_data_t* hungering_slash_buff;
const spell_data_t* hungering_slash_damage;
const spell_data_t* hungering_slash_energize;
const spell_data_t* voidstep;
const spell_data_t* rolling_torment_buff;
const spell_data_t* rolling_torment_energize;
// Havoc
const spell_data_t* havoc_demon_hunter;
const spell_data_t* annihilation;
const spell_data_t* blade_dance;
const spell_data_t* chaos_strike;
const spell_data_t* death_sweep;
const spell_data_t* fel_rush;
const spell_data_t* demonic_appetite;
const spell_data_t* blade_dance_2;
const spell_data_t* burning_wound_debuff;
const spell_data_t* chaos_strike_fury;
const spell_data_t* chaos_strike_refund;
const spell_data_t* chaos_theory_buff;
const spell_data_t* demon_blades;
const spell_data_t* demon_blades_damage;
const spell_data_t* essence_break_debuff;
const spell_data_t* eye_beam_damage;
const spell_data_t* fel_rush_damage;
const spell_data_t* first_blood_blade_dance_damage;
const spell_data_t* first_blood_blade_dance_2_damage;
const spell_data_t* first_blood_death_sweep_damage;
const spell_data_t* first_blood_death_sweep_2_damage;
const spell_data_t* furious_gaze_buff;
const spell_data_t* glaive_tempest;
const spell_data_t* glaive_tempest_damage;
const spell_data_t* immolation_aura_3;
const spell_data_t* initiative_buff;
const spell_data_t* inner_demon_buff;
const spell_data_t* inner_demon_damage;
const spell_data_t* exergy_buff;
const spell_data_t* inertia_trigger_buff;
const spell_data_t* inertia_buff;
const spell_data_t* ragefire_damage;
const spell_data_t* soulscar_debuff;
const spell_data_t* tactical_retreat_buff;
const spell_data_t* unbound_chaos_buff;
const spell_data_t* cycle_of_hatred_buff;
const spell_data_t* furious_throws_damage;
const spell_data_t* collective_anguish;
const spell_data_t* collective_anguish_damage;
const spell_data_t* essence_break_proc_damage;
const spell_data_t* empowered_eye_beam_buff;
const spell_data_t* empowered_eye_beam_damage;
const spell_data_t* eternal_hunt_buff;
// Vengeance
const spell_data_t* vengeance_demon_hunter;
const spell_data_t* demon_spikes;
const spell_data_t* infernal_strike;
const spell_data_t* soul_cleave;
const spell_data_t* fracture;
const spell_data_t* sigil_of_flame;
const spell_data_t* sigil_of_flame_damage;
const spell_data_t* sigil_of_flame_fury;
const spell_data_t* demonic_wards_2;
const spell_data_t* demonic_wards_3;
const spell_data_t* fiery_brand_debuff;
const spell_data_t* frailty_debuff;
const spell_data_t* riposte;
const spell_data_t* thick_skin;
const spell_data_t* demon_spikes_buff;
const spell_data_t* painbringer_buff;
const spell_data_t* calcified_spikes_buff;
const spell_data_t* immolation_aura_cdr;
const spell_data_t* soul_fragments_buff;
const spell_data_t* retaliation_damage;
const spell_data_t* sigil_of_silence;
const spell_data_t* sigil_of_silence_debuff;
const spell_data_t* sigil_of_chains;
const spell_data_t* sigil_of_chains_debuff;
const spell_data_t* burning_alive_controller;
const spell_data_t* infernal_strike_impact;
const spell_data_t* spirit_bomb_damage;
const spell_data_t* frailty_heal;
const spell_data_t* feast_of_souls_heal;
const spell_data_t* fel_devastation_2;
const spell_data_t* fel_devastation_heal;
const spell_data_t* felfire_fist_in_combat_buff;
const spell_data_t* felfire_fist_out_of_combat_buff;
const spell_data_t* sigil_of_spite_damage;
const spell_data_t* untethered_rage_buff;
const spell_data_t* seething_anger_buff;
} spec;
struct hero_spec_t
{
// Aldrachi Reaver
const spell_data_t* reavers_glaive;
const spell_data_t* reavers_glaive_buff;
const spell_data_t* reavers_mark;
const spell_data_t* glaive_flurry;
const spell_data_t* rending_strike;
const spell_data_t* art_of_the_glaive_buff;
const spell_data_t* art_of_the_glaive_damage;
const spell_data_t* warblades_hunger_buff;
const spell_data_t* warblades_hunger_damage;
const spell_data_t* wounded_quarry_damage;
const spell_data_t* thrill_of_the_fight_haste_buff;
const spell_data_t* thrill_of_the_fight_damage_buff;
double wounded_quarry_proc_rate;
// Annihilator
const spell_data_t* voidfall_meteor;
const spell_data_t* voidfall_building_buff;
const spell_data_t* voidfall_spending_buff;
const spell_data_t* voidfall_final_hour_buff;
const spell_data_t* catastrophe_dot;
const spell_data_t* dark_matter_buff;
const spell_data_t* meteor_shower_driver;
const spell_data_t* meteor_shower_damage;
const spell_data_t* doomsayer_in_combat_buff;
const spell_data_t* doomsayer_out_of_combat_buff;
const spell_data_t* world_killer;
// Scarred
const spell_data_t* burning_blades_debuff;
const spell_data_t* enduring_torment_buff;
const spell_data_t* monster_rising_buff;
const spell_data_t* student_of_suffering_buff;
const spell_data_t* demonsurge_demonsurge_buff;
const spell_data_t* demonsurge_placeholder_buff;
const spell_data_t* demonsurge_demonic_intensity_buff;
const spell_data_t* demonsurge_trigger;
const spell_data_t* demonsurge_damage;
const spell_data_t* demonsurge_stacking_buff;
const spell_data_t* voidsurge_trigger;
const spell_data_t* voidsurge_damage;
const spell_data_t* voidsurge_stacking_buff;
const spell_data_t* sigil_of_doom;
const spell_data_t* sigil_of_doom_damage;
const spell_data_t* abyssal_gaze;
const spell_data_t* predators_wake;
const spell_data_t* pierce_the_veil;
const spell_data_t* reapers_toll;
const spell_data_t* volatile_instinct;
const spell_data_t* demonsurge_meta_trigger;
} hero_spec;
// Set Bonus effects
struct set_bonuses_t
{
// Devourer
const spell_data_t* stars_fury; // MID1 Devourer 4pc Energize
// Havoc
// Vengeance
const spell_data_t* mid1_vengeance_4pc;
const spell_data_t* explosion_of_the_soul;
// Auxilliary
} set_bonuses;
// Mastery Spells
struct mastery_t
{
// Devourer
const spell_data_t* monster_within;
// Havoc
const spell_data_t* a_fire_inside;
const spell_data_t* demonic_presence;
// Vengeance
const spell_data_t* fel_blood;
const spell_data_t* fel_blood_rank_2;
} mastery;
// Cooldowns
struct cooldowns_t
{
// General
cooldown_t* sigil_of_spite;
cooldown_t* felblade;
cooldown_t* immolation_aura;
cooldown_t* the_hunt;
cooldown_t* sigil_of_flame;
cooldown_t* sigil_of_misery;
cooldown_t* metamorphosis;
cooldown_t* throw_glaive;
cooldown_t* vengeful_retreat;