mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-25 03:29:51 +01:00
feat: more data
This commit is contained in:
1 parent
c6c78f2661
commit
6c6cf6b76d
3 files changed
+130
-89
No files matched your search
@@ -0,0 +1,57 @@
|
|||||||
|
import { Table } from '@radix-ui/themes';
|
||||||
|
import { memo, use } from 'react';
|
||||||
|
import { TankRowHeaderCell } from '../../../../components/TankRowHeaderCell';
|
||||||
|
import { averageDefinitions } from '../../../../core/blitzkit/averageDefinitions';
|
||||||
|
import { TankDefinition } from '../../../../core/blitzkit/tankDefinitions';
|
||||||
|
|
||||||
|
interface TankRowProps {
|
||||||
|
tank: TankDefinition;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const TankRow = memo<TankRowProps>(
|
||||||
|
({ tank }) => {
|
||||||
|
const awaitedAverageDefinitions = use(averageDefinitions);
|
||||||
|
const averages = awaitedAverageDefinitions[tank.id];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Table.Row>
|
||||||
|
<TankRowHeaderCell tank={tank} />
|
||||||
|
<Table.Cell align="center">
|
||||||
|
{Math.round(averages.mu.wins * 100)}%
|
||||||
|
</Table.Cell>
|
||||||
|
<Table.Cell align="center">
|
||||||
|
{averages.samples.toLocaleString()}
|
||||||
|
</Table.Cell>
|
||||||
|
<Table.Cell align="center">
|
||||||
|
{Math.round(averages.mu.damage_dealt).toLocaleString()}
|
||||||
|
</Table.Cell>
|
||||||
|
<Table.Cell align="center">
|
||||||
|
{Math.round(averages.mu.survived_battles * 100)}%
|
||||||
|
</Table.Cell>
|
||||||
|
<Table.Cell align="center">
|
||||||
|
{Math.round(averages.mu.xp).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 align="center">
|
||||||
|
{Math.round(averages.mu.damage_received).toLocaleString()}
|
||||||
|
</Table.Cell>
|
||||||
|
<Table.Cell align="center">
|
||||||
|
{averages.mu.capture_points.toFixed(2)}
|
||||||
|
</Table.Cell>
|
||||||
|
<Table.Cell align="center">
|
||||||
|
{averages.mu.dropped_capture_points.toFixed(2)}
|
||||||
|
</Table.Cell>
|
||||||
|
</Table.Row>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
(prev, next) => prev.tank.id === next.tank.id,
|
||||||
|
);
|
||||||
@@ -2,9 +2,9 @@ import { InfoCircledIcon } from '@radix-ui/react-icons';
|
|||||||
import { Callout, Flex, Table } from '@radix-ui/themes';
|
import { Callout, Flex, Table } from '@radix-ui/themes';
|
||||||
import { use, useMemo } from 'react';
|
import { use, useMemo } from 'react';
|
||||||
import PageWrapper from '../../../components/PageWrapper';
|
import PageWrapper from '../../../components/PageWrapper';
|
||||||
import { TankRowHeaderCell } from '../../../components/TankRowHeaderCell';
|
|
||||||
import { averageDefinitionsArray } from '../../../core/blitzkit/averageDefinitions';
|
import { averageDefinitionsArray } from '../../../core/blitzkit/averageDefinitions';
|
||||||
import { tankDefinitions } from '../../../core/blitzkit/tankDefinitions';
|
import { tankDefinitions } from '../../../core/blitzkit/tankDefinitions';
|
||||||
|
import { TankRow } from './components/TankRow';
|
||||||
|
|
||||||
export default function Page() {
|
export default function Page() {
|
||||||
const awaitedTankDefinitions = use(tankDefinitions);
|
const awaitedTankDefinitions = use(tankDefinitions);
|
||||||
@@ -19,7 +19,7 @@ export default function Page() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageWrapper color="jade">
|
<PageWrapper color="jade" noMaxWidth>
|
||||||
<Flex justify="center">
|
<Flex justify="center">
|
||||||
<Callout.Root style={{ width: 'fit-content' }}>
|
<Callout.Root style={{ width: 'fit-content' }}>
|
||||||
<Callout.Icon>
|
<Callout.Icon>
|
||||||
@@ -27,91 +27,70 @@ export default function Page() {
|
|||||||
</Callout.Icon>
|
</Callout.Icon>
|
||||||
<Callout.Text>
|
<Callout.Text>
|
||||||
Based on {samples.toLocaleString()} players with at least 5,000
|
Based on {samples.toLocaleString()} players with at least 5,000
|
||||||
career battles and 1 battle in the past 120 days. Updated daily.
|
career battles and 1 battle in the past 120 days. Stats displayed as
|
||||||
Stats displayed as an average per battle.
|
an average per battle. Updated daily.
|
||||||
</Callout.Text>
|
</Callout.Text>
|
||||||
</Callout.Root>
|
</Callout.Root>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
|
||||||
<Table.Root variant="surface" style={{ textWrap: 'nowrap' }}>
|
<Flex justify="center">
|
||||||
<Table.Header>
|
<Table.Root variant="surface" style={{ maxWidth: '100%' }}>
|
||||||
<Table.Row>
|
<Table.Header>
|
||||||
<Table.ColumnHeaderCell>Tank</Table.ColumnHeaderCell>
|
<Table.Row align="end">
|
||||||
<Table.ColumnHeaderCell width="0" align="right">
|
<Table.ColumnHeaderCell>Tank</Table.ColumnHeaderCell>
|
||||||
Winrate
|
<Table.ColumnHeaderCell width="0" justify="center">
|
||||||
</Table.ColumnHeaderCell>
|
Winrate
|
||||||
<Table.ColumnHeaderCell width="0" align="right">
|
</Table.ColumnHeaderCell>
|
||||||
Damage
|
<Table.ColumnHeaderCell width="0" justify="center">
|
||||||
</Table.ColumnHeaderCell>
|
Players
|
||||||
<Table.ColumnHeaderCell width="0" align="right">
|
</Table.ColumnHeaderCell>
|
||||||
Survival
|
<Table.ColumnHeaderCell width="0" justify="center">
|
||||||
</Table.ColumnHeaderCell>
|
Damage
|
||||||
<Table.ColumnHeaderCell width="0" align="right">
|
</Table.ColumnHeaderCell>
|
||||||
XP
|
<Table.ColumnHeaderCell width="0" justify="center">
|
||||||
</Table.ColumnHeaderCell>
|
Survival
|
||||||
<Table.ColumnHeaderCell width="0" align="right">
|
</Table.ColumnHeaderCell>
|
||||||
Kills
|
<Table.ColumnHeaderCell width="0" justify="center">
|
||||||
</Table.ColumnHeaderCell>
|
XP
|
||||||
<Table.ColumnHeaderCell width="0" align="right">
|
</Table.ColumnHeaderCell>
|
||||||
Spots
|
<Table.ColumnHeaderCell width="0" justify="center">
|
||||||
</Table.ColumnHeaderCell>
|
Kills
|
||||||
<Table.ColumnHeaderCell width="0" align="right">
|
</Table.ColumnHeaderCell>
|
||||||
Accuracy
|
<Table.ColumnHeaderCell width="0" justify="center">
|
||||||
</Table.ColumnHeaderCell>
|
Spots
|
||||||
<Table.ColumnHeaderCell width="0" align="right">
|
</Table.ColumnHeaderCell>
|
||||||
Shots
|
<Table.ColumnHeaderCell width="0" justify="center">
|
||||||
</Table.ColumnHeaderCell>
|
Accuracy
|
||||||
<Table.ColumnHeaderCell width="0" align="right">
|
</Table.ColumnHeaderCell>
|
||||||
Hits
|
<Table.ColumnHeaderCell width="0" justify="center">
|
||||||
</Table.ColumnHeaderCell>
|
Shots
|
||||||
<Table.ColumnHeaderCell width="0" align="right">
|
</Table.ColumnHeaderCell>
|
||||||
Capture points
|
<Table.ColumnHeaderCell width="0" justify="center">
|
||||||
</Table.ColumnHeaderCell>
|
Hits
|
||||||
</Table.Row>
|
</Table.ColumnHeaderCell>
|
||||||
</Table.Header>
|
<Table.ColumnHeaderCell width="0" justify="center">
|
||||||
|
Damage ratio
|
||||||
|
</Table.ColumnHeaderCell>
|
||||||
|
<Table.ColumnHeaderCell width="0" justify="center">
|
||||||
|
Damage received
|
||||||
|
</Table.ColumnHeaderCell>
|
||||||
|
<Table.ColumnHeaderCell width="0" justify="center">
|
||||||
|
Capture points
|
||||||
|
</Table.ColumnHeaderCell>
|
||||||
|
<Table.ColumnHeaderCell width="0" justify="center">
|
||||||
|
Dropped capture points
|
||||||
|
</Table.ColumnHeaderCell>
|
||||||
|
</Table.Row>
|
||||||
|
</Table.Header>
|
||||||
|
|
||||||
<Table.Body>
|
<Table.Body>
|
||||||
{tankAverages.map((averages) => {
|
{tankAverages.map((averages) => {
|
||||||
const tank = awaitedTankDefinitions[averages.id];
|
const tank = awaitedTankDefinitions[averages.id];
|
||||||
|
return <TankRow tank={tank} key={tank.id} />;
|
||||||
return (
|
})}
|
||||||
<Table.Row key={averages.id}>
|
</Table.Body>
|
||||||
<TankRowHeaderCell tank={tank} />
|
</Table.Root>
|
||||||
<Table.Cell align="right">
|
</Flex>
|
||||||
{Math.round(averages.mu.wins * 100)}%
|
|
||||||
</Table.Cell>
|
|
||||||
<Table.Cell align="right">
|
|
||||||
{Math.round(averages.mu.damage_dealt).toLocaleString()}
|
|
||||||
</Table.Cell>
|
|
||||||
<Table.Cell align="right">
|
|
||||||
{Math.round(averages.mu.survived_battles * 100)}%
|
|
||||||
</Table.Cell>
|
|
||||||
<Table.Cell align="right">
|
|
||||||
{Math.round(averages.mu.xp).toLocaleString()}
|
|
||||||
</Table.Cell>
|
|
||||||
<Table.Cell align="right">
|
|
||||||
{averages.mu.frags.toFixed(2)}
|
|
||||||
</Table.Cell>
|
|
||||||
<Table.Cell align="right">
|
|
||||||
{averages.mu.spotted.toFixed(2)}
|
|
||||||
</Table.Cell>
|
|
||||||
<Table.Cell align="right">
|
|
||||||
{Math.round((averages.mu.hits / averages.mu.shots) * 100)}%
|
|
||||||
</Table.Cell>
|
|
||||||
<Table.Cell align="right">
|
|
||||||
{averages.mu.shots.toFixed(1)}
|
|
||||||
</Table.Cell>
|
|
||||||
<Table.Cell align="right">
|
|
||||||
{averages.mu.hits.toFixed(1)}
|
|
||||||
</Table.Cell>
|
|
||||||
<Table.Cell align="right">
|
|
||||||
{averages.mu.capture_points.toFixed(1)}
|
|
||||||
</Table.Cell>
|
|
||||||
</Table.Row>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</Table.Body>
|
|
||||||
</Table.Root>
|
|
||||||
</PageWrapper>
|
</PageWrapper>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Flex, Table } from '@radix-ui/themes';
|
import { Table } from '@radix-ui/themes';
|
||||||
import { TankDefinition } from '../core/blitzkit/tankDefinitions';
|
import { TankDefinition } from '../core/blitzkit/tankDefinitions';
|
||||||
import { tankIcon } from '../core/blitzkit/tankIcon';
|
import { tankIcon } from '../core/blitzkit/tankIcon';
|
||||||
import { ExperimentIcon } from './ExperimentIcon';
|
import { ExperimentIcon } from './ExperimentIcon';
|
||||||
@@ -33,14 +33,19 @@ export function TankRowHeaderCell({ tank }: TankRowHeaderCellProps) {
|
|||||||
href={`/tools/tankopedia/${tank.id}`}
|
href={`/tools/tankopedia/${tank.id}`}
|
||||||
style={{
|
style={{
|
||||||
paddingLeft: 'var(--space-2)',
|
paddingLeft: 'var(--space-2)',
|
||||||
|
display: 'flex',
|
||||||
|
alignItems: 'center',
|
||||||
|
gap: 'var(--space-1)',
|
||||||
|
width: 128,
|
||||||
|
overflow: 'hidden',
|
||||||
|
textOverflow: 'ellipsis',
|
||||||
|
whiteSpace: 'nowrap',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Flex align="center" gap="1" position="relative" pl="2">
|
{tank.testing && (
|
||||||
{tank.testing && (
|
<ExperimentIcon style={{ width: '1em', height: '1em' }} />
|
||||||
<ExperimentIcon style={{ width: '1em', height: '1em' }} />
|
)}
|
||||||
)}
|
{tank.name}
|
||||||
{tank.name}
|
|
||||||
</Flex>
|
|
||||||
</Link>
|
</Link>
|
||||||
</Table.RowHeaderCell>
|
</Table.RowHeaderCell>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in new issue
Block a user