SimulationCraft
SimulationCraft is a tool to explore combat mechanics in the popular MMO RPG World of Warcraft (tm).
sim.hpp
1 // ==========================================================================
2 // Dedmonwakeen's Raid DPS/TPS Simulator.
3 // Send questions to [email protected]
4 // ==========================================================================
5 
6 #pragma once
7 
8 #include "config.hpp"
9 #include "event_manager.hpp"
10 #include "player/gear_stats.hpp"
11 #include "progress_bar.hpp"
12 #include "sim_ostream.hpp"
13 #include "sim/option.hpp"
14 #include "util/concurrency.hpp"
15 #include "util/rng.hpp"
16 #include "util/sample_data.hpp"
17 #include "util/util.hpp"
18 #include "util/vector_with_callback.hpp"
19 
20 #include <map>
21 #include <memory>
22 
23 struct actor_target_data_t;
24 struct buff_t;
25 struct cooldown_t;
26 class dbc_t;
27 class dbc_override_t;
28 struct expr_t;
29 namespace highchart {
30  struct chart_t;
31 }
33 struct option_t;
34 struct plot_t;
35 struct raid_event_t;
36 struct reforge_plot_t;
38 struct sim_control_t;
39 struct spell_data_expr_t;
40 struct spell_data_t;
41 struct work_queue_t;
42 
43 namespace report::json
44 {
45 class report_configuration_t;
46 }
47 
48 namespace profileset{
49  class profilesets_t;
50 }
51 
53 {
54  int current_iterations;
55  int total_iterations;
56  double pct() const
57  { return std::min( 1.0, current_iterations / static_cast<double>(total_iterations) ); }
58 };
59 
61 struct sim_t : private sc_thread_t
62 {
63  event_manager_t event_mgr;
64 
65  // Output
66  sim_ostream_t out_log;
67  sim_ostream_t out_debug;
68  bool debug;
69 
78  bool canceled;
79  // Clean up memory for threads after iterating (defaults to no in normal operation, some options
80  // will force-enable the option)
81  bool cleanup_threads;
82  bool initialized;
83  bool fixed_time;
84  bool save_profiles;
85  bool save_profile_with_actions; // When saving full profiles, include actions or not
86  bool default_actions;
87 
88  // Iteration Controls
89  timespan_t max_time, expected_iteration_time;
90  double vary_combat_length;
91  int current_iteration, iterations;
92  double target_error;
93  role_e target_error_role;
94  double current_error;
95  double current_mean;
96  int analyze_error_interval, analyze_number;
97 
98  sim_control_t* control;
99  sim_t* parent;
100  player_t* target;
101  player_t* heal_target;
103  vector_with_callback<player_t*> target_non_sleeping_list;
105  vector_with_callback<player_t*> player_no_pet_list;
106  vector_with_callback<player_t*> player_non_sleeping_list;
107  vector_with_callback<player_t*> healing_no_pet_list;
108  vector_with_callback<player_t*> healing_pet_list;
109  player_t* active_player;
110  size_t current_index; // Current active player
111  int num_players;
112  int num_enemies;
113  int num_tanks;
114  int enemy_targets;
115  int healing; // Creates healing targets. Useful for ferals, I guess.
116  int global_spawn_index;
117  int max_player_level;
118  timespan_t queue_lag, queue_lag_stddev;
119  timespan_t gcd_lag, gcd_lag_stddev;
120  timespan_t channel_lag, channel_lag_stddev;
121  timespan_t queue_gcd_reduction;
122  timespan_t default_cooldown_tolerance;
123  bool strict_gcd_queue;
124  double confidence, confidence_estimator;
125  // Latency
126  timespan_t world_lag, world_lag_stddev;
127  double travel_variance, default_skill;
128  timespan_t reaction_time, regen_periodicity;
129  timespan_t ignite_sampling_delta;
130  int optimize_expressions;
131  int optimize_expressions_rounds;
132  int current_slot;
133  int optimal_raid, log, debug_each;
134  std::vector<uint64_t> debug_seed;
135  stat_e normalized_stat;
136  std::string current_name, default_region_str, default_server_str, save_prefix_str, save_suffix_str;
137  bool save_talent_str;
138  talent_format talent_input_format;
140  std::string main_target_str;
141  int stat_cache;
142  int max_aoe_enemies;
143  double tmi_window_global;
144  double tmi_bin_size;
145  bool show_etmi;
146  bool requires_regen_event;
147  bool single_actor_batch;
148  bool allow_experimental_specializations;
149  int progressbar_type;
150  int armory_retries;
151 
152  // Target options
153  double enemy_death_pct;
154  int rel_target_level, target_level;
155  std::string target_race;
156  int target_adds;
157  std::string sim_progress_base_str, sim_progress_phase_str;
158  int desired_targets; // desired number of targets
159 
160 
161  // Data access
162  std::unique_ptr<dbc_t> dbc;
163  std::unique_ptr<dbc_override_t> dbc_override;
164 
165  // Default stat enchants
167 
168  int timewalk;
169  int scale_to_itemlevel; //itemlevel to scale to. if -1, we don't scale down
170  int keystone_level; // keystone difficulty for scaling purposes
171  int keystone_pct_hp; // keystone mob health percent
172  std::string keystone_bounty; // Shrouded bounty stat type
173  bool challenge_mode; // if active, players will get scaled down to 620 and set bonuses are deactivated
174  bool scale_itemlevel_down_only; // Items below the value of scale_to_itemlevel will not be scaled up.
175  bool disable_set_bonuses; // Disables all set bonuses.
176  bool enable_taunts;
177  bool use_item_verification; // Disable use-item action verification in the simulator
178  unsigned int disable_2_set; // Disables all 2 set bonuses for this tier/integer that this is set as
179  unsigned int disable_4_set; // Disables all 4 set bonuses for this tier/integer that this is set as
180  unsigned int enable_2_set;// Enables all 2 set bonuses for the tier/integer that this is set as
181  unsigned int enable_4_set; // Enables all 4 set bonuses for the tier/integer that this is set as
182  const spell_data_t* pvp_rules; // Hidden aura that contains the PvP crit damage reduction
183  bool pvp_mode; // Enables PvP mode - reduces crit damage, adjusts PvP gear iLvl
184  bool feast_as_dps = true;
185  bool auto_attacks_always_land;
186  bool log_spell_id; // Add spell data ids to log/debug output where available. (actions, buffs)
187 
188  // Actor tracking
189  int active_enemies;
190  int active_allies;
191 
192  std::vector<std::unique_ptr<option_t>> options;
193  std::vector<std::string> party_encoding;
194  std::vector<std::string> item_db_sources;
195 
196  // Random Number Generation
197  rng::rng_t _rng;
198  uint64_t seed;
199  int deterministic;
200  int strict_work_queue;
201  int average_range, average_gauss;
202 
203  // Raid Events
204  std::vector<std::unique_ptr<raid_event_t>> raid_events;
205  std::string raid_events_str;
206  fight_style_e fight_style;
207  size_t add_waves;
208 
209  // Buffs and Debuffs Overrides
210  struct overrides_t
211  {
212  // Buff overrides
213  int arcane_intellect;
214  int battle_shout;
215  int power_word_fortitude;
216  int windfury_totem;
217 
218  // Debuff overrides
219  int chaos_brand;
220  int mystic_touch;
221  int mortal_wounds;
222  int bleeding;
223 
224  // Misc stuff needs resolving
225  int bloodlust;
226  std::vector<uint64_t> target_health;
227  } overrides;
228 
229  struct auras_t
230  {
231  buff_t* arcane_intellect;
232  buff_t* battle_shout;
233  buff_t* power_word_fortitude;
234  } auras;
235 
236  // Expansion specific custom parameters. Defaults in the constructor.
238  {
239  // Legion
240  int infernal_cinders_users = 1;
241  int engine_of_eradication_orbs = 4;
242  int void_stalkers_contract_targets = -1;
243  double specter_of_betrayal_overlap = 1.0;
244  std::vector<double> cradle_of_anguish_resets;
245  } legion_opts;
246 
247  struct bfa_opt_t
248  {
250  double secrets_of_the_deep_chance = 0.1; // TODO: Guessed, needs validation
252  double secrets_of_the_deep_collect_chance = 1.0;
254  double gutripper_default_rppm = 2.0;
256  double seductive_power_pickup_chance = 1.0;
258  timespan_t covenant_period = 1.0_s;
260  double covenant_chance = 1.0;
262  double incandescent_sliver_chance = 1.0;
264  timespan_t fight_or_flight_period = 1.0_s;
266  double fight_or_flight_chance = 0.0;
268  double harbingers_inscrutable_will_silence_chance = 0.0;
270  double harbingers_inscrutable_will_move_chance = 1.0;
272  double aberrant_tidesage_damage_chance = 1.0;
274  double fathuuls_floodguards_damage_chance = 1.0;
276  double grips_of_forsaken_sanity_damage_chance = 1.0;
278  double stormglide_steps_take_damage_chance = 0.0;
280  timespan_t lurkers_insidious_gift_duration = 0_ms;
282  timespan_t abyssal_speakers_gauntlets_shield_duration = 0_ms;
284  timespan_t trident_of_deep_ocean_duration = 0_ms;
286  double legplates_of_unbound_anguish_chance = 1.0;
288  timespan_t loyal_to_the_end_ally_death_timer = 60_s;
290  double loyal_to_the_end_ally_death_chance = 0.0;
292  int loyal_to_the_end_allies = 0;
294  int worldvein_allies = 0;
296  double ripple_in_space_proc_chance = 0.0;
298  double blood_of_the_enemy_in_range = 1.0;
300  timespan_t undulating_tides_lockout_timer = 60_s;
302  double undulating_tides_lockout_chance = 0.0;
304  double leviathans_lure_base_rppm = 0.75;
306  double aquipotent_nautilus_catch_chance = 1.0;
308  double zaquls_portal_key_move_chance = 0.0;
310  timespan_t anuazshara_unleash_time = 0_ms;
312  double storm_of_the_eternal_ratio = 0.05;
314  timespan_t font_of_power_precombat_channel = 0_ms;
316  double voidtwisted_titanshard_percent_duration = 0.5;
318  timespan_t surging_vitality_damage_taken_period = 0_s;
320  unsigned manifesto_allies_start = 0;
322  unsigned manifesto_allies_end = 5;
324  timespan_t symbiotic_presence_interval = 22_s;
326  double whispered_truths_offensive_chance = 0.75;
328  int initial_seductive_power_stacks = 0;
330  unsigned jes_howler_allies = 4;
332  int initial_archive_of_the_titans_stacks = 0;
334  unsigned arcane_heart_hps = 0;
336  int subroutine_recalibration_precombat_stacks = 0;
338  int subroutine_recalibration_dummy_casts = 0;
340  int reorigination_array_stacks = 0;
342  bool reorigination_array_ignore_scale_factors = false;
344  bool randomize_oscillation = true;
346  bool auto_oscillating_overload = true;
348  bool zuldazar = false;
350  bool nyalotha = true;
352  bool nazjatar = true;
354  bool shiver_venom = false;
355  } bfa_opts;
356 
358  {
361  double combat_meditation_extend_chance = 1.0;
363  unsigned pointed_courage_nearby = 3;
366  int lead_by_example_nearby = -1;
368  unsigned stone_legionnaires_in_party = 0;
370  unsigned crimson_choir_in_party = 0;
372  timespan_t memory_of_past_sins_precast = 0_s;
374  double judgment_of_the_arbiter_arc_chance = 0.0;
378  std::string volatile_solvent_type = "mastery";
379  // Overrides the Unbound Changeling trinket to the given version.
380  // The versions are given by the "all", "crit", "haste", and "mastery"
381  // strings. Anything else will result in the item's bonus IDs being
382  // used to determine which version the player is currently using.
383  std::string unbound_changeling_stat_type = "default";
385  double gluttonous_spike_overheal_chance = 1.0;
387  double anima_field_emitter_mean = std::numeric_limits<double>::max(),
388  anima_field_emitter_stddev = 0.0;
390  timespan_t retarget_shadowgrasp_totem = 0_s;
392  double iqd_stat_fail_chance = 0.0;
395  double thrill_seeker_killing_blow_chance = -1.0;
397  double wild_hunt_tactics_duration_multiplier = 1.0;
399  double bonded_hearts_other_covenant_chance = 1.0;
400  // Stat buff provided by Theotar's Party Favors soulbind (The Mad Duke's Tea buffs)
401  // Buff Types: "primary", "haste", "crit", "versatility"
402  std::string party_favor_type = "random";
403  // Battlefield Presence enemy count override
404  // Defaults to -1 to have the sim constantly adjust the value based on number of enemies in the sim
405  int battlefield_presence_enemies = -1;
407  unsigned shattered_psyche_allies = 0;
409  timespan_t salvaged_fusion_amplifier_precast = 0_s;
411  double titanic_ocular_gland_worthy_chance = 1.0;
413  double newfound_resolve_success_chance = 1.0;
416  timespan_t newfound_resolve_default_delay = 4_s;
417  double newfound_resolve_delay_relstddev = 0.2;
419  timespan_t pustule_eruption_interval = 1_s;
421  double shredded_soul_pickup_chance = 1.0;
423  double valiant_strikes_heal_rate = 1.0;
426  std::string soleahs_secret_technique_type = "haste";
428  timespan_t shadowed_orb_of_torment_precombat_channel = 0_ms;
430  timespan_t reactive_defense_matrix_interval = 0_ms;
432  double field_of_blossoms_duration_multiplier = 1.0;
434  double cruciform_veinripper_proc_rate = 0.0;
436  double cruciform_veinripper_in_front_rate = 0.0;
438  unsigned int precombat_pustules = 9;
439  // Prevents Soul Ignite from being used a second time to trigger the
440  // AoE early. This results in the highest possible damage and the
441  // player can alternatively trigger it early by canceling the buff.
442  bool disable_soul_igniter_second_use = true;
444  bool disable_iqd_execute = false;
445  // Better Together Override
446  // Defaults active
447  bool better_together_ally = true;
448  bool enable_rune_words = false;
449  bool enable_domination_gems = false;
450  // fleshcraft cancel delay from the_first_sigil
451  timespan_t the_first_sigil_fleshcraft_cancel_time = 50_ms;
452  // Earthbreaker's Impact weak points triggered
453  unsigned int earthbreakers_impact_weak_points = 3;
454  // Grim Eclipse Dot Duration override
455  double grim_eclipse_dot_duration_multiplier = 1.0;
456  // Percentage of default duration for Grim Eclipse haste buff. Set to 90% by default assuming about 1s of movement to get to the Event Horizon
457  double grim_eclipse_buff_duration_multiplier = 0.9;
458  // Automatically break the Chains of Domination trinket at maximum
459  bool chains_of_domination_auto_break = true;
460  // First Strike proc period
461  double first_strike_chance = 0.0;
462  // First Strike proc chance when the period is set
463  timespan_t first_strike_period = 5_s;
464  // Expected uptime of Adaptive Armor Fragment
465  double adaptive_armor_fragment_uptime = 0.5;
467  double soothing_shade_duration_multiplier = 1.0;
468  // Time in seconds before prepull to use Jotungeirr
469  timespan_t jotungeirr_prepull_seconds = 0_s;
470  } shadowlands_opts;
471 
472  // Auras and De-Buffs
474 
475  // Global aura related delay
476  timespan_t default_aura_delay;
477  timespan_t default_aura_delay_stddev;
478 
480 
482  azerite_control azerite_status;
483 
484  // Reporting
485  progress_bar_t progress_bar;
486  std::unique_ptr<scale_factor_control_t> scaling;
487  std::unique_ptr<plot_t> plot;
488  std::unique_ptr<reforge_plot_t> reforge_plot;
489  chrono::cpu_clock::duration elapsed_cpu;
490  chrono::wall_clock::duration elapsed_time;
491  std::vector<size_t> work_per_thread;
492  size_t work_done;
493  double iteration_dmg, priority_iteration_dmg, iteration_heal, iteration_absorb;
494  simple_sample_data_t raid_dps, total_dmg, raid_hps, total_heal, total_absorb, raid_aps;
495  extended_sample_data_t simulation_length;
496  chrono::wall_clock::duration merge_time, init_time, analyze_time;
497  // Deterministic simulation iteration data collectors for specific iteration
498  // replayability
499  std::vector<iteration_data_entry_t> iteration_data, low_iteration_data, high_iteration_data;
500  // Report percent (how many% of lowest/highest iterations reported, default 2.5%)
501  double report_iteration_data;
502  // Minimum number of low/high iterations reported (default 5 of each)
503  int min_report_iteration_data;
504  int report_progress;
505  int bloodlust_percent;
506  timespan_t bloodlust_time;
507  std::string reference_player_str;
508  std::vector<player_t*> players_by_dps;
509  std::vector<player_t*> players_by_priority_dps;
510  std::vector<player_t*> players_by_hps;
511  std::vector<player_t*> players_by_hps_plus_aps;
512  std::vector<player_t*> players_by_dtps;
513  std::vector<player_t*> players_by_tmi;
514  std::vector<player_t*> players_by_name;
515  std::vector<player_t*> players_by_apm;
516  std::vector<player_t*> players_by_variance;
517  std::vector<player_t*> targets_by_name;
518  std::vector<std::string> id_dictionary;
519  std::map<double, std::vector<double> > divisor_timeline_cache;
520  std::vector<report::json::report_configuration_t> json_reports;
521  std::string output_file_str, html_file_str, json_file_str;
522  std::string reforge_plot_output_file_str;
523  std::vector<std::string> error_list;
524  int report_precision;
525  int report_pets_separately;
526  int report_targets;
527  int report_details;
528  int report_raw_abilities;
529  int report_rng;
530  int hosted_html;
531  int save_raid_summary;
532  int save_gear_comments;
533  int statistics_level;
534  int separate_stats_by_actions;
535  int report_raid_summary;
536  int buff_uptime_timeline;
537  int buff_stack_uptime_timeline;
538  bool json_full_states;
539  int decorated_tooltips;
540 
541  int allow_potions;
542  int allow_food;
543  bool allow_flasks;
544  int allow_augmentations;
545  int solo_raid;
546  bool maximize_reporting;
547  std::string apikey, user_apitoken;
548  bool distance_targeting_enabled;
549  bool ignore_invulnerable_targets;
550  bool enable_dps_healing;
551  bool count_overheal_as_heal;
552  double scaling_normalized;
553  bool merge_enemy_priority_dmg;
554 
555  // Multi-Threading
556  mutex_t merge_mutex;
557  int threads;
558  std::vector<sim_t*> children; // Manual delete!
559  int thread_index;
560  computer_process::priority_e process_priority;
561 
562  std::shared_ptr<work_queue_t> work_queue;
563 
564  // Related Simulations
565  mutex_t relatives_mutex;
566  std::vector<sim_t*> relatives;
567 
568  // Spell database access
569  std::unique_ptr<spell_data_expr_t> spell_query;
570  unsigned spell_query_level;
571  std::string spell_query_xml_output_file_str;
572 
573  std::unique_ptr<mutex_t> pause_mutex; // External pause mutex, instantiated an external entity (in our case the GUI).
574  bool paused;
575 
576  // Highcharts stuff
577 
578  // Vector of on-ready charts. These receive individual jQuery handlers in the HTML report (at the
579  // end of the report) to load the highcharts into the target div.
580  std::vector<std::string> on_ready_chart_data;
581 
582  // A map of highcharts data, added as a json object into the HTML report. JQuery installs handlers
583  // to correct elements (toggled elements in the HTML report) based on the data.
584  std::map<std::string, std::vector<std::string> > chart_data;
585 
586  bool chart_show_relative_difference;
587  // Use the max metric actor as the relative difference base instead of the min
588  bool relative_difference_from_max;
589  // Which actor to use as the base for computing relative difference.
590  std::string relative_difference_base;
591  double chart_boxplot_percentile;
592 
593  // List of callbacks to call when an actor_target_data_t object is created. Currently used to
594  // initialize the generic targetdata debuffs/dots we have.
595  std::vector<std::function<void(actor_target_data_t*)> > target_data_initializer;
596 
597  bool display_hotfixes, disable_hotfixes;
598  bool display_bonus_ids;
599 
600  // Profilesets
601  opts::map_list_t profileset_map;
602  std::vector<scale_metric_e> profileset_metric;
603  std::vector<std::string> profileset_output_data;
604  bool profileset_enabled;
605  int profileset_work_threads, profileset_init_threads;
606  std::unique_ptr<profileset::profilesets_t> profilesets;
607 
608 
609  sim_t();
610  sim_t( sim_t* parent, int thread_index = 0 );
611  sim_t( sim_t* parent, int thread_index, sim_control_t* control );
612  ~sim_t() override;
613 
614  void run() override;
615  int main( const std::vector<std::string>& args );
616  double iteration_time_adjust();
617  double expected_max_time() const;
618  bool is_canceled() const;
619  void cancel_iteration();
620  void cancel();
621  void interrupt();
622  void add_relative( sim_t* cousin );
623  void remove_relative( sim_t* cousin );
624  sim_progress_t progress( std::string* detailed = nullptr, int index = -1 );
625  double progress( std::string& phase, std::string* detailed = nullptr, int index = -1 );
626  void detailed_progress( std::string*, int current_iterations, int total_iterations );
627  void datacollection_begin();
628  void datacollection_end();
629  void reset();
630  void check_actors();
631  void init_fight_style();
632  void init_parties();
633  void init_actors();
634  void init_actor( player_t* );
635  void init_actor_pets();
636  void init();
637  void analyze();
638  void merge( sim_t& other_sim );
639  void merge();
640  bool iterate();
641  void partition();
642  bool execute();
643  void analyze_error();
644  void analyze_iteration_data();
645  void print_options();
646  void add_option( std::unique_ptr<option_t> opt );
647  void create_options();
648  bool parse_option( const std::string& name, const std::string& value );
649  void setup( sim_control_t* );
650  bool time_to_think( timespan_t proc_time );
651  player_t* find_player( util::string_view name ) const;
652  player_t* find_player( int index ) const;
653  cooldown_t* get_cooldown( util::string_view name );
654  void use_optimal_buffs_and_debuffs( int value );
655  std::unique_ptr<expr_t> create_expression( util::string_view name );
659  template <typename... Args>
660  void errorf( util::string_view format, Args&&... args )
661  {
662  if ( thread_index != 0 )
663  return;
664 
665  set_error( fmt::sprintf( format, std::forward<Args>(args)... ) );
666  }
667 
671  template <typename... Args>
672  void error( fmt::format_string<Args...> format, Args&&... args )
673  {
674  if ( thread_index != 0 )
675  return;
676 
677  set_error( fmt::vformat( format, fmt::make_format_args( std::forward<Args>(args)... ) ) );
678  }
679 
680  void abort();
681  void combat();
682  void combat_begin();
683  void combat_end();
684  void add_chart_data( const highchart::chart_t& chart );
685  bool has_raid_event( util::string_view type ) const;
686 
687  // Activates the necessary actor/actors before iteration begins.
688  void activate_actors();
689 
690  timespan_t current_time() const
691  { return event_mgr.current_time; }
692  static double distribution_mean_error( const sim_t& s, const extended_sample_data_t& sd )
693  { return s.confidence_estimator * sd.mean_std_dev; }
694  void register_target_data_initializer(std::function<void(actor_target_data_t*)> cb)
695  { target_data_initializer.push_back( cb ); }
696  const rng::rng_t& rng() const
697  { return _rng; }
698  rng::rng_t& rng()
699  { return _rng; }
700  double averaged_range( double min, double max );
701 
702  // Thread id of this sim_t object
703 #ifndef SC_NO_THREADING
704  std::thread::id thread_id() const
705  { return sc_thread_t::thread_id(); }
706 #endif
707 
721  template <typename... Args>
722  void print_debug( fmt::format_string<Args...> format, Args&& ... args )
723  {
724  if ( ! debug )
725  return;
726 
727  out_debug.vprint( format, fmt::make_format_args( std::forward<Args>(args)... ) );
728  }
729 
736  template <typename... Args>
737  void print_log( fmt::format_string<Args...> format, Args&& ... args )
738  {
739  if ( ! log )
740  return;
741 
742  out_log.vprint( format, fmt::make_format_args( std::forward<Args>(args)... ) );
743  }
744 
745 private:
746  void set_error(std::string error);
747  void do_pause();
748  void print_spell_query();
749  void enable_debug_seed();
750  void disable_debug_seed();
751  bool requires_cleanup() const;
752 };
Definition: option.hpp:38
Definition: generic.hpp:484
Definition: client_data.hpp:17
Definition: sim.hpp:237
void error(fmt::format_string< Args... > format, Args &&... args)
Create error using fmt libraries python-like formatting syntax.
Definition: sim.hpp:672
Definition: sim.hpp:210
Definition: sim.hpp:229
Definition: sim_control.hpp:39
Definition: charts.hpp:36
Definition: sim.hpp:52
Definition: cooldown.hpp:26
void errorf(util::string_view format, Args &&... args)
Create error with printf formatting.
Definition: sim.hpp:660
void print_log(fmt::format_string< Args... > format, Args &&... args)
Convenient log function using python-like formatting.
Definition: sim.hpp:737
Definition: sample_data.hpp:311
Definition: spell_data.hpp:398
Definition: raid_event.hpp:28
Definition: dbc.hpp:522
Definition: sample_data.hpp:196
Definition: scale_factor_control.hpp:18
Definition: highchart.hpp:48
Definition: concurrency.hpp:23
Definition: progress_bar.hpp:17
Definition: work_queue.hpp:14
Definition: rng.hpp:305
Definition: gear_stats.hpp:17
Definition: event_manager.hpp:20
Definition: charts.hpp:22
bool log_spell_id
Allow Auto Attacks (white attacks) to always hit the enemy.
Definition: sim.hpp:186
Definition: spell_data_expr.hpp:35
Class for representing InGame time.
Definition: timespan.hpp:37
Definition: dbc.hpp:310
Definition: sim.hpp:247
Definition: player.hpp:109
azerite_control azerite_status
Status of azerite-related effects.
Definition: sim.hpp:482
Action expression.
Definition: expressions.hpp:79
Definition: concurrency.hpp:37
Definition: reforge_plot.hpp:15
bool strict_parsing
Error on unknown options (default=false)
Definition: sim.hpp:77
Definition: sim_ostream.hpp:56
Definition: enchants.hpp:23
Definition: report_configuration.cpp:39
Definition: buff.hpp:56
Random number generation.
Definition: action.hpp:37
Definition: core.h:1208
void print_debug(fmt::format_string< Args... > format, Args &&... args)
Convenient stdout print function using python-like formatting.
Definition: sim.hpp:722
Simulation engine.
Definition: sim.hpp:61
Definition: charts.hpp:27
Definition: sim.hpp:357
Definition: actor_target_data.hpp:15
Definition: plot.hpp:14
Definition: vector_with_callback.hpp:19
Definition: iteration_data_entry.hpp:13