diff --git a/src/app/components/Offence.jsx b/src/app/components/Offence.jsx
index 0898a57f..737303d0 100644
--- a/src/app/components/Offence.jsx
+++ b/src/app/components/Offence.jsx
@@ -154,11 +154,13 @@ export default class Offence extends TranslatedComponent {
let thermalArmourSDps = 0;
let totalSEps = 0;
+ let totalSDps = 0;
const rows = [];
for (let i = 0; i < damage.length; i++) {
const weapon = damage[i];
+ totalSDps += weapon.sdps.base.total;
totalSEps += weapon.seps;
absoluteShieldsSDps += weapon.sdps.shields.absolute;
explosiveShieldsSDps += weapon.sdps.shields.explosive;
@@ -174,6 +176,12 @@ export default class Offence extends TranslatedComponent {
effectivenessShieldsTooltipDetails.push(
{translate('resistance') + ' ' + formats.pct1(weapon.effectiveness.shields.resistance)}
);
effectivenessShieldsTooltipDetails.push({translate('power distributor') + ' ' + formats.pct1(weapon.effectiveness.shields.sys)}
);
+ const baseSDpsTooltipDetails = [];
+ if (weapon.sdps.shields.absolute) baseSDpsTooltipDetails.push({translate('absolute') + ' ' + formats.f1(weapon.sdps.base.absolute)}
);
+ if (weapon.sdps.shields.explosive) baseSDpsTooltipDetails.push({translate('explosive') + ' ' + formats.f1(weapon.sdps.base.explosive)}
);
+ if (weapon.sdps.shields.kinetic) baseSDpsTooltipDetails.push({translate('kinetic') + ' ' + formats.f1(weapon.sdps.base.kinetic)}
);
+ if (weapon.sdps.shields.thermal) baseSDpsTooltipDetails.push({translate('thermal') + ' ' + formats.f1(weapon.sdps.base.thermal)}
);
+
const effectiveShieldsSDpsTooltipDetails = [];
if (weapon.sdps.shields.absolute) effectiveShieldsSDpsTooltipDetails.push({translate('absolute') + ' ' + formats.f1(weapon.sdps.shields.absolute)}
);
if (weapon.sdps.shields.explosive) effectiveShieldsSDpsTooltipDetails.push({translate('explosive') + ' ' + formats.f1(weapon.sdps.shields.explosive)}
);
@@ -199,6 +207,7 @@ export default class Offence extends TranslatedComponent {
{weapon.classRating} {translate(weapon.name)}
{weapon.engineering ? ' (' + weapon.engineering + ')' : null }
+ {formats.f1(weapon.sdps.base.total)} |
{formats.f1(weapon.sdps.shields.total)} |
{formats.pct1(weapon.effectiveness.shields.total)} |
{formats.f1(weapon.sdps.armour.total)} |
@@ -231,10 +240,12 @@ export default class Offence extends TranslatedComponent {
| {translate('weapon')} |
+ {translate('overall')} |
{translate('opponent\'s shields')} |
{translate('opponent\'s armour')} |
+ | {'sdps'} |
{'sdps'} |
{'eft'} |
{'sdps'} |
@@ -243,6 +254,12 @@ export default class Offence extends TranslatedComponent {
{rows}
+ |
+ ={formats.f1(totalSDps)} |
+ ={formats.f1(totalShieldsSDps)} |
+ |
+ ={formats.f1(totalArmourSDps)} |
+ |
diff --git a/src/app/shipyard/Calculations.js b/src/app/shipyard/Calculations.js
index c330243b..d4912f34 100644
--- a/src/app/shipyard/Calculations.js
+++ b/src/app/shipyard/Calculations.js
@@ -484,7 +484,7 @@ export function shieldMetrics(ship, sys) {
let sgSbExplosiveDmg = diminishDamageMult(sgExplosiveDmg * 0.7, (1 - shieldGenerator.getExplosiveResistance()) * boosterExplDmg);
shield.explosive = {
generator: sgExplosiveDmg,
- boosters: sgSbExplosiveDmg - sgExplosiveDmg,
+ boosters: sgSbExplosiveDmg / sgExplosiveDmg,
sys: (1 - sysResistance),
total: sgSbExplosiveDmg * (1 - sysResistance),
max: sgSbExplosiveDmg * (1 - maxSysResistance),
@@ -495,7 +495,7 @@ export function shieldMetrics(ship, sys) {
let sgSbKineticDmg = diminishDamageMult(sgKineticDmg * 0.7, (1 - shieldGenerator.getKineticResistance()) * boosterKinDmg);
shield.kinetic = {
generator: sgKineticDmg,
- boosters: sgSbKineticDmg - sgKineticDmg,
+ boosters: sgSbKineticDmg / sgKineticDmg,
sys: (1 - sysResistance),
total: sgSbKineticDmg * (1 - sysResistance),
max: sgSbKineticDmg * (1 - maxSysResistance),
@@ -506,7 +506,7 @@ export function shieldMetrics(ship, sys) {
let sgSbThermalDmg = diminishDamageMult(sgThermalDmg * 0.7, (1 - shieldGenerator.getThermalResistance()) * boosterThermDmg);
shield.thermal = {
generator: sgThermalDmg,
- boosters: sgSbThermalDmg - sgThermalDmg,
+ boosters: sgSbThermalDmg / sgThermalDmg,
sys: (1 - sysResistance),
total: sgSbThermalDmg * (1 - sysResistance),
max: sgSbThermalDmg * (1 - maxSysResistance),
@@ -612,7 +612,7 @@ export function armourMetrics(ship) {
let armourReinforcedExplDmg = diminishDamageMult(0.7, (1 - ship.bulkheads.m.getExplosiveResistance()) * hullExplDmg);
armour.explosive = {
bulkheads: armourExplDmg,
- reinforcement: armourReinforcedExplDmg - armourExplDmg,
+ reinforcement: armourReinforcedExplDmg / armourExplDmg,
total: armourReinforcedExplDmg,
res: 1 - armourReinforcedExplDmg
};
@@ -621,7 +621,7 @@ export function armourMetrics(ship) {
let armourReinforcedKinDmg = diminishDamageMult(0.7, (1 - ship.bulkheads.m.getKineticResistance()) * hullKinDmg);
armour.kinetic = {
bulkheads: armourKinDmg,
- reinforcement: armourReinforcedKinDmg - armourKinDmg,
+ reinforcement: armourReinforcedKinDmg / armourKinDmg,
total: armourReinforcedKinDmg,
res: 1 - armourReinforcedKinDmg
};
@@ -630,7 +630,7 @@ export function armourMetrics(ship) {
let armourReinforcedThermDmg = diminishDamageMult(0.7, (1 - ship.bulkheads.m.getThermalResistance()) * hullThermDmg);
armour.thermal = {
bulkheads: armourThermDmg,
- reinforcement: armourReinforcedThermDmg - armourThermDmg,
+ reinforcement: armourReinforcedThermDmg / armourThermDmg,
total: armourReinforcedThermDmg,
res: 1 - armourReinforcedThermDmg
};
@@ -819,6 +819,13 @@ export function _weaponSustainedDps(m, opponent, opponentShields, opponentArmour
const weapon = {
eps: 0,
damage: {
+ base: {
+ absolute: 0,
+ explosive: 0,
+ kinetic: 0,
+ thermal: 0,
+ total: 0,
+ },
shields: {
absolute: 0,
explosive: 0,
@@ -863,6 +870,12 @@ export function _weaponSustainedDps(m, opponent, opponentShields, opponentArmour
sDps *= dropoff;
}
+ weapon.damage.base.absolute = sDps * m.getDamageDist().A;
+ weapon.damage.base.explosive = sDps * m.getDamageDist().E;
+ weapon.damage.base.kinetic = sDps * m.getDamageDist().K;
+ weapon.damage.base.thermal = sDps * m.getDamageDist().T;
+ weapon.damage.base.total = sDps;
+
// Piercing/hardness modifier (for armour only)
const armourMultiple = m.getPiercing() >= opponent.hardness ? 1 : m.getPiercing() / opponent.hardness;
weapon.effectiveness.armour.hardness = armourMultiple;