diff --git a/src/app/components/Defence.jsx b/src/app/components/Defence.jsx index 0528c192..3419801f 100644 --- a/src/app/components/Defence.jsx +++ b/src/app/components/Defence.jsx @@ -160,18 +160,21 @@ export default class Defence extends TranslatedComponent { const effectiveArmourExplosiveTt = []; const effectiveArmourKineticTt = []; const effectiveArmourThermalTt = []; + const effectiveArmourCausticTt = []; if (armour.bulkheads > 0) { armourSourcesTt.push(
{translate('bulkheads') + ' ' + formats.int(armour.bulkheads)}
); effectiveArmourAbsoluteTt.push(
{translate('bulkheads') + ' ' + formats.int(armour.bulkheads)}
); effectiveArmourExplosiveTt.push(
{translate('bulkheads') + ' ' + formats.int(armour.bulkheads)}
); effectiveArmourKineticTt.push(
{translate('bulkheads') + ' ' + formats.int(armour.bulkheads)}
); effectiveArmourThermalTt.push(
{translate('bulkheads') + ' ' + formats.int(armour.bulkheads)}
); + effectiveArmourCausticTt.push(
{translate('bulkheads') + ' ' + formats.int(armour.bulkheads)}
); if (armour.reinforcement > 0) { armourSourcesTt.push(
{translate('reinforcement') + ' ' + formats.int(armour.reinforcement)}
); effectiveArmourAbsoluteTt.push(
{translate('reinforcement') + ' ' + formats.int(armour.reinforcement)}
); effectiveArmourExplosiveTt.push(
{translate('reinforcement') + ' ' + formats.int(armour.reinforcement)}
); effectiveArmourKineticTt.push(
{translate('reinforcement') + ' ' + formats.int(armour.reinforcement)}
); effectiveArmourThermalTt.push(
{translate('reinforcement') + ' ' + formats.int(armour.reinforcement)}
); + effectiveArmourCausticTt.push(
{translate('reinforcement') + ' ' + formats.int(armour.reinforcement)}
); } } @@ -196,6 +199,11 @@ export default class Defence extends TranslatedComponent { armourDamageTakenThermalTt.push(
{translate('reinforcement') + ' ' + formats.pct1(armour.thermal.reinforcement)}
); if (armour.thermal.total != 1) effectiveArmourThermalTt.push(
{translate('resistance') + ' ' + formats.int(rawArmour / armour.thermal.total - rawArmour)}
); + const armourDamageTakenCausticTt = []; + armourDamageTakenCausticTt.push(
{translate('bulkheads') + ' ' + formats.pct1(armour.caustic.bulkheads)}
); + armourDamageTakenCausticTt.push(
{translate('reinforcement') + ' ' + formats.pct1(armour.caustic.reinforcement)}
); + if (armour.thermal.total != 1) effectiveArmourCausticTt.push(
{translate('resistance') + ' ' + formats.int(rawArmour / armour.caustic.total - rawArmour)}
); + const effectiveArmourData = []; const effectiveAbsoluteArmour = armour.total / armour.absolute.total; effectiveArmourData.push({ value: Math.round(effectiveAbsoluteArmour), label: translate('absolute'), tooltip: effectiveArmourAbsoluteTt }); @@ -205,12 +213,15 @@ export default class Defence extends TranslatedComponent { effectiveArmourData.push({ value: Math.round(effectiveKineticArmour), label: translate('kinetic'), tooltip: effectiveArmourKineticTt }); const effectiveThermalArmour = armour.total / armour.thermal.total; effectiveArmourData.push({ value: Math.round(effectiveThermalArmour), label: translate('thermal'), tooltip: effectiveArmourThermalTt }); + const effectiveCausticArmour = armour.total / armour.caustic.total; + effectiveArmourData.push({ value: Math.round(effectiveCausticArmour), label: translate('caustic'), tooltip: effectiveArmourCausticTt }); const armourDamageTakenData = []; armourDamageTakenData.push({ value: Math.round(armour.absolute.total * 100), label: translate('absolute'), tooltip: armourDamageTakenTt }); armourDamageTakenData.push({ value: Math.round(armour.explosive.total * 100), label: translate('explosive'), tooltip: armourDamageTakenExplosiveTt }); armourDamageTakenData.push({ value: Math.round(armour.kinetic.total * 100), label: translate('kinetic'), tooltip: armourDamageTakenKineticTt }); armourDamageTakenData.push({ value: Math.round(armour.thermal.total * 100), label: translate('thermal'), tooltip: armourDamageTakenThermalTt }); + armourDamageTakenData.push({ value: Math.round(armour.caustic.total * 100), label: translate('caustic'), tooltip: armourDamageTakenCausticTt }); return ( diff --git a/src/app/components/InternalSlot.jsx b/src/app/components/InternalSlot.jsx index 38f1011f..2460830b 100644 --- a/src/app/components/InternalSlot.jsx +++ b/src/app/components/InternalSlot.jsx @@ -85,6 +85,7 @@ export default class InternalSlot extends Slot { { showModuleResistances && m.getExplosiveResistance() ?
{translate('explres')}: {formats.pct(m.getExplosiveResistance())}
: null } { showModuleResistances && m.getKineticResistance() ?
{translate('kinres')}: {formats.pct(m.getKineticResistance())}
: null } { showModuleResistances && m.getThermalResistance() ?
{translate('thermres')}: {formats.pct(m.getThermalResistance())}
: null } + { showModuleResistances && m.getCausticResistance() ?
{translate('causres')}: {formats.pct(m.getCausticResistance())}
: null } { m.getHullReinforcement() ?
{translate('armour')}: {formats.int(m.getHullReinforcement() + ship.baseArmour * m.getModValue('hullboost') / 10000)}
: null } { m.getProtection() ?
{translate('protection')}: {formats.rPct(m.getProtection())}
: null } { m.getIntegrity() ?
{translate('integrity')}: {formats.int(m.getIntegrity())}
: null } diff --git a/src/app/components/ShipSummaryTable.jsx b/src/app/components/ShipSummaryTable.jsx index 7bf07146..82ff1032 100644 --- a/src/app/components/ShipSummaryTable.jsx +++ b/src/app/components/ShipSummaryTable.jsx @@ -63,80 +63,88 @@ export default class ShipSummaryTable extends TranslatedComponent { shieldColour }; return
- - - - - - - - - - - - {/* */} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {/* */} - - - - - - - - - - - - -
{translate('speed')}{translate('boost')}{translate('jump range')}{translate('shield')}{translate('integrity')}{translate('DPS')}{translate('EPS')}{translate('TTD')}{translate('HPS')}{translate('cargo')}{translate('pax')}{translate('fuel')}{translate('mass')}{translate('hrd')}{translate('crew')}{translate('MLF')}{translate('boost time')}
{translate('max')}{translate('unladen')}{translate('laden')}{translate('total unladen')}{translate('total laden')}{translate('hull')}{translate('unladen')}{translate('laden')}
{ canThrust ? {int(ship.calcSpeed(4, ship.fuelCapacity, 0, false))}{u['m/s']} : 0 }{ canBoost ? {int(ship.calcSpeed(4, ship.fuelCapacity, 0, true))}{u['m/s']} : 0 }{f2(Calc.jumpRange(ship.unladenMass + ship.standard[2].m.getMaxFuelPerJump(), ship.standard[2].m, ship.standard[2].m.getMaxFuelPerJump(), ship))}{u.LY}{f2(Calc.jumpRange(ship.unladenMass + ship.fuelCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY}{f2(Calc.jumpRange(ship.unladenMass + ship.fuelCapacity + ship.cargoCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY}{f2(Calc.totalJumpRange(ship.unladenMass + ship.fuelCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY}{f2(Calc.totalJumpRange(ship.unladenMass + ship.fuelCapacity + ship.cargoCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY}{int(ship.shield)}{u.MJ}{int(ship.armour)}{f1(ship.totalDps)}{f1(ship.totalEps)}{timeToDrain === Infinity ? '∞' : time(timeToDrain)}{f1(ship.totalHps)}{round(ship.cargoCapacity)}{u.T}{ship.passengerCapacity}{round(ship.fuelCapacity)}{u.T}{ship.hullMass}{u.T}{int(ship.unladenMass)}{u.T}{int(ship.ladenMass)}{u.T}{int(ship.hardness)}{ship.crew}{ship.masslock}{shipBoost !== 'No Boost' ? formats.time(shipBoost) : 'No Boost'}
- +
+
+ + + + + + + + + + + {/* */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {/* */} + + + + + + + + + + + + +
{translate('speed')}{translate('boost')}{translate('jump range')}{translate('shield')}{translate('integrity')}{translate('DPS')}{translate('EPS')}{translate('TTD')}{translate('HPS')}{translate('cargo')}{translate('pax')}{translate('fuel')}{translate('mass')}{translate('hrd')}{translate('crew')}{translate('MLF')}{translate('boost time')}
{translate('max')}{translate('unladen')}{translate('laden')}{translate('total unladen')}{translate('total laden')}{translate('hull')}{translate('unladen')}{translate('laden')}
{ canThrust ? {int(ship.calcSpeed(4, ship.fuelCapacity, 0, false))}{u['m/s']} : 0 }{ canBoost ? {int(ship.calcSpeed(4, ship.fuelCapacity, 0, true))}{u['m/s']} : 0 }{f2(Calc.jumpRange(ship.unladenMass + ship.standard[2].m.getMaxFuelPerJump(), ship.standard[2].m, ship.standard[2].m.getMaxFuelPerJump(), ship))}{u.LY}{f2(Calc.jumpRange(ship.unladenMass + ship.fuelCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY}{f2(Calc.jumpRange(ship.unladenMass + ship.fuelCapacity + ship.cargoCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY}{f2(Calc.totalJumpRange(ship.unladenMass + ship.fuelCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY}{f2(Calc.totalJumpRange(ship.unladenMass + ship.fuelCapacity + ship.cargoCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY}{int(ship.shield)}{u.MJ}{int(ship.armour)}{f1(ship.totalDps)}{f1(ship.totalEps)}{timeToDrain === Infinity ? '∞' : time(timeToDrain)}{f1(ship.totalHps)}{round(ship.cargoCapacity)}{u.T}{ship.passengerCapacity}{round(ship.fuelCapacity)}{u.T}{ship.hullMass}{u.T}{int(ship.unladenMass)}{u.T}{int(ship.ladenMass)}{u.T}{int(ship.hardness)}{ship.crew}{ship.masslock}{shipBoost !== 'No Boost' ? formats.time(shipBoost) : 'No Boost'}
+ - - - - + + - - - - - - + + + + + + + + + + + + + + + @@ -145,29 +153,37 @@ export default class ShipSummaryTable extends TranslatedComponent { + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -176,16 +192,19 @@ export default class ShipSummaryTable extends TranslatedComponent { + +
{translate('shield')}{translate('explres')}{translate('kinres')}{translate('thermres')}{translate('shield')}{translate('resistance')}{`${translate('absolute')} ${translate('HP')}`}{`${translate('explosive')} ${translate('HP')}`}{`${translate('kinetic')} ${translate('HP')}`}{`${translate('thermal')} ${translate('HP')}`}{translate('recovery')}{translate('recharge')}{`${translate('HP')}`}{translate('recovery')}{translate('recharge')}
{`${translate('explosive')}`}{`${translate('kinetic')}`}{`${translate('thermal')}`}{`${translate('absolute')}`}{`${translate('explosive')}`}{`${translate('kinetic')}`}{`${translate('explosive')}`}
{formats.pct1(ship.shieldExplRes)} {formats.pct1(ship.shieldKinRes)} {formats.pct1(ship.shieldThermRes)}{int(ship && ship.shield > 0 ? ship.shield : 0)}{u.MJ} {int(ship && ship.shield > 0 ? ship.shield * ((1 / (1 - (ship.shieldExplRes)))) : 0)}{u.MJ} {int(ship && ship.shield > 0 ? ship.shield * ((1 / (1 - (ship.shieldKinRes)))) : 0)}{u.MJ} {int(ship && ship.shield > 0 ? ship.shield * ((1 / (1 - (ship.shieldThermRes)))) : 0)}{u.MJ} {sgMetrics && sgMetrics.recover === Math.Inf ? translate('Never') : formats.time(sgMetrics.recover)} {sgMetrics && sgMetrics.recharge === Math.Inf ? translate('Never') : formats.time(sgMetrics.recharge)}
{translate('armour')}{translate('explres')}{translate('kinres')}{translate('thermres')}{`${translate('absolute')} ${translate('HP')}`}{`${translate('explosive')} ${translate('HP')}`}{`${translate('kinetic')} ${translate('HP')}`}{`${translate('thermal')} ${translate('HP')}`}{translate('raw module armour')}{translate('internal protection')}{translate('armour')}{translate('resistance')}{`${translate('HP')}`}{translate('raw module armour')}{translate('internal protection')}
{`${translate('explosive')}`}{`${translate('kinetic')}`}{`${translate('thermal')}`}{`${translate('caustic')}`}{`${translate('absolute')}`}{`${translate('explosive')}`}{`${translate('kinetic')}`}{`${translate('thermal')}`}{`${translate('caustic')}`}
{formats.pct1(ship.hullExplRes)} {formats.pct1(ship.hullKinRes)} {formats.pct1(ship.hullThermRes)}{formats.pct1(ship.hullCausRes)} {int(ship.armour)} {int(ship.armour * ((1 / (1 - (ship.hullExplRes)))))} {int(ship.armour * ((1 / (1 - (ship.hullKinRes)))))} {int(ship.armour * ((1 / (1 - (ship.hullThermRes)))))}{int(ship.armour * ((1 / (1 - (ship.hullCausRes)))))} {int(armourMetrics.modulearmour)} {int(armourMetrics.moduleprotection * 100) + '%'}
+
; } diff --git a/src/app/i18n/en.json b/src/app/i18n/en.json index 83f11835..f35f444c 100644 --- a/src/app/i18n/en.json +++ b/src/app/i18n/en.json @@ -85,6 +85,7 @@ "bl": "Beam Laser", "bsg": "Bi-Weave Shield Generator", "c": "Cannon", + "causres": "Caustic resistance", "cc": "Collector Limpet Controller", "ch": "Chaff Launcher", "cr": "Cargo Rack", @@ -266,6 +267,7 @@ "explosive": "Explosive", "kinetic": "Kinetic", "thermal": "Thermal", + "caustic": "Caustic", "generator": "Generator", "boosters": "Boosters", "cells": "Cells", diff --git a/src/app/shipyard/Calculations.js b/src/app/shipyard/Calculations.js index cf66dfee..109d466e 100644 --- a/src/app/shipyard/Calculations.js +++ b/src/app/shipyard/Calculations.js @@ -564,6 +564,7 @@ export function armourMetrics(ship) { let hullExplDmg = 1; let hullKinDmg = 1; let hullThermDmg = 1; + let hullCausDmg = 1; // const dimReturnLine = (res) => 1 - (1 - res) * 0.7; // let res = { // kin: 0, @@ -582,6 +583,7 @@ export function armourMetrics(ship) { hullExplDmg = hullExplDmg * (1 - slot.m.getExplosiveResistance()); hullKinDmg = hullKinDmg * (1 - slot.m.getKineticResistance()); hullThermDmg = hullThermDmg * (1 - slot.m.getThermalResistance()); + hullCausDmg = hullCausDmg * (1 - slot.m.getCausticResistance()); } if (slot.m && slot.m.grp == 'mrp') { moduleArmour += slot.m.getIntegrity(); @@ -653,6 +655,15 @@ export function armourMetrics(ship) { total: armourReinforcedThermDmg, res: 1 - armourReinforcedThermDmg }; + + let armourCausDmg = diminishDamageMult(0.7, 1 - ship.bulkheads.m.getCausticResistance()); + let armourReinforcedCausDmg = diminishDamageMult(0.7, (1 - ship.bulkheads.m.getCausticResistance()) * hullCausDmg); + armour.caustic = { + bulkeads: armourCausDmg, + reinforcement: armourReinforcedCausDmg / armourCausDmg, + total: armourReinforcedCausDmg, + res: 1 - armourReinforcedCausDmg, + }; return armour; } diff --git a/src/app/shipyard/Module.js b/src/app/shipyard/Module.js index 350d0374..a8e5c3cd 100755 --- a/src/app/shipyard/Module.js +++ b/src/app/shipyard/Module.js @@ -48,7 +48,7 @@ export default class Module { // this special effect modifies our returned value const modification = Modifications.modifications[name]; const multiplier = modification.type === 'percentage' ? 10000 : 100; - if (name === 'explres' || name === 'kinres' || name === 'thermres') { + if (name === 'explres' || name === 'kinres' || name === 'thermres' || name === 'causres') { // Resistance modifications in itself are additive, however their // special effects are multiplicative. They affect the overall result // by (special effect resistance) * (damage mult after modification), @@ -293,6 +293,10 @@ export default class Module { return this._getModifiedValue('explres'); } + getCausticResistance() { + return this._getModifiedValue('causres'); + } + /** * Get the regeneration rate for this module, taking in to account modifications * @return {Number} the regeneration rate of this module diff --git a/src/app/shipyard/Ship.js b/src/app/shipyard/Ship.js index df219a83..19bfdf64 100755 --- a/src/app/shipyard/Ship.js +++ b/src/app/shipyard/Ship.js @@ -1295,6 +1295,7 @@ export default class Ship { this.hullExplRes = 1 - metrics.explosive.total; this.hullKinRes = 1 - metrics.kinetic.total; this.hullThermRes = 1 - metrics.thermal.total; + this.hullCausRes = 1 - metrics.caustic.total; return this; } diff --git a/src/less/outfit.less b/src/less/outfit.less index 8455feab..0ec6db88 100755 --- a/src/less/outfit.less +++ b/src/less/outfit.less @@ -93,6 +93,9 @@ color: @primary-bg; } + & thead th.bordered { + border-left: 1px solid @primary-bg; + } } }