mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-24 03:59:50 +02:00
feat: scaling
This commit is contained in:
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,
|
||||||
|
),
|
||||||
[],
|
[],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user