From 391990676f1338034370b502be90e1196e0c6f3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Fri, 26 Apr 2024 12:34:59 -0500 Subject: [PATCH] feat: wn8 and labels --- src/commands/replay.tsx | 118 +++++++++++++++++++++++++++- src/core/statistics/calculateWN8.ts | 12 ++- 2 files changed, 127 insertions(+), 3 deletions(-) diff --git a/src/commands/replay.tsx b/src/commands/replay.tsx index 70af61346..1cbec7f53 100644 --- a/src/commands/replay.tsx +++ b/src/commands/replay.tsx @@ -6,8 +6,10 @@ import { RenderConfiguration } from '../core/blitzkit/renderConfiguration'; import { tankDefinitions } from '../core/blitzkit/tankDefinitions'; import { TIER_ROMAN_NUMERALS } from '../core/blitzkit/tankDefinitions/constants'; import { tankIcon } from '../core/blitzkit/tankIcon'; +import { tankAverages } from '../core/blitzstars/tankAverages'; import buttonLink from '../core/discord/buttonLink'; import { createLocalizedCommand } from '../core/discord/createLocalizedCommand'; +import calculateWN8 from '../core/statistics/calculateWN8'; import { CommandRegistry } from '../events/interactionCreate'; import { theme } from '../stitches.config'; @@ -212,8 +214,10 @@ function stat(value: string | number, flex = 2) { async function playerListing( player: WotInspectorReplayPlayerData, protagonistTeam: boolean, + winningTeam: number, recordingPlayer = false, ) { + const awaitedTankAverages = await tankAverages; const awaitedTankDefinitions = await tankDefinitions; const tank = awaitedTankDefinitions[player.vehicle_descr]; const blockAccent = recordingPlayer ? '_amber' : ''; @@ -231,6 +235,18 @@ async function playerListing( )[0]; const totalHealth = turret.health + tank.health; const healthLeft = clamp(player.hitpoints_left / totalHealth, 0, 1); + const tankAveragesEntry = awaitedTankAverages[player.vehicle_descr]; + const wn8 = + tankAveragesEntry === undefined + ? -1 + : calculateWN8(tankAveragesEntry.all, { + battles: 1, + damage_dealt: player.damage_made, + dropped_capture_points: player.base_defend_points, + frags: player.enemies_destroyed, + spotted: player.enemies_spotted, + wins: winningTeam === player.team ? 1 : 0, + }); return (
{stat(player.damage_made.toLocaleString())} - {stat((2830).toLocaleString())} + {stat(wn8 === -1 ? '--' : Math.round(wn8).toLocaleString())} {stat(player.exp.toLocaleString())} {stat(player.enemies_destroyed, 1)}
@@ -347,6 +363,97 @@ async function playerListing( ); } +function Header() { + return ( +
+
+ +
+
+ + Damage + +
+
+ + WN8 + +
+
+ + XP + +
+
+ + Kills + +
+
+
+ ); +} + export const replayCommand = new Promise((resolve) => { resolve({ inProduction: true, @@ -404,6 +511,8 @@ export const replayCommand = new Promise((resolve) => { gap: 4, }} > +
+ {await Promise.all( players .filter((player) => player.team === protagonistTeamId) @@ -411,6 +520,7 @@ export const replayCommand = new Promise((resolve) => { playerListing( player, true, + replayData.winner_team, player.dbid === replayData.protagonist, ), ), @@ -425,10 +535,14 @@ export const replayCommand = new Promise((resolve) => { gap: 4, }} > +
+ {await Promise.all( players .filter((player) => player.team === antagonistTeamId) - .map((player) => playerListing(player, false)), + .map((player) => + playerListing(player, false, replayData.winner_team), + ), )}
diff --git a/src/core/statistics/calculateWN8.ts b/src/core/statistics/calculateWN8.ts index c169bc148..885ad2430 100644 --- a/src/core/statistics/calculateWN8.ts +++ b/src/core/statistics/calculateWN8.ts @@ -6,7 +6,17 @@ import { AllStats } from '../blitz/getAccountInfo'; * @param expected what all players on average perform like * @param average what the player in question performs like */ -export default function calculateWN8(expected: AllStats, average: AllStats) { +export default function calculateWN8( + expected: AllStats, + average: { + damage_dealt: number; + battles: number; + spotted: number; + frags: number; + dropped_capture_points: number; + wins: number; + }, +) { const avgDmg = average.damage_dealt / average.battles; const avgSpot = average.spotted / average.battles; const avgFrag = average.frags / average.battles;