 |
01/07/09, 3:15 AM
|
#1151
|
|
Glass Joe
Draenei Shaman
Bloodscalp
|
Originally Posted by Tramana
On a related note, I noticed that flametongue doesn't proc 100% of the time when using ft/ft it's more like 80% of the time. When I used different ranks of FT on each weapon the proc rate went back to 100%. Try testing this out on the target dummy yourself to see if you see the same thing.
|
I don't have this issue. Interestingly, looking back at my WWS I actually have quite a few more flametongue attacks than I do melee hits. This can be attributed to Stormstrike and Lava Lash.
I suspect the reason why you aren't getting as many on the target dummy is because you aren't spell capped without raid buffs. It's possible to have a melee hit, but the flametongue miss. You can easily see this if you lose your shadow priest (and/or moonkin) part way through a raid.
|
|
|
|
|
01/07/09, 3:45 AM
|
#1152
|
|
Von Kaiser
|
Originally Posted by Paenor
I don't have this issue. Interestingly, looking back at my WWS I actually have quite a few more flametongue attacks than I do melee hits. This can be attributed to Stormstrike and Lava Lash.
I suspect the reason why you aren't getting as many on the target dummy is because you aren't spell capped without raid buffs. It's possible to have a melee hit, but the flametongue miss. You can easily see this if you lose your shadow priest (and/or moonkin) part way through a raid.
|
It's interesting that you aren't seeing this.
The missing procs were not due to spell miss. Recount showed 0 misses for flametongue weapon, I was hitting a level 60 training dummy with 14% spell hit, and I saw different results when changing the rank of the main hand flametongue.
|
|
|
|
|
01/07/09, 4:14 AM
|
#1153
|
|
Don Flamenco
Tauren Shaman
Blackrock (EU)
|
Originally Posted by Tramana
It's interesting that you aren't seeing this.
The missing procs were not due to spell miss. Recount showed 0 misses for flametongue weapon, I was hitting a level 60 training dummy with 14% spell hit, and I saw different results when changing the rank of the main hand flametongue.
|
Most probably there is a short cooldown on FT. Paenor used two weapons with a big difference in speed in his test (1.8/2.5), while you use weapons with a more closer speed (1.8/1.4).
|
|
|
|
|
01/07/09, 5:19 AM
|
#1154
|
|
Glass Joe
Draenei Shaman
Bloodscalp
|
Actually tonight I managed to grab a Webbed Death, so my combat dummy (and the WWS I referred to in my last post) tests were actually done with that.
Since that post I have done more testing on the dummies, and i'm get some strange results as well.
First and foremost. Make sure you are reading Recount correctly. It displays the current amount of swings, which includes dodges/misses/parries. So the number will be inflated by default. However, Recount is also giving me different numbers that looking directly at the combat log does. Nearly always for the worse.
Even keeping that in mind, most (but not all) of the tests that I did do have missing flametongue procs. Just by watching your scrolling damage text you can see it behaving strangely. Sometimes you will get 5 procs in a row after one hit, sometimes none.
Even stranger still, looking back at my combat logs from Naxx earlier today many fights not only did I have more flametongue hits than melee attacks, but I had many more than all physical hits combined. Additionally, I never once had less flametongue hits than melee. So it appears that it can actually work both ways.
At this point, i'm not sure what to say, other than I'm tired and I'll look into it more later. I need more raid data at this point to make a call. It's hard to say right now if it's some strange target dummy thing, or possibly a lag issue.
|
|
|
|
|
01/07/09, 6:05 AM
|
#1155
|
|
Von Kaiser
|
Originally Posted by SentinelBorg
Most probably there is a short cooldown on FT. Paenor used two weapons with a big difference in speed in his test (1.8/2.5), while you use weapons with a more closer speed (1.8/1.4).
|
I think this is right. To help test this idea, I got two weapons with matched speed. When I run with 2.6/2.6 and start with them out of phase (each weapon hits about 1 second apart) I got 100 ft out of 100 melee hits. When I started with the weapons in phase (each weapon hits at the same time) I got 54 ft out of 101 melee hits.
It would seem that using different ranks gets around the short FT cooldown. This is the way windfury behaved when they first introduced the cooldown if I remember correctly.
|
|
|
|
|
01/07/09, 9:19 AM
|
#1156
|
|
Major Berserk
Raut
Tauren Shaman
No WoW Account (EU)
|
Building EnhSim is currently broken using GCC on linux. Lines starting with "enh::eout << enh::setw(26)" triggers an error:

enhsimconfig.cpp:337: error: no match for 'operator<<' in 'enh::eout << enh::setw(26)'
enhsimoutput.h:37: note: candidates are: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(bool)
enhsimoutput.h:38: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(short int)
enhsimoutput.h:39: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(short unsigned int)
enhsimoutput.h:40: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(int)
enhsimoutput.h:41: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(unsigned int)
enhsimoutput.h:42: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(long int)
enhsimoutput.h:43: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(long unsigned int)
enhsimoutput.h:44: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(float)
enhsimoutput.h:45: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(double)
enhsimoutput.h:46: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(long double)
enhsimoutput.h:47: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(void*)
enhsimoutput.h:49: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(std::string&)
enhsimoutput.h:50: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(const std::string&)
enhsimoutput.h:51: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(std::streambuf*)
enhsimoutput.h:52: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(std::ostream& (*)(std::ostream&))
enhsimoutput.h:53: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(std::ios& (*)(std::ios&))
enhsimoutput.h:54: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(std::ios_base& (*)(std::ios_base&))
enhsimoutput.h:56: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(enh::setprecision&)
enhsimoutput.h:57: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(enh::setw&)
enhsimoutput.h:59: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(char)
enhsimoutput.h:60: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(signed char)
enhsimoutput.h:61: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(unsigned char)
enhsimoutput.h:62: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(const char*)
enhsimoutput.h:63: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(const signed char*)
enhsimoutput.h:64: note: enh::EnhSimOutput& enh::EnhSimOutput::operator<<(const unsigned char*)
I've noticed "enh::EnhSimOutput& enh::EnhSimOutput::operator<< (setw& p)" in enhsimoutput.cpp, but I don't really know C++ enough to correct it. I guess all << enh::setw() or enh::setprecision() fail, but GCC will only show the first error in the line.
|
Baby, you can hold my balls.
10:10 < buu_> Raut: You are a hero of the internet.
|
|
|
01/07/09, 1:02 PM
|
#1157
|
|
Von Kaiser
Draenei Shaman
Aerie Peak
|
Problems Running the GUI
Sorry if this problem seems amateurish, but I'm quite unversed in programming language and code. Here's my problem:
I download the latest enhsim rar file and unzip it and go to run enhsimgui and I get an error message that says
"Unable to Locate Component
This application has failed to start because MSCOREE.DLL was not found. Re-installing this application may fix this problem"
Maybe I'm missing something obvious here (that is what I'm hoping in posting this), but this tells me nothing of use. Does anyone have any suggestions on this?
|
|
|
|
|
01/07/09, 1:43 PM
|
#1158
|
|
Bouncy Ball
|
I was wondering what is the most efficient way to sim multiple items?
Are people using chardev.org, rawr or manually calculating stats to put into EnhSim?
Or am I missing something fundamental?
|
|
|
|
|
01/07/09, 2:16 PM
|
#1159
|
|
In Awe of Shocks
Draenei Shaman
Khadgar (EU)
|
Originally Posted by Caladiera
I was wondering what is the most efficient way to sim multiple items?
Are people using chardev.org, rawr or manually calculating stats to put into EnhSim?
Or am I missing something fundamental?
|
To answer your's and Rounced question on Rawr, over the holiday's I wrote a java app that takes your Rawr exports and creates a EnhSim config similar to what ShockAndAwe does - idea being that the data in each would be identical so the cut n' paste was exactly the same. The problem is that whilst it works there is a vast amount of info that is missing from the Rawr export. The saved character file xml is decent but only has item id's and so can't be used directly to support export to the sim, a cross reference database would need to be maintained to convert item ids into sim config text. This could be overcome if Tukez was willing to modify the sim config to allow things like
trinket1 40256
trinket2 40684
as an option ie: not replacing the existing
trinket1 grim_toll
trinket2 mirror_of_truth
but as a valid config option to use the item ids instead of user readable names. Incidentally this would make ShockAndAwe export more robust too as SAA could simply export the item ids and avoid current issues with being out of sync when new sim version is released. If the sim supported the item id then the Rawr export and the ShockAndAwe export would both work with whichever version of EnhSim was current.
There are other annoyances, the Cut n' paste option in Rawr contains the base stats (STR, STA, AGI etc) but the XML doesn't. If we could convince the Rawr people to include that in the XML then it would be simply a case of use Rawr, save your char and import XML into sim using my Java app.
|
Author of ShockAndAwe Enhancement Shaman max dps addon
Please use the EnhSim by Ziff & others to simulate what gear, priorities etc are the best dps. You can use ShockAndAwe to export your paperdoll stats to EnhSim.
|
|
|
01/07/09, 2:26 PM
|
#1160
|
|
Don Flamenco
Orc Shaman
Dragonblight (EU)
|
Originally Posted by jonnaei
"Unable to Locate Component
This application has failed to start because MSCOREE.DLL was not found. Re-installing this application may fix this problem"
Maybe I'm missing something obvious here (that is what I'm hoping in posting this), but this tells me nothing of use. Does anyone have any suggestions on this?
|
Install .NET framework.
About the crit reduction. I glanced trough the threads, but I couldn't find any conclusive results. To make sure I do it right, I would like the info on the following. (My assumptions are in parenthesis)
- white hit system? 1roll / 2roll? (1roll)
- white crit reduction? (4.8%)
- yellow hit system? (2roll)
- yellow crit reduction? (0%??)
- spell hit system? (2roll)
- spell crit reduction? (3%??)
And melee miss chance is 8%/27% based on this thread Is melee hit cap really 9%? .
Raut, next version source should compile fine with the guide from the home page. I also included boost library in the source so it is no longer necessary to setup boost separately. I ripped uneccessary files out to make it smaller in size, so I'm not exactly sure does it work with other platforms other than Windows. I might have ripped off necessary files on other platforms..will see that when I release the next version.
Levva, good idea with the item IDs. I'll implement it when I have time.
|
|
|
|
01/07/09, 9:57 PM
|
#1161
|
|
Mind the gap.
Malan
Tauren Shaman
No WoW Account
|
White should be 1 roll, yellow should be 2 roll as you have assumed.
|
|
|
|
|
01/08/09, 10:13 AM
|
#1162
|
|
In Awe of Shocks
Draenei Shaman
Khadgar (EU)
|
Originally Posted by tukez
Levva, good idea with the item IDs. I'll implement it when I have time.
|
Did you also notice the request to add ES_SS to priority list. I've implemented this in ShockAndAwe 3.90 basically it will prioritise ES if there is still a SS debuff on the target. This should give a slight dps boost as you can use ES that bit earlier in the priority as fairly frequently the SS charges haven't all been consumed. It would be interesting to see if this was borne out in the sim.
I therefore changed ShockAndAwe defaults to MW5_LB, ES_SS, SS, ES, LL.
|
Author of ShockAndAwe Enhancement Shaman max dps addon
Please use the EnhSim by Ziff & others to simulate what gear, priorities etc are the best dps. You can use ShockAndAwe to export your paperdoll stats to EnhSim.
|
|
|
01/08/09, 12:00 PM
|
#1163
|
|
Don Flamenco
|
So atm the sim overrates ft/ft? (Due to giving 1:1 procs/hit on both hands or by assuming top rank on both hands)
|
|
|
|
|
01/08/09, 1:10 PM
|
#1164
|
|
Just a little bit off
|
I seem to be having a problem with my ep calculations in the enhsim. Im using the lvl80 config file, but when I run it at home i am getting messages saying im over the hit and expertise cap by some amount, but im clearly not expertise capped or hit capped yet.
Does anyone know if Ive configured something wrong? Here is my config file for reference.

simulation_time 10000
simulation_time_combatlog 30
combat_length 6
report_count 80
threads 2
min_lag 0
max_lag 0
simulate_mana 1
ep_precision 2
ep_base_stat ap
ep_ap 64
ep_crit_rating 46
ep_hit_rating 30
ep_expertise 4
ep_haste_rating 33
ep_armor_penetration_rating 15
ep_spellpower 28
ep_dps 10.0
ep_mana 200
ep_spirit 100
ep_mp5 20
mh_auto_attack 1
oh_auto_attack 1
wait_ss_with_wf_cd 0
cast_ll_only_if_wf_on_cd 0
bloodlust_casters 2
sync_bloodlust_with_trinkets 0
cast_lvb_only_if_ed_left 15
cast_lvb_only_if_fsdots_left 4
cast_lvb_only_if_fs_active 1
cast_fs_only_if_dots_left 0
cast_ls_only_if_charges_left 0
cast_sr_only_if_mana_left 700
use_mana_potion_if_mana_left 3000
rotation_priority_count 7
rotation_priority1 SR
rotation_priority2 MW5_LB
rotation_priority3 SS
rotation_priority4 ES
rotation_priority5 LL
rotation_priority6 LS
rotation_priority7 ST
miss 9.00
dodge 6.50
glancing 25.00
armor 13083
spell_miss 17.00
nature_resistance 0
fire_resistance 0
frost_resistance 0
arcane_resistance 0
shadow_resistance 0
armor_debuff_major 3925/3925
armor_debuff_minor 1260/1260
physical_vulnerability_debuff 2.0/2.0
melee_haste_buff 20.0/20.0
melee_crit_chance_buff 5.0/5.0
attack_power_buff_flat 688/688
attack_power_buff_multiplier 99.7/99.7
spell_haste_buff 5.0/5.0
spell_crit_chance_buff 5.0/5.0
spell_crit_chance_debuff 10.0/10.0
spell_damage_debuff 13.0/13.0
spellpower_buff 280/280
spell_hit_chance_debuff 3.0/3.0
haste_buff 3.0/3.0
percentage_damage_increase 3.0/3.0
crit_chance_debuff 3.0/3.0
stat_multiplier 10.0/10.0
stat_add_buff 52/52
agi_and_strength_buff 178/178
intellect_buff 60/60
replenishment 1
water_shield 0
mana_spring_totem 1
blessing_of_wisdom 1
judgement_of_wisdom 1
flask_elixir elixir_of_major_agility
guardian_elixir elixir_of_draenic_wisdom
potion haste_potion
food spice_hot_talbuk
misc_item drums_of_battle
race tauren
mh_speed 2.6
oh_speed 1.4
mh_dps 143.6
oh_dps 156.4
mh_crit 24.40
oh_crit 24.40
mh_hit 9.24
oh_hit 9.24
mh_expertise_rating 196
oh_expertise_rating 196
ap 3173
haste 4.88
armor_penetration 0
str 133
agi 616
int 473
spi 153
spellpower 951
spell_crit 19.12
spell_hit 11.55
max_mana 11211
mp5 0
mh_imbue windfury
oh_imbue flametongue
mh_enchant mongoose
oh_enchant mongoose
mh_weapon -
oh_weapon -
trinket1 -
trinket2 fury_of_the_five_flights
totem stonebreakers_totem
set_bonus naxx_melee_4
metagem relentless_earthstorm_diamond
glyph_major1 windfury_weapon
glyph_major2 stormstrike
glyph_major3 lava_lash
glyph_minor1 -
glyph_minor2 -
glyph_minor3 -
ancestral_knowledge 3/5
improved_shields 0/3
mental_dexterity 3/3
shamanistic_focus 1/1
flurry 5/5
elemental_weapons 3/3
unleashed_rage 5/5
weapon_mastery 3/3
dual_wield_specialization 3/3
mental_quickness 3/3
improved_stormstrike 2/2
static_shock 3/3
maelstrom_weapon 5/5
convection 0/5
concussion 5/5
call_of_flame 2/3
elemental_devastation 3/3
reverberation 0/5
elemental_focus 1/1
elemental_fury 5/5
call_of_thunder 0/1
unrelenting_storm 0/5
elemental_precision 0/3
lightning_mastery 0/5
elemental_oath 0/2
lightning_overload 0/5
lava_flows 0/3
storm_earth_and_fire 0/5
|
|
|
|
01/08/09, 2:01 PM
|
#1165
|
|
Glass Joe
Tauren Shaman
Burning Legion (EU)
|
You have your Expertise EP range at 4, that converts into 32.78998947 expertise rating, taking you well over the cap. Try chaning the EP range to something smaller, like 1.
Edit: Also, why are you using old TBC consumables?
Edit2: I noticed your Spellpower is below 1k, have I been doing things wrong and inputting my spellpower with Flametongue imbued? If yes, I might have just screwed up all my sims 
Last edited by wiggie : 01/08/09 at 2:10 PM.
|
|
|
|
|
01/08/09, 2:32 PM
|
#1166
|
|
Just a little bit off
|
Ah thats because I had to reproduce my config file since im at work and I didnt notice the consumables. And I didnt use the spellpower added from FT because of the sim asking you for the imbue, and I didnt want it added twice. But I may be wrong about that.
I thought I read a post in this thread about that issue.
|
|
|
|
01/08/09, 3:37 PM
|
#1167
|
|
Deeper Shade of Blue
Rouncer
Orc Shaman
No WoW Account
|
Originally Posted by wiggie
You have your Expertise EP range at 4, that converts into 32.78998947 expertise rating, taking you well over the cap. Try chaning the EP range to something smaller, like 1.
Edit: Also, why are you using old TBC consumables?
Edit2: I noticed your Spellpower is below 1k, have I been doing things wrong and inputting my spellpower with Flametongue imbued? If yes, I might have just screwed up all my sims 
|
If you make the EP value that low you introduce a lot of potential error into the calculation. The simpler method is to just make it a negative value so that the sim is removing that much Exp when comparing instead of adding and see what values you get that way.
You should be running the sim with your paperdoll stats with no imbues active and no buffs whatsoever.
Who cares what kinds of consumables he is using? I have a bunch of relentless flasks that I break out for raiding sometimes and run sims with occassionally. What does it matter?
Finally, if you aren't sure about how the Sim functions in the first place, why are you trying to answer other people's concerns?
Last edited by Rouncer : 01/08/09 at 3:44 PM.
|
|
|
|
|
01/08/09, 7:14 PM
|
#1168
|
|
Glass Joe
Tauren Shaman
Burning Legion (EU)
|
I actually realised on the way home from work that using negatives would probably be a better idea, I hadn't gone through the config file thoroughly enough.
I had been using 1 as the Expertise EP range because upon skimming through this thread, I noticed other people using it. The config file does after all say "Best scenario is low EP ranges and high simulation time", I just didn't know how low was "low". Sorry Gadoh.
|
|
|
|
|
01/08/09, 8:46 PM
|
#1169
|
|
Glass Joe
|
Ok, I can't for the life of me get the sim to work. I feel really stupid for not see what is probably a obvious error on my part, but I've never been good with computer programs. When I've open the enhsim.exe it just comes back to me with: 'No config file specified. Pass the config file as parameter to this program'.
I'm sorry for the stupid question, but i really want to better myself and have back up for when the rogues complain about my dkp spending.
|
|
|
|
|
01/09/09, 1:32 AM
|
#1170
|
|
Glass Joe
Blood Elf Priest
Jubei'Thos
|
If you are using windows use enhsimgui.exe other wise you need to run enhsim.exe through a command line interface and specify the config file that contains your settings (something like enhsim.exe myconfigfile.txt). Visit the enhsim website for more info about running enhsim through command line.
|
|
|
|
|
01/09/09, 3:19 AM
|
#1171
|
|
Glass Joe
Draenei Shaman
Cenarion Circle
|
Originally Posted by Raut
Building EnhSim is currently broken using GCC on linux.
|
The issue is the same as that of compiling on OSX. The author posted the bits of text that needed to be replaced in order to make it compile a few pages back. Though, even after replacing it, there still seemed to be an issue on linux, that I didn't have on OSX.
Long story short, here's the diff for the patch:

diff -drc source/effects.cpp source_patched/effects.cpp
*** source/effects.cpp 2008-12-04 04:58:21.000000000 -0800
--- source_patched/effects.cpp 2008-12-31 13:53:51.000000000 -0800
***************
*** 9,15 ****
void SimulationProgress::event(const int& event_id) {
++reported_count_;
! enh::eout << ".";
sim.addLowPrioEvent(interval_, this);
}
--- 9,15 ----
void SimulationProgress::event(const int& event_id) {
++reported_count_;
! std::cout << ".";
sim.addLowPrioEvent(interval_, this);
}
diff -drc source/enhsimconfig.cpp source_patched/enhsimconfig.cpp
*** source/enhsimconfig.cpp 2008-12-08 11:09:25.000000000 -0800
--- source_patched/enhsimconfig.cpp 2008-12-31 13:53:51.000000000 -0800
***************
*** 249,255 ****
}
skip = false;
std::getline(msg, message);
! enh::eout << message << std::endl;
}
}
--- 249,255 ----
}
skip = false;
std::getline(msg, message);
! std::cout << message << std::endl;
}
}
***************
*** 333,371 ****
bool valuemissing = false;
std::string vmissing = "";
! enh::eout << "\n\n";
! enh::eout << enh::setw(26) << std::left << "EP" << enh::setw(10) << "value" << enh::setw(10) << "DPS" << enh::setw(15) << "total DPS" << "difference\n\n" << std::fixed << enh::setprecision(ep_precision_);
! enh::eout << enh::setw(46) << "baseline" << statsv_[0].getTotalDamage() / (hours_ * 3600) << std::endl;
! enh::eout << enh::setw(26) << std::left << "ap" << enh::setw(10) << ep_ap << enh::setw(10) << ap_dps << enh::setw(15) << statsv_[1].getTotalDPS() << statsv_[1].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
! enh::eout << enh::setw(26) << std::left << "crit rating" << enh::setw(10) << ep_crit << enh::setw(10) << critp_dps + crits_dps << enh::setw(15) << statsv_[2].getTotalDPS() + statsv_[3].getTotalDPS() - statsv_[0].getTotalDPS() << statsv_[2].getTotalDPS() + statsv_[3].getTotalDPS() - statsv_[0].getTotalDPS() * 2 << std::endl;
! enh::eout << enh::setw(26) << std::left << "hit rating" << enh::setw(10) << ep_hit << enh::setw(10) << hit_dps << enh::setw(15) << statsv_[4].getTotalDPS() << statsv_[4].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
! enh::eout << enh::setw(26) << std::left << "expertise rating" << enh::setw(10) << ep_expertise << enh::setw(10) << expertise_dps << enh::setw(15) << statsv_[5].getTotalDPS() << statsv_[5].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
! enh::eout << enh::setw(26) << std::left << "haste rating" << enh::setw(10) << ep_haste << enh::setw(10) << haste_dps << enh::setw(15) << statsv_[6].getTotalDPS() << statsv_[6].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
! enh::eout << enh::setw(26) << std::left << "armor penetration rating" << enh::setw(10) << ep_armorp << enh::setw(10) << armor_ignore_dps << enh::setw(15) << statsv_[7].getTotalDPS() << statsv_[7].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
! enh::eout << enh::setw(26) << std::left << "spellpower" << enh::setw(10) << ep_spellpower << enh::setw(10) << spellpower_dps << enh::setw(15) << statsv_[8].getTotalDPS() << statsv_[8].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
! enh::eout << enh::setw(26) << std::left << "mh dps" << enh::setw(10) << ep_mhdps << enh::setw(10) << mh_dps << enh::setw(15) << statsv_[9].getTotalDPS() << statsv_[9].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
! enh::eout << enh::setw(26) << std::left << "oh dps" << enh::setw(10) << ep_ohdps << enh::setw(10) << oh_dps << enh::setw(15) << statsv_[10].getTotalDPS() << statsv_[10].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
vmissing = ""; if (ep_ap_ == 0) { vmissing = "*"; valuemissing = true; }
! enh::eout << enh::setw(26) << std::left << "strength" + vmissing << enh::setw(10) << ep_strength << std::endl;
vmissing = ""; if (ep_ap_ == 0 || ep_crit_rating_ == 0) { vmissing = "*"; valuemissing = true; }
! enh::eout << enh::setw(26) << std::left << "agility" + vmissing << enh::setw(10) << ep_agility << std::endl;
vmissing = ""; if (ep_ap_ == 0 || ep_crit_rating_ == 0 || ep_spirit_ == 0 || ep_mp5_ == 0 || ep_mana_ == 0) { vmissing = "*"; valuemissing = true; }
! enh::eout << enh::setw(26) << std::left << "intelligence" + vmissing << enh::setw(10) << ep_intelligence << std::endl;
! enh::eout << enh::setw(26) << std::left << "spirit" << enh::setw(10) << ep_spirit << enh::setw(10) << spirit_dps << enh::setw(15) << statsv_[12].getTotalDPS() << statsv_[12].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
! enh::eout << enh::setw(26) << std::left << "mana" << enh::setw(10) << ep_mana << enh::setw(10) << mana_dps << enh::setw(15) << statsv_[11].getTotalDPS() << statsv_[11].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
! enh::eout << enh::setw(26) << std::left << "mp5" << enh::setw(10) << ep_mp5 << enh::setw(10) << mp5_dps << enh::setw(15) << statsv_[13].getTotalDPS() << statsv_[13].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
if (valuemissing) {
! enh::eout << "\n* part of the EP value is missing because of skipped tests.";
}
! enh::eout << std::endl;
std::ifstream is("enhsim_ep_exports.txt");
std::vector<std::string> lines;
if (is.fail()) {
! enh::eout << "Could not open enhsim_ep_exports.txt";
}
else {
--- 333,371 ----
bool valuemissing = false;
std::string vmissing = "";
! std::cout << "\n\n";
! std::cout << std::setw(26) << std::left << "EP" << std::setw(10) << "value" << std::setw(10) << "DPS" << std::setw(15) << "total DPS" << "difference\n\n" << std::fixed << std::setprecision(ep_precision_);
! std::cout << std::setw(46) << "baseline" << statsv_[0].getTotalDamage() / (hours_ * 3600) << std::endl;
! std::cout << std::setw(26) << std::left << "ap" << std::setw(10) << ep_ap << std::setw(10) << ap_dps << std::setw(15) << statsv_[1].getTotalDPS() << statsv_[1].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
! std::cout << std::setw(26) << std::left << "crit rating" << std::setw(10) << ep_crit << std::setw(10) << critp_dps + crits_dps << std::setw(15) << statsv_[2].getTotalDPS() + statsv_[3].getTotalDPS() - statsv_[0].getTotalDPS() << statsv_[2].getTotalDPS() + statsv_[3].getTotalDPS() - statsv_[0].getTotalDPS() * 2 << std::endl;
! std::cout << std::setw(26) << std::left << "hit rating" << std::setw(10) << ep_hit << std::setw(10) << hit_dps << std::setw(15) << statsv_[4].getTotalDPS() << statsv_[4].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
! std::cout << std::setw(26) << std::left << "expertise rating" << std::setw(10) << ep_expertise << std::setw(10) << expertise_dps << std::setw(15) << statsv_[5].getTotalDPS() << statsv_[5].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
! std::cout << std::setw(26) << std::left << "haste rating" << std::setw(10) << ep_haste << std::setw(10) << haste_dps << std::setw(15) << statsv_[6].getTotalDPS() << statsv_[6].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
! std::cout << std::setw(26) << std::left << "armor penetration rating" << std::setw(10) << ep_armorp << std::setw(10) << armor_ignore_dps << std::setw(15) << statsv_[7].getTotalDPS() << statsv_[7].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
! std::cout << std::setw(26) << std::left << "spellpower" << std::setw(10) << ep_spellpower << std::setw(10) << spellpower_dps << std::setw(15) << statsv_[8].getTotalDPS() << statsv_[8].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
! std::cout << std::setw(26) << std::left << "mh dps" << std::setw(10) << ep_mhdps << std::setw(10) << mh_dps << std::setw(15) << statsv_[9].getTotalDPS() << statsv_[9].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
! std::cout << std::setw(26) << std::left << "oh dps" << std::setw(10) << ep_ohdps << std::setw(10) << oh_dps << std::setw(15) << statsv_[10].getTotalDPS() << statsv_[10].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
vmissing = ""; if (ep_ap_ == 0) { vmissing = "*"; valuemissing = true; }
! std::cout << std::setw(26) << std::left << "strength" + vmissing << std::setw(10) << ep_strength << std::endl;
vmissing = ""; if (ep_ap_ == 0 || ep_crit_rating_ == 0) { vmissing = "*"; valuemissing = true; }
! std::cout << std::setw(26) << std::left << "agility" + vmissing << std::setw(10) << ep_agility << std::endl;
vmissing = ""; if (ep_ap_ == 0 || ep_crit_rating_ == 0 || ep_spirit_ == 0 || ep_mp5_ == 0 || ep_mana_ == 0) { vmissing = "*"; valuemissing = true; }
! std::cout << std::setw(26) << std::left << "intelligence" + vmissing << std::setw(10) << ep_intelligence << std::endl;
! std::cout << std::setw(26) << std::left << "spirit" << std::setw(10) << ep_spirit << std::setw(10) << spirit_dps << std::setw(15) << statsv_[12].getTotalDPS() << statsv_[12].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
! std::cout << std::setw(26) << std::left << "mana" << std::setw(10) << ep_mana << std::setw(10) << mana_dps << std::setw(15) << statsv_[11].getTotalDPS() << statsv_[11].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
! std::cout << std::setw(26) << std::left << "mp5" << std::setw(10) << ep_mp5 << std::setw(10) << mp5_dps << std::setw(15) << statsv_[13].getTotalDPS() << statsv_[13].getTotalDPS() - statsv_[0].getTotalDPS() << std::endl;
if (valuemissing) {
! std::cout << "\n* part of the EP value is missing because of skipped tests.";
}
! std::cout << std::endl;
std::ifstream is("enhsim_ep_exports.txt");
std::vector<std::string> lines;
if (is.fail()) {
! std::cout << "Could not open enhsim_ep_exports.txt";
}
else {
***************
*** 402,411 ****
searchAndReplace(lines[i], "$mana", doubleToString(ep_mana, ep_precision_));
searchAndReplace(lines[i], "$mp5", doubleToString(ep_mp5, ep_precision_));
! enh::eout << lines[i] << std::endl;
}
! enh::eout << std::endl;
}
EnhSimConfig::EnhSimConfig()
--- 402,411 ----
searchAndReplace(lines[i], "$mana", doubleToString(ep_mana, ep_precision_));
searchAndReplace(lines[i], "$mp5", doubleToString(ep_mp5, ep_precision_));
! std::cout << lines[i] << std::endl;
}
! std::cout << std::endl;
}
EnhSimConfig::EnhSimConfig()
***************
*** 966,972 ****
}
else {
if (once && name != "-") {
! enh::eout << "Imbue " << name << " not found." << std::endl;
}
}
--- 966,972 ----
}
else {
if (once && name != "-") {
! std::cout << "Imbue " << name << " not found." << std::endl;
}
}
***************
*** 1003,1009 ****
}
else {
if (once && name != "-") {
! enh::eout << "Imbue " << name << " not found." << std::endl;
}
}
--- 1003,1009 ----
}
else {
if (once && name != "-") {
! std::cout << "Imbue " << name << " not found." << std::endl;
}
}
***************
*** 1048,1054 ****
}
else {
if (once && name != "-") {
! enh::eout << "Enchant " << name << " not found." << std::endl;
}
}
--- 1048,1054 ----
}
else {
if (once && name != "-") {
! std::cout << "Enchant " << name << " not found." << std::endl;
}
}
***************
*** 1093,1099 ****
}
else {
if (once && name != "-") {
! enh::eout << "Enchant " << name << " not found." << std::endl;
}
}
--- 1093,1099 ----
}
else {
if (once && name != "-") {
! std::cout << "Enchant " << name << " not found." << std::endl;
}
}
***************
*** 1293,1299 ****
}
else {
if (once && name != "-") {
! enh::eout << "Trinket " << name << " not found." << std::endl;
}
}
--- 1293,1299 ----
}
else {
if (once && name != "-") {
! std::cout << "Trinket " << name << " not found." << std::endl;
}
}
***************
*** 1380,1386 ****
}
else {
if (once && name != "-") {
! enh::eout << "Totem " << name << " not found." << std::endl;
}
}
--- 1380,1386 ----
}
else {
if (once && name != "-") {
! std::cout << "Totem " << name << " not found." << std::endl;
}
}
***************
*** 1457,1463 ****
}
else {
if (once && name != "-") {
! enh::eout << "Set bonus " << name << " not found." << std::endl;
}
}
--- 1457,1463 ----
}
else {
if (once && name != "-") {
! std::cout << "Set bonus " << name << " not found." << std::endl;
}
}
***************
*** 1506,1512 ****
}
else {
if (once && name != "-") {
! enh::eout << "Metagem " << name << " not found." << std::endl;
}
}
--- 1506,1512 ----
}
else {
if (once && name != "-") {
! std::cout << "Metagem " << name << " not found." << std::endl;
}
}
***************
*** 1946,1952 ****
else {
if (name != "-") {
! enh::eout << "Consumable " << name << " not found." << std::endl;
}
}
}
--- 1946,1952 ----
else {
if (name != "-") {
! std::cout << "Consumable " << name << " not found." << std::endl;
}
}
}
***************
*** 1972,1978 ****
else {
if (name != "-") {
! enh::eout << "Misc item " << name << " not found." << std::endl;
}
}
}
--- 1972,1978 ----
else {
if (name != "-") {
! std::cout << "Misc item " << name << " not found." << std::endl;
}
}
}
***************
*** 2036,2042 ****
else {
if (once && name != "-") {
! enh::eout << "Glyph " << name << " not found." << std::endl;
}
}
--- 2036,2042 ----
else {
if (once && name != "-") {
! std::cout << "Glyph " << name << " not found." << std::endl;
}
}
***************
*** 2198,2214 ****
ep_hit_rating_ >= 0) {
ep_hit_rating_ = 0;
! enh::eout << "Hit is past caps, EP hit test will be skipped." << std::endl;
}
else {
if (mhhit > miss) {
! enh::eout << "Mh hit + EP range goes past cap by " << (mhhit - miss)/100 << "% (" << (mhhit - miss) / HIT_RATING_TO_HIT << " hit rating)." << std::endl;
}
if (ohhit > miss) {
! enh::eout << "Oh hit + EP range goes past cap by " << (ohhit - miss)/100 << "% (" << (ohhit - miss) / HIT_RATING_TO_HIT << " hit rating)." << std::endl;
}
if (spellhit > spell_miss_) {
! enh::eout << "Spell hit + EP range goes past cap by " << (spellhit - spell_miss_)/100 << "% (" << (spellhit - spell_miss_) / HIT_RATING_TO_SPELLHIT << " hit rating)." << std::endl;
}
}
if (mh_expertise_rating_ >= expcap &&
--- 2198,2214 ----
ep_hit_rating_ >= 0) {
ep_hit_rating_ = 0;
! std::cout << "Hit is past caps, EP hit test will be skipped." << std::endl;
}
else {
if (mhhit > miss) {
! std::cout << "Mh hit + EP range goes past cap by " << (mhhit - miss)/100 << "% (" << (mhhit - miss) / HIT_RATING_TO_HIT << " hit rating)." << std::endl;
}
if (ohhit > miss) {
! std::cout << "Oh hit + EP range goes past cap by " << (ohhit - miss)/100 << "% (" << (ohhit - miss) / HIT_RATING_TO_HIT << " hit rating)." << std::endl;
}
if (spellhit > spell_miss_) {
! std::cout << "Spell hit + EP range goes past cap by " << (spellhit - spell_miss_)/100 << "% (" << (spellhit - spell_miss_) / HIT_RATING_TO_SPELLHIT << " hit rating)." << std::endl;
}
}
if (mh_expertise_rating_ >= expcap &&
***************
*** 2216,2236 ****
ep_expertise_rating_ >= 0) {
ep_expertise_rating_ = 0;
! enh::eout << "Expertise is past cap, EP expertise test will be skipped." << std::endl;
}
else {
if (mhexp > expcap) {
! enh::eout << "Mh expertise + EP range goes past cap by " << (mhexp - expcap) / EXPERTISE_RATING_TO_EXPERTISE << " expertise (" << mhexp - expcap << " expertise rating)." << std::endl;
}
if (ohexp > expcap) {
! enh::eout << "Oh expertise + EP range goes past cap by " << (ohexp - expcap) / EXPERTISE_RATING_TO_EXPERTISE << " expertise (" << ohexp - expcap << " expertise rating)." << std::endl;
}
}
! enh::eout << std::endl;
! enh::eout << "Calculating EP values...\n";
#ifndef NOTHREADS
for (unsigned int i=0; i<threads_; ++i) {
--- 2216,2236 ----
ep_expertise_rating_ >= 0) {
ep_expertise_rating_ = 0;
! std::cout << "Expertise is past cap, EP expertise test will be skipped." << std::endl;
}
else {
if (mhexp > expcap) {
! std::cout << "Mh expertise + EP range goes past cap by " << (mhexp - expcap) / EXPERTISE_RATING_TO_EXPERTISE << " expertise (" << mhexp - expcap << " expertise rating)." << std::endl;
}
if (ohexp > expcap) {
! std::cout << "Oh expertise + EP range goes past cap by " << (ohexp - expcap) / EXPERTISE_RATING_TO_EXPERTISE << " expertise (" << ohexp - expcap << " expertise rating)." << std::endl;
}
}
! std::cout << std::endl;
! std::cout << "Calculating EP values...\n";
#ifndef NOTHREADS
for (unsigned int i=0; i<threads_; ++i) {
diff -drc source/enhsimconfig.h source_patched/enhsimconfig.h
*** source/enhsimconfig.h 2008-12-08 11:08:46.000000000 -0800
--- source_patched/enhsimconfig.h 2008-12-31 13:53:51.000000000 -0800
***************
*** 157,163 ****
/*void setPhysicalCritBonus(const f32& crit_bonus) { physical_crit_multiplier_ *= 1.0f + crit_bonus / 100; };
void setSpellCritBonus(const f32& crit_bonus) { spell_crit_multiplier_ *= 1.0f + crit_bonus / 100; };*/
! /*void enh::setwindfuryAp(const int& wf_ap) { for (unsigned int i=0; i<enhsims_.size(); ++i) {
enhsims_[i]->mh_windfury_->bonus_ap_ += wf_ap;
enhsims_[i]->oh_windfury_->bonus_ap_ += wf_ap; }};*/
--- 157,163 ----
/*void setPhysicalCritBonus(const f32& crit_bonus) { physical_crit_multiplier_ *= 1.0f + crit_bonus / 100; };
void setSpellCritBonus(const f32& crit_bonus) { spell_crit_multiplier_ *= 1.0f + crit_bonus / 100; };*/
! /*void std::setwindfuryAp(const int& wf_ap) { for (unsigned int i=0; i<enhsims_.size(); ++i) {
enhsims_[i]->mh_windfury_->bonus_ap_ += wf_ap;
enhsims_[i]->oh_windfury_->bonus_ap_ += wf_ap; }};*/
diff -drc source/enhsimoutput.cpp source_patched/enhsimoutput.cpp
*** source/enhsimoutput.cpp 2008-12-04 14:08:40.000000000 -0800
--- source_patched/enhsimoutput.cpp 2008-12-31 13:53:57.000000000 -0800
***************
*** 165,171 ****
return *this;
}
! enh::EnhSimOutput& enh::EnhSimOutput::operator<< (enh::setprecision& p) {
std::cout << std::setprecision(p.i_);
if (logset_) {
log_ << std::setprecision(p.i_);
--- 165,171 ----
return *this;
}
! enh::EnhSimOutput& enh::EnhSimOutput::operator<< (enh::setprecision& p) {
std::cout << std::setprecision(p.i_);
if (logset_) {
log_ << std::setprecision(p.i_);
diff -drc source/globalutil.cpp source_patched/globalutil.cpp
*** source/globalutil.cpp 2008-12-06 14:08:59.000000000 -0800
--- source_patched/globalutil.cpp 2008-12-31 13:53:51.000000000 -0800
***************
*** 16,22 ****
void setupCombatLog(std::string filename) {
combatlog.open(filename.c_str(), std::ios::out);
if (combatlog.fail()) {
! enh::eout << "Could not open " << filename << " for combatlog." << std::endl;
}
}
--- 16,22 ----
void setupCombatLog(std::string filename) {
combatlog.open(filename.c_str(), std::ios::out);
if (combatlog.fail()) {
! std::cout << "Could not open " << filename << " for combatlog." << std::endl;
}
}
diff -drc source/main.cpp source_patched/main.cpp
*** source/main.cpp 2008-12-08 11:02:20.000000000 -0800
--- source_patched/main.cpp 2008-12-31 13:53:51.000000000 -0800
***************
*** 16,22 ****
int getConfigInt(const std::string& key) {
std::string value = config[key];
if (value.empty()) {
! enh::eout << key << " not found from config.\n";
}
return stringToInt(value);
--- 16,22 ----
int getConfigInt(const std::string& key) {
std::string value = config[key];
if (value.empty()) {
! std::cout << key << " not found from config.\n";
}
return stringToInt(value);
***************
*** 25,31 ****
f32 getConfigFloat(const std::string& key) {
std::string value = config[key];
if (value.empty()) {
! enh::eout << key << " not found from config.\n";
}
return stringToFloat(value);
--- 25,31 ----
f32 getConfigFloat(const std::string& key) {
std::string value = config[key];
if (value.empty()) {
! std::cout << key << " not found from config.\n";
}
return stringToFloat(value);
***************
*** 34,40 ****
int getConfigTalent(const std::string& key) {
std::string value = config[key];
if (value.empty()) {
! enh::eout << key << " not found from config.\n";
}
return stringToInt(value.substr(0,value.length()-2));
--- 34,40 ----
int getConfigTalent(const std::string& key) {
std::string value = config[key];
if (value.empty()) {
! std::cout << key << " not found from config.\n";
}
return stringToInt(value.substr(0,value.length()-2));
***************
*** 43,49 ****
float getConfigBuff(const std::string& key) {
std::string value = config[key];
if (value.empty()) {
! enh::eout << key << " not found from config.\n";
}
return stringToFloat(value.substr(0,value.find_first_of("/")));
--- 43,49 ----
float getConfigBuff(const std::string& key) {
std::string value = config[key];
if (value.empty()) {
! std::cout << key << " not found from config.\n";
}
return stringToFloat(value.substr(0,value.find_first_of("/")));
***************
*** 65,71 ****
}
if (argc == 1) {
! enh::eout << "No config file specified. Pass the config file as parameter to this program.";
std::cin.get();
return 1;
--- 65,71 ----
}
if (argc == 1) {
! std::cout << "No config file specified. Pass the config file as parameter to this program.";
std::cin.get();
return 1;
***************
*** 73,79 ****
std::ifstream is(argv[1]);
if (is.fail()) {
! enh::eout << "Could not open config file " << argv[1];
std::cin.get();
return 1;
}
--- 73,79 ----
std::ifstream is(argv[1]);
if (is.fail()) {
! std::cout << "Could not open config file " << argv[1];
std::cin.get();
return 1;
}
***************
*** 314,322 ****
closeCombatLog();
#endif
! enh::eout << "elapsed simulation time: " << hours << "h\n";
! enh::eout << "elapsed real time: " << (f32)(end-start) / CLOCKS_PER_SEC << "s\n";
! enh::eout << "simulation speed: " << static_cast<int>(hours*3600 / ((f32)(end-start) / CLOCKS_PER_SEC)) << "x" << std::endl;
std::cin.get();
--- 314,322 ----
closeCombatLog();
#endif
! std::cout << "elapsed simulation time: " << hours << "h\n";
! std::cout << "elapsed real time: " << (f32)(end-start) / CLOCKS_PER_SEC << "s\n";
! std::cout << "simulation speed: " << static_cast<int>(hours*3600 / ((f32)(end-start) / CLOCKS_PER_SEC)) << "x" << std::endl;
std::cin.get();
diff -drc source/skills.cpp source_patched/skills.cpp
*** source/skills.cpp 2008-10-26 19:36:33.000000000 -0700
--- source_patched/skills.cpp 2009-01-07 17:12:12.000000000 -0800
***************
*** 491,497 ****
sim.global_cooldown_->cd_ = true;
sim.addLowPrioEvent(sim.spell_gcd_duration_, sim.global_cooldown_, 0, sim.randomLag());
! int64 casttime = floor(casting_time_ / sim.spell_haste_divider_ * (1.0 - (0.2 * sim.maelstrom_weapon_->stack_)));
sim.spell_casting_->startCasting(this, casttime, !(sim.maelstrom_weapon_->stack_ > 0));
return true;
--- 491,498 ----
sim.global_cooldown_->cd_ = true;
sim.addLowPrioEvent(sim.spell_gcd_duration_, sim.global_cooldown_, 0, sim.randomLag());
! int64 casttime = floor(casting_time_ / sim.spell_haste_divider_ * 0.2 * (5.0 - sim.maelstrom_weapon_->stack_));
!
sim.spell_casting_->startCasting(this, casttime, !(sim.maelstrom_weapon_->stack_ > 0));
return true;
diff -drc source/stats.cpp source_patched/stats.cpp
*** source/stats.cpp 2008-12-04 14:04:37.000000000 -0800
--- source_patched/stats.cpp 2008-12-31 13:53:51.000000000 -0800
***************
*** 184,196 ****
}
void Statistics::print() {
! enh::eout << std::endl << std::fixed << enh::setprecision(2);
double dmg = getTotalDamage();
double mhhits = mh_crit_ + mh_dodge_ + mh_glancing_ + mh_hit_ + mh_miss_;
if (mhhits > 0) {
! enh::eout << "\nMH:\n";
printValueAndPercent("miss", mh_miss_, mhhits);
printValueAndPercent("dodge", mh_dodge_, mhhits);
printValueAndPercent("glancing", mh_glancing_, mhhits);
--- 184,196 ----
}
void Statistics::print() {
! std::cout << std::endl << std::fixed << std::setprecision(2);
double dmg = getTotalDamage();
double mhhits = mh_crit_ + mh_dodge_ + mh_glancing_ + mh_hit_ + mh_miss_;
if (mhhits > 0) {
! std::cout << "\nMH:\n";
printValueAndPercent("miss", mh_miss_, mhhits);
printValueAndPercent("dodge", mh_dodge_, mhhits);
printValueAndPercent("glancing", mh_glancing_, mhhits);
***************
*** 201,209 ****
double mhsshits = mh_ss_crit_ + mh_ss_dodge_ + mh_ss_hit_ + mh_ss_miss_;
double mhwfhits = mh_wf_crit_ + mh_wf_dodge_ + mh_wf_hit_ + mh_wf_miss_;
if (mhwfhits > 0) {
! enh::eout << "\nMH Windfury:\n";
! enh::eout << enh::setw(20) << "procs/hits" << mhwfhits / 2 / (mhhits - mh_miss_ - mh_dodge_ + mhsshits - mh_ss_miss_ - mh_ss_dodge_) * 100 << "%" << std::endl;
! enh::eout << enh::setw(20) << "procs/swings" << mhwfhits / 2 / (mhhits + mhsshits) * 100 << "%" << std::endl;
printValueAndPercent("miss", mh_wf_miss_, mhwfhits);
printValueAndPercent("dodge", mh_wf_dodge_, mhwfhits);
printValueAndPercent("hit", mh_wf_hit_, mhwfhits);
--- 201,209 ----
double mhsshits = mh_ss_crit_ + mh_ss_dodge_ + mh_ss_hit_ + mh_ss_miss_;
double mhwfhits = mh_wf_crit_ + mh_wf_dodge_ + mh_wf_hit_ + mh_wf_miss_;
if (mhwfhits > 0) {
! std::cout << "\nMH Windfury:\n";
! std::cout << std::setw(20) << "procs/hits" << mhwfhits / 2 / (mhhits - mh_miss_ - mh_dodge_ + mhsshits - mh_ss_miss_ - mh_ss_dodge_) * 100 << "%" << std::endl;
! std::cout << std::setw(20) << "procs/swings" << mhwfhits / 2 / (mhhits + mhsshits) * 100 << "%" << std::endl;
printValueAndPercent("miss", mh_wf_miss_, mhwfhits);
printValueAndPercent("dodge", mh_wf_dodge_, mhwfhits);
printValueAndPercent("hit", mh_wf_hit_, mhwfhits);
***************
*** 212,225 ****
double mhfthits = mh_ft_crit_ + mh_ft_hit_ + mh_ft_miss_;
if (mhfthits > 0) {
! enh::eout << "\nMH Flametongue:\n";
printValueAndPercent("miss", mh_ft_miss_, mhfthits);
printValueAndPercent("hit", mh_ft_hit_, mhfthits);
printValueAndPercent("crit", mh_ft_crit_, mhfthits);
}
if (mhsshits > 0) {
! enh::eout << "\nMH Storsmtrike:\n";
printValueAndPercent("miss", mh_ss_miss_, mhsshits);
printValueAndPercent("dodge", mh_ss_dodge_, mhsshits);
printValueAndPercent("hit", mh_ss_hit_, mhsshits);
--- 212,225 ----
double mhfthits = mh_ft_crit_ + mh_ft_hit_ + mh_ft_miss_;
if (mhfthits > 0) {
! std::cout << "\nMH Flametongue:\n";
printValueAndPercent("miss", mh_ft_miss_, mhfthits);
printValueAndPercent("hit", mh_ft_hit_, mhfthits);
printValueAndPercent("crit", mh_ft_crit_, mhfthits);
}
if (mhsshits > 0) {
! std::cout << "\nMH Storsmtrike:\n";
printValueAndPercent("miss", mh_ss_miss_, mhsshits);
printValueAndPercent("dodge", mh_ss_dodge_, mhsshits);
printValueAndPercent("hit", mh_ss_hit_, mhsshits);
***************
*** 228,234 ****
double ohhits = oh_crit_ + oh_dodge_ + oh_glancing_ + oh_hit_ + oh_miss_;
if (ohhits > 0) {
! enh::eout << "\nOH:\n";
printValueAndPercent("miss", oh_miss_, ohhits);
printValueAndPercent("dodge", oh_dodge_, ohhits);
printValueAndPercent("glancing", oh_glancing_, ohhits);
--- 228,234 ----
double ohhits = oh_crit_ + oh_dodge_ + oh_glancing_ + oh_hit_ + oh_miss_;
if (ohhits > 0) {
! std::cout << "\nOH:\n";
printValueAndPercent("miss", oh_miss_, ohhits);
printValueAndPercent("dodge", oh_dodge_, ohhits);
printValueAndPercent("glancing", oh_glancing_, ohhits);
***************
*** 240,248 ****
double ohsshits = oh_ss_crit_ + oh_ss_dodge_ + oh_ss_hit_ + oh_ss_miss_;
double ohwfhits = oh_wf_crit_ + oh_wf_dodge_ + oh_wf_hit_ + oh_wf_miss_;
if (ohwfhits > 0) {
! enh::eout << "\nOH Windfury:\n";
! enh::eout << enh::setw(20) << "procs/hits" << ohwfhits / 2 / (ohhits - oh_miss_ - oh_dodge_ + ohsshits - oh_ss_miss_ - oh_ss_dodge_ + lavalash - lava_lash_miss_ - lava_lash_dodge_) * 100 << "%" << std::endl;
! enh::eout << enh::setw(20) << "procs/swings" << ohwfhits / 2 / (ohhits + ohsshits + lavalash) * 100 << "%" << std::endl;
printValueAndPercent("miss", oh_wf_miss_, ohwfhits);
printValueAndPercent("dodge", oh_wf_dodge_, ohwfhits);
printValueAndPercent("hit", oh_wf_hit_, ohwfhits);
--- 240,248 ----
double ohsshits = oh_ss_crit_ + oh_ss_dodge_ + oh_ss_hit_ + oh_ss_miss_;
double ohwfhits = oh_wf_crit_ + oh_wf_dodge_ + oh_wf_hit_ + oh_wf_miss_;
if (ohwfhits > 0) {
! std::cout << "\nOH Windfury:\n";
! std::cout << std::setw(20) << "procs/hits" << ohwfhits / 2 / (ohhits - oh_miss_ - oh_dodge_ + ohsshits - oh_ss_miss_ - oh_ss_dodge_ + lavalash - lava_lash_miss_ - lava_lash_dodge_) * 100 << "%" << std::endl;
! std::cout << std::setw(20) << "procs/swings" << ohwfhits / 2 / (ohhits + ohsshits + lavalash) * 100 << "%" << std::endl;
printValueAndPercent("miss", oh_wf_miss_, ohwfhits);
printValueAndPercent("dodge", oh_wf_dodge_, ohwfhits);
printValueAndPercent("hit", oh_wf_hit_, ohwfhits);
***************
*** 251,264 ****
double ohfthits = oh_ft_crit_ + oh_ft_hit_ + oh_ft_miss_;
if (ohfthits > 0) {
! enh::eout << "\nOH Flametongue:\n";
printValueAndPercent("miss", oh_ft_miss_, ohfthits);
printValueAndPercent("hit", oh_ft_hit_, ohfthits);
printValueAndPercent("crit", oh_ft_crit_, ohfthits);
}
if (ohsshits > 0) {
! enh::eout << "\nOH Stormstrike:\n";
printValueAndPercent("miss", oh_ss_miss_, ohsshits);
printValueAndPercent("dodge", oh_ss_dodge_, ohsshits);
printValueAndPercent("hit", oh_ss_hit_, ohsshits);
--- 251,264 ----
double ohfthits = oh_ft_crit_ + oh_ft_hit_ + oh_ft_miss_;
if (ohfthits > 0) {
! std::cout << "\nOH Flametongue:\n";
printValueAndPercent("miss", oh_ft_miss_, ohfthits);
printValueAndPercent("hit", oh_ft_hit_, ohfthits);
printValueAndPercent("crit", oh_ft_crit_, ohfthits);
}
if (ohsshits > 0) {
! std::cout << "\nOH Stormstrike:\n";
printValueAndPercent("miss", oh_ss_miss_, ohsshits);
printValueAndPercent("dodge", oh_ss_dodge_, ohsshits);
printValueAndPercent("hit", oh_ss_hit_, ohsshits);
***************
*** 267,273 ****
double eshits = earth_shock_hit_ + earth_shock_crit_ + earth_shock_miss_;
if (eshits > 0) {
! enh::eout << "\nEarth Shock:\n";
printValueAndPercent("miss", earth_shock_miss_, eshits);
printValueAndPercent("hit", earth_shock_hit_, eshits);
printValueAndPercent("crit", earth_shock_crit_, eshits);
--- 267,273 ----
double eshits = earth_shock_hit_ + earth_shock_crit_ + earth_shock_miss_;
if (eshits > 0) {
! std::cout << "\nEarth Shock:\n";
printValueAndPercent("miss", earth_shock_miss_, eshits);
printValueAndPercent("hit", earth_shock_hit_, eshits);
printValueAndPercent("crit", earth_shock_crit_, eshits);
***************
*** 275,290 ****
double fshits = flame_shock_hit_ + flame_shock_crit_ + flame_shock_miss_;
if (fshits > 0) {
! enh::eout << "\nFlame Shock:\n";
printValueAndPercent("miss", flame_shock_miss_, fshits);
printValueAndPercent("hit", flame_shock_hit_, fshits);
printValueAndPercent("crit", flame_shock_crit_, fshits);
! enh::eout << enh::setw(20) << std::left << "dots" << flame_shock_dot_ << std::endl;
}
double frosthits = frost_shock_hit_ + frost_shock_crit_ + frost_shock_miss_;
if (frosthits > 0) {
! enh::eout << "\nFrost Shock:\n";
printValueAndPercent("miss", frost_shock_miss_, frosthits);
printValueAndPercent("hit", frost_shock_hit_, frosthits);
printValueAndPercent("crit", frost_shock_crit_, frosthits);
--- 275,290 ----
double fshits = flame_shock_hit_ + flame_shock_crit_ + flame_shock_miss_;
if (fshits > 0) {
! std::cout << "\nFlame Shock:\n";
printValueAndPercent("miss", flame_shock_miss_, fshits);
printValueAndPercent("hit", flame_shock_hit_, fshits);
printValueAndPercent("crit", flame_shock_crit_, fshits);
! std::cout << std::setw(20) << std::left << "dots" << flame_shock_dot_ << std::endl;
}
double frosthits = frost_shock_hit_ + frost_shock_crit_ + frost_shock_miss_;
if (frosthits > 0) {
! std::cout << "\nFrost Shock:\n";
printValueAndPercent("miss", frost_shock_miss_, frosthits);
printValueAndPercent("hit", frost_shock_hit_, frosthits);
printValueAndPercent("crit", frost_shock_crit_, frosthits);
***************
*** 292,305 ****
double lavaburst = lava_burst_hit_ + lava_burst_crit_ + lava_burst_miss_;
if (lavaburst > 0) {
! enh::eout << "\nLava Burst:\n";
printValueAndPercent("miss", lava_burst_miss_, lavaburst);
printValueAndPercent("hit", lava_burst_hit_, lavaburst);
printValueAndPercent("crit", lava_burst_crit_, lavaburst);
}
if (lavalash > 0) {
! enh::eout << "\nLava Lash:\n";
printValueAndPercent("miss", lava_lash_miss_, lavalash);
printValueAndPercent("dodge", lava_lash_dodge_, lavalash);
printValueAndPercent("hit", lava_lash_hit_, lavalash);
--- 292,305 ----
double lavaburst = lava_burst_hit_ + lava_burst_crit_ + lava_burst_miss_;
if (lavaburst > 0) {
! std::cout << "\nLava Burst:\n";
printValueAndPercent("miss", lava_burst_miss_, lavaburst);
printValueAndPercent("hit", lava_burst_hit_, lavaburst);
printValueAndPercent("crit", lava_burst_crit_, lavaburst);
}
if (lavalash > 0) {
! std::cout << "\nLava Lash:\n";
printValueAndPercent("miss", lava_lash_miss_, lavalash);
printValueAndPercent("dodge", lava_lash_dodge_, lavalash);
printValueAndPercent("hit", lava_lash_hit_, lavalash);
***************
*** 308,314 ****
double lb = lightning_bolt_hit_ + lightning_bolt_crit_ + lightning_bolt_miss_;
if (lb > 0) {
! enh::eout << "\nLightning Bolt:\n";
printValueAndPercent("miss", lightning_bolt_miss_, lb);
printValueAndPercent("hit", lightning_bolt_hit_, lb);
printValueAndPercent("crit", lightning_bolt_crit_, lb);
--- 308,314 ----
double lb = lightning_bolt_hit_ + lightning_bolt_crit_ + lightning_bolt_miss_;
if (lb > 0) {
! std::cout << "\nLightning Bolt:\n";
printValueAndPercent("miss", lightning_bolt_miss_, lb);
printValueAndPercent("hit", lightning_bolt_hit_, lb);
printValueAndPercent("crit", lightning_bolt_crit_, lb);
***************
*** 316,322 ****
double cl = chain_lightning_hit_ + chain_lightning_crit_ + chain_lightning_miss_;
if (cl > 0) {
! enh::eout << "\nChain Lightning:\n";
printValueAndPercent("miss", chain_lightning_miss_, cl);
printValueAndPercent("hit", chain_lightning_hit_, cl);
printValueAndPercent("crit", chain_lightning_crit_, cl);
--- 316,322 ----
double cl = chain_lightning_hit_ + chain_lightning_crit_ + chain_lightning_miss_;
if (cl > 0) {
! std::cout << "\nChain Lightning:\n";
printValueAndPercent("miss", chain_lightning_miss_, cl);
printValueAndPercent("hit", chain_lightning_hit_, cl);
printValueAndPercent("crit", chain_lightning_crit_, cl);
***************
*** 324,330 ****
double ls = lightning_shield_hit_ + lightning_shield_crit_ + lightning_shield_miss_;
if (ls > 0) {
! enh::eout << "\nLightning Shield:\n";
printValueAndPercent("miss", lightning_shield_miss_, ls);
printValueAndPercent("hit", lightning_shield_hit_, ls);
printValueAndPercent("crit", lightning_shield_crit_, ls);
--- 324,330 ----
double ls = lightning_shield_hit_ + lightning_shield_crit_ + lightning_shield_miss_;
if (ls > 0) {
! std::cout << "\nLightning Shield:\n";
printValueAndPercent("miss", lightning_shield_miss_, ls);
printValueAndPercent("hit", lightning_shield_hit_, ls);
printValueAndPercent("crit", lightning_shield_crit_, ls);
***************
*** 332,363 ****
double lo = lightning_overload_hit_ + lightning_overload_crit_ + lightning_overload_miss_;
if (lo > 0) {
! enh::eout << "\nLightning Overload:\n";
printValueAndPercent("miss", lightning_overload_miss_, lo);
printValueAndPercent("hit", lightning_overload_hit_, lo);
printValueAndPercent("crit", lightning_overload_crit_, lo);
}
if (maelstrom_weapon_procs_ > 0) {
! enh::eout << "\nMaelstrom Weapon:\n";
! enh::eout << enh::setw(20) << "PPM" << maelstrom_weapon_procs_ * 60 / seconds_ << std::endl;
}
! enh::eout << std::endl;
! enh::eout << enh::setw(31) << "flurry uptime" << flurry_uptime_ / seconds_ << "%\n";
! enh::eout << enh::setw(31) << "unleashed rage uptime" << unleashed_rage_uptime_ / seconds_ << "%\n";
! enh::eout << enh::setw(31) << "elemental devastation uptime" << elemental_devastation_uptime_ / seconds_ << "%\n";
! enh::eout << enh::setw(31) << "elemental oath uptime" << elemental_oath_uptime_ / seconds_ << "%\n\n";
! enh::eout << enh::setw(31) << "mh enchant uptime" << mh_enchant_uptime_ / seconds_ << "%\n";
! enh::eout << enh::setw(31) << "oh enchant uptime" << oh_enchant_uptime_ / seconds_ << "%\n";
! enh::eout << enh::setw(31) << "trinket1 uptime" << trinket1_uptime_ / seconds_ << "%\n";
! enh::eout << enh::setw(31) << "trinket2 uptime" << trinket2_uptime_ / seconds_ << "%\n";
! enh::eout << enh::setw(31) << "totem uptime" << totem_uptime_ / seconds_ << "%\n";
! enh::eout << enh::setw(31) << "set bonus uptime" << set_bonus_uptime_ / seconds_ << "%\n";
! enh::eout << enh::setw(31) << "metagem uptime" << metagem_uptime_ / seconds_ << "%\n\n";
! enh::eout << enh::setw(20) << "" << "MRPS without overregen\n";
printValueAndPercentRegen("mana regen", mana_regen_, getTotalManaRegen());
printValueAndPercentRegen("mp5", mp5_regen_, getTotalManaRegen());
printValueAndPercentRegen("replenishment", replenishment_regen_, getTotalManaRegen());
--- 332,363 ----
double lo = lightning_overload_hit_ + lightning_overload_crit_ + lightning_overload_miss_;
if (lo > 0) {
! std::cout << "\nLightning Overload:\n";
printValueAndPercent("miss", lightning_overload_miss_, lo);
printValueAndPercent("hit", lightning_overload_hit_, lo);
printValueAndPercent("crit", lightning_overload_crit_, lo);
}
if (maelstrom_weapon_procs_ > 0) {
! std::cout << "\nMaelstrom Weapon:\n";
! std::cout << std::setw(20) << "PPM" << maelstrom_weapon_procs_ * 60 / seconds_ << std::endl;
}
! std::cout << std::endl;
! std::cout << std::setw(31) << "flurry uptime" << flurry_uptime_ / seconds_ << "%\n";
! std::cout << std::setw(31) << "unleashed rage uptime" << unleashed_rage_uptime_ / seconds_ << "%\n";
! std::cout << std::setw(31) << "elemental devastation uptime" << elemental_devastation_uptime_ / seconds_ << "%\n";
! std::cout << std::setw(31) << "elemental oath uptime" << elemental_oath_uptime_ / seconds_ << "%\n\n";
! std::cout << std::setw(31) << "mh enchant uptime" << mh_enchant_uptime_ / seconds_ << "%\n";
! std::cout << std::setw(31) << "oh enchant uptime" << oh_enchant_uptime_ / seconds_ << "%\n";
! std::cout << std::setw(31) << "trinket1 uptime" << trinket1_uptime_ / seconds_ << "%\n";
! std::cout << std::setw(31) << "trinket2 uptime" << trinket2_uptime_ / seconds_ << "%\n";
! std::cout << std::setw(31) << "totem uptime" << totem_uptime_ / seconds_ << "%\n";
! std::cout << std::setw(31) << "set bonus uptime" << set_bonus_uptime_ / seconds_ << "%\n";
! std::cout << std::setw(31) << "metagem uptime" << metagem_uptime_ / seconds_ << "%\n\n";
! std::cout << std::setw(20) << "" << "MRPS without overregen\n";
printValueAndPercentRegen("mana regen", mana_regen_, getTotalManaRegen());
printValueAndPercentRegen("mp5", mp5_regen_, getTotalManaRegen());
printValueAndPercentRegen("replenishment", replenishment_regen_, getTotalManaRegen());
***************
*** 366,374 ****
printValueAndPercentRegen("shamanistic rage", shamanistic_rage_regen_, getTotalManaRegen());
printValueAndPercentRegen("mana potion", mana_potion_regen_, getTotalManaRegen());
printValueAndPercentRegen("misc potion", misc_regen_, getTotalManaRegen());
! enh::eout << std::endl;
! enh::eout << enh::setw(20) << "" << enh::setw(20) << "DPS" << enh::setw(10) << "PPM" << "MPS\n";
printValueAndPercentFinal("white", mh_glancing_damage_ + mh_hit_damage_ + mh_crit_damage_ + oh_glancing_damage_ + oh_hit_damage_ + oh_crit_damage_, dmg, mhhits+ohhits);
printValueAndPercentFinal("windfury", mh_wf_hit_damage_ + mh_wf_crit_damage_ + oh_wf_hit_damage_ + oh_wf_crit_damage_, dmg, (mhwfhits+ohwfhits)/2);
printValueAndPercentFinal("flametongue", mh_ft_hit_damage_ + mh_ft_crit_damage_ + oh_ft_hit_damage_ + oh_ft_crit_damage_, dmg, mhfthits+ohfthits);
--- 366,374 ----
printValueAndPercentRegen("shamanistic rage", shamanistic_rage_regen_, getTotalManaRegen());
printValueAndPercentRegen("mana potion", mana_potion_regen_, getTotalManaRegen());
printValueAndPercentRegen("misc potion", misc_regen_, getTotalManaRegen());
! std::cout << std::endl;
! std::cout << std::setw(20) << "" << std::setw(20) << "DPS" << std::setw(10) << "PPM" << "MPS\n";
printValueAndPercentFinal("white", mh_glancing_damage_ + mh_hit_damage_ + mh_crit_damage_ + oh_glancing_damage_ + oh_hit_damage_ + oh_crit_damage_, dmg, mhhits+ohhits);
printValueAndPercentFinal("windfury", mh_wf_hit_damage_ + mh_wf_crit_damage_ + oh_wf_hit_damage_ + oh_wf_crit_damage_, dmg, (mhwfhits+ohwfhits)/2);
printValueAndPercentFinal("flametongue", mh_ft_hit_damage_ + mh_ft_crit_damage_ + oh_ft_hit_damage_ + oh_ft_crit_damage_, dmg, mhfthits+ohfthits);
***************
*** 384,413 ****
printValueAndPercentFinalMana("lightning shield", lightning_shield_damage_ + lightning_shield_crit_damage_, dmg, lightning_shield_cast_, lightning_shield_mana_, getTotalMana());
printValueAndPercentFinal("lightning overload", lightning_overload_damage_ + lightning_overload_crit_damage_, dmg, lo);
printValueAndPercentFinal("misc", misc_damage_, dmg, misc_hit_);
! enh::eout << std::endl;
! enh::eout << enh::setw(20) << "DPS" << getTotalDPS() << std::endl;
! enh::eout << enh::setw(20) << "MPS" << getTotalMPS() << std::endl;
! enh::eout << enh::setw(20) << "MP2min" << getTotalMPS() * 120 << std::endl;
! enh::eout << enh::setw(20) << "MRPS" << getTotalMRPS() + mana_overregen_ / seconds_ << std::endl;
! enh::eout << enh::setw(20) << "Out of mana time" << oom_time_ / seconds_ << "%" << std::endl;
/*if (mw_stack_full_count_ > 0) {
double mw_avg = mw_total_time_ / mw_stack_full_count_;
double mw_sd = sqrt((mw_total_sd_time_ / mw_stack_full_count_) - (mw_avg * mw_avg));
! enh::eout << std::endl << "Average time to get 5 MW charges: " << mw_avg << std::endl;
! enh::eout << "95% of times it is between " << mw_avg - 1.96 * mw_sd << "s and " << mw_avg + 1.96 * mw_sd << "s" << std::endl;
}*/
! enh::eout << std::endl;
}
void Statistics::printValueAndPercentRegen(const std::string& label, const double& value, const double& total) {
! enh::eout << enh::setw(20) << std::left << label << enh::setw(10) << value/seconds_ << enh::setprecision(2) << value * 100 / total << "%" << std::endl;
}
void Statistics::printValueAndPercent(const std::string& label, const double& value, const double& total) {
! enh::eout << enh::setw(20) << std::left << label << enh::setw(15) << enh::setprecision(0) << value << enh::setprecision(2) << value * 100 / total << "%" << std::endl;
}
void Statistics::printValueAndPercentFinal(const std::string& label, const double& value, const double& total, const double& procs) {
--- 384,413 ----
printValueAndPercentFinalMana("lightning shield", lightning_shield_damage_ + lightning_shield_crit_damage_, dmg, lightning_shield_cast_, lightning_shield_mana_, getTotalMana());
printValueAndPercentFinal("lightning overload", lightning_overload_damage_ + lightning_overload_crit_damage_, dmg, lo);
printValueAndPercentFinal("misc", misc_damage_, dmg, misc_hit_);
! std::cout << std::endl;
! std::cout << std::setw(20) << "DPS" << getTotalDPS() << std::endl;
! std::cout << std::setw(20) << "MPS" << getTotalMPS() << std::endl;
! std::cout << std::setw(20) << "MP2min" << getTotalMPS() * 120 << std::endl;
! std::cout << std::setw(20) << "MRPS" << getTotalMRPS() + mana_overregen_ / seconds_ << std::endl;
! std::cout << std::setw(20) << "Out of mana time" << oom_time_ / seconds_ << "%" << std::endl;
/*if (mw_stack_full_count_ > 0) {
double mw_avg = mw_total_time_ / mw_stack_full_count_;
double mw_sd = sqrt((mw_total_sd_time_ / mw_stack_full_count_) - (mw_avg * mw_avg));
! std::cout << std::endl << "Average time to get 5 MW charges: " << mw_avg << std::endl;
! std::cout << "95% of times it is between " << mw_avg - 1.96 * mw_sd << "s and " << mw_avg + 1.96 * mw_sd << "s" << std::endl;
}*/
! std::cout << std::endl;
}
void Statistics::printValueAndPercentRegen(const std::string& label, const double& value, const double& total) {
! std::cout << std::setw(20) << std::left << label << std::setw(10) << value/seconds_ << std::setprecision(2) << value * 100 / total << "%" << std::endl;
}
void Statistics::printValueAndPercent(const std::string& label, const double& value, const double& total) {
! std::cout << std::setw(20) << std::left << label << std::setw(15) << std::setprecision(0) << value << std::setprecision(2) << value * 100 / total << "%" << std::endl;
}
void Statistics::printValueAndPercentFinal(const std::string& label, const double& value, const double& total, const double& procs) {
***************
*** 418,424 ****
std::string percent = out.str();
percent.append("%");
! enh::eout << enh::setw(20) << std::left << label << enh::setw(10) << value/seconds_ << enh::setw(10) << percent << procs*60/seconds_ << std::endl;
}
}
--- 418,424 ----
std::string percent = out.str();
percent.append("%");
! std::cout << std::setw(20) << std::left << label << std::setw(10) << value/seconds_ << std::setw(10) << percent << procs*60/seconds_ << std::endl;
}
}
***************
*** 430,436 ****
std::string percent = out.str();
percent.append("%");
! enh::eout << enh::setw(20) << std::left << label << enh::setw(10) << value/seconds_ << enh::setw(10) << percent << enh::setw(10) << procs*60/seconds_ << enh::setw(10) << value2/seconds_ << value2 * 100 / total2 << "%" << std::endl;
}
}
--- 430,436 ----
std::string percent = out.str();
percent.append("%");
! std::cout << std::setw(20) << std::left << label << std::setw(10) << value/seconds_ << std::setw(10) << percent << std::setw(10) << procs*60/seconds_ << std::setw(10) << value2/seconds_ << value2 * 100 / total2 << "%" << std::endl;
}
}
|
|
|
|
|
01/09/09, 4:57 AM
|
#1172
|
|
Major Berserk
Raut
Tauren Shaman
No WoW Account (EU)
|
Originally Posted by Rhalis
The issue is the same as that of compiling on OSX. The author posted the bits of text that needed to be replaced in order to make it compile a few pages back. Though, even after replacing it, there still seemed to be an issue on linux, that I didn't have on OSX.
|
That patch doesn't look complete. Changing enh::eout to std::cout and all enh:: for std:: seems to solve the issue.
tukez - Wouldn't sub-classing streambuf in EnhSimOutput help you get rid off all the operator code and let you leach the stream to a log file if enabled? (Like I said, no good at C++, just wondering)
|
Baby, you can hold my balls.
10:10 < buu_> Raut: You are a hero of the internet.
|
|
|
01/09/09, 3:01 PM
|
#1173
|
|
Glass Joe
|
rotation_priority5 LL
rotation_priority6 LS
I was curious about the more or less standard rotation prioritizing Lava Lash over refreshing Lightning Shield. Given how anemic Lava Lash damage is, it seems that you might eek out a few more dps by reversing them. Obviously depends on variables like talent choices (static shock, imp shields), offhand weap choice, and general gear level / mana situation. In the spirit of true min maxing, I swapped them and noticed a few dps increase at my 10 man gear level with minimal buffs. Not a particularly significant increase and possibly in the range of noise in the simulator. I don't know what it might be for you guys in 25 man gear, but thought it might be interesting to some of the folks playing around with high spell power and fast offhands.
|
|
|
|
|
01/09/09, 10:49 PM
|
#1174
|
|
Mind the gap.
Malan
Tauren Shaman
No WoW Account
|
You should prefer LL over refreshing LS because of Flurry, UR, and most importantly MW procs. In all actuality by putting LS at the bottom of your sim priority list you're really saying that everything takes priority over LS, not just that LL does.
|
|
|
|
|
01/09/09, 11:03 PM
|
#1175
|
|
Von Kaiser
Draenei Shaman
Burning Legion
|
Originally Posted by Shae
rotation_priority5 LL
rotation_priority6 LS
I was curious about the more or less standard rotation prioritizing Lava Lash over refreshing Lightning Shield. Given how anemic Lava Lash damage is, it seems that you might eek out a few more dps by reversing them. Obviously depends on variables like talent choices (static shock, imp shields), offhand weap choice, and general gear level / mana situation. In the spirit of true min maxing, I swapped them and noticed a few dps increase at my 10 man gear level with minimal buffs. Not a particularly significant increase and possibly in the range of noise in the simulator. I don't know what it might be for you guys in 25 man gear, but thought it might be interesting to some of the folks playing around with high spell power and fast offhands.
|
Honestly in actual play that isn't a factor in the least, nor is searing totem. There are always free GCDs during the DPS cycle, when MW is <4 and ES, SS, and LL are on CD, these are the ideal times to refresh LS and searing totem, even if I have an 8 stack of LS I will still refresh it if the GCD is available, and anytime the searing totem is getting low (around 10s left) I will drop that as well, even if it overwrites a chunk of the old totem, it isn't as if mana is really an issue in raiding for us right now. So as far as priority goes in the sim, use whatever setup gets you the most DPS because in live play you will have better uptime anyway.
|
|
[Dezzimal] The first iteration of Algalon looted your raid after a kill and posted screenshots on his website.
|
|
|
|
|