Provide damage dealt statistics for both shields and hull

This commit is contained in:
Cmdr McDonald
2017-01-25 10:11:24 +00:00
parent baf6f8130a
commit e364560ca7
2 changed files with 54 additions and 25 deletions

View File

@@ -3,6 +3,7 @@
* Make absolute damage visible * Make absolute damage visible
* Add 'average' roll for blueprints * Add 'average' roll for blueprints
* Update spacing for movement summary * Update spacing for movement summary
* Provide damage dealt statistics for both shields and hull
#2.2.10 #2.2.10
* Fix detailed export of module reinforcement packages * Fix detailed export of module reinforcement packages

View File

@@ -108,9 +108,12 @@ export default class DamageDealt extends TranslatedComponent {
// Track totals // Track totals
let totals = {}; let totals = {};
totals.effectiveness = 0; totals.effectivenessShields = 0;
totals.effectiveDps = 0; totals.effectiveDpsShields = 0;
totals.effectiveSDps = 0; totals.effectiveSDpsShields = 0;
totals.effectivenessHull = 0;
totals.effectiveDpsHull = 0;
totals.effectiveSDpsHull = 0;
let totalDps = 0; let totalDps = 0;
let weapons = []; let weapons = [];
@@ -134,24 +137,33 @@ export default class DamageDealt extends TranslatedComponent {
} }
} }
const classRating = `${m.class}${m.rating}${m.missile ? '/' + m.missile : ''}`; const classRating = `${m.class}${m.rating}${m.missile ? '/' + m.missile : ''}`;
const effectiveness = (m.getPiercing() >= against.properties.hardness ? 1 : m.getPiercing() / against.properties.hardness) * dropoff; const effectivenessShields = dropoff;
const effectiveDps = m.getDps() * effectiveness * dropoff; const effectiveDpsShields = m.getDps() * effectivenessShields * dropoff;
const effectiveSDps = (m.getClip() ? (m.getClip() * m.getDps() / m.getRoF()) / ((m.getClip() / m.getRoF()) + m.getReload()) * effectiveness : effectiveDps) * dropoff; const effectiveSDpsShields = (m.getClip() ? (m.getClip() * m.getDps() / m.getRoF()) / ((m.getClip() / m.getRoF()) + m.getReload()) * effectivenessShields : effectiveDpsShields) * dropoff;
totals.effectiveDps += effectiveDps; const effectivenessHull = (m.getPiercing() >= against.properties.hardness ? 1 : m.getPiercing() / against.properties.hardness) * dropoff;
totals.effectiveSDps += effectiveSDps; const effectiveDpsHull = m.getDps() * effectivenessHull * dropoff;
const effectiveSDpsHull = (m.getClip() ? (m.getClip() * m.getDps() / m.getRoF()) / ((m.getClip() / m.getRoF()) + m.getReload()) * effectivenessHull : effectiveDpsHull) * dropoff;
totals.effectiveDpsShields += effectiveDpsShields;
totals.effectiveSDpsShields += effectiveSDpsShields;
totals.effectiveDpsHull += effectiveDpsHull;
totals.effectiveSDpsHull += effectiveSDpsHull;
totalDps += m.getDps(); totalDps += m.getDps();
weapons.push({ id: i, weapons.push({ id: i,
mount: m.mount, mount: m.mount,
name: m.name || m.grp, name: m.name || m.grp,
classRating, classRating,
effectiveDps, effectiveDpsShields,
effectiveSDps, effectiveSDpsShields,
effectiveness }); effectivenessShields,
effectiveDpsHull,
effectiveSDpsHull,
effectivenessHull });
} }
} }
} }
totals.effectiveness = totals.effectiveDps / totalDps; totals.effectivenessShields = totals.effectiveDpsShields / totalDps;
totals.effectivenessHull = totals.effectiveDpsHull / totalDps;
return { weapons, totals }; return { weapons, totals };
} }
@@ -201,9 +213,12 @@ export default class DamageDealt extends TranslatedComponent {
switch (predicate) { switch (predicate) {
case 'n': comp = comp(null, desc); break; case 'n': comp = comp(null, desc); break;
case 'edps': comp = comp((a, b) => a.effectiveDps - b.effectiveDps, desc); break; case 'edpss': comp = comp((a, b) => a.effectiveDpsShields - b.effectiveDpsShields, desc); break;
case 'esdps': comp = comp((a, b) => a.effectiveSDps - b.effectiveSDps, desc); break; case 'esdpss': comp = comp((a, b) => a.effectiveSDpsShields - b.effectiveSDpsShields, desc); break;
case 'e': comp = comp((a, b) => a.effectiveness - b.effectiveness, desc); break; case 'es': comp = comp((a, b) => a.effectivenessShields - b.effectivenessShields, desc); break;
case 'edpsh': comp = comp((a, b) => a.effectiveDpsHull - b.effectiveDpsHull, desc); break;
case 'esdpsh': comp = comp((a, b) => a.effectiveSDpsHull - b.effectiveSDpsHull, desc); break;
case 'eh': comp = comp((a, b) => a.effectivenessHull - b.effectivenessHull, desc); break;
} }
this.state.weapons.sort(comp); this.state.weapons.sort(comp);
@@ -232,9 +247,12 @@ export default class DamageDealt extends TranslatedComponent {
{weapon.mount == 'T' ? <span onMouseOver={termtip.bind(null, 'turreted')} onMouseOut={tooltip.bind(null, null)}><MountTurret /></span> : null} {weapon.mount == 'T' ? <span onMouseOver={termtip.bind(null, 'turreted')} onMouseOut={tooltip.bind(null, null)}><MountTurret /></span> : null}
{weapon.classRating} {translate(weapon.name)} {weapon.classRating} {translate(weapon.name)}
</td> </td>
<td className='ri'>{formats.round1(weapon.effectiveDps)}</td> <td className='ri'>{formats.round1(weapon.effectiveDpsShields)}</td>
<td className='ri'>{formats.round1(weapon.effectiveSDps)}</td> <td className='ri'>{formats.round1(weapon.effectiveSDpsShields)}</td>
<td className='ri'>{formats.pct(weapon.effectiveness)}</td> <td className='ri'>{formats.pct(weapon.effectivenessShields)}</td>
<td className='ri'>{formats.round1(weapon.effectiveDpsHull)}</td>
<td className='ri'>{formats.round1(weapon.effectiveSDpsHull)}</td>
<td className='ri'>{formats.pct(weapon.effectivenessHull)}</td>
</tr>); </tr>);
} }
} }
@@ -271,10 +289,17 @@ export default class DamageDealt extends TranslatedComponent {
<table className='summary' style={{ width: '100%' }}> <table className='summary' style={{ width: '100%' }}>
<thead> <thead>
<tr className='main'> <tr className='main'>
<td className='sortable' onClick={sortOrder.bind(this, 'n')}>{translate('weapon')}</td> <th rowSpan='2' className='sortable' onClick={sortOrder.bind(this, 'n')}>{translate('weapon')}</th>
<td className='sortable' onClick={sortOrder.bind(this, 'edps')}>{translate('effective dps')}</td> <th colSpan='3'>{translate('shields')}</th>
<td className='sortable' onClick={sortOrder.bind(this, 'esdps')}>{translate('effective sdps')}</td> <th colSpan='3'>{translate('armour')}</th>
<td className='sortable' onClick={sortOrder.bind(this, 'e')}>{translate('effectiveness')}</td> </tr>
<tr>
<th className='lft sortable' onClick={sortOrder.bind(this, 'edpss')}>{translate('effective dps')}</th>
<th className='sortable' onClick={sortOrder.bind(this, 'esdpss')}>{translate('effective sdps')}</th>
<th className='sortable' onClick={sortOrder.bind(this, 'es')}>{translate('effectiveness')}</th>
<th className='lft sortable' onClick={sortOrder.bind(this, 'edpsh')}>{translate('effective dps')}</th>
<th className='sortable' onClick={sortOrder.bind(this, 'esdpsh')}>{translate('effective sdps')}</th>
<th className='sortable' onClick={sortOrder.bind(this, 'eh')}>{translate('effectiveness')}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -283,9 +308,12 @@ export default class DamageDealt extends TranslatedComponent {
<tfoot> <tfoot>
<tr className='main'> <tr className='main'>
<td className='ri'><i>{translate('total')}</i></td> <td className='ri'><i>{translate('total')}</i></td>
<td className='ri'><i>{formats.round1(totals.effectiveDps)}</i></td> <td className='ri'><i>{formats.round1(totals.effectiveDpsShields)}</i></td>
<td className='ri'><i>{formats.round1(totals.effectiveSDps)}</i></td> <td className='ri'><i>{formats.round1(totals.effectiveSDpsShields)}</i></td>
<td className='ri'><i>{formats.pct(totals.effectiveness)}</i></td> <td className='ri'><i>{formats.pct(totals.effectivenessShields)}</i></td>
<td className='ri'><i>{formats.round1(totals.effectiveDpsHull)}</i></td>
<td className='ri'><i>{formats.round1(totals.effectiveSDpsHull)}</i></td>
<td className='ri'><i>{formats.pct(totals.effectivenessHull)}</i></td>
</tr> </tr>
</tfoot> </tfoot>
</table> </table>