From 352cb7083015664215483853d72f6f9cf6a8cf21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 1 May 2024 22:11:12 -0500 Subject: [PATCH] feat: totals --- src/app/tools/session/page.tsx | 54 +++++++++++++++++++++++++++------ src/core/blitz/generateStats.ts | 31 +++++++++++++++++-- src/stores/session.ts | 2 +- 3 files changed, 74 insertions(+), 13 deletions(-) diff --git a/src/app/tools/session/page.tsx b/src/app/tools/session/page.tsx index 6d6aea4ce..93d8d0e9f 100644 --- a/src/app/tools/session/page.tsx +++ b/src/app/tools/session/page.tsx @@ -25,6 +25,7 @@ import { generateStats, prettifyStats, STAT_NAMES, + sumStats, } from '../../../core/blitz/generateStats'; import { getAccountInfo, @@ -75,12 +76,30 @@ export default function Page() { const delta = useMemo( () => session.tracking && tankStatsB - ? deltaTankStats(session.player.stats, tankStatsB).sort( - (a, b) => b.last_battle_time - a.last_battle_time, - ) + ? deltaTankStats(session.player.stats, tankStatsB) + .sort((a, b) => b.last_battle_time - a.last_battle_time) + .map((entry) => { + const tank = awaitedTankDefinitions[entry.tank_id]; + const average = awaitedTankAvearges[tank.id]; + const stats = generateStats(entry.all, average?.all); + const statsPretty = prettifyStats(stats); + + return { + tank, + stats, + statsPretty, + }; + }) : undefined, [session.tracking && session.player, tankStatsB], ); + const total = useMemo( + () => + delta + ? prettifyStats(sumStats(delta.map(({ stats }) => stats))) + : undefined, + [delta], + ); const search = debounce(async () => { if (!input.current) return; @@ -338,13 +357,28 @@ export default function Page() { - {delta.map((entry) => { - const tank = awaitedTankDefinitions[entry.tank_id]; - const average = awaitedTankAvearges[tank.id]; - const stats = prettifyStats( - generateStats(entry.all, average?.all), - ); + + + Total + + {session.columns.map((column) => ( + + {total![column]} + + ))} + + {delta.map(({ statsPretty, tank }) => { return ( {session.columns.map((column) => ( - {stats[column]} + {statsPretty[column]} ))} diff --git a/src/core/blitz/generateStats.ts b/src/core/blitz/generateStats.ts index 3ddd269d1..836cee06e 100644 --- a/src/core/blitz/generateStats.ts +++ b/src/core/blitz/generateStats.ts @@ -7,23 +7,50 @@ export const STAT_NAMES: Record = { battles: 'Battles', winrate: 'Winrate', wn8: 'WN8', + averageDamage: 'Damage', damage: 'Damage', + wins: 'Wins', }; export function generateStats(s: AllStats, e?: AllStats) { return { battles: s.battles, + wins: s.wins, winrate: s.wins / s.battles, wn8: e ? calculateWN8(e, s) : null, - damage: s.damage_dealt / s.battles, + damage: s.damage_dealt, + averageDamage: s.damage_dealt / s.battles, }; } export function prettifyStats(s: ReturnType) { return { battles: `${s.battles}`, + wins: `${s.wins}`, winrate: `${(s.winrate * 100).toFixed(0)}%`, wn8: s.wn8 ? s.wn8.toFixed(0) : '--', - damage: s.damage.toFixed(0), + damage: `${s.damage}`, + averageDamage: s.averageDamage.toFixed(0), } satisfies Record; } + +export function sumStats(s: ReturnType[]) { + function sum(slice: (stat: ReturnType) => number) { + return s.reduce((a, b) => a + slice(b), 0); + } + + const battles = sum((s) => s.battles); + const wins = sum((s) => s.wins); + const damage = sum((s) => s.damage); + + return { + battles, + wins, + winrate: wins / battles, + damage, + averageDamage: damage / battles, + wn8: + sum((s) => (s.wn8 ? s.wn8 * s.battles : 0)) / + sum((s) => (s.wn8 ? s.battles : 0)), + } satisfies ReturnType; +} diff --git a/src/stores/session.ts b/src/stores/session.ts index 448f2d2d0..f748cad37 100644 --- a/src/stores/session.ts +++ b/src/stores/session.ts @@ -29,7 +29,7 @@ type Session = SessionTracking | SessionNotTracking; export const useSession = create()( persist( (set) => ({ - columns: ['battles', 'winrate', 'wn8', 'damage'], + columns: ['battles', 'winrate', 'wn8', 'averageDamage'], tracking: false, }), { name: 'session-2', merge: (a, b) => merge(b, a) },