Page 2 of 12 FirstFirst 1 2 3 4 ... LastLast
Results 11 to 20 of 112

Thread: A DPS Simulator

  1. #11
    Player
    pandabearcat's Avatar
    Join Date
    Sep 2013
    Posts
    1,517
    Character
    Alizebeth Bequin
    World
    Brynhildr
    Main Class
    Dancer Lv 90
    Small update, but the internal code for potency calculations is faster and more accurate now.

    Update 3
    Small update here, but its useful and was needed moving forwards
    • Added inline metrics, cleaned up potency calculations. Should be more accurate now.
    • HE is now 12.9% modifier multiplicative with the damage modifiers (which are additive).
    • Cleaned up output a bit.

    Known issues:
    • DoT buffs are realtime instead of snapshotted.
    • Buffed DoTs are allowed to be overwritten by unbuffed DoTs.
    (0)

  2. #12
    Player
    EasymodeX's Avatar
    Join Date
    Sep 2013
    Posts
    900
    Character
    Lunairetic Emx
    World
    Midgardsormr
    Main Class
    Lancer Lv 50
    Err, damage modifiers are multiplicative. RS + BFB will be 144%.
    (0)

  3. #13
    Player
    pandabearcat's Avatar
    Join Date
    Sep 2013
    Posts
    1,517
    Character
    Alizebeth Bequin
    World
    Brynhildr
    Main Class
    Dancer Lv 90
    Quote Originally Posted by EasymodeX View Post
    Err, damage modifiers are multiplicative. RS + BFB will be 144%.
    People kept telling me they're additive, so I put it that way.

    Idk. I'm not sure if anyone's tested, but either way its a small change if I can get it confirmed one way or the other.
    (0)

  4. #14
    Player
    pandabearcat's Avatar
    Join Date
    Sep 2013
    Posts
    1,517
    Character
    Alizebeth Bequin
    World
    Brynhildr
    Main Class
    Dancer Lv 90
    Phew, the bulk of the engine is complete, and modularity has been achieved!

    You can now code your own rotations.

    If someone wants to write a script engine to allow non programming users to easily script their own rotations, please be my guest, it would be awesome.

    As always any code I may provide comes with no guarantee whatsoever, and while there is no malicious intent in my code, I am not responsible or liable for any damages to your machine or you or your property.

    Update 4
    Massive backend update!

    Code now allows users to code their own rotations, independent of the simulation engine!

    See the first post for a code sample!

    I will be releasing the engine hopefully tomorrow, as well as documentation for how to code your own rotations!

    Furthermore I will provide a list of all the data the engine provides to you to enable you to make more complicated rotations.

    Too tired tonight to do more though!
    (0)

  5. #15
    Player
    Zirael_Foxfire's Avatar
    Join Date
    Mar 2011
    Posts
    235
    Character
    Zireael Stargaze
    World
    Ragnarok
    Main Class
    Arcanist Lv 60
    Link?
    1234567890
    (0)

  6. #16
    Player
    Alenore's Avatar
    Join Date
    Aug 2012
    Location
    Limsa Lominsa
    Posts
    439
    Character
    Alenore Llohen
    World
    Excalibur
    Main Class
    Lancer Lv 100
    There's a code sample on first page. Feel free to use it, I doubt Panda will release a version before it's really usable =P

    Anyway, Panda, I've started the same work but for Dragoon. Since we both are on Excalibur, i'll probably /tell you to talk about it !
    (0)

  7. #17
    Player
    pandabearcat's Avatar
    Join Date
    Sep 2013
    Posts
    1,517
    Character
    Alizebeth Bequin
    World
    Brynhildr
    Main Class
    Dancer Lv 90
    That sounds good, but if it would save you work you can just (or I can) change only a couple things and rewrite it for Dragoon.

    The point of the engine was (sadly I couldn't make it as flexible as I wanted) that with minimal changes it can simulate all classes.

    The only things I need in order to do any class are:
    • Procs, and their durations, and their effects
    • Any DoTs
    • All cooldowns, their durations, and their cooldowns

    And once I feed that into the program, basically it can simulate anything.

    There is kinda a (somewhat) big difference between DoM and DoW abilities, but its not major enough, just requires a change in how GCD events are handled.

    In that vein, the reason I'm been slow in releasing is while the old engine worked fine, it turns out I had to rewrite a chunk of the potency handling code in order to accomodate DoTs.

    In this way I've taken even more functionality away from the engine, so that almost all the calculations are handled in the event itself.

    Because of this, the engine only handles events, game mechanics, and state checking (to make sure you don't do anything illegal, like constantly spamming bloodletter).

    The event class handles (and keeps track of) all potency, and the state of the game as it was cast.

    Each DoT is now tracked separatedly (from their attacks as well, for example, Windbite and Windbite (DoT) are separate events), and the TICK event no longer handles damage, but rather creates 2 (or 3, with flaming) separate DoT events that trigger.

    In this way, I've opened the path to having a separate Metrics package (which I will write...probably sometime on monday?) which can give detailed info (sort of like Recount's damage breakdown) and pretty graphs.

    So anyway, the engine is broken atm because it is undergoing the "DoT Overhaul" as I like to call it.

    Oh also tweaked the way GCD is handled to no longer generate GCDs, allowing users to consume GCDs whenever they want, rather than forcing them into a cycle. So you are able to delay abilities (though in 99% of situations obviously this is a dps loss).
    (1)

  8. #18
    Player
    pandabearcat's Avatar
    Join Date
    Sep 2013
    Posts
    1,517
    Character
    Alizebeth Bequin
    World
    Brynhildr
    Main Class
    Dancer Lv 90
    Okay double post here, but I wanted to show you the events:

    Code:
    public static enum EventType
        {
            // attacks are NAME (Display Name, Potency, TP Cost, isAnAction, requiresGCD)
            GCD ("GCD", 0, 0, false, false),
            OGCD ("oGCD", 0, 0, false, false),
            TICK ("Tick", 0, 0, false, false),   //server DoT tick
            EXECUTE ("Execute Begins", 0, 0, false, false), //when executes can occur
            AA ("Autoattack", 100, 0, false, false),     //autoattack
            HS ("Heavy Shot", 150, 60, true, true),
            SS ("Straight Shot", 140, 70, true, true),
            SS_RECAST ("SS Recast Timer", 0, 0, false, false), //buffer event for recasting prior to running out
            SS_END ("SS Ends", 0, 0, false, false),
            WB ("Windbite", 60, 80, true, true),
            WB_DOT ("Windbite (DoT)", 40, 0, false, false),
            WB_RECAST ("WB Recast Timer", 0, 0, false, false),
            WB_END ("WB Ends", 0, 0, false, false),
            VB ("Venomous Bite", 100, 80, true, true),
            VB_DOT ("Venomous Bite (DoT)", 35, 0, false, false),
            VB_RECAST ("VB Recast Timer", 0, 0, false, false),
            VB_END ("VB Ends", 0, 0, false, false),
            ME ("Misery's End", 190, 0, true, false),         //misery's end
            ME_CD_END ("ME CD Ends", 0, 0, false, false),
            BL ("Bloodletter", 150, 0, true, false),
            BL_CD_END ("BL CD Ends", 0, 0, false, false),
            ROB_PROC ("River of Blood", 0, 0, false, false),
            SS_PROC ("Straighter Shot", 0, 0, false, false),
            //cooldowns
            HE ("Hawk's Eye", 0, 0, true, false),
            HE_END ("HE Ends", 0, 0,false, false),
            HE_CD_END ("HE CD Ends", 0, 0, false, false),
            BFB ("Blood for Blood", 0, 0, true, false),
            BFB_END ("BFB Ends", 0, 0, false, false),
            BFB_CD_END ("BFB CD Ends", 0, 0, false, false),
            RS ("Raging Strikes", 0, 0, true, false),
            RS_END ("RS Ends", 0, 0, false, false),
            RS_CD_END ("RS CD Ends", 0, 0, false, false),
            IR ("Internal Release", 0, 0, true, false),
            IR_END ("IR Ends", 0, 0, false, false),
            IR_CD_END ("IR CD Ends", 0, 0, false, false),
            BARRAGE ("Barrage", 0, 0, true, false),
            BARRAGE_END ("Barrage Ends", 0, 0, false, false),
            BARRAGE_CD_END ("Barrage CD Ends", 0, 0, false, false),
            FLAMING ("Flaming Arrow", 0, 0, true, false),
            FLAMING_DOT ("Flaming Arrow (DoT)", 35, 0, false, false),
            FLAMING_END ("FA Ends", 0, 0, false, false),
            FLAMING_CD_END ("FA CD Ends", 0, 0, false, false);
        }
    As you can see, these are all the events that are necessary for a Bard, with the exception of TP_TICK (which is the 60/3 secs), and INVIG for invigorate. I will put those in...eventually.

    The format for each event is EVENT_NAME (display_name, potency, tp cost, is an action, requires a gcd).

    Display name, potency, and tp cost (use negatives for tp gains) are pretty self explanatory.

    Is An Action determines whether its an action the user can perform. This is used in checks to see if a user wants to do a nonsensical action (such as, manually proccing RoB), so make sure this flag is correct.

    Requires GCD means whether the attack requires a GCD and/or causes a GCD cooldown. This flag doesn't matter (but leave it false for consistency) for events that are not actions (like procs or dot ticks). Leave this flag false for actions that do not require and do not cause GCD (such as Misery's End).

    So, I'm asking you for help!

    If you are level 50 and knowledgeable about your job, please provide the event lists in such format for your job, in the same format.

    Please remember these key events:
    • All buffs/dots must have a start event and an end event.
    • Generally all buffs/dots should have a Recast event, for ease of use for users to figure out when their dot is about to expire
    • All cooldowns also have a cooldown end event
    • All procs generally should have a "proc end" event as well, unless they last forever (which afaik none do). Notice I forgot to do this for Straighter Shot and RoB. I am in the process of changing this in the DoT overhaul.
    • For DoTs, you need a separate event for the DoT, as well as one for the attack, even if the attack does no damage (such as Bio, Flaming Arrow, etc).
    • You do not need a separate event for actions that consume a proc (such as Thunder that consumes thundercloud, or SS that consumes straighter), as the engine will handle that and automatically update to consume the proc.
    • Events are in all caps, procs should be labeled with PROC, label dot ticks with DOT append _END to anything that is, well, an end (either of a buff, or a cd duration)
    (1)

  9. #19
    Player
    pandabearcat's Avatar
    Join Date
    Sep 2013
    Posts
    1,517
    Character
    Alizebeth Bequin
    World
    Brynhildr
    Main Class
    Dancer Lv 90
    Update 5
    Massive DoT and Event overhaul complete! The engine is now complete and ready for action!
    • DoT overwriting will now follow rules of the game. The engine will not warn you when your DoT will not overwrite, just like real life!
    • DoTs will now snapshot their crit and potency profiles.
    • DoTs have been separated from the "TICK" event. They now tick separately, making it much easier to track individual damage contributions.
    • All Events now track their own "buffs" at time of cast. This way, you can retroactively see what buffs are active for a given event.
    • Similarly, all events track whether or not they have crit. Crits are symbolized with a (!) in the output, and can also be retrieved programmatically.
    • All events are fully exposed and can be consumed by a Metrics package to track "realtime" DPS and other factors.
    • TP has been added to the engine. If your attack consumes more TP than is available, it will fail.
    • TP balance is now tracked as well as total TP usage.
    • Invigorate has been added as a usable cooldown.
    • Woops, RoB stopped working. Am fixing now - Now working again.

    I am writing the documentation for the engine now, and hopefully it will be available over the weekend!
    (1)
    Last edited by pandabearcat; 10-19-2013 at 03:34 AM. Reason: can't count

  10. #20
    Player
    EasymodeX's Avatar
    Join Date
    Sep 2013
    Posts
    900
    Character
    Lunairetic Emx
    World
    Midgardsormr
    Main Class
    Lancer Lv 50
    Quote Originally Posted by pandabearcat View Post
    Update 6
    The engine will not warn you when your DoT will not overwrite, just like real life!
    Err, what's the point of that? If the player is entering logic for the engine, then they'd want to wait for the DOT to drop before recasting. If the player is entering a sequence, then the engine should flag a rejected DOT so the player can fix it, IMO, and run the sim again.

    This should be the set of Dragoon events:

    Code:
    //attacks
    AA ("Autoattack", 100, 0, false, false),
    HT ("Heavy Thrust", 170, 70, true, true),
    HT_RECAST ("HT Recast Timer", 0, 0, false, false),
    HT_END ("HT Ends", 0, 0, false, false),
    PH ("Phlebotomize", 170, 90, true, true),
    PH_DOT ("Phlebotomize (DoT)", 20, 0, false, false),
    PH_RECAST ("PH Recast Timer", 0, 0, false, false),
    PH_END ("PH Ends", 0, 0, false, false),
    ID ("Impulse Drive", 180, 70, true, true),
    ID_ENDc ("ID Ends (combo)", 0, 0, false, false),
    DE ("Disembowel", 220, 60, true, true),
    DE_RECAST ("DE Recast Timer", 0, 0, false, false),
    DE_END ("DE Ends", 0, 0, false, false),
    DE_ENDc ("DE Ends (combo)", 0, 0, false, false),
    CT ("Chaos Thrust", 160, 60, true, true),
    CT_DOT ("Chaos Thrust (DoT)", 20, 0, false, false),
    CT_RECAST ("CT Recast Timer", 0, 0, false, false),
    CT_END ("CT Ends", 0, 0, false, false),
    TT ("True Thrust", 150, 70, true, true),
    TT_ENDc ("TT Ends (combo)", 0, 0, false, false),
    VT ("Vorpal Thrust", 200, 60, true, true),
    VT_ENDc ("VT Ends (combo)", 0, 0, false, false),
    FT ("Full Thrust", 300, 60, true, true),
    FR ("Fracture", 100, 80, true, true),
    FR_DOT ("Fracture", 20, 0, false, false),
    FR_RECAST ("Fracture", 0, 0, false, false),
    FR_END ("Fracture", 0, 0, false, false),
    //OGCD attacks
    LS ("Leg Sweep", 130, 0, true, false),
    LS_CD_END ("LS CD Ends", 0, 0, false, false),
    JU ("Jump", 200, 0, true, false),
    SSD ("Spineshatter Dive", 170, 0, true, false),
    DFD ("Dragonfire Dive", 250, 0, true, false),
    //buffs
    BFBt ("Blood for Blood (traited)", 0, 0, true, false),
    BFBt_END ("BFB (traited) Ends", 0, 0, false, false),
    BFBt_CD_END ("BFB (traited) CD Ends", 0, 0, false, false),
    IR ("Internal Release", 0, 0, true, false),
    IR_END ("IR Ends", 0, 0, false, false),
    IR_CD_END ("IR CD Ends", 0, 0, false, false),
    LSURGE ("Life Surge", 0, 0, true, false),
    LSURGE_CD_END ("LSurge CD Ends", 0, 0, false, false),
    PSURGE ("Power Surge", 0, 0, true, false),
    PSURGE_END ("PSurge Ends", 0, 0, false, false),
    PSURGE_CD_END ("PSurge CD Ends", 0, 0, false, false),
    (1)
    Last edited by EasymodeX; 10-19-2013 at 04:09 AM.

Page 2 of 12 FirstFirst 1 2 3 4 ... LastLast