Register

Catus: Edgy's Cat Simulator (in development)

Face-rippin fun.

Moderator: Forum Administrators

Exalted
User avatar
Posts: 870
Joined: Tue Oct 23, 2012 7:15 am

Catus: Edgy's Cat Simulator (in development)

Postby raffy » Tue Oct 23, 2012 7:39 am

Tonight I started development on my own Cat simulator. The goal of this project is simple: try to replicate the simc rotation, and then look for possible improvements to the rotation. Additionally, I want to be able to track modified bleeds more effectively (as I'm mainly interested in the DoC rotation.)

Here is a text dump of a few seconds of combat:
Code: Select all
00:00:00.000: Pre: DOC
00:00:00.000: Pre: SR
00:00:00.000: Potion
00:00:00.000: Rake+SR+DOC+Agi(4000): HIT(18744)
00:00:00.000: Combo: 1
00:00:00.978: Melee+SR+Agi(4000): HIT(9278)
00:00:01.000: Shred+SR+DOC+BL+Agi(4000): HIT(69739)
00:00:01.000: Combo: 2
00:00:01.956: Melee+SR+Agi(4000): HIT(8752)
00:00:02.000: Shred+SR+BL+Agi(4000): HIT(47659)
00:00:02.000: Combo: 3
00:00:02.934: Melee+SR+Agi(4000): HIT(9298)
00:00:03.000: Tiger's Fury: +60
00:00:03.000: Berserk
00:00:03.000: Shred+TF+SR+BL+Agi(4000): CRIT(107075)
00:00:03.000: Searing Words
00:00:03.000: LOTP
00:00:03.000: Combo: 5
00:00:03.000: Rake(DoT)+SR+DOC+Agi(4000): HIT(18744)
00:00:03.912: Melee+TF+SR+Agi(7386): CRIT(21574)
00:00:03.912: Xuen
00:00:04.000: Rip^5+TF+SR+Agi(10415)
00:00:04.000: PS: 5
00:00:04.890: Melee+TF+SR+Agi(10415): HIT(11448)
00:00:05.000: Shred+TF+SR+BL+Agi(10415): CRIT(125876)
00:00:05.000: Combo: 2
00:00:05.868: Melee+TF+SR+Agi(10415): CRIT(22829)
00:00:06.000: Rip^5(DoT)+TF+SR+Agi(10415): CRIT(49768)
00:00:06.000: Shred+TF+SR+BL+Agi(10415): HIT(60556)
00:00:06.000: Combo: 3
00:00:06.000: Rake(DoT)+SR+DOC+Agi(4000): CRIT(38614)
00:00:06.846: Melee+TF+SR+Agi(10415): HIT(10560)
00:00:06.846: Clearcasting
00:00:07.000: Healing Touch: PS
00:00:07.824: Melee+TF+SR+Agi(10415): HIT(10482)
00:00:08.000: Rip^5(DoT)+TF+SR+Agi(10415): HIT(24159)
00:00:08.467: Thrash+TF+SR+DOC+Agi(10415): CRIT(88956)
00:00:08.802: Melee+TF+SR+Agi(10415): CRIT(24660)
00:00:09.000: Rake(DoT)+SR+DOC+Agi(4000): HIT(18744)
00:00:09.467: Clipped: Rake[2] 51893 -> 165270
00:00:09.467: Rake+SR+DOC+Agi(10415): CRIT(51093)

I'm trying to track the damage modifiers on various bleeds:
Code: Select all
Rip^5+TF+SR+Agi(10415)

I'm also trying to accurately clip my bleeds:
Code: Select all
Clipped: Rake[2] 51893 -> 165270

And use OOC effectively:
Code: Select all
00:00:06.846: Clearcasting
00:00:07.000: Healing Touch: PS
00:00:07.824: Melee+TF+SR+Agi(10415): HIT(10482)
00:00:08.000: Rip^5(DoT)+TF+SR+Agi(10415): HIT(24159)
00:00:08.467: Thrash+TF+SR+DOC+Agi(10415): CRIT(88956)


After a few hours with a Raid Target Dummy, a bunch of gear configurations, and Recount, I felt like I was reinventing the wheel trying to figure out all the proper scaling and implementation of each attack.

I was wondering, does anyone have a comprehensive list of Feral damage equations that are up to date? simc seems to extract spell information from some database and I don't know if I can trust Rawr.
Last edited by raffy on Tue Feb 19, 2013 6:30 pm, edited 2 times in total.

Honored
Posts: 188
Joined: Tue Dec 14, 2010 5:34 pm

Re: Feral Damage Equations

Postby Jeshu » Wed Oct 24, 2012 10:04 am

The Wowhead tooltips generally give the damage formulas, but the damage coefficients need to be mined from the WoW data files. Also, the formulas may be modified by server-side changes that aren't reflected in the in-game tooltips, i.e., "hotfixes" -- you'll need to read all of the patch notes to identify things where they say "base damage of Rake increased by 25%" and adjust your formulas accordingly.

Then later, when 5.1 is released, you'll need to remove all of those manual adjustments for hotfixes because the client data files will have caught up with the server-side hotfixes and the data-mined coefficients will be accurate again.

Good luck with your simulator.

Exalted
User avatar
Posts: 870
Joined: Tue Oct 23, 2012 7:15 am

Re: Feral Damage Equations

Postby raffy » Tue Oct 30, 2012 7:16 am

Some dumps of logs:
http://raffy.antistupid.com/wow/catsim/DumpRun1.txt
http://raffy.antistupid.com/wow/catsim/DumpRun2.txt
http://raffy.antistupid.com/wow/catsim/DumpRunBatch.txt

So far it's pretty fast. I'm doing about 250 sims of 40m dmg per second on my MBP (2.3GHz i7) with logging enabled. Once I profile it, remove the logging and string manipulation, and spread it across more cores, 100k should take less than a minute.

The code right now is a huge mess but this will change shortly. It's currently hardcoded to use the gear from my armory (Edgy/US-Suramar) with two different profiles: Solo and Raiding. I'm just focused on correctness and trying to implement as many things as possible to see what code gets repeated the most before I set anything in stone. Mostly, I've been spending my time clawing away at raid level target dummies with different gear configurations to collect data.

Current sim code (java) w/o dependancies for the curious (I'll put the project up on a github soon):
http://raffy.antistupid.com/wow/catsim/SimCode.txt

There's a bunch of cool stuff in the logs:
Here is a final Rip tick (11th tick [8+3] from a 5-combo Rip) followed by a fade event (where the 0 tells me that no rip extensions remain.)
Code: Select all
00:28.326 Rip`5#11+SR+TF+Agi(7386): HIT(42005)
00:28.326 -Rip`5+SR+TF+Agi(7386): 0


Here is a 3-combo FB that consumed 10 extra energy, it also refreshed a Rip, that had 1 tick left (0 extensions available) and would of expired in 920ms.
Code: Select all
07:08.328 FB`3+En(10)+SR+BL+Agi(3029): CRIT(83445)
07:08.328 Refreshed: Rip`5+SR[1+0] (920-920)


Pre-combat SR properly trims its uptime to about 9.5s (to allow for 100 starting energy and no gcd).
Code: Select all
00:00.000 Pre: DOC
00:00.000 Pre: SR
00:00.000 +Potion#1
00:00.000 Ravage+SR+DOC+Agi(4000): HIT(90778)
00:00.000 Combo: 1 (+1)
00:00.000 Melee+SR+Agi(4000): HIT(13076)


My rotation blows at the moment. I plan to implement the simc priority list once I've got more stuff implemented.

As of right now, I have two improvements over typical analysis:

1. Since I can track all damage modifiers, I produce interesting statistics like:
http://raffy.antistupid.com/wow/catsim/ ... Detail.txt
Code: Select all
SR Uptime          =  97.30%
SR Casts           = 16
SR Clipped Time    = 0ms
SR Glyph           = 3

+SR                (only Melee) =  97.21% (488 of 502)
+SR              (except Melee) =  99.02% (605 of 611)
+TF              (except Melee) =  28.15% (172 of 611)
+BL                (only Shred) = 100.00% (126 of 126)

+DOC                 (only Rip) =  38.46% (5 of 13)
+DOC               (only Rip`5) =  38.46% (5 of 13)
+DOC           (only Rip Ticks) =  30.00% (54 of 180)

+DOC                (only Rake) =  47.06% (16 of 34)
+DOC          (only Rake Ticks) =  50.36% (70 of 139)


2. Since it's feral specific, I can monitor things more closely:
Code: Select all
Energy Gain Haste  = 5034
Energy Gain Miss   = 0
Energy Gain Waste  = 70
Energy Gain TF     = 840 (14 of 15 possible)
Energy Gain SotF   = 749 (44)
OOC                = 34
OOC Shred          = 9 (26%)
OOC Thrash         = 18 (53%)
OOC Wasted         = 0 (0 during lockout)
FB Extra Energy    = 11.8
DOC Total          = 76
DOC Wasted         = 0
Rip Refreshes      = 8
Rip Clips          = 3

Exalted
User avatar
Posts: 870
Joined: Tue Oct 23, 2012 7:15 am

Re: Feral Damage Equations

Postby raffy » Mon Nov 05, 2012 9:05 am

NetBeans (java) project source:
http://raffy.antistupid.com/wow/catsim/Src.zip

Note: this is only for programmers at the moment or those curious (there is no interface, readme, instructions, or support)

Current features:
- full armory/item import with gem/enchant/tinker/socket bonuses support and can validate new armor configurations (currently missing set bonuses)
- multi-threaded monte carlo and brute force reforger (with objective/constraints)

Simulator features:
- scheduler/future system to make development easy
- immediate code abort on gcd/cast invocation
- full casting/stop casting/gcd support (will add simulated latency soon)
- buff modifier tracking
- accuracy (abilities have been checked to within +/- 1 damage for various gear sets)

Once I get everything a bit more polished and verify simc results, here are my plans:

First goal: Trinket Simulator (simple Upgrade simulator)
I'd like to make it so a fellow druid can enter their Character, Realm, and Country.
First, it would import their current gear/gems/enchants.
Then work through a list of valid trinket pairs (N choose 2).
Equip them and then perform optimal reforging.
Then run a large multi-threaded simulation.
Record all results and then produce a trinket pair ranking.

Obviously, this leads to a second goal: Generalized Upgrade Simulator
With support for single socket upgrades and pre-set configurations (like 5x 4-piece + offset configurations).

Newest features:
Time-spent distribution:
Code: Select all
Waiting    04:12.550 [ 41.02%]    0
Shred      02:37.000 [ 25.50%]  157 1.0s
HT         01:14.103 [ 12.04%]   51 1.5s
Rake       00:49.000 [  7.96%]   49 1.0s
SR         00:22.000 [  3.57%]   22 1.0s
Thrash     00:21.000 [  3.41%]   21 1.0s
FB         00:20.000 [  3.25%]   20 1.0s
Rip        00:19.000 [  3.09%]   19 1.0s
Ravage     00:01.000 [  0.16%]    1 1.0s


Tick-number tracking:
Code: Select all
10:11.653 Rip`5#67      34055 hit  +SR+TF+DOC+Agi(3029)
10:12.408 Melee         12861 hit  +SR+Agi(3386)
10:12.437 FB`2          39701 crit +En(0)+SR+DOC+BL+Agi(3386)
10:12.437 +Blessing of the Celestials
10:12.437 BitW: Rip`5+SR+TF+DOC+Agi(3029)[5+2] (9.2s-13s)
10:12.984 Rake#1        24691 hit  +SR+Agi(3386)
10:13.059 Thrash#3      28040 crit +SR+DOC
10:13.377 Melee         10207 hit  /Glance+SR+Agi(6415)
10:13.653 Rip`5#68      34055 hit  +SR+TF+DOC+Agi(3029)
10:14.346 Melee         23159 crit +SR+Agi(6415)
10:15.315 Melee         23364 crit +SR+Agi(6415)
10:15.456 Shred         53539 hit  +SR+DOC+BL+Agi(6415)
10:15.456 Combo: 1 (+1)
10:15.653 Rip`5#69      68110 crit +SR+TF+DOC+Agi(3029)
10:15.653 Target has died: 40.00M


Buff/Debuff fader support (the negative prefix)
Code: Select all
00:55.233 Melee          7676 hit  /Glance+SR
00:55.408 Rip`5#11      22508 hit  +SR+TF
00:55.408 -Rip`5+SR+TF: 0
00:56.202 Melee         11530 hit  +SR
00:56.667 Thrash#5      14020 hit  +SR+DOC
00:56.667 -Thrash+SR+DOC
00:57.171 Melee         11613 hit  +SR
00:58.000 Rake#4        20247 hit  +SR


Numerical Rake/Rip clipping:
Code: Select all
02:00.960 Clipped: Rip`5+SR [1+0] 12958 >> Rip`5+SR+Agi(3386) 125402
...
03:08.568 Clipped: Rake +SR+DOC+Agi(6415) [1] 25721 >> +SR+Agi(3386) 100282
...
06:54.528 Clipped: Rip`5+SR+DOC+Agi(3029) [1+0] 19999 >> Rip`5+SR 103667

Exalted
User avatar
Posts: 870
Joined: Tue Oct 23, 2012 7:15 am

Re: Feral Damage Equations

Postby raffy » Mon Nov 19, 2012 7:19 am

I keep chipping away at this thing each evening, I've got a few updates, but no usable (interfaced) release yet.

First, my simulator supports lookahead Rake/Rip clipping:
Code: Select all
06:21.635 -Rake+SR+DoC+TF+Agi(2539)
06:21.635 Rake            28577 Hit          +SR+Agi(5568)
06:21.635 Combo: 3 (+1)
06:22.400 Melee           24250 Crit         +SR+Agi(5568)
06:22.635 HT: PS
06:23.356 Melee           26659 Crit         +SR+Agi(5568)
06:23.925 Thrash#4        29479 Crit         +SR+TF+Agi(2539)
06:24.312 Melee           11561 Hit          +SR+Agi(5568)
06:24.635 Rake#1          28577 Hit          +SR+Agi(5568)
06:24.655 Clipped: Rake [4] +SR+Agi(5568) 38763 > +25.00% > +SR+DoC+Agi(5568) 48454
06:24.655 Rake            35721 Hit          +SR+DoC+Agi(5568)
06:24.655 Combo: 4 (+1)
06:25.268 Melee            8642 Glance       +SR+Agi(5568)
06:26.224 Melee           27250 Crit         +SR+Agi(5568)
06:26.925 Thrash#5        29479 Crit         +SR+TF+Agi(2539)
06:26.925 -Thrash+SR+TF+Agi(2539)
06:27.180 Melee           13331 Hit          +SR+Agi(5568)
06:27.635 Rake#1          35721 Hit          +SR+DoC+Agi(5568)
06:28.075 Clipped: Rake [4] +SR+DoC+Agi(5568) 48454 > +0.00% > +SR+DoC+Agi(5568) 48454     <====== Lookahead Bottle
06:28.075 Rake            71443 Crit         +SR+DoC+Agi(5568)
06:28.075 Combo: 5 (+2)
06:28.136 Melee            8307 Glance       +SR+Agi(5568)
06:29.016 -Bottle of Infinite Stars
06:29.075 HT: NS


Second, it supports active HotW casting (Wrath/Hurricane/Tranquility), including weapon swaps (with enchants and gem/meta validation) with proper GCD/swing-timer emulation:
Code: Select all
00:00.000 Change Equipment: Main > Alt
00:00.000 +Heart of the Wild
00:00.000 Shapeshift: Human
00:00.000 Casting: Wrath...
00:01.928 Casted: Wrath (1.93s)
00:01.928 Wrath          101581 Hit          +HotW
00:01.928 Casting: Wrath...
00:03.856 Casted: Wrath (1.93s)
00:03.856 Wrath          101492 Hit          +HotW
00:03.856 Casting: Wrath...
00:05.784 Casted: Wrath (1.93s)
00:05.784 Wrath          208986 Crit         +HotW
00:05.784 Casting: Wrath...
00:07.712 Casted: Wrath (1.93s)
00:07.712 Wrath          101419 Hit          +HotW
00:07.712 Casting: Wrath...
00:09.590 -SR
00:09.640 Casted: Wrath (1.93s)
00:09.640 Wrath          101324 Hit          +HotW
...
00:23.136 Casting: Wrath...
00:25.064 Casted: Wrath (1.93s)
00:25.064 Wrath          101685 Hit          +HotW
00:25.064 Casting: Wrath...
00:26.992 Casted: Wrath (1.93s)
00:26.992 Wrath          101241 Hit          +HotW
00:26.992 Casting: Wrath...
00:28.920 Casted: Wrath (1.93s)
00:28.920 Wrath          101496 Hit          +HotW
00:28.920 +Bottle of Infinite Stars
00:28.920 Casting: Wrath...
00:30.000 Expect target death: 08:21.711 <7.9 min>
00:30.848 Casted: Wrath (1.93s)
00:30.848 Wrath          114259 Hit          +HotW+Agi(2539)
00:30.848 Casting: Wrath...
00:32.776 Casted: Wrath (1.93s)
00:32.776 Wrath          114419 Hit          +HotW+Agi(2539)
...
00:38.560 Casting: Wrath...
00:40.488 Casted: Wrath (1.93s)
00:40.488 Wrath          114211 Hit          +HotW+Agi(2539)
00:40.488 Casting: Wrath...
00:42.416 Casted: Wrath (1.93s)
00:42.416 Wrath          114173 Hit          +HotW+Agi(2539)
00:42.416 Casting: Wrath...
00:44.344 Casted: Wrath (1.93s)
00:44.344 Wrath          114095 Hit          +HotW+Agi(2539)
00:44.344 Casting: Wrath...
00:45.000 -Heart of the Wild
00:45.000 Interrupted: Wrath (0.66/1.93s)
00:45.000 Shapeshift: Cat
00:45.000 Change Equipment: Alt > Main
00:45.956 Melee           19382 Crit         +Agi(2539)
00:45.956 LOTP
00:46.500 +SR`0
00:46.912 Melee           25917 Crit         +SR+Agi(2539)


The interface keeps going through iterations:
http://raffy.antistupid.com/wow/catsim/sim_ui.jpg
http://raffy.antistupid.com/wow/catsim/sim_ui2.png

I have the N choose 2 trinket simulator (with reforging) working, but the output is purely textual.

Theres a bunch of other options that I added under a miscellaneous header, I we can simulate the effect of various abilities (disable Omen, LotP, any individual spell, etc...). MoP bosses like to spin around, so I've implemented a spin probability thing, to try to emulate this retarded behavior. I have options for using Rake as primary generator, include one that uses Shred when clipping a Rake would be a DPS loss (which is equivalent to just setting the clip threshold of Rake near break even). Smart weaving of FF.

When you select HotW, and choose a non-passive option like Hurricane, you get support for multiple targets, however the primary cat rotation is single target. I'll probably consider multi-target support in the future.

Posts: 15
Joined: Wed Apr 13, 2011 9:02 am

Re: Feral Damage Equations

Postby Nepplol » Mon Nov 19, 2012 10:24 am

Nice work ! Love the MewLike ui ^^
Looking forward to try it !

Exalted
User avatar
Posts: 870
Joined: Tue Oct 23, 2012 7:15 am

Re: Feral Damage Equations

Postby raffy » Sat Nov 24, 2012 1:58 am

Got some work done while stuffing my face with turkey.

Here is gear configuration:
http://raffy.antistupid.com/wow/catsim/sim_ui3.png

Currently, I have it preconfigured with all the gear from http://fluiddruid.net/feral-druid-5-0mi ... gear-list/, plus whatever you import, along with the ability to load in any piece of gear by id.

I need to finish optimizing the reforger and then I should have a release ready.

Exalted
User avatar
Posts: 1145
Joined: Fri Jun 04, 2010 4:28 am

Re: Feral Damage Equations

Postby Leafkiller » Sat Nov 24, 2012 3:19 am

How close in dps is your simulator to Simulationcraft when identical action lists are used?

Exalted
User avatar
Posts: 870
Joined: Tue Oct 23, 2012 7:15 am

Re: Feral Damage Equations

Postby raffy » Sun Nov 25, 2012 2:38 am

I downloaded SimulationCraft to see what gear is used in the BiS T14H configuration, but I wasn't able to find the exact gear. Since my interface isn't finished yet, I started hardcoding a BiS configuration in my own code, and soon realized that describing gear configurations is kind of a complicated.

I came up with a pretty simple notation to describe gear:
Code: Select all
r = 76692                     # Delicate Primordial Ruby: +160 Agility
p = 76680                     # Glinting Imperial Amethyst: +80 Agility, +160 Hit

86925 >eh +76884 +p                   # [509] Eternal Blossom Headpiece (Heroic)
86953                         # [509] Choker of the Unleashed Storm (Heroic)
86927 >em +p "Secret Tiger Claw"   # [509] Eternal Blossom Spaulders (Heroic)
86963 Swordguard                 # [509] Legbreaker Greatcloak (Heroic)
86923 "Glorious Stats"             # [509] Eternal Blossom Raiment (Heroic)
86995 >eh "Greater Agility"         # [509] Smooth Beetle Wristbands (Heroic)
86924 >hm "Super Strength" Springs    # [509] Eternal Blossom Grips (Heroic)
87180 >he +rr Socket Frag          # [509] Stalker's Cord of Eternal Autumn (Heroic)
90504 +rp Shadowleather          # [516] Legguards of Failing Purification (Heroic Elite)
86984 >ec +r Blurred             # [509] Treads of Deadly Secretions (Heroic)
90503 >tm                     # [516] Regail's Band of the Endless (Heroic Elite)
86974 >ec                     # [509] Painful Thorned Ring (Heroic)
87057                         # [502] Bottle of Infinite Stars (Heroic)
87167                        # [509] Terror in the Mists (Heroic)
87156 >ec +89873 "Dancing Steel"   # [509] Gao-Rei, Staff of the Legendary Protector (Heroic)


Syntax:
Code: Select all
anything after # = comments
>XY = reforge from X to Y (e = exp, c = crit, h = hit, t = haste, etc...)
+key/id = add a gem by define (at top) or inline blizzard item id
any remaining text defines Enchant, Tinker, or Mod (like extra socket)


I produced the reforging using my exhaustive reforger with the following objective/constraints:
Code: Select all
new ReforgeAlgo().atLeast(StatT.HIT, 2540).atLeast(StatT.EXP, 2540).setWeight(StatT.MASTERY, 1.00).setWeight(StatT.CRIT, 0.90).setWeight(StatT.HASTE, 0.80).dontReforge(StatT.MASTERY);


Which produced:
Code: Select all
Critical Strike       4858
Hit                   2544
Haste                  825
Expertise             2544
Mastery               8239


For some unknown reason, I am about -900 secondary stat different from the "Gear Summary" information at the bottom of Druid_Feral_T14H.simc

My basic cat rotation currently looks the following, which is pretty close, but not yet verbatim to your script, but it's getting there.
Code: Select all
if (cfg.use_hero && HEROISM.clickable() && willExpire(ttl, 60000)) {
            HEROISM.click();
        }
       
        if (cfg.use_pot && pot_clickable() && (HEROISM.up() || (bitw() && BERSERK.up()) || willExpire(ttl, 45000))) {
            pot_click();   
            berserk_macro();         
        }       
       
        if (bitw() && rip_tick_left > 0 && ripTimeMin() < Math.max(1000, timeToCast(FB))) {
            if (combo > 0 && rip_extends == 0) tf_assist(FB);
            tf_assist(generator(false));
        }
       
        final int sr_time = sr_time();
       
        // thrash on ooc
        if (oocKey.exists && (thrash_tick_left < 2)) {
            if (sr_time == 0 && !willEnergyCap()) SR.click();           
            //wantDoC_ns_en(false, 5);           
            THRASH.click();
        }
       
        // free ravage consumes ooc :(   
        if (can_pvpRavage() && !oocKey.exists) {   
            RAVAGE.click();
        }
       
        // dont waste ps procs outside of berserk
        if (spec.talent_doc && cfg.dont_waste_ps && doc_charges < 2 && willExpire(ps_time(), 1000) && berserk_time() == 0) {
            HT.click();
        }
       
        // tf and berserk
        if (TF.clickable() && sr_time > 0 && oocKey.exists ? energy <= 20 : energy + TF_ENERGY <= energyMax) {
            tf_macro();
            if (BERSERK.clickable() && (ttl > BERSERK_CD + BERSERK_DUR || pot_up()))  {               
                berserk_macro();
            }
        }       
        if (willExpire(ttl, BERSERK_DUR) && BERSERK.clickable()) {
            berserk_macro();
        }
               
        // agressive SR
        if (ttl > 3000) {
            if (sr_time == 0) {
                SR.click();
            } else if (sr_time < ttl && sr_time < 4000 && combo > 0 && rip_tick_left >= 2) {
                SR.click();
            }
        }
       
        // normal finisher
        if (combo == 5) {
            if (rip_tick_left == 0 || (bitw() ? ttl > 20000 && ripTickDmgAvgNew() > cfg.ripClipMultiplier * ripTickDmgAvg : maxRipTicksLeft() <= 4)) {
                wantDoC_ns_en(true, -1);                               
                RIP.click();             
                /*
            } else if (!bitw() && maxRipTicksLeft() <= 4) {
                // rip clip
                if (oocKey.exists) {
                    THRASH.click();
                } else {
                    RIP.click();
                }
                */
            } else {
                FB.click();
            }
        }
       
       
        if (RAKE.clickable()) {
            if (rake_tick_left == 0) {
                // initial rake
                RAKE.click();             
            } else {   
                double newDmg = rakeTickDmgAvgNew();           
                if (newDmg > cfg.rakeClipMultiplier * rakeTickDmgAvg) {
                    // clip rake
                    RAKE.click();             
                } else if (rake_tick_index > 0 && newDmg >= rakeTickDmgAvg && rakeTickDmgAvgFuture(CAT_GCD) < rakeTickDmgAvg) {               
                    // the next rake sux, shit is fading
                    RAKE.click();
                }
            }
        }
       
        // combo builder
        if (combo < 5) {               
            if (BERSERK.up() && KOTJ.clickable()) {
                KOTJ.click(); // fucking gcd
            }           
            generator(cfg.use_rake_as_generator).click();
        }
       
        if (spec.talent_hotw && HOTW.clickable() && !BERSERK.up() && hotwLogic != null) {
            altGear.equip();
            HOTW.click();
            top.push(hotwLogic);
        }
       
        if (shouldFF()) {
            FF.click();
        }


I don't know Troll base stats yet, so these numbers are for Night Elf using the gear configuration above, for a 45-55m hp target (~7.2 minute combat time):
Code: Select all
Median = 119082
Mean   = 119017 +/- 102
Min    = 110224
Max    = 128557
Mean Time = 7.2 min +/- 446 ms


I need to track down that 900 secondary different, add more latency emulation, and mirror your action list better.

Edit: some detailed stats from averaging together 10 runs
Code: Select all
Rake Uptime        =  92.98%
Rip Uptime         =  89.59%

+SR                (only Melee) =  99.81% (4769 of 4778)
+SR              (except Melee) =  98.77% (6097 of 6173)
+DoC           (only Rip Ticks) =  63.04% (1211 of 1921)
+DoC          (only Rake Ticks) =  72.75% (964 of 1325)

Name                              Count       Hit      Crit   Crit%   Overall
Rip`5#                             1921     43037     88999  40.81% [ 23.73%]
Melee                              4778     13928     32927  40.12% [ 20.58%]
Rake#                              1325     50514    106676  39.47% [ 19.25%]
Shred                              1185     54262    110229  38.82% [ 18.00%]
FB`5                                193     79532    175670  68.91% [  5.62%]
Rake                                374     47712    101611  40.91% [  5.21%]
Thrash#                             793     22828     47759  39.47% [  5.18%]
Thrash                              166     31755     66912  36.75% [  1.48%]
Cobalt Frag Bomb                     76     31539     65162  11.84% [  0.54%]
Ravage                               10    102571    188249  90.00% [  0.36%]
FB`4                                  2         0     79065 100.00% [  0.03%]
FB`3                                  1         0     59525 100.00% [  0.01%]
FB`1                                  1         0     23018 100.00% [  0.00%]
Rip`5                               126         0         0   0.00% [  0.00%] // rip application

Dancing Steel                 PPM  107 30.555%
Swordguard                    ICD   79 27.637%
Bottle of Infinite Stars      ICD   89 42.333%
Terror in the Mists           ICD   40 19.244%

Waiting          2.4m [ 34.32%]    0
Shred            2.0m [ 29.35%]  122 1.0s
HT                49s [ 11.80%]   35 1.4s
Rake              34s [  8.18%]   34 1.0s
FB                21s [  5.05%]   21 1.0s
SR                18s [  4.33%]   18 1.0s
Thrash            16s [  3.85%]   16 1.0s
Rip               12s [  2.89%]   12 1.0s
Ravage           1.0s [  0.24%]    1 1.0s


Edit 2: this is DoC, open with Ravage, pre pot/SR/2xDoC, all raid buffs, 300 agi food, 1000 agi flask, heroism, but no symbosis/stormlash/skull banner/etc...

Edit 3: textual dump: http://raffy.antistupid.com/wow/catsim/Dump4.txt

Exalted
User avatar
Posts: 1604
Joined: Mon May 24, 2010 10:21 pm

Re: Feral Damage Equations

Postby Tinderhoof » Sun Nov 25, 2012 5:13 am

Hey Raffy. I had a question about your rotation. Why are you opening with Ravage in your rotation? With the limited amount of time we have with SR to open a fight it is a very expensive opener with a risky upside. It is also not really safe to try and get behind a boss stealthed pre pull.

Also for the opener what time do you have on SR, and how much energy do you start with? Have you tried your opener as Rake instead of Ravage?

Exalted
User avatar
Posts: 870
Joined: Tue Oct 23, 2012 7:15 am

Re: Feral Damage Equations

Postby raffy » Sun Nov 25, 2012 12:24 pm

I just figured Ravage was better (I haven't really done any comparisons of different rotations yet, apart from playing around with lookahead Rake), but I currently implement it as an option. If you begin with "Normal Rotation", it opens with Rake. You can also open with active HotW (Wrath or Hurricane spam).

If pre-SR is enabled (and glyph is active), you still start with 100 energy, but SR is shortened by the time it takes to regen your energy back to 100 (which puts the starting SR at 9.77s in duration for the BiS setup above).
Code: Select all
if (spec.glyph_sr && cfg.pre_sr) {
      _srApply(_srDur() - timeToGainBackIfCast(SR)); // about 9 seconds
}

Exalted
User avatar
Posts: 870
Joined: Tue Oct 23, 2012 7:15 am

Re: Feral Damage Equations

Postby raffy » Sun Nov 25, 2012 2:12 pm

Ravage seems to be a DPS gain over Rake according to my sim, but I still need to do a lot more debugging.

In my results from before, my chest piece was missing two gems, so I added an audit feature (so that doesn't happen again) and re-simulated which improved my BiS median DPS to 120301:
Code: Select all
Sockets: (2) [Yellow, Yellow]
[gem0:Yellow] Empty
[gem1:Yellow] Empty

Exalted
User avatar
Posts: 1604
Joined: Mon May 24, 2010 10:21 pm

Re: Feral Damage Equations

Postby Tinderhoof » Sun Nov 25, 2012 3:05 pm

raffy wrote:If pre-SR is enabled (and glyph is active), you still start with 100 energy, but SR is shortened by the time it takes to regen your energy back to 100 (which puts the starting SR at 9.77s in duration for the BiS setup above).

I have been meaning to put this up in a more public place, but haven't got around to it yet (coming soon). You can game the glyph a little for the opening of a fight, but it will take some pratice and it will annoy any of your raid mates who play with sound on (I never do).

Savage Roar ticks like a bleed at 3 second intervals. If we refresh at the correct time it will let us keep the last 2 seconds of the pervious SR. That means that if you refresh ST at 0 combo points at 11, 8, 5, or 2 seconds the refreshed time will start at 14 seconds. If you do so our energy will be 100% by the time you hit 11 seconds and may refresh over and over until the pull begins. If the fight does not call for Wild Charge (I am finding most fights don't) you can refresh right before the tank pulls which should leave you about 11 energy by the time you reach the boss for the run in (don't forget to pre pot).

This can't really be executed perfectly every time, but it does give us a little more breathing room to get a Rip up before the SR exprires on the opener. Very importent for DoC as it wastes the 1.5 GCD for the HT. Just to make sure, your Sim is using a 1.5 GCD for HT while everything else is 1 second right?

Ravage seems to be a DPS gain over Rake according to my sim, but I still need to do a lot more debugging.

I am intersted to know by how much. The reason being is I don't think you will be able to start most fights out as soon as the tank pulls due to our slowed movment and the postional requirement of Ravage outside of Incarnation. What happens to the damage spread if you add a 3 second delay to the Ravage opener vs a Rake opener?

Exalted
User avatar
Posts: 870
Joined: Tue Oct 23, 2012 7:15 am

Re: Feral Damage Equations

Postby raffy » Sun Nov 25, 2012 3:46 pm

3-second open delay (with SR/Pot/2xDoC applied at 0:00) drops median DPS to 119342 when using Ravage.

The SR thing is interesting. I recently noticed the same effect with Rake.

If you Rake once before Rake ticks, you get 1 extra Rake tick.
If you Rake twice before Rake ticks, you still only get 1 extra Rake tick.

I implemented this like RipShreds (or Rip/extends or whatever you guys call it) where each Rake tick grants you 1 Rake extend, such that, if you clip the Rake, instead of getting 5 ticks on the new Rake, you get 6.

Edit:

Let me simplify that, it seems like, if you have a Rake up, and re-rake, the new Rake gets 6 ticks instead of 5.

Thrash doesn't seem to be extendable however. I could not get the debuff duration to appear longer than 30 sec.

Edit 2:

Yeah, all spells (instant, casted, channelled) are implemented (and weapon swaps) and HT properly uses spell gcd, not cat gcd.

Edit 3:

I implemented the SR rollover, with a setting that controls the maximum amount of rollover (up to 3 sec).

I avoid using the SR rollover at the start to get a 14.X sec SR since it costs 25+25 energy (and after regen back to full ends up being about the same). --- oh I see, I have to wait longer, so the SR's aren't back to back, gotcha.

In game, there seems to be some probability that you get a PS proc with a SR`0, but I have no idea what it is.

Edit 4:

I made a rotation that just spams SR using 3 second rollover maximum. The first SR is just the best case of previous time + maximum rollover.

Code: Select all
00:00.000 Pre: DoC
00:00.000 +Potion#1
00:00.000 +SR`0: 12.77s
00:00.000 +Prowl
00:01.000 Delayed opening
00:01.000 -Prowl
00:01.000 Ravage         183764 Crit         +SR+DoC+Agi(4000)
00:01.000 Combo: 2 (+2)
00:02.000 *SR`2: 25.23s
00:02.000 PS: 2
00:03.000 *SR`0: 14.23s
00:04.000 *SR`0: 12.23s
00:05.000 *SR`0: 13.23s
00:06.497 *SR`0: 14.73s
00:08.722 *SR`0: 13.95s
00:10.947 *SR`0: 13.18s
00:13.172 *SR`0: 12.40s
00:15.397 *SR`0: 14.63s
00:17.622 *SR`0: 13.85s
00:19.847 *SR`0: 13.08s
00:22.072 *SR`0: 12.30s
00:24.297 *SR`0: 14.53s
00:25.000 -Potion#1
00:26.522 *SR`0: 13.75s
00:28.747 *SR`0: 12.98s
00:30.972 *SR`0: 12.20s
00:33.197 *SR`0: 14.43s
00:35.422 *SR`0: 13.65s
00:37.647 *SR`0: 12.88s
00:39.872 *SR`0: 12.10s

Exalted
User avatar
Posts: 1604
Joined: Mon May 24, 2010 10:21 pm

Re: Feral Damage Equations

Postby Tinderhoof » Sun Nov 25, 2012 7:56 pm

raffy wrote:
Let me simplify that, it seems like, if you have a Rake up, and re-rake, the new Rake gets 6 ticks instead of 5.

All DOTs work like this as of Cata. The second one isn't "extended", it just doesn't overwrite the last tick of the DOT that is already in place. The SR follows the same forumla. Rip works the same way but it ticks every 2 seconds, so you would need to refresh below 2 seconds instead of 3 like Rake.

Exalted
User avatar
Posts: 870
Joined: Tue Oct 23, 2012 7:15 am

Re: Feral Damage Equations

Postby raffy » Sun Nov 25, 2012 8:02 pm

Tinderhoof wrote:All DOTs work like this as of Cata. The second one isn't "extended", it just doesn't overwrite the last tick of the DOT that is already in place. The SR follows the same forumla. Rip works the same way but it ticks every 2 seconds, so you would need to refresh below 2 seconds instead of 3 like Rake.

Thats good to know. I must of made a mistake with Thrash (I said 30 seconds so I must of been monitoring the wrong debuff.)

For Rake, do you know if it is 6 ticks at new damage, or keep last tick + 5 ticks at new damage? I don't have WoW on my laptop, and won't be able to test more stuff until my vacation ends.

Edit: also, do you know if this applies for BitW refresh? Meaning, we almost always get 1 extra tick on the refreshed Rip? I don't recall seeing a longer debuff time when I BitW in-game, and that would explain the bug where a BitW rip fades prematurely.

Exalted
User avatar
Posts: 1201
Joined: Fri Nov 25, 2011 7:49 pm

Re: Feral Damage Equations

Postby aggixx » Sun Nov 25, 2012 8:49 pm

Rake is 5 ticks, 1 every 3 seconds, over 15 seconds, and deals instant bleed damage that uses the same damage formula as a tick on application. The instant damage is not a "tick."
Image

Exalted
User avatar
Posts: 870
Joined: Tue Oct 23, 2012 7:15 am

Re: Feral Damage Equations

Postby raffy » Sun Nov 25, 2012 8:55 pm

aggixx wrote:Rake is 5 ticks, 1 every 3 seconds, over 15 seconds, and deals instant bleed damage that uses the same damage formula as a tick on application. The instant damage is not a "tick."


Tinderhoof wrote:All DOTs work like this as of Cata. The second one isn't "extended", it just doesn't overwrite the last tick of the DOT that is already in place. The SR follows the same forumla. Rip works the same way but it ticks every 2 seconds, so you would need to refresh below 2 seconds instead of 3 like Rake.


From that description, it sounds like the new Rake appends 5 ticks after the current tick (which would be a messy code change, so I'm trying to avoid this). So my question was (since I don't have access to WoW now):
Code: Select all
0.000: Rake (Initial Rake Tick)
1.000: TF
1.000: Rake again (Initial Rake Tick)
3.000: Tick#1 <=================
6.000: Tick#2 +TF
9.000: Tick#3 +TF
12.000: Tick#4 +TF
15.000: Tick#5 +TF
18.000: Tick#6 +TF

Is Tick#1 damage modified by TF? So I have 6 ticks with TF?

Edit: looking at some combat logs, it appears to be TF'd, so good, I don't have to change any code.

Now, I'm mainly curious how many ticks a Rip gets after being BitW'd: 8 or 9

Exalted
User avatar
Posts: 870
Joined: Tue Oct 23, 2012 7:15 am

Re: Feral Damage Equations

Postby raffy » Mon Nov 26, 2012 1:14 am

Changed Thrash, Rake, Rip, Pounce, and SR so they rollover correctly and encouraged the simulator to clip during the final tick. I also figured out the base stats for the Troll and Tauren. Overall, my BiS T14H configuration is now at 124503 median dps.
Code: Select all
Runs = 1000
DPS: Median    = 124503
DPS: Mean      = 124520 +/- 112
DPS: Range     = 110493 -- 135723
Damage: Median = 49.97M
Damage: Mean   = 49.97M +/- 88.99K
Damage: Range  = 45.02M -- 55.00M
Time: Median   = 6.7m
Time: Mean     = 6.7m +/- 816ms
Time: Range    = 5.7m -- 8.0m


Took a screenshot of the entire scrollable simulator interface: http://raffy.antistupid.com/wow/catsim/sim_ui4.png

Edit:

I'm trying to figure out what is the best way to model latency. SimC seems to provide two latency settings: World Lag and Aura Delay. I was thinking about just adding some padding to the GCD, but with WoW spell queueing, I don't think that's a good idea, considering in-game, you can pretty much align spells back to back w/o gap as long as your resources hold up. Also, since Cat's aren't GCD capped, this seemed kinda silly. Lastly, it seems like, regardless of your latency, 10 second buff still lasts for 10 seconds and I imagine all wow commands are timestamped (in some sense.) So any ideas here would be greatly appreciated.

Exalted
User avatar
Posts: 1201
Joined: Fri Nov 25, 2011 7:49 pm

Re: Feral Damage Equations

Postby aggixx » Mon Nov 26, 2012 5:26 am

raffy wrote:in-game, you can pretty much align spells back to back w/o gap as long as your resources hold up

I don't believe this is at all true. If you look at any combat log it is never exactly 1000 milliseconds between 2 consecutive GCDs.

Edit: Here's a WoL XE query for one of my Gara'jal parses (link to query).
Code: Select all
[20:31:35.175] Pawkets casts Savage Roar
[20:31:36.166] Pawkets casts Faerie Fire on Gara'jal the Spiritbinder
[20:31:36.442] Pawkets casts Virmen's Bite
[20:31:37.158] Pawkets casts Rake on Gara'jal the Spiritbinder
[20:31:38.844] Pawkets casts Shred on Gara'jal the Spiritbinder
[20:31:39.872] Pawkets casts Shred on Gara'jal the Spiritbinder
[20:31:40.876] Pawkets casts Tiger's Fury
[20:31:40.887] Pawkets casts Synapse Springs
[20:31:40.950] Pawkets casts Berserk
[20:31:41.605] Pawkets casts Shred on Gara'jal the Spiritbinder
[20:31:42.077] Pawkets casts Nature's Swiftness
[20:31:42.536] Pawkets casts Healing Touch on Loq
[20:31:43.960] Pawkets casts Rip on Gara'jal the Spiritbinder
[20:31:44.999] Pawkets casts Rake on Gara'jal the Spiritbinder
[20:31:46.035] Pawkets casts Shred on Gara'jal the Spiritbinder
[20:31:47.066] Pawkets casts Shred on Gara'jal the Spiritbinder
[20:31:49.427] Pawkets casts Savage Roar
[20:31:50.450] Pawkets casts Shred on Gara'jal the Spiritbinder
[20:31:51.451] Pawkets casts Shred on Gara'jal the Spiritbinder
[20:31:52.560] Pawkets casts Shred on Gara'jal the Spiritbinder
[20:31:54.995] Pawkets casts Thrash


You can see near the end I had two shreds back to back that were 1001 ms apart from each other, but that is definitely not the norm.
Image

Exalted
User avatar
Posts: 870
Joined: Tue Oct 23, 2012 7:15 am

Re: Feral Damage Equations

Postby raffy » Mon Nov 26, 2012 3:43 pm

@aggixx, thanks for the data.

Any thoughts on where one should put delays or w/e to model latency?

From your data, it looks like I could either implement some fixed or random penalty onto each GCD.

I currently allow NS+HT within 0 ms, but I don't know if modeling that truthfully is worth it, considering 1 minute CD.

For my sim, I just added "Cat Stats", got basic reforger UI working, and added support for set bonuses.
http://raffy.antistupid.com/wow/catsim/sim_ui5.png

Exalted
User avatar
Posts: 1201
Joined: Fri Nov 25, 2011 7:49 pm

Re: Feral Damage Equations

Postby aggixx » Mon Nov 26, 2012 11:18 pm

Since NS is off the GCD there isn't any harm in not having a delay on it. As far as what to do to model latency, I would hop into SimC IRC and see if someone could give you a brief explanation on what they do and why.
Image

Posts: 10
Joined: Tue Oct 30, 2012 5:50 pm

Re: Feral Damage Equations

Postby Caltiom » Tue Nov 27, 2012 6:50 pm

Any special reason you didn't want to start working on SimC? ;)

I tried to test your Simulation: Downloaded the source archive you posted a while ago, built it with 'ant' and then tried to run the Sim2.jar in /dist. Error Message is:

Code: Select all
Exception in thread "main" java.lang.NoClassDefFoundError: org/json/simple/JSONValue
   at sim2.API.json(API.java:65)
   at sim2.API.json_char(API.java:61)
   at sim2.API.loadChar(API.java:274)
   at sim2.Main.main(Main.java:42)
Caused by: java.lang.ClassNotFoundException: org.json.simple.JSONValue
   at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
   at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
   at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
   ... 4 more


So the problem seems to lie in the JSON package. Any ideas why that happens?
Oh and I use java version "1.7.0_09"
OpenJDK Runtime Environment (IcedTea7 2.3.3) (7u9-2.3.3-0ubuntu1~12.10.1)
OpenJDK 64-Bit Server VM (build 23.2-b09, mixed mode)

Oh and just for the record: <----- complete Java N00b.

Exalted
User avatar
Posts: 870
Joined: Tue Oct 23, 2012 7:15 am

Re: Feral Damage Equations

Postby raffy » Tue Nov 27, 2012 8:01 pm

@Caltiom, "Note: this is only for programmers" :p but thanks for the interest. I'll have a more usable update available soon.

I didn't want to work on Simc because:
1. I wanted to independently verify the Simc results (I'm pretty close to them right now)
2. Implement a DPS rotation that doesn't use a singular action list (for both speed and dynamic complexity)
3. Track a lot of Feral specific things, like:

Figuring out % of Rake/Rip ticks that have DoC (or any combination of procs)
Code: Select all
+DoC                 (only Rip) =  45.16% (1254 of 2777)
+DoC               (only Rip`5) =  45.16% (1254 of 2777)
+DoC           (only Rip Ticks) =  47.89% (21237 of 44343)
+DoC                (only Rake) =  72.72% (6665 of 9165)
+DoC          (only Rake Ticks) =  82.52% (27413 of 33219)


Here is a DPS breakdown, where I have the typical breakdown at the top, and then a super detailed breakout of all the modifiers that were active when damage was recorded: http://raffy.antistupid.com/wow/catsim/Dump7.txt

Right now all my analysis stuff is textual. I'm working on getting a release out before doing anything fancy.

Last night, I added a simc importer, and with the help of aggixx, was able to evaluate the current feral simc script in my simulator:
Code: Select all
DPS: Median    = 126388
DPS: Mean      = 126464 +/- 71
DPS: Range     = 114452 -- 136870
Damage: Median = 50.13M
Damage: Mean   = 50.12M +/- 64.34K
Damage: Range  = 45.01M -- 55.25M
Time: Median   = 6.6m
Time: Mean     = 6.6m +/- 567ms
Time: Range    = 5.6m -- 7.7m

Exalted
User avatar
Posts: 1145
Joined: Fri Jun 04, 2010 4:28 am

Re: Feral Damage Equations

Postby Leafkiller » Tue Nov 27, 2012 8:21 pm

I was talking to Yawning a few months ago bemoaning the loss of Mew as a tool we could use and he said good things about Simulationcraft and the people who work on it. He said he developed Mew because he was interested in creating a simulator and the classic "NIH" ("not invented here").

I found it faster to optimize the rotation in Mew for a few reasons:
1. Rather than deal with gear, I was able to enter stat values. This made it much easier to play with different stat combinations and draw meaningful conclusions about relative stat values. Ideally, both methods of character input should be supported, gear and raw stat values.

2. It was easier to work on the rotation in Java because I could implement basic things like if/else structures and functions (not to mention Java is closer to Lua which is what the Ovale scripts use). aggixx will confirm that there are things that are much easier to express in my Ovale script than they are in the simc script.

3. It was easier to get changes made to Mew to support new ideas in the rotation. For instance, we are still handicapped by the lack of a way to get the total damage ratios for overwriting DoTs in simc which Raffy already has support for in his simulator. Early on I was the most active user of Mew, and Yawning added a lot of features as I requested them.

@Raffy - as a side note, did you ever look at the source code for Mew? It is written in Java and could give you some ideas of how to address some of the issues you are talking (such as latency, etc.). https://code.google.com/p/mew-wow-druid ... e/checkout

Next

Return to Kitty DPS

Who is online

Users browsing this forum: Yahoo [Bot] and 5 guests