"simple" is perhaps not the first word a layperson would use to describe the OP
"simple" is perhaps not the first word a layperson would use to describe the OP
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!}
http://ffxisimple.ytmnd.com/
This starts to happen below 1.5 cRatio, when cRatio-LIA reaches 1.0 and below.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.
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:
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.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)
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.
Ok looks bit more cleanup indeed, GJ!
But still i don't see in your formula the conditionals producing the plateaus and spikes:
... while your graph show them clearly. Forgot something in your post ?Originally Posted by Raellia
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:
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).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 ) ]
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)
Ok i found the forgotten thing, here is exploitable syntax:
Plotted on this googlesheet.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%) )
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...