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) },