
Originally Posted by
nand
Reproduced here (too long for the original post):
Code:
import Data.Number.Symbolic
type Rate = Sym Double
type Chance = Sym Double
type Multiplier = Sym Double
type Distribution = Sym Double
baseRate :: Rate
baseRate = 364
critMultiplier :: Rate -> Multiplier
critMultiplier r = 1 + chance * bonusDamage
where chance = (((r - baseRate) / 108.5) + 4.9511233) / 100
bonusDamage = 0.4 + ((r - baseRate) / 108.5) / 100
directMultiplier :: Rate -> Multiplier
directMultiplier r = 1 + chance * bonusDamage
where chance = ((r - baseRate) / 39.1) / 100
bonusDamage = 0.25
statGain :: Rate -> Rate -> (Rate -> Multiplier) -> Multiplier
statGain cur inc f = f (cur + inc) / f cur
distGain :: Rate -> Distribution -> Multiplier
distGain pool dist = critMultiplier critRate * directMultiplier directRate
where critRate = baseRate + pool * dist
directRate = baseRate + pool * (1 - dist)
relGain :: Rate -> Distribution -> Multiplier
relGain pool dist = distGain pool dist / distGain pool 0.5