Files
blitzkit/packages/website/src/components/Compare/Body.tsx
T

327 lines
11 KiB
TypeScript
Raw Normal View History

2024-09-08 10:46:12 -05:00
import { asset } from '@blitzkit/core';
2024-07-12 20:38:19 -05:00
import { Flex, Heading, IconButton, Table } from '@radix-ui/themes';
2024-09-23 10:49:54 -05:00
import type { TankCharacteristics } from '../../core/blitzkit/tankCharacteristics';
2025-01-14 19:22:41 -06:00
import { useLocale } from '../../hooks/useLocale';
2024-09-23 10:49:54 -05:00
import { CompareEphemeral } from '../../stores/compareEphemeral';
import { StickyColumnHeaderCell } from '../StickyColumnHeaderCell';
2024-07-12 20:38:19 -05:00
import { CompareRow } from './CompareRow';
import { CompareSectionTitle } from './CompareSectionTitle';
interface BodyProps {
stats: TankCharacteristics[];
}
export function Body({ stats }: BodyProps) {
const members = CompareEphemeral.use((state) => state.members);
2024-10-05 16:44:07 -05:00
const hasNonRegularGun = members.some(
2024-10-07 18:45:11 -05:00
({ gun }) => gun.gun_type!.$case !== 'regular',
2024-10-05 16:44:07 -05:00
);
2025-01-16 20:14:34 -06:00
const { unwrap, strings } = useLocale();
2024-07-12 20:38:19 -05:00
const mutateCompareEphemeral = CompareEphemeral.useMutation();
return (
<>
<Table.Header>
<Table.Row>
<StickyColumnHeaderCell top={137} style={{ left: 0, zIndex: 2 }}>
<Flex height="100%" align="center">
<Heading size="4">Firepower</Heading>
</Flex>
</StickyColumnHeaderCell>
{members.map(({ gun, shell, key }, index) => (
<StickyColumnHeaderCell key={key} top={137}>
<Flex justify="center">
<Flex>
2024-10-07 18:45:11 -05:00
{gun.gun_type!.value.base.shells.map(
2024-10-05 16:44:07 -05:00
(thisShell, shellIndex) => (
<IconButton
color={thisShell.id === shell.id ? undefined : 'gray'}
variant="soft"
key={thisShell.id}
style={{
borderTopLeftRadius: shellIndex === 0 ? undefined : 0,
borderBottomLeftRadius:
shellIndex === 0 ? undefined : 0,
borderTopRightRadius:
shellIndex ===
2024-10-07 18:45:11 -05:00
gun.gun_type!.value.base.shells.length - 1
2024-10-05 16:44:07 -05:00
? undefined
: 0,
borderBottomRightRadius:
shellIndex ===
2024-10-07 18:45:11 -05:00
gun.gun_type!.value.base.shells.length - 1
2024-10-05 16:44:07 -05:00
? undefined
: 0,
marginLeft: shellIndex === 0 ? 0 : -1,
}}
onClick={() => {
mutateCompareEphemeral((draft) => {
draft.members[index].shell = thisShell;
});
}}
>
<img
2025-01-14 19:22:41 -06:00
alt={unwrap(thisShell.name)}
2024-10-05 16:44:07 -05:00
width={16}
height={16}
src={asset(`icons/shells/${thisShell.icon}.webp`)}
/>
</IconButton>
),
)}
2024-07-12 20:38:19 -05:00
</Flex>
</Flex>
</StickyColumnHeaderCell>
))}
</Table.Row>
</Table.Header>
2024-10-13 20:49:02 -05:00
2024-07-12 20:38:19 -05:00
<Table.Body>
2025-01-16 20:14:34 -06:00
<CompareRow stats={stats} value="dpm" decimals={0} />
2025-07-31 14:12:14 -05:00
<CompareRow stats={stats} value="damage" decimals={0} />
{hasNonRegularGun && (
<CompareRow stats={stats} indent value="clipDamage" decimals={0} />
)}
<CompareRow stats={stats} value="moduleDamage" decimals={0} />
<CompareRow stats={stats} value="penetration" decimals={0} />
2024-07-12 20:38:19 -05:00
<CompareRow
stats={stats}
2025-01-16 20:14:34 -06:00
name={strings.website.tools.tankopedia.characteristics.values.reload}
2024-07-12 20:38:19 -05:00
deltaType="lowerIsBetter"
value={(stats) =>
stats.shellReload ??
stats.shellReloads!.reduce((a, b) => a + b, 0) /
stats.shellReloads!.length
}
display={(stats) =>
stats.shellReload?.toFixed(2) ??
stats.shellReloads!.map((reload) => reload.toFixed(2)).join(', ')
}
deltaNominalDisplay={(delta) => delta.toFixed(2)}
/>
{hasNonRegularGun && (
<>
<CompareRow
stats={stats}
deltaType="lowerIsBetter"
value="intraClip"
decimals={2}
/>
2025-01-16 20:14:34 -06:00
<CompareRow stats={stats} value="shells" decimals={0} />
2024-07-12 20:38:19 -05:00
</>
)}
2025-01-16 20:14:34 -06:00
<CompareRow stats={stats} value="caliber" decimals={0} />
<CompareRow stats={stats} value="shellNormalization" decimals={0} />
2024-07-12 20:38:19 -05:00
<CompareRow
stats={stats}
value="shellRicochet"
deltaType="lowerIsBetter"
decimals={0}
/>
2025-01-16 20:14:34 -06:00
<CompareRow stats={stats} value="shellVelocity" decimals={0} />
<CompareRow stats={stats} value="shellRange" decimals={0} />
<CompareRow stats={stats} value="shellCapacity" decimals={0} />
2024-07-12 20:38:19 -05:00
<CompareRow
stats={stats}
value="aimTime"
deltaType="lowerIsBetter"
decimals={2}
/>
<CompareRow
stats={stats}
value="dispersion"
deltaType="lowerIsBetter"
decimals={3}
/>
<CompareRow
stats={stats}
indent
value="dispersionMoving"
deltaType="lowerIsBetter"
decimals={3}
/>
<CompareRow
stats={stats}
indent
value="dispersionHullTraversing"
deltaType="lowerIsBetter"
decimals={3}
/>
<CompareRow
stats={stats}
indent
value="dispersionTurretTraversing"
deltaType="lowerIsBetter"
decimals={3}
/>
<CompareRow
stats={stats}
indent
value="dispersionShooting"
deltaType="lowerIsBetter"
decimals={3}
/>
<CompareRow
stats={stats}
indent
value="dispersionGunDamaged"
deltaType="lowerIsBetter"
decimals={3}
/>
2025-01-16 20:14:34 -06:00
<CompareRow stats={stats} value="gunDepression" decimals={1} />
<CompareRow stats={stats} indent value="gunElevation" decimals={1} />
2024-07-12 20:38:19 -05:00
</Table.Body>
<CompareSectionTitle>Maneuverability</CompareSectionTitle>
<Table.Body>
2025-01-16 20:14:34 -06:00
<CompareRow stats={stats} value="speedForwards" decimals={0} />
<CompareRow stats={stats} indent value="speedBackwards" decimals={0} />
<CompareRow stats={stats} value="enginePower" decimals={0} />
<CompareRow stats={stats} value="weight" decimals={1} />
<CompareRow stats={stats} value="hardTerrainCoefficient" decimals={0} />
2024-07-12 20:38:19 -05:00
<CompareRow
stats={stats}
indent
value="mediumTerrainCoefficient"
2024-07-13 14:37:42 -05:00
decimals={0}
2024-07-12 20:38:19 -05:00
/>
<CompareRow
stats={stats}
indent
value="softTerrainCoefficient"
2024-07-13 14:37:42 -05:00
decimals={0}
2024-07-12 20:38:19 -05:00
/>
2024-09-03 21:54:35 -05:00
<CompareRow
stats={stats}
value="hardTerrainCoefficientRaw"
deltaType="lowerIsBetter"
2024-09-03 21:54:35 -05:00
decimals={2}
/>
<CompareRow
stats={stats}
indent
value="mediumTerrainCoefficientRaw"
deltaType="lowerIsBetter"
2024-09-03 21:54:35 -05:00
decimals={2}
/>
<CompareRow
stats={stats}
indent
value="softTerrainCoefficientRaw"
deltaType="lowerIsBetter"
2024-09-03 21:54:35 -05:00
decimals={2}
/>
2024-07-12 20:38:19 -05:00
<CompareRow
stats={stats}
value="powerToWeightRatioHardTerrain"
decimals={1}
/>
<CompareRow
stats={stats}
indent
value="powerToWeightRatioMediumTerrain"
decimals={1}
/>
<CompareRow
stats={stats}
indent
value="powerToWeightRatioSoftTerrain"
decimals={1}
/>
2025-01-16 20:14:34 -06:00
<CompareRow stats={stats} value="turretTraverseSpeed" decimals={1} />
2024-07-12 20:38:19 -05:00
<CompareRow
stats={stats}
value="hullTraverseHardTerrain"
decimals={1}
/>
<CompareRow
stats={stats}
indent
value="hullTraverseMediumTerrain"
decimals={1}
/>
<CompareRow
stats={stats}
indent
value="hullTraverseSoftTerrain"
decimals={1}
/>
</Table.Body>
<CompareSectionTitle>Survivability</CompareSectionTitle>
<Table.Body>
2025-01-16 20:14:34 -06:00
<CompareRow stats={stats} value="health" decimals={0} />
2024-07-12 20:38:19 -05:00
<CompareRow
stats={stats}
value="fireChance"
deltaType="lowerIsBetter"
display={(stats) => (stats.fireChance * 100).toFixed(0)}
deltaNominalDisplay={(delta) => (delta * 100).toFixed(0)}
/>
2025-01-16 20:14:34 -06:00
<CompareRow stats={stats} value="viewRange" decimals={0} />
2024-07-12 20:38:19 -05:00
<CompareRow
stats={stats}
value="camouflageStill"
2024-11-09 19:33:29 -06:00
display={(stats) => (stats.camouflageStill * 100).toFixed(2)}
deltaNominalDisplay={(delta) => (delta * 100).toFixed(2)}
2024-07-12 20:38:19 -05:00
/>
<CompareRow
stats={stats}
indent
value="camouflageMoving"
2024-11-09 19:33:29 -06:00
display={(stats) => (stats.camouflageMoving * 100).toFixed(2)}
deltaNominalDisplay={(delta) => (delta * 100).toFixed(2)}
2024-07-12 20:38:19 -05:00
/>
<CompareRow
stats={stats}
indent
value="camouflageShootingStill"
2024-11-09 19:33:29 -06:00
display={(stats) => (stats.camouflageShootingStill * 100).toFixed(2)}
deltaNominalDisplay={(delta) => (delta * 100).toFixed(2)}
2024-07-12 20:38:19 -05:00
/>
<CompareRow
stats={stats}
indent
value="camouflageShootingMoving"
2024-11-09 19:33:29 -06:00
display={(stats) => (stats.camouflageShootingMoving * 100).toFixed(2)}
deltaNominalDisplay={(delta) => (delta * 100).toFixed(2)}
2024-07-12 20:38:19 -05:00
/>
<CompareRow
stats={stats}
indent
value="camouflageCaughtOnFire"
2024-11-09 19:33:29 -06:00
display={(stats) => (stats.camouflageCaughtOnFire * 100).toFixed(2)}
deltaNominalDisplay={(delta) => (delta * 100).toFixed(2)}
2024-07-12 20:38:19 -05:00
/>
<CompareRow
stats={stats}
value="volume"
deltaType="lowerIsBetter"
decimals={1}
/>
<CompareRow
stats={stats}
indent
value="width"
deltaType="lowerIsBetter"
decimals={1}
/>
<CompareRow
stats={stats}
indent
value="height"
deltaType="lowerIsBetter"
decimals={1}
/>
<CompareRow
stats={stats}
indent
value="length"
deltaType="lowerIsBetter"
decimals={1}
/>
</Table.Body>
</>
);
}