From 1307474755f876f99240f877767b09bb6f1188dc Mon Sep 17 00:00:00 2001 From: Felix Linker Date: Thu, 23 Aug 2018 18:08:50 +0200 Subject: [PATCH] Added tooltips to offence table summary --- src/app/components/Offence.jsx | 144 ++++++++++++++++++++------------- 1 file changed, 89 insertions(+), 55 deletions(-) diff --git a/src/app/components/Offence.jsx b/src/app/components/Offence.jsx index 737303d0..68d8186c 100644 --- a/src/app/components/Offence.jsx +++ b/src/app/components/Offence.jsx @@ -42,6 +42,63 @@ export function weaponComparator(translate, propComparator, desc) { }; } +/** + * Creates a tooltip that shows damage by type. + * @param {function} translate Translation function + * @param {Object} formats Object that holds format functions + * @param {Object} sdpsObject Object that holds sdps split up by type + * @returns {Array} Tooltip + */ +function getSDpsTooltip(translate, formats, sdpsObject) { + return Object.keys(sdpsObject).filter(key => sdpsObject[key]) + .map(key => { + return ( +
+ {translate(key) + ' ' + formats.f1(sdpsObject[key])} +
+ ); + }); +} + +/** + * Returns a data object used by {@link PieChart} that shows damage by type. + * @param {function} translate Translation function + * @param {Object} sdpsObject Object that holds sdps split up by type + * @returns {Object} Data object + */ +function getSDpsData(translate, sdpsObject) { + return Object.keys(sdpsObject).map(key => { + return { + value: Math.round(sdpsObject[key]), + label: translate(key) + }; + }); +} + +/** + * Adds all damage of `add` onto `addOn`. + * @param {Object} addOn Object that holds sdps split up by type (will be mutated) + * @param {Object} add Object that holds sdps split up by type + */ +function addSDps(addOn, add) { + Object.keys(addOn).map(k => addOn[k] += (add[k] ? add[k] : 0)); +} + +/** + * Calculates the overall sdps of an sdps object. + * @param {Object} sdpsObject Object that holds sdps spluit up by type + */ +function sumSDps(sdpsObject) { + if (sdpsObject.total) { + return sdpsObject.total; + } + + return Object.keys(sdpsObject).reduce( + (acc, k) => acc + (sdpsObject[k] ? sdpsObject[k] : 0), + 0 + ); +} + /** * Offence information * Offence information consists of four panels: @@ -144,59 +201,36 @@ export default class Offence extends TranslatedComponent { const timeToDrain = Calc.timeToDrainWep(ship, wep); - let absoluteShieldsSDps = 0; - let explosiveShieldsSDps = 0; - let kineticShieldsSDps = 0; - let thermalShieldsSDps = 0; - let absoluteArmourSDps = 0; - let explosiveArmourSDps = 0; - let kineticArmourSDps = 0; - let thermalArmourSDps = 0; let totalSEps = 0; - let totalSDps = 0; + let totalSDpsObject = {'absolute': 0, 'explosive': 0, 'kinetic': 0, 'thermal': 0}; + let shieldsSDpsObject = {'absolute': 0, 'explosive': 0, 'kinetic': 0, 'thermal': 0}; + let armourSDpsObject = {'absolute': 0, 'explosive': 0, 'kinetic': 0, 'thermal': 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; - kineticShieldsSDps += weapon.sdps.shields.kinetic; - thermalShieldsSDps += weapon.sdps.shields.thermal; - absoluteArmourSDps += weapon.sdps.armour.absolute; - explosiveArmourSDps += weapon.sdps.armour.explosive; - kineticArmourSDps += weapon.sdps.armour.kinetic; - thermalArmourSDps += weapon.sdps.armour.thermal; + addSDps(totalSDpsObject, weapon.sdps.base); + addSDps(shieldsSDpsObject, weapon.sdps.shields); + addSDps(armourSDpsObject, weapon.sdps.armour); + + const baseSDpsTooltipDetails = getSDpsTooltip(translate, formats, weapon.sdps.base); const effectivenessShieldsTooltipDetails = []; effectivenessShieldsTooltipDetails.push(
{translate('range') + ' ' + formats.pct1(weapon.effectiveness.shields.range)}
); 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)}
); - if (weapon.sdps.shields.kinetic) effectiveShieldsSDpsTooltipDetails.push(
{translate('kinetic') + ' ' + formats.f1(weapon.sdps.shields.kinetic)}
); - if (weapon.sdps.shields.thermal) effectiveShieldsSDpsTooltipDetails.push(
{translate('thermal') + ' ' + formats.f1(weapon.sdps.shields.thermal)}
); + const effectiveShieldsSDpsTooltipDetails = getSDpsTooltip(translate, formats, weapon.sdps.armour); const effectivenessArmourTooltipDetails = []; effectivenessArmourTooltipDetails.push(
{translate('range') + ' ' + formats.pct1(weapon.effectiveness.armour.range)}
); effectivenessArmourTooltipDetails.push(
{translate('resistance') + ' ' + formats.pct1(weapon.effectiveness.armour.resistance)}
); effectivenessArmourTooltipDetails.push(
{translate('hardness') + ' ' + formats.pct1(weapon.effectiveness.armour.hardness)}
); - const effectiveArmourSDpsTooltipDetails = []; - if (weapon.sdps.armour.absolute) effectiveArmourSDpsTooltipDetails.push(
{translate('absolute') + ' ' + formats.f1(weapon.sdps.armour.absolute)}
); - if (weapon.sdps.armour.explosive) effectiveArmourSDpsTooltipDetails.push(
{translate('explosive') + ' ' + formats.f1(weapon.sdps.armour.explosive)}
); - if (weapon.sdps.armour.kinetic) effectiveArmourSDpsTooltipDetails.push(
{translate('kinetic') + ' ' + formats.f1(weapon.sdps.armour.kinetic)}
); - if (weapon.sdps.armour.thermal) effectiveArmourSDpsTooltipDetails.push(
{translate('thermal') + ' ' + formats.f1(weapon.sdps.armour.thermal)}
); + + const effectiveArmourSDpsTooltipDetails = getSDpsTooltip(translate, formats, weapon.sdps.armour); rows.push( @@ -215,20 +249,16 @@ export default class Offence extends TranslatedComponent { ); } - const totalShieldsSDps = absoluteShieldsSDps + explosiveShieldsSDps + kineticShieldsSDps + thermalShieldsSDps; - const totalArmourSDps = absoluteArmourSDps + explosiveArmourSDps + kineticArmourSDps + thermalArmourSDps; + const totalSDps = sumSDps(totalSDpsObject); + const totalSDpsTooltipDetails = getSDpsTooltip(translate, formats, totalSDpsObject); - const shieldsSDpsData = []; - shieldsSDpsData.push({ value: Math.round(absoluteShieldsSDps), label: translate('absolute') }); - shieldsSDpsData.push({ value: Math.round(explosiveShieldsSDps), label: translate('explosive') }); - shieldsSDpsData.push({ value: Math.round(kineticShieldsSDps), label: translate('kinetic') }); - shieldsSDpsData.push({ value: Math.round(thermalShieldsSDps), label: translate('thermal') }); + const totalShieldsSDps = sumSDps(shieldsSDpsObject); + const totalShieldsSDpsTooltipDetails = getSDpsTooltip(translate, formats, shieldsSDpsObject); + const shieldsSDpsData = getSDpsData(translate, shieldsSDpsObject); - const armourSDpsData = []; - armourSDpsData.push({ value: Math.round(absoluteArmourSDps), label: translate('absolute') }); - armourSDpsData.push({ value: Math.round(explosiveArmourSDps), label: translate('explosive') }); - armourSDpsData.push({ value: Math.round(kineticArmourSDps), label: translate('kinetic') }); - armourSDpsData.push({ value: Math.round(thermalArmourSDps), label: translate('thermal') }); + const totalArmourSDps = sumSDps(armourSDpsObject); + const totalArmourSDpsTooltipDetails = getSDpsTooltip(translate, formats, armourSDpsObject); + const armourSDpsData = getSDpsData(translate, armourSDpsObject); const timeToDepleteShields = Calc.timeToDeplete(opponentShields.total, totalShieldsSDps, totalSEps, pd.getWeaponsCapacity(), pd.getWeaponsRechargeRate() * (wep / 4)); const timeToDepleteArmour = Calc.timeToDeplete(opponentArmour.total, totalArmourSDps, totalSEps, pd.getWeaponsCapacity(), pd.getWeaponsRechargeRate() * (wep / 4)); @@ -252,15 +282,19 @@ export default class Offence extends TranslatedComponent { {'eft'} - - {rows} - - ={formats.f1(totalSDps)} - ={formats.f1(totalShieldsSDps)} - - ={formats.f1(totalArmourSDps)} - - + + {rows} + {rows.length > 0 && + + + ={formats.f1(totalSDps)} + ={formats.f1(totalShieldsSDps)} + + ={formats.f1(totalArmourSDps)} + + + } +