feat: scaling

This commit is contained in:
TrèsAbhi committed 2024-07-01 19:41:13 -05:00
1 parent ea305b8ce5
commit 16bee48989
4 files changed
+78 -48

No files matched your search

@@ -2,47 +2,47 @@ import { Table } from '@radix-ui/themes';
export function Header() { export function Header() {
return ( return (
<Table.Header> <Table.Header style={{ whiteSpace: 'nowrap' }}>
<Table.Row align="end"> <Table.Row align="end">
<Table.ColumnHeaderCell>Tank</Table.ColumnHeaderCell> <Table.ColumnHeaderCell>Tank</Table.ColumnHeaderCell>
<Table.ColumnHeaderCell width="0" justify="center"> <Table.ColumnHeaderCell width="0" justify="center" minWidth="0px">
Winrate Winrate
</Table.ColumnHeaderCell> </Table.ColumnHeaderCell>
<Table.ColumnHeaderCell width="0" justify="center"> <Table.ColumnHeaderCell width="0" justify="center" minWidth="0px">
Players Players (30d)
</Table.ColumnHeaderCell> </Table.ColumnHeaderCell>
<Table.ColumnHeaderCell width="0" justify="center"> <Table.ColumnHeaderCell width="0" justify="center" minWidth="0px">
Damage Damage
</Table.ColumnHeaderCell> </Table.ColumnHeaderCell>
<Table.ColumnHeaderCell width="0" justify="center"> <Table.ColumnHeaderCell width="0" justify="center" minWidth="0px">
Survival Survival
</Table.ColumnHeaderCell> </Table.ColumnHeaderCell>
<Table.ColumnHeaderCell width="0" justify="center"> <Table.ColumnHeaderCell width="0" justify="center" minWidth="0px">
XP XP
</Table.ColumnHeaderCell> </Table.ColumnHeaderCell>
<Table.ColumnHeaderCell width="0" justify="center"> <Table.ColumnHeaderCell width="0" justify="center" minWidth="0px">
Kills Kills
</Table.ColumnHeaderCell> </Table.ColumnHeaderCell>
<Table.ColumnHeaderCell width="0" justify="center"> <Table.ColumnHeaderCell width="0" justify="center" minWidth="0px">
Spots Spots
</Table.ColumnHeaderCell> </Table.ColumnHeaderCell>
<Table.ColumnHeaderCell width="0" justify="center"> <Table.ColumnHeaderCell width="0" justify="center" minWidth="0px">
Accuracy Accuracy
</Table.ColumnHeaderCell> </Table.ColumnHeaderCell>
<Table.ColumnHeaderCell width="0" justify="center"> <Table.ColumnHeaderCell width="0" justify="center" minWidth="0px">
Shots Shots
</Table.ColumnHeaderCell> </Table.ColumnHeaderCell>
<Table.ColumnHeaderCell width="0" justify="center"> <Table.ColumnHeaderCell width="0" justify="center" minWidth="0px">
Hits Hits
</Table.ColumnHeaderCell> </Table.ColumnHeaderCell>
<Table.ColumnHeaderCell width="0" justify="center"> <Table.ColumnHeaderCell width="0" justify="center" minWidth="0px">
Damage ratio Dmg. ratio
</Table.ColumnHeaderCell> </Table.ColumnHeaderCell>
<Table.ColumnHeaderCell width="0" justify="center"> <Table.ColumnHeaderCell width="0" justify="center" minWidth="0px">
Damage received Dmg. taken
</Table.ColumnHeaderCell> </Table.ColumnHeaderCell>
<Table.ColumnHeaderCell width="0" justify="center"> <Table.ColumnHeaderCell width="0" justify="center" minWidth="0px">
Capture points Cap points
</Table.ColumnHeaderCell> </Table.ColumnHeaderCell>
</Table.Row> </Table.Row>
</Table.Header> </Table.Header>
@@ -9,6 +9,7 @@ import { discoveredIdsDefinitions } from '../../../../core/blitzkit/discoveredId
export function Info() { export function Info() {
const awaitedAverageDefinitions = use(averageDefinitions); const awaitedAverageDefinitions = use(averageDefinitions);
const awaitedDiscoveredIdsDefinitions = use(discoveredIdsDefinitions); const awaitedDiscoveredIdsDefinitions = use(discoveredIdsDefinitions);
const numberFormat = Intl.NumberFormat(undefined, { notation: 'compact' });
const ratio = const ratio =
awaitedDiscoveredIdsDefinitions.count / awaitedDiscoveredIdsDefinitions.count /
awaitedAverageDefinitions.scanned_players; awaitedAverageDefinitions.scanned_players;
@@ -20,13 +21,12 @@ export function Info() {
<InfoCircledIcon /> <InfoCircledIcon />
</Callout.Icon> </Callout.Icon>
<Callout.Text> <Callout.Text>
Based on{' '} Career stats based on{' '}
{Math.round( {numberFormat.format(
ratio * awaitedAverageDefinitions.sampled_players, Math.round(ratio * awaitedAverageDefinitions.sampled_players),
).toLocaleString()}{' '} )}{' '}
players with at least 5,000 career battles and 1 battle in the past players with at least 5K career battles and 1 battle in the past 30
120 days. {awaitedDiscoveredIdsDefinitions.count.toLocaleString()}{' '} days. Updated daily.
scanned in total. Updated daily.
</Callout.Text> </Callout.Text>
</Callout.Root> </Callout.Root>
</Flex> </Flex>
@@ -1,7 +1,8 @@
import { Table } from '@radix-ui/themes'; import { Table } from '@radix-ui/themes';
import { memo, use, useMemo } from 'react'; import { memo, use } from 'react';
import { TankRowHeaderCell } from '../../../../components/TankRowHeaderCell'; import { TankRowHeaderCell } from '../../../../components/TankRowHeaderCell';
import { averageDefinitions } from '../../../../core/blitzkit/averageDefinitions'; import { averageDefinitions } from '../../../../core/blitzkit/averageDefinitions';
import { discoveredIdsDefinitions } from '../../../../core/blitzkit/discoveredIdDefinitions';
import { TankDefinition } from '../../../../core/blitzkit/tankDefinitions'; import { TankDefinition } from '../../../../core/blitzkit/tankDefinitions';
interface TankRowProps { interface TankRowProps {
@@ -10,46 +11,72 @@ interface TankRowProps {
export const TankRow = memo<TankRowProps>( export const TankRow = memo<TankRowProps>(
({ tank }) => { ({ tank }) => {
const awaitedDiscoveredIdsDefinitions = use(discoveredIdsDefinitions);
const awaitedAverageDefinitions = use(averageDefinitions); const awaitedAverageDefinitions = use(averageDefinitions);
const averages = awaitedAverageDefinitions.averages[tank.id]; const averages = awaitedAverageDefinitions.averages[tank.id];
const numberFormat = useMemo( const numberFormat = Intl.NumberFormat(undefined, { notation: 'compact' });
() => Intl.NumberFormat(undefined, { notation: 'compact' }), const ratio =
[], awaitedDiscoveredIdsDefinitions.count /
); awaitedAverageDefinitions.scanned_players;
return ( return (
<Table.Row> <Table.Row>
<TankRowHeaderCell tank={tank} /> <TankRowHeaderCell tank={tank} />
<Table.Cell align="center"> <Table.Cell align="center">
{Math.round(averages.mu.wins * 100)}% {Math.round((averages.mu.wins / averages.mu.battles) * 100)}%
</Table.Cell> </Table.Cell>
<Table.Cell align="center"> <Table.Cell align="center">
{numberFormat.format(Math.round(averages.samples))} {numberFormat.format(Math.round(ratio * averages.samples))}
</Table.Cell> </Table.Cell>
<Table.Cell align="center"> <Table.Cell align="center">
{Math.round(averages.mu.damage_dealt).toLocaleString()} {Math.round(
averages.mu.damage_dealt / averages.mu.battles,
).toLocaleString()}
</Table.Cell> </Table.Cell>
<Table.Cell align="center"> <Table.Cell align="center">
{Math.round(averages.mu.survived_battles * 100)}% {Math.round(
(averages.mu.survived_battles / averages.mu.battles) * 100,
)}
%
</Table.Cell> </Table.Cell>
<Table.Cell align="center"> <Table.Cell align="center">
{Math.round(averages.mu.xp).toLocaleString()} {Math.round(averages.mu.xp / averages.mu.battles).toLocaleString()}
</Table.Cell>
<Table.Cell align="center">{averages.mu.frags.toFixed(2)}</Table.Cell>
<Table.Cell align="center">{averages.mu.spotted.toFixed(2)}</Table.Cell>
<Table.Cell align="center">
{Math.round((averages.mu.hits / averages.mu.shots) * 100)}%
</Table.Cell>
<Table.Cell align="center">{averages.mu.shots.toFixed(1)}</Table.Cell>
<Table.Cell align="center">{averages.mu.hits.toFixed(1)}</Table.Cell>
<Table.Cell align="center">
{(averages.mu.damage_dealt / averages.mu.damage_received).toFixed(2)}
</Table.Cell> </Table.Cell>
<Table.Cell align="center"> <Table.Cell align="center">
{Math.round(averages.mu.damage_received).toLocaleString()} {(averages.mu.frags / averages.mu.battles).toFixed(2)}
</Table.Cell> </Table.Cell>
<Table.Cell align="center"> <Table.Cell align="center">
{averages.mu.capture_points.toFixed(2)} {(averages.mu.spotted / averages.mu.battles).toFixed(2)}
</Table.Cell>
<Table.Cell align="center">
{Math.round(
(averages.mu.hits /
averages.mu.battles /
(averages.mu.shots / averages.mu.battles)) *
100,
)}
%
</Table.Cell>
<Table.Cell align="center">
{(averages.mu.shots / averages.mu.battles).toFixed(1)}
</Table.Cell>
<Table.Cell align="center">
{(averages.mu.hits / averages.mu.battles).toFixed(1)}
</Table.Cell>
<Table.Cell align="center">
{(
averages.mu.damage_dealt /
averages.mu.battles /
(averages.mu.damage_received / averages.mu.battles)
).toFixed(2)}
</Table.Cell>
<Table.Cell align="center">
{Math.round(
averages.mu.damage_received / averages.mu.battles,
).toLocaleString()}
</Table.Cell>
<Table.Cell align="center">
{(averages.mu.capture_points / averages.mu.battles).toFixed(2)}
</Table.Cell> </Table.Cell>
</Table.Row> </Table.Row>
); );
@@ -11,7 +11,10 @@ export function Tanks() {
const awaitedTankDefinitions = use(tankDefinitions); const awaitedTankDefinitions = use(tankDefinitions);
const awaitedAverageDefinitionsArray = use(averageDefinitionsArray); const awaitedAverageDefinitionsArray = use(averageDefinitionsArray);
const tankAverages = useMemo( const tankAverages = useMemo(
() => awaitedAverageDefinitionsArray.sort((a, b) => b.mu.wins - a.mu.wins), () =>
awaitedAverageDefinitionsArray.sort(
(a, b) => b.mu.wins / b.mu.battles - a.mu.wins / a.mu.battles,
),
[], [],
); );