From 8bc3e2c6b9f995c1e02d71db8710f7b5025f2a3b 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 17:55:13 -0500 Subject: [PATCH] feat: stat generalzation --- .vscode/settings.json | 2 ++ src/app/tools/session/page.tsx | 31 +++++++++++++++++++++++-------- src/core/blitz/generateStats.ts | 29 +++++++++++++++++++++++++++++ src/stores/session.ts | 6 +++++- 4 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 src/core/blitz/generateStats.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 55a0d9ee5..5ba71e9e2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -11,6 +11,7 @@ "applypatches", "artefacts", "atgm", + "Avearges", "AYUV", "battleresults", "bbox", @@ -82,6 +83,7 @@ "loadouts", "loddist", "lods", + "lossrate", "mantlets", "metallicness", "minitelrose", diff --git a/src/app/tools/session/page.tsx b/src/app/tools/session/page.tsx index be9b7e229..2217532d1 100644 --- a/src/app/tools/session/page.tsx +++ b/src/app/tools/session/page.tsx @@ -21,6 +21,11 @@ import { use, useEffect, useMemo, useRef, useState } from 'react'; import PageWrapper from '../../../components/PageWrapper'; import { UNLOCALIZED_REGION_NAMES_SHORT } from '../../../constants/regions'; import { authURL } from '../../../core/blitz/authURL'; +import { + generateStats, + prettifyStats, + STAT_NAMES, +} from '../../../core/blitz/generateStats'; import { getAccountInfo, IndividualAccountInfo, @@ -32,6 +37,7 @@ import searchPlayersAcrossRegions, { } from '../../../core/blitz/searchPlayersAcrossRegions'; import { tankDefinitions } from '../../../core/blitzkit/tankDefinitions'; import { tankIcon } from '../../../core/blitzkit/tankIcon'; +import { tankAverages } from '../../../core/blitzstars/tankAverages'; import { theme } from '../../../stitches.config'; import { useApp } from '../../../stores/app'; import mutateSession, { @@ -42,6 +48,7 @@ import { IndividualTankStats } from '../../../types/tanksStats'; export default function Page() { const awaitedTankDefinitions = use(tankDefinitions); + const awaitedTankAvearges = use(tankAverages); const [showSearch, setShowSearch] = useState(false); const [searching, setSearching] = useState(false); const [searchResults, setSearchResults] = useState([]); @@ -306,8 +313,11 @@ export default function Page() { Tank - Battles - Winrate + {session.columns.map((column) => ( + + {STAT_NAMES[column]} + + ))} @@ -315,8 +325,12 @@ export default function Page() { {tankStatsB .filter((stat) => stat.all.battles > 0) .sort((a, b) => b.last_battle_time - a.last_battle_time) - .map((stat) => { - const tank = awaitedTankDefinitions[stat.tank_id]; + .map((entry) => { + const tank = awaitedTankDefinitions[entry.tank_id]; + const average = awaitedTankAvearges[tank.id]; + const stats = prettifyStats( + generateStats(entry.all, average?.all), + ); return ( - {stat.all.battles} - - {((100 * stat.all.wins) / stat.all.battles).toFixed(0)}% - + {session.columns.map((column) => ( + + {stats[column]} + + ))} ); })} diff --git a/src/core/blitz/generateStats.ts b/src/core/blitz/generateStats.ts new file mode 100644 index 000000000..3ddd269d1 --- /dev/null +++ b/src/core/blitz/generateStats.ts @@ -0,0 +1,29 @@ +import calculateWN8 from '../statistics/calculateWN8'; +import { AllStats } from './getAccountInfo'; + +export type Stat = keyof ReturnType; + +export const STAT_NAMES: Record = { + battles: 'Battles', + winrate: 'Winrate', + wn8: 'WN8', + damage: 'Damage', +}; + +export function generateStats(s: AllStats, e?: AllStats) { + return { + battles: s.battles, + winrate: s.wins / s.battles, + wn8: e ? calculateWN8(e, s) : null, + damage: s.damage_dealt / s.battles, + }; +} + +export function prettifyStats(s: ReturnType) { + return { + battles: `${s.battles}`, + winrate: `${(s.winrate * 100).toFixed(0)}%`, + wn8: s.wn8 ? s.wn8.toFixed(0) : '--', + damage: s.damage.toFixed(0), + } satisfies Record; +} diff --git a/src/stores/session.ts b/src/stores/session.ts index 48c7faba2..95ccdb797 100644 --- a/src/stores/session.ts +++ b/src/stores/session.ts @@ -3,8 +3,11 @@ import { merge } from 'lodash'; import { create } from 'zustand'; import { persist } from 'zustand/middleware'; import { Region } from '../constants/regions'; +import { Stat } from '../core/blitz/generateStats'; -interface SessionBase {} +interface SessionBase { + columns: Stat[]; +} export interface SessionTracking extends SessionBase { tracking: true; @@ -24,6 +27,7 @@ type Session = SessionTracking | SessionNotTracking; export const useSession = create()( persist( (set) => ({ + columns: ['battles', 'winrate', 'wn8', 'damage'], tracking: false, }), { name: 'session-2', merge: (a, b) => merge(b, a) },