Item Search
     
BG-Wiki Search
+ Reply to Thread
Page 4 of 4 FirstFirst ... 2 3 4
Results 61 to 66 of 66
  1. #61
    Cerberus
    Join Date
    Feb 2009
    Posts
    498
    BG Level
    4
    FFXI Server
    Cerberus

    "simple" is perhaps not the first word a layperson would use to describe the OP

  2. #62
    Masamune
    Guest

    Raellia, i think my reading skills are failing me: i don't find that "rule" you mentioned earlier as answer to my post wondering how the formula produces spikes. {Please Help me out!}

  3. #63
    Custom Title
    Join Date
    Nov 2008
    Posts
    1,066
    BG Level
    6
    FFXI Server
    Diabolos

    Quote Originally Posted by scaevola View Post
    "simple" is perhaps not the first word a layperson would use to describe the OP
    http://ffxisimple.ytmnd.com/

    Quote Originally Posted by Masamune View Post
    Raellia, i think my reading skills are failing me: i don't find that "rule" you mentioned earlier as answer to my post wondering how the formula produces spikes. {Please Help me out!}
    There are special rules for particularly low Intermediate pDif:

    If Intermediate pDif falls below 1.0, it is set to 1.0.

    If Intermediate pDif falls below 0.75, instead add 0.25 to it.
    This starts to happen below 1.5 cRatio, when cRatio-LIA reaches 1.0 and below.

    Pre-Secondary values that are then below 1.0 are set to 1.0, developing an increasing number of 1.0 hits, before Secondary mind you which spreads them up about 5% or 2-3 points of damage, that produces the spike you're pointing out.

    As cRatio drops below 1.272 (14/11) cRatio-LIA is now reaching down to 0.75. Any pre-Secondary value below 0.75 is not set to 1.0 but is instead given a +0.25 bonus. This allows minimum hits at below 1.272 cRatio to continue below a 1.0 pre-Secondary.

    There is still the range of 0.75-1.0 Pre-Secondary being set to 1.0, and the 0.25 bonus intersects values below 0.75 with this at 1.0.

    This is apparent in your data where your 1.249 data finally dropped below 1.0, and is about as high a cRatio value as can expect this due to Secondary pushing up any narrower margin to above 1.0.

    Note here that between 0.727 and 1.272 cRatio, there is always a portion of Intermediate (Pre-Sec.) PDifs falling betweein 0.75 and 1.0, around 30% of of the range, being turned into 1.0 Pre-Sec. hits and producing a spike in the middle of the data.

    Below 0.727 cRatio (8/11), cRatio+RAE no longer reaches above 1.0, with the uppermost of it's range in the 0.75-1.0 Pre-Sec. and getting set to 1.0, developing the apparent '1.0 ceiling'.

    And then finally at below 0.5 cRatio, like at 1.272, all hits are now below 0.75 and receiving the 0.25 bonus with none being set to 1.0 by falling in the 0.75-1.0 Pre-Sec. range.

    That's a lot of words to explain what exactly it does, but in code format it's crazy simple, does what it would be purposed for, and is something I would definitely use:

    Code:
    (Genrate pDif without Secondary)
    
    If pDif >3.0
    	pDif = 3.0
    If pDif > 1.0
    	pDif = pDif
    If 0.75 < pDif < 1.0
    	pDif = 1.0
    If pDif < 0.75
    	pDif = pDif+0.25
    
    (Now apply Secondary)
    From a design standpoint, it's a way to apply a bonus to low damage hits without making a weird 'jump' in the graph from the bonus. You also need this stage before Secondary for crits, so I threw that in too.

  4. #64
    Custom Title
    Join Date
    Nov 2008
    Posts
    1,066
    BG Level
    6
    FFXI Server
    Diabolos

    Another nice big cleanup/rollup. I'm satisfied with it above 1.0 cRatio, so only somebody with data at or below that can really tell me what fits and what still doesn't fit.

  5. #65
    Masamune
    Guest

    Ok looks bit more cleanup indeed, GJ!

    But still i don't see in your formula the conditionals producing the plateaus and spikes:
    Quote Originally Posted by Raellia
    Final Damage = Floor([Base Damage] * [(11/10)*cRatio-0.65+rand*0.85] * [1+rand(0.05)])
    And for critical hits:
    Final Damage = Floor([Base Damage] * [(11/10)*cRatio+0.45+rand*0.75] * [1+rand(0.05)])
    ... while your graph show them clearly. Forgot something in your post ?

    Also, since we are now quite close in reasoning, i'll share the "skeleton" i had so you get what i meant with above comment:
    Excel version:
    Code:
    Cap = IF(WeapType="1H";2;2.25)
    cRatio = IF(cRatio>Cap; Cap; IF(cRatio<0; 0; cRatio))
    RANGE = BaseDMG
    RANDX = rand() + IF(rand()<=CritRate; 1.2; 0)
    SecondaryRAND = 1 + 0.05*rand()
    GeneratorFunction = IF(OR(AND(cRatio>=0.5;cRatio<0.75-RANDX/2);AND(cRatio>=1.25;cRatio<1.5-RANDX));;IF(AND(cRatio>=1.65;cRatio>3.5-RANDX);2;cRatio-1.5+RANDX))
    DISPLAYED DMG = BaseDMG + TRUNCATE[ RANGE * ( GeneratorFunction * SecondaryRAND ) ]
    This has most important conditionals*, you could almost paste it directly. Also you will recognize the same format of a randomized step as defined in wikipedia: Y=Start+INT(Range*generator).

    Now, as i said earlier, it's only a draft function reproducing main artifacts observed on parses... but it's not fine tuned !
    If you generate with it, 1st thing you will notice is crit maxs going off the board way before the cap @ cRatio=1.65. The reason is because i simply considered RANGE = BaseDMG at 1st glance, meaning critRange = Normal hits range * 1.05, which parses shows is false.
    A possible solution at this point would be to add a modifier :
    RANGE = BaseDMG * Func(cRatio). To be determined...

    Hope that helps.

    EDIT: if someone want to know how i determined GeneratorFunction without even looking at parses, feel free to PM.

    EDIT2: i'm gonna check those new mobs in [S] areas if can make low cRatio (especially around cRatio~0.3) parses on them without getting owned.
    edit 2bis: ok found 4 "doable" mobs: Hispid Rarabs, Condors, FeywealdSaplings, and DuriumShells (parses on crabs will have to be filtered out of STRdown'd and stoneskin'd hits). Viseclaws @ TheBoyadha are doable too but VT so might be hard to solo with some jobs. Moorning Crawlers under Cocoon can work also but need some erase against their slow...
    Bats at Abyssea-Misareaux spit a nice attack down that stays long, sadly it might be hard to keep data scattered through 4-6 different mob's levels + exp varying with lights (unless resetting constantly with a coli nearby like a cruor pt)

  6. #66
    Masamune
    Guest

    Ok i found the forgotten thing, here is exploitable syntax:
    Code:
    Validation rule on cRatio = IF(AND(WeapType="2H"; cRatio>2.25); 2.25; IF(AND(WeapType="1H"; cRatio>2); 2; IF(cRatio<0; 0; cRatio)))
    Range = BaseDMG
    Generator = 1.1*cRatio + IF(rand < CritRate; 0.45+rand*0.75; -0.65+rand*0.85)
    Final Damage = Floor( [Range * IF(Generator > 3; 3; IF(Generator > 1; Generator; IF(Generator > 0.75; 1; Generator+0.25)))] * (1+rand*5%) )
    Plotted on this googlesheet.

    So can deduce from this:

    - Minimum Normal Hits:
    occurs when all rands=0 => Generator=1.1*cRatio-0.65
    => MinDMG=BaseDMG*IF(cRatio > 3.65/1.1; 3; IF(cRatio > 1.65/1.1; 1.1*cRatio-0.65; IF(cRatio > 1.4/1.1; 1; 1.1*cRatio-0.4)))
    => MinDMG=BaseDMG*IF(cRatio > 3.318; 3; IF(cRatio > 1.5; 1.1*cRatio-0.65; IF(cRatio > 1.27273; 1; 1.1*cRatio-0.4)))
    since cRatio is capped @ 2 for 1H, or 2.25 if 2H weapon:
    => MinDMG = BaseDMG * IF(cRatio > 1.5; 1.1*cRatio-0.65; IF(cRatio > 1.27273; 1; 1.1*cRatio-0.4))

    - Maximum Normal Hits:
    occurs when all rands near 1 => Generator<1.1*cRatio+0.2
    => MaxDMG=(BaseDMG*IF(cRatio > 2.8/1.1; 3; IF(cRatio > 0.8/1.1; 1.1*cRatio+0.2; IF(cRatio > 0.55/1.1; 1; 1.1*cRatio+0.45))))*1.05
    => MaxDMG<(BaseDMG*IF(cRatio > 2.54545; 3; IF(cRatio > 0.727273; 1.1*cRatio+0.2; IF(cRatio > 0.5; 1; 1.1*cRatio+0.45))))*1.05
    since cRatio is capped @ 2 for 1H, or 2.25 if 2H weapon:
    => MaxDMG<(BaseDMG*IF(cRatio > 0.727273; 1.1*cRatio+0.2; IF(cRatio > 0.5; 1; 1.1*cRatio+0.45)))*1.05
    => MaxDMG < BaseDMG * IF(cRatio > 0.727273; 1.155*cRatio+0.21; IF(cRatio > 0.5; 1.05; 1.155*cRatio+0.4725))

    - Minimum Critical Hits:
    occurs when all rands=0 => Generator=1.1*cRatio+0.45
    => MinCritDMG=BaseDMG*IF(cRatio > 2.55/1.1; 3; IF(cRatio > 0.55/1.1; 1.1*cRatio+0.45; IF(cRatio > 0.3/1.1; 1; 1.1*cRatio+0.7)))
    => MinCritDMG=BaseDMG*IF(cRatio > 2.31818; 3; IF(cRatio > 0.5; 1.1*cRatio+0.45; IF(cRatio > 0.272727; 1; 1.1*cRatio+0.7)))
    since cRatio is capped @ 2 for 1H, or 2.25 if 2H weapon:
    => MinCritDMG = BaseDMG * IF(cRatio > 0.5; 1.1*cRatio+0.45; IF(cRatio > 0.272727; 1; 1.1*cRatio+0.7))

    - Maximum Critical Hits:
    occurs when all rands near 1 => Generator<1.1*cRatio+1.2
    => MaxCritDMG=BaseDMG*IF(cRatio > 1.8/1.1; 3; IF(cRatio > -0.2/1.1; 1.1*cRatio+1.2; IF(cRatio > -0.45/1.1; 1; 1.1*cRatio+1.45)))
    since cRatio can't <0, it follows:
    => MaxCritDMG<(BaseDMG*IF(cRatio > 1.63636; 3; 1.1*cRatio+1.2))*1.05
    => MaxCritDMG < BaseDMG * IF(cRatio > 1.63636; 3.15; 1.155*cRatio+1.26)

    For averages :

    - Average Normal Hits:
    occurs when all rands=0.5 => Generator=1.1*cRatio-0.65+0.5*0.85=1.1*cRatio-0.225
    => AvgDMG=(BaseDMG*IF(cRatio > 3.225/1.1; 3; IF(cRatio > 1.225/1.1; 1.1*cRatio-0.225; IF(cRatio > 0.975/1.1; 1; 1.1*cRatio-0.025))))*1.025
    => AvgDMG=(BaseDMG*IF(cRatio > 2.932; 3; IF(cRatio > 1.11364; 1.1*cRatio-0.225; IF(cRatio > 0.886; 1; 1.1*cRatio-0.025))))*1.025
    since cRatio is capped @ 2 for 1H, or 2.25 if 2H weapon:
    => AvgDMG=(BaseDMG*IF(cRatio > 1.11364; 1.1*cRatio-0.225; IF(cRatio > 0.886; 1; 1.1*cRatio-0.025)))*1.025
    => AvgDMG = BaseDMG * IF(cRatio > 1.11364; 1.1275*cRatio-0.23; IF(cRatio > 0.886; 1.05; 1.1275*cRatio-0.0256))

    - Average Critical Hits:
    occurs when all rands=0.5 => Generator=1.1*cRatio+0.45+0.5*0.75=1.1*cRatio+0.82 5
    => AvgCritDMG=(BaseDMG*IF(cRatio > 2.175/1.1; 3; IF(cRatio > 0.175/1.1; 1.1*cRatio+0.825; 1.1*cRatio+1.075)))*1.025
    => AvgCritDMG=(BaseDMG*IF(cRatio > 1.977; 3; IF(cRatio > 0.159; 1.1*cRatio+0.825; 1.1*cRatio+1.075)))*1.025
    => AvgCritDMG = BaseDMG * IF(cRatio > 1.977; 3.15; IF(cRatio > 0.159; 1.1275*cRatio+0.8456; 1.1275*cRatio+1.102))


    Now just have to use those formulas to check if indeed 100% compatability with parses...

    Mmmm 1st thing i found is AvgDMG should be ~ 0.8*cRatio+0.2 within the cRatio range [0.73;1.5]... but the formula built here shows 2 different slopes which much higher than 0.8, and even a plateau... conclusion: piece-wise conditionals might not be an acceptable solution ?
    EDIT: Actually nvm since after rereading the Avg formulas, i'm not sure anymore i took into account the skew from spike, especially within the aforementioned cRatio range. Must be more complciated than just setting rands to 1/2...

+ Reply to Thread
Page 4 of 4 FirstFirst ... 2 3 4