From e180f96eab638078df17c1d6eb372152320b0267 Mon Sep 17 00:00:00 2001 From: willyb321 Date: Fri, 29 Jun 2018 10:16:55 +1000 Subject: [PATCH] hopefully much more accurate resistance calculation --- src/app/components/ShipSummaryTable.jsx | 28 ++++----- src/app/shipyard/Calculations.js | 77 +++++++++++++++++++++---- 2 files changed, 79 insertions(+), 26 deletions(-) diff --git a/src/app/components/ShipSummaryTable.jsx b/src/app/components/ShipSummaryTable.jsx index 600fc5d0..b8cb1cce 100644 --- a/src/app/components/ShipSummaryTable.jsx +++ b/src/app/components/ShipSummaryTable.jsx @@ -142,13 +142,13 @@ export default class ShipSummaryTable extends TranslatedComponent { {translate(shieldGenerator && shieldGenerator.m.grp || 'No Shield')} - {int(ship.shieldExplRes * 100) + '%'} - {int(ship.shieldKinRes * 100) + '%'} - {int(ship.shieldThermRes * 100) + '%'} - {int(sgMetrics && sgMetrics.generator ? sgMetrics.total / sgMetrics.absolute.total : 0)} - {int(sgMetrics && sgMetrics.generator ? sgMetrics.total / sgMetrics.explosive.total : 0)} - {int(sgMetrics && sgMetrics.generator ? sgMetrics.total / sgMetrics.kinetic.total : 0)} - {int(sgMetrics && sgMetrics.generator ? sgMetrics.total / sgMetrics.thermal.total : 0)} + {formats.pct1(ship.shieldExplRes)} + {formats.pct1(ship.shieldKinRes)} + {formats.pct1(ship.shieldThermRes)} + {int(ship && ship.shield > 0 ? ship.shield / sgMetrics.absolute.total : 0)}{u.MJ} + {int(ship && ship.shield > 0 ? ship.shield / sgMetrics.explosive.total : 0)}{u.MJ} + {int(ship && ship.shield > 0 ? ship.shield / sgMetrics.kinetic.total : 0)}{u.MJ} + {int(ship && ship.shield > 0 ? ship.shield / sgMetrics.thermal.total : 0)}{u.MJ} {sgMetrics && sgMetrics.recover ? formats.time(sgMetrics.recover) : 0} {sgMetrics && sgMetrics.recharge ? formats.time(sgMetrics.recharge) : 0} @@ -173,13 +173,13 @@ export default class ShipSummaryTable extends TranslatedComponent { {translate(ship && ship.bulkheads && ship.bulkheads.m && ship.bulkheads.m.name || 'No Armour')} - {int(ship.hullExplRes * 100) + '%'} - {int(ship.hullKinRes * 100) + '%'} - {int(ship.hullThermRes * 100) + '%'} - {int(armourMetrics.total / armourMetrics.absolute.total)} - {int(armourMetrics.total / armourMetrics.explosive.total)} - {int(armourMetrics.total / armourMetrics.kinetic.total)} - {int(armourMetrics.total / armourMetrics.thermal.total)} + {formats.pct1(ship.hullExplRes)} + {formats.pct1(ship.hullKinRes)} + {formats.pct1(ship.hullThermRes)} + {int(ship.armour / armourMetrics.absolute.total)} + {int(ship.armour / armourMetrics.explosive.total)} + {int(ship.armour / armourMetrics.kinetic.total)} + {int(ship.armour / armourMetrics.thermal.total)} {int(armourMetrics.modulearmour)} {int(armourMetrics.moduleprotection * 100) + '%'} diff --git a/src/app/shipyard/Calculations.js b/src/app/shipyard/Calculations.js index 6bf2621b..50bcc25a 100644 --- a/src/app/shipyard/Calculations.js +++ b/src/app/shipyard/Calculations.js @@ -330,35 +330,62 @@ export function shieldMetrics(ship, sys) { const maxSysResistance = this.sysResistance(4); let shield = {}; + const dimReturnLine = (res) => 1 - (1 - res) * 0.7; const shieldGeneratorSlot = ship.findInternalByGroup('sg'); if (shieldGeneratorSlot && shieldGeneratorSlot.enabled && shieldGeneratorSlot.m) { const shieldGenerator = shieldGeneratorSlot.m; - + let res = { + kin: shieldGenerator.kinres, + therm: shieldGenerator.thermres, + expl: shieldGenerator.explres + }; // Boosters let boost = 1; let boosterExplDmg = 1; let boosterKinDmg = 1; let boosterThermDmg = 1; + const explDim = dimReturnLine(shieldGenerator.explres); + const thermDim = dimReturnLine(shieldGenerator.thermres); + const kinDim = dimReturnLine(shieldGenerator.kinres); for (let slot of ship.hardpoints) { if (slot.enabled && slot.m && slot.m.grp == 'sb') { boost += slot.m.getShieldBoost(); + res.expl += slot.m.getExplosiveResistance(); + res.kin += slot.m.getKineticResistance(); + res.therm += slot.m.getThermalResistance(); boosterExplDmg = boosterExplDmg * (1 - slot.m.getExplosiveResistance()); boosterKinDmg = boosterKinDmg * (1 - slot.m.getKineticResistance()); boosterThermDmg = boosterThermDmg * (1 - slot.m.getThermalResistance()); } } - // Calculate diminishing returns for boosters // Diminishing returns not currently in-game // boost = Math.min(boost, (1 - Math.pow(Math.E, -0.7 * boost)) * 2.5); + // Remove base shield generator strength boost -= 1; + + if (res.expl > explDim) { + const overage = (res.expl - explDim) * 0.5; + boosterExplDmg = explDim + overage; + } + + if (res.therm > thermDim) { + const overage = (res.therm - thermDim) * 0.5; + boosterThermDmg = thermDim + overage; + } + + if (res.kin > kinDim) { + const overage = (res.kin - kinDim) * 0.5; + 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; + // 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; const generatorStrength = this.shieldStrength(ship.hullMass, ship.baseShieldStrength, shieldGenerator, 1); const boostersStrength = generatorStrength * boost; @@ -383,7 +410,7 @@ export function shieldMetrics(ship, sys) { const remainingShieldToRecover = shieldToRecover - capacitorLifetime * shieldGenerator.getBrokenRegenerationRate(); if (sys === 0) { // No system pips so will never recover shields - recover = Math.Inf; + recover = Math.Infinity; } else { // Recover remaining shields at the rate of the power distributor's recharge recover += remainingShieldToRecover / (sysRechargeRate / 0.6); @@ -487,19 +514,27 @@ export function armourMetrics(ship) { let moduleArmour = 0; let moduleProtection = 1; - + const bulkheads = ship.bulkheads.m; let hullExplDmg = 1; let hullKinDmg = 1; let hullThermDmg = 1; - + const dimReturnLine = (res) => 1 - (1 - res) * 0.7; + let res = { + kin: 0, + therm: 0, + expl: 0 + }; // Armour from HRPs and module armour from MRPs for (let slot of ship.internal) { if (slot.m && slot.m.grp == 'hr') { armourReinforcement += slot.m.getHullReinforcement(); // Hull boost for HRPs is applied against the ship's base armour armourReinforcement += ship.baseArmour * slot.m.getModValue('hullboost') / 10000; - + res.expl += slot.m.getExplosiveResistance(); + res.kin += slot.m.getKineticResistance(); + res.therm += slot.m.getThermalResistance(); hullExplDmg = hullExplDmg * (1 - slot.m.getExplosiveResistance()); + hullKinDmg = hullKinDmg * (1 - slot.m.getKineticResistance()); hullThermDmg = hullThermDmg * (1 - slot.m.getThermalResistance()); } @@ -510,10 +545,28 @@ export function armourMetrics(ship) { } moduleProtection = 1 - moduleProtection; + const explDim = dimReturnLine(bulkheads.explres); + const thermDim = dimReturnLine(bulkheads.thermres); + const kinDim = dimReturnLine(bulkheads.kinres); + if (res.expl > explDim) { + const overage = (res.expl - explDim) * 0.5; + hullExplDmg = explDim + overage; + } + + if (res.therm > thermDim) { + const overage = (res.therm - thermDim) * 0.5; + hullThermDmg = thermDim + overage; + } + + if (res.kin > kinDim) { + const overage = (res.kin - kinDim) * 0.5; + hullKinDmg = kinDim + overage; + } + // Apply diminishing returns - hullExplDmg = hullExplDmg > 0.7 ? hullExplDmg : 0.7 - (0.7 - hullExplDmg) / 2; - hullKinDmg = hullKinDmg > 0.7 ? hullKinDmg : 0.7 - (0.7 - hullKinDmg) / 2; - hullThermDmg = hullThermDmg > 0.7 ? hullThermDmg : 0.7 - (0.7 - hullThermDmg) / 2; + // hullExplDmg = hullExplDmg > 0.7 ? hullExplDmg : 0.7 - (0.7 - hullExplDmg) / 2; + // hullKinDmg = hullKinDmg > 0.7 ? hullKinDmg : 0.7 - (0.7 - hullKinDmg) / 2; + // hullThermDmg = hullThermDmg > 0.7 ? hullThermDmg : 0.7 - (0.7 - hullThermDmg) / 2; const armour = { bulkheads: armourBulkheads,