From a8c44fddcae97c7cef1d99b52d4a2009b2c0b029 Mon Sep 17 00:00:00 2001 From: Felix Linker Date: Fri, 20 Jul 2018 12:00:53 +0200 Subject: [PATCH] Shield resistances caps introduced --- src/app/components/Defence.jsx | 6 ++-- src/app/shipyard/Calculations.js | 55 ++++++++++++++++++++------------ 2 files changed, 38 insertions(+), 23 deletions(-) diff --git a/src/app/components/Defence.jsx b/src/app/components/Defence.jsx index 576b65f6..c5b7053d 100644 --- a/src/app/components/Defence.jsx +++ b/src/app/components/Defence.jsx @@ -102,11 +102,11 @@ export default class Defence extends TranslatedComponent { // Add effective shield from resistances const rawMj = shield.generator + shield.boosters + shield.cells; - const explosiveMj = rawMj / (shield.explosive.generator * shield.explosive.boosters) - rawMj; + const explosiveMj = rawMj / shield.explosive.total - rawMj; if (explosiveMj != 0) effectiveShieldExplosiveTt.push(
{translate('resistance') + ' ' + formats.int(explosiveMj)}{units.MJ}
); - const kineticMj = rawMj / (shield.kinetic.generator * shield.kinetic.boosters) - rawMj; + const kineticMj = rawMj / shield.kinetic.total - rawMj; if (kineticMj != 0) effectiveShieldKineticTt.push(
{translate('resistance') + ' ' + formats.int(kineticMj)}{units.MJ}
); - const thermalMj = rawMj / (shield.thermal.generator * shield.thermal.boosters) - rawMj; + const thermalMj = rawMj / shield.thermal.total - rawMj; if (thermalMj != 0) effectiveShieldThermalTt.push(
{translate('resistance') + ' ' + formats.int(thermalMj)}{units.MJ}
); // Add effective shield from power distributor SYS pips diff --git a/src/app/shipyard/Calculations.js b/src/app/shipyard/Calculations.js index ed3d321a..a159c4bf 100644 --- a/src/app/shipyard/Calculations.js +++ b/src/app/shipyard/Calculations.js @@ -397,11 +397,6 @@ export function shieldMetrics(ship, sys) { // res.kin = kinDim + overage; // boosterKinDmg = kinDim + overage; // } - // Apply diminishing returns - // boosterExplDmg = boosterExplDmg > 0.7 ? boosterExplDmg : 0.7 - (0.7 - boosterExplDmg) / 2; - // boosterKinDmg = boosterKinDmg > 0.7 ? boosterKinDmg : 0.7 - (0.7 - boosterKinDmg) / 2; - // boosterThermDmg = boosterThermDmg > 0.7 ? boosterThermDmg : 0.7 - (0.7 - boosterThermDmg) / 2; - // res.therm = res.therm > 0.7 ? res.therm : 0.7 - (0.7 - res.therm) / 2; let shieldAddition = 0; if (ship) { for (const module of ship.internal) { @@ -485,31 +480,37 @@ export function shieldMetrics(ship, sys) { max: 1 - maxSysResistance }; + let sgExplosiveDmg = 1 - shieldGenerator.getExplosiveResistance(); + let sgSbExplosiveDmg = diminishDamageMult(sgExplosiveDmg * 0.7, (1 - shieldGenerator.getExplosiveResistance()) * boosterExplDmg); shield.explosive = { - generator: 1 - shieldGenerator.getExplosiveResistance(), - boosters: boosterExplDmg, + generator: sgExplosiveDmg, + boosters: sgSbExplosiveDmg - sgExplosiveDmg, sys: (1 - sysResistance), - total: (1 - shieldGenerator.getExplosiveResistance()) * boosterExplDmg * (1 - sysResistance), - max: (1 - shieldGenerator.getExplosiveResistance()) * boosterExplDmg * (1 - maxSysResistance), - res: 1 - boosterExplDmg + total: sgSbExplosiveDmg * (1 - sysResistance), + max: sgSbExplosiveDmg * (1 - maxSysResistance), + res: 1 - sgSbExplosiveDmg }; + let sgKineticDmg = 1 - shieldGenerator.getKineticResistance(); + let sgSbKineticDmg = diminishDamageMult(sgKineticDmg * 0.7, (1 - shieldGenerator.getKineticResistance()) * boosterKinDmg); shield.kinetic = { - generator: 1 - shieldGenerator.getKineticResistance(), - boosters: boosterKinDmg, + generator: sgKineticDmg, + boosters: sgSbKineticDmg - sgKineticDmg, sys: (1 - sysResistance), - total: (1 - shieldGenerator.getKineticResistance()) * boosterKinDmg * (1 - sysResistance), - max: (1 - shieldGenerator.getKineticResistance()) * boosterKinDmg * (1 - maxSysResistance), - res: 1 - boosterKinDmg + total: sgSbKineticDmg * (1 - sysResistance), + max: sgSbKineticDmg * (1 - maxSysResistance), + res: 1 - sgSbKineticDmg }; + let sgThermalDmg = 1 - shieldGenerator.getThermalResistance(); + let sgSbThermalDmg = diminishDamageMult(sgThermalDmg * 0.7, (1 - shieldGenerator.getThermalResistance()) * boosterThermDmg); shield.thermal = { - generator: 1 - shieldGenerator.getThermalResistance(), - boosters: boosterThermDmg, + generator: sgThermalDmg, + boosters: sgSbThermalDmg - sgThermalDmg, sys: (1 - sysResistance), - total: (1 - shieldGenerator.getThermalResistance()) * boosterThermDmg * (1 - sysResistance), - max: (1 - shieldGenerator.getThermalResistance()) * boosterThermDmg * (1 - maxSysResistance), - res: 1 - boosterThermDmg + total: sgSbThermalDmg * (1 - sysResistance), + max: sgSbThermalDmg * (1 - maxSysResistance), + res: 1 - sgSbThermalDmg }; } return shield; @@ -959,3 +960,17 @@ export function timeToDeplete(amount, dps, eps, capacity, recharge) { } } } + +/** + * Applies diminishing returns to resistances. + * @param {number} baseDamageMult The base resistance up to which no diminishing returns are applied. + * @param {number} damageMult Resistance as damage multiplier + * @returns {number} Actual damage multiplier + */ +export function diminishDamageMult(diminishFrom, damageMult) { + if (damageMult > diminishFrom) { + return damageMult; + } else { + return (diminishFrom / 2) + 0.5 * damageMult; + } +}