characterStatRatio = Max(0, attackerCharacterAtk - defenderCharacterDef) / 5000
unitStatRatio = Max(0, RoundUp((attackerUnitAtk / 10.0) - (defenderUnitDef / 10.0))) /
5000
characterSigmoidAdjustment = 1.0 / (Exp((250 * (defenderCharacterDef
- attackerCharacterAtk)) / 100000.0) + 1.0)
unitSigmoidAdjustment = 1.0 / (Exp((25 * (defenderUnitDef - attackerUnitAtk))
/ 100000.0) + 1.0)
baseDamage = RoundUp((characterStatRatio + unitStatRatio + characterSigmoidAdjustment +
unitSigmoidAdjustment) * weaponPower)
attackerCombinedStat = RoundUp((attackerUnitAtk + 2 * attackerCharacterAtk) / 10.0)
targetCombinedStat = RoundUp((defenderUnitDef + 2 * defenderCharacterDef) / 10.0)
offenseCorrectionExponent = ((5000 - attackerCombinedStat) *
30) / 100000.0
defenseCorrectionExponent = ((5000 - targetCombinedStat) *
3) / 100000.0
offenseDamageComponent = (10000 / 100.0) / (Exp(offenseCorrectionExponent)
+ 1.0)
defenseMitigationComponent = (-4000 / 100.0) / (Exp(defenseCorrectionExponent)
+ 1.0)
damageCorrection = (offenseDamageComponent + defenseMitigationComponent) * baseDamage
battleDamage = RoundUp((baseDamage + damageCorrection) * terrainCorrection)
totalDamageMultiplierPercent = sumAttackerDamageDealtPercent +
sumAttackerCritDamageDealtPercent + attackerVigorDamageBonus -
sumDefenderDamageTakenPercent
scaledDamage = RoundUp((totalDamageMultiplierPercent * battleDamage) / 100.0)
combinedDamage = (battleDamage + scaledDamage ) * defensiveCorrection
finalDamage = Max(0, RoundUp(combinedDamage * ((criticalCorrectionPercent + 100.0) /
100.0)))