Elitist Jerks
Register
Blogs
Forums


Go Back   Elitist Jerks » Shamans

Closed Thread
 
LinkBack Thread Tools
Old 01/07/09, 3:15 AM   #1151
Paenor
Glass Joe
 
Draenei Shaman
 
Bloodscalp
Originally Posted by Tramana View Post
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.

Offline
Old 01/07/09, 3:45 AM   #1152
Tramana
Von Kaiser
 
Troll Shaman
 
Durotan
Originally Posted by Paenor View Post
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.

Offline
Old 01/07/09, 4:14 AM   #1153
SentinelBorg
Don Flamenco
 
SentinelBorg's Avatar
 
Tauren Shaman
 
Blackrock (EU)
Originally Posted by Tramana View Post
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).

Germany Offline
Old 01/07/09, 5:19 AM   #1154
Paenor
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.

Offline
Old 01/07/09, 6:05 AM   #1155
Tramana
Von Kaiser
 
Troll Shaman
 
Durotan
Originally Posted by SentinelBorg View Post
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.

Offline
Old 01/07/09, 9:19 AM   #1156
Raut
Major Berserk
 
Raut's Avatar
 
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.

Norway Offline
Old 01/07/09, 1:02 PM   #1157
jonnaei
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?

Offline
Old 01/07/09, 1:43 PM   #1158
 Caladiera
Bouncy Ball
 
Caladiera's Avatar
 
Orc Hunter
 
Hyjal
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?

Online
Old 01/07/09, 2:16 PM   #1159
Levva
In Awe of Shocks
 
Levva's Avatar
 
Draenei Shaman
 
Khadgar (EU)
Originally Posted by Caladiera View Post
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.

Offline
Old 01/07/09, 2:26 PM   #1160
tukez
Don Flamenco
 
Orc Shaman
 
Dragonblight (EU)
Originally Posted by jonnaei View Post
"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.

EnhSim, shaman DPS simulator

Offline
Old 01/07/09, 9:57 PM   #1161
Malan
Mind the gap.
 
Malan's Avatar
 
Malan
Tauren Shaman
 
No WoW Account
White should be 1 roll, yellow should be 2 roll as you have assumed.

United States Offline
Old 01/08/09, 10:13 AM   #1162
Levva
In Awe of Shocks
 
Levva's Avatar
 
Draenei Shaman
 
Khadgar (EU)
Originally Posted by tukez View Post
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.

Offline
Old 01/08/09, 12:00 PM   #1163
 Glayde
Don Flamenco
 
Glayde's Avatar
 
Troll Druid
 
Thrall
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)

United States Offline
Old 01/08/09, 1:10 PM   #1164
Gadoh
Just a little bit off
 
Gadoh's Avatar
 
Tauren Shaman
 
<VoS>
Sargeras
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


Offline
Old 01/08/09, 2:01 PM   #1165
wiggie
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.

Offline
Old 01/08/09, 2:32 PM   #1166
Gadoh
Just a little bit off
 
Gadoh's Avatar
 
Tauren Shaman
 
<VoS>
Sargeras
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.


Offline
Old 01/08/09, 3:37 PM   #1167
Rouncer
Deeper Shade of Blue
 
Rouncer's Avatar
 
Rouncer
Orc Shaman
 
No WoW Account
Originally Posted by wiggie View Post
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.

Offline
Old 01/08/09, 7:14 PM   #1168
wiggie
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.

Offline
Old 01/08/09, 8:46 PM   #1169
ankasunamore
Glass Joe
 
Troll Shaman
 
Proudmoore
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.

Offline
Old 01/09/09, 1:32 AM   #1170
BW~Merlin
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.

Offline
Old 01/09/09, 3:19 AM   #1171
Rhalis
Glass Joe
 
Draenei Shaman
 
Cenarion Circle
Originally Posted by Raut View Post
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;
    }
  }

Offline
Old 01/09/09, 4:57 AM   #1172
Raut
Major Berserk
 
Raut's Avatar
 
Raut
Tauren Shaman
 
No WoW Account (EU)
Originally Posted by Rhalis View Post
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.

Norway Offline
Old 01/09/09, 3:01 PM   #1173
Shae
Glass Joe
 
Tauren Shaman
 
Gul'dan
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.

Offline
Old 01/09/09, 10:49 PM   #1174
Malan
Mind the gap.
 
Malan's Avatar
 
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.

United States Offline
Old 01/09/09, 11:03 PM   #1175
Protico
Von Kaiser
 
Draenei Shaman
 
Burning Legion
Originally Posted by Shae View Post
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.

Offline
Closed Thread

Go Back   Elitist Jerks » Shamans

Thread Tools

Similar Threads
Thread Thread Starter Forum Replies Last Post
DPS Simulator Grim13 Warriors 133 11/12/08 8:20 AM
Teron Gorefiend Ghost Simulator Zugstab Public Discussion 31 01/16/08 8:14 PM
[Mage] DPS Simulator zurmagus Class Mechanics 41 11/08/07 10:11 PM
[Shaman] Experimental combat simulator draghkar Class Mechanics 182 08/30/07 5:33 AM