fix: some linting for new proto 2

This commit is contained in:
TrèsAbhi committed 2024-10-05 15:57:34 -05:00
1 parent 94f67e30f1
commit 79bc259565
22 files changed
+183 -163

No files matched your search

@@ -1,6 +0,0 @@
import { blitzStarsTankAverages } from '@blitzkit/core';
import { NextResponse } from 'next/server';
export async function GET() {
return NextResponse.json(await blitzStarsTankAverages);
}
@@ -1,15 +1,11 @@
import { import {
blitzStarsTankAverages,
BlitzStats, BlitzStats,
calculateWN8, calculateWN8,
filterStats,
getAccountInfo, getAccountInfo,
getClanAccountInfo, getClanAccountInfo,
getTankStats, getTankStats,
getWN8Percentile, getWN8Percentile,
StatFilters,
TankDefinition, TankDefinition,
tankDefinitions,
} from '@blitzkit/core'; } from '@blitzkit/core';
import { Locale } from 'discord.js'; import { Locale } from 'discord.js';
import { chunk } from 'lodash-es'; import { chunk } from 'lodash-es';
@@ -18,8 +14,11 @@ import { CommandWrapper } from '../../components/CommandWrapper';
import { NoData } from '../../components/NoData'; import { NoData } from '../../components/NoData';
import { TitleBar } from '../../components/TitleBar'; import { TitleBar } from '../../components/TitleBar';
import { filtersToDescription } from '../../core/blitzkit/filtersToDescription'; import { filtersToDescription } from '../../core/blitzkit/filtersToDescription';
import { tankDefinitions } from '../../core/blitzkit/nonBlockingPromises';
import { UserError } from '../../core/blitzkit/userError'; import { UserError } from '../../core/blitzkit/userError';
import { filterStats, StatFilters } from '../../core/blitzstars/filterStats';
import { getStatsInPeriod } from '../../core/blitzstars/getStatsInPeriod'; import { getStatsInPeriod } from '../../core/blitzstars/getStatsInPeriod';
import { blitzStarsTankAverages } from '../../core/blitzstars/tankAverages';
import { ResolvedPeriod } from '../../core/discord/resolvePeriodFromCommand'; import { ResolvedPeriod } from '../../core/discord/resolvePeriodFromCommand';
import { ResolvedPlayer } from '../../core/discord/resolvePlayerFromCommand'; import { ResolvedPlayer } from '../../core/discord/resolvePlayerFromCommand';
import { translator } from '../../core/localization/translator'; import { translator } from '../../core/localization/translator';
@@ -136,7 +135,7 @@ export async function renderBreakdown(
children.push( children.push(
<Breakdown.Row <Breakdown.Row
key={id} key={id}
type="summary" displayType="summary"
title={t`bot.commands.breakdown.body.total`} title={t`bot.commands.breakdown.body.total`}
stats={[ stats={[
{ {
@@ -176,7 +175,7 @@ export async function renderBreakdown(
); );
filteredOrder.forEach((id, index) => { filteredOrder.forEach((id, index) => {
const tankDefinition = awaitedTankDefinitions[id] as const tankDefinition = awaitedTankDefinitions.tanks[id] as
| TankDefinition | TankDefinition
| undefined; | undefined;
const current = orderedCurrentStats[index]; const current = orderedCurrentStats[index];
@@ -187,9 +186,9 @@ export async function renderBreakdown(
children.push( children.push(
<Breakdown.Row <Breakdown.Row
key={id} key={id}
type="tank" displayType="tank"
tankType={tankDefinition?.class} class={tankDefinition?.class}
treeType={tankDefinition?.treeType} displayType={tankDefinition?.type}
title={ title={
tankDefinition?.name ?? tankDefinition?.name ??
translate('bot.commands.breakdown.body.unknown_tank', [`${id}`]) translate('bot.commands.breakdown.body.unknown_tank', [`${id}`])
@@ -1,8 +1,8 @@
import { import {
Percentile, Percentile,
TankClass, TankClass,
TankType,
TREE_TYPE_ICONS, TREE_TYPE_ICONS,
TreeType,
} from '@blitzkit/core'; } from '@blitzkit/core';
import { createColors } from 'bepaint'; import { createColors } from 'bepaint';
import { import {
@@ -21,12 +21,12 @@ export interface RowStatItem {
} }
interface RowProps { interface RowProps {
type?: 'tank' | 'summary'; displayType?: 'tank' | 'summary';
naked?: boolean; naked?: boolean;
title: string; title: string;
minimized?: boolean; minimized?: boolean;
treeType?: TreeType; type?: TankType;
tankType?: TankClass; class?: TankClass;
color?: AccentColor | GrayColor; color?: AccentColor | GrayColor;
stats: (RowStatItem | undefined)[]; stats: (RowStatItem | undefined)[];
} }
@@ -36,10 +36,10 @@ export function Row({
stats, stats,
title, title,
minimized, minimized,
tankType, class: tankClass,
treeType,
naked = false,
type, type,
naked = false,
displayType,
}: RowProps) { }: RowProps) {
const palette = PALETTES[`${color}Dark`]; const palette = PALETTES[`${color}Dark`];
const theme = createColors(palette); const theme = createColors(palette);
@@ -70,10 +70,10 @@ export function Row({
: theme.componentInteractive, : theme.componentInteractive,
}} }}
> >
{type === 'tank' && tankType !== undefined && ( {displayType === 'tank' && tankClass !== undefined && (
<img <img
alt={tankType} alt={TankClass[tankClass]}
src={TREE_TYPE_ICONS[treeType ?? 'researchable'][tankType]} src={TREE_TYPE_ICONS[type ?? TankType.RESEARCHABLE][tankClass]}
style={{ width: 16, height: 16 }} style={{ width: 16, height: 16 }}
/> />
)} )}
@@ -81,8 +81,8 @@ export function Row({
<span <span
style={{ style={{
color: color:
type === 'tank' displayType === 'tank'
? treeType === 'collector' ? type === TankType.COLLECTOR
? theme.textLowContrast_blue ? theme.textLowContrast_blue
: treeType === 'premium' : treeType === 'premium'
? theme.textLowContrast_amber ? theme.textLowContrast_amber
+20 -14
View File
@@ -1,15 +1,16 @@
import { blitzStarsTankAverages } from './tankAverages'; import { TankClass, TankType } from '@blitzkit/core';
import { SupplementaryStats } from '@blitzkit/core/src/blitz/getAccountInfo'; import { SupplementaryStats } from '@blitzkit/core/src/blitz/getAccountInfo';
import { tankDefinitions, TreeType } from '@blitzkit/core/src/blitzkit/tankDefinitions';
import { calculateWN8 } from '@blitzkit/core/src/statistics/calculateWN8'; import { calculateWN8 } from '@blitzkit/core/src/statistics/calculateWN8';
import { BlitzStats } from '@blitzkit/core/src/statistics/compositeStats'; import { BlitzStats } from '@blitzkit/core/src/statistics/compositeStats';
import { sumAllStats } from '@blitzkit/core/src/statistics/sumAllStats'; import { sumAllStats } from '@blitzkit/core/src/statistics/sumAllStats';
import { tankDefinitions } from '../blitzkit/nonBlockingPromises';
import { blitzStarsTankAverages } from './tankAverages';
export interface StatFilters { export interface StatFilters {
nation?: string; nation?: string;
tier?: number; tier?: number;
tankType?: string; class?: TankClass;
treeType?: TreeType; type?: TankType;
tank?: number; tank?: number;
} }
@@ -23,18 +24,20 @@ export async function filterStats(
const awaitedTankDefinitions = await tankDefinitions; const awaitedTankDefinitions = await tankDefinitions;
const awaitedTankAverages = await blitzStarsTankAverages; const awaitedTankAverages = await blitzStarsTankAverages;
const filteredOrder = order.filter((id) => { const filteredOrder = order.filter((id) => {
const entry = awaitedTankDefinitions[id]; const entry = awaitedTankDefinitions.tanks[id];
return ( return (
entry && entry &&
(filters.nation === undefined || entry.nation === filters.nation) && (filters.nation === undefined || entry.nation === filters.nation) &&
(filters.tier === undefined || entry.tier === filters.tier) && (filters.tier === undefined || entry.tier === filters.tier) &&
(filters.tankType === undefined || entry.class === filters.tankType) && (filters.class === undefined || entry.class === filters.class) &&
(filters.treeType === undefined || (filters.type === undefined ||
(filters.treeType === 'collector' && entry.treeType === 'collector') || (filters.type === TankType.COLLECTOR &&
(filters.treeType === 'premium' && entry.treeType === 'premium') || entry.type === TankType.COLLECTOR) ||
(filters.treeType === 'researchable' && (filters.type === TankType.PREMIUM &&
entry.treeType === 'researchable')) && entry.type === TankType.PREMIUM) ||
(filters.type === TankType.RESEARCHABLE &&
entry.type === TankType.RESEARCHABLE)) &&
(filters.tank === undefined || entry.id === filters.tank) (filters.tank === undefined || entry.id === filters.tank)
); );
}); });
@@ -46,7 +49,9 @@ export async function filterStats(
); );
const battlesOfTanksWithTankDefinition = filteredOrder.reduce<number>( const battlesOfTanksWithTankDefinition = filteredOrder.reduce<number>(
(accumulator, id) => (accumulator, id) =>
awaitedTankDefinitions[id] ? accumulator + diff[id].battles : accumulator, awaitedTankDefinitions.tanks[id]
? accumulator + diff[id].battles
: accumulator,
0, 0,
); );
const supplementary = { const supplementary = {
@@ -63,8 +68,9 @@ export async function filterStats(
tier: tier:
filteredOrder.reduce<number>( filteredOrder.reduce<number>(
(accumulator, id) => (accumulator, id) =>
awaitedTankDefinitions[id] awaitedTankDefinitions.tanks[id]
? accumulator + awaitedTankDefinitions[id]!.tier * diff[id].battles ? accumulator +
awaitedTankDefinitions.tanks[id]!.tier * diff[id].battles
: accumulator, : accumulator,
0, 0,
) / battlesOfTanksWithTankDefinition, ) / battlesOfTanksWithTankDefinition,
@@ -1,10 +1,6 @@
import { import { BlitzStats, emptyAllStats, Region } from '@blitzkit/core';
BlitzStats,
DiffedTankStats,
emptyAllStats,
Region,
} from '@blitzkit/core';
import { Locale } from 'discord.js'; import { Locale } from 'discord.js';
import { DiffedTankStats } from './filterStats';
import { import {
getTankHistories, getTankHistories,
TankHistories, TankHistories,
+9 -8
View File
@@ -52,17 +52,18 @@
}, },
"tank_class_short": { "tank_class_short": {
"lightTank": "Light", "0": "Light",
"mediumTank": "Medium", "1": "Medium",
"heavyTank": "Heavy", "2": "Heavy",
"AT-SPG": "TD" "3": "TD"
}, },
"tank_class_medium": { "tank_class_medium": {
"lightTank": "Light", "-1": "unrecognized",
"mediumTank": "Medium", "0": "Light",
"heavyTank": "Heavy", "1": "Medium",
"AT-SPG": "Tank destroyer" "2": "Heavy",
"3": "Tank destroyer"
}, },
"tree_type": { "tree_type": {
+4 -4
View File
@@ -4,10 +4,10 @@ import { BlitzStats } from '../statistics';
export const TREE_TYPES = ['researchable', 'premium', 'collector'] as const; export const TREE_TYPES = ['researchable', 'premium', 'collector'] as const;
export const TANK_CLASSES = [ export const TANK_CLASSES = [
TankClass.TANK_CLASS_LIGHT, TankClass.LIGHT,
TankClass.TANK_CLASS_MEDIUM, TankClass.MEDIUM,
TankClass.TANK_CLASS_HEAVY, TankClass.HEAVY,
TankClass.TANK_CLASS_TANK_DESTROYER, TankClass.TANK_DESTROYER,
TankClass.UNRECOGNIZED, TankClass.UNRECOGNIZED,
] as const; ] as const;
@@ -6,6 +6,7 @@ export interface DiscoveredIdsDefinitions {
count: number; count: number;
} }
export const discoveredIdsDefinitions = fetch(asset('ids/manifest.json')).then( export async function fetchDiscoveredIdsDefinitions() {
(response) => response.json() as Promise<DiscoveredIdsDefinitions>, const response = await fetch(asset('ids/manifest.json'));
); return response.json() as Promise<DiscoveredIdsDefinitions>;
}
+1 -1
View File
@@ -9,7 +9,7 @@ export * from './consumableDefinitions';
// export * from './context'; // export * from './context';
export * from './createDefaultSkills'; export * from './createDefaultSkills';
export * from './degressiveStat'; export * from './degressiveStat';
// export * from './discoveredIdDefinitions'; export * from './discoveredIdDefinitions';
// export * from './emblemURL'; // export * from './emblemURL';
export * from './equipmentDefinitions'; export * from './equipmentDefinitions';
export * from './eventManager'; export * from './eventManager';
@@ -2,12 +2,15 @@ import { BoundingBox } from '@blitzkit/core';
export function unionBoundingBox(a: BoundingBox, b: BoundingBox) { export function unionBoundingBox(a: BoundingBox, b: BoundingBox) {
return { return {
// min: a.min.map((a, index) => Math.min(a, b.min[index])) as Vector3Tuple,
// max: a.max.map((a, index) => Math.max(a, b.max[index])) as Vector3Tuple,
min: { min: {
x: Math.min(a.min.x, b.min.x), x: Math.min(a.min.x, b.min.x),
y: Math.min(a.min.y, b.min.y), y: Math.min(a.min.y, b.min.y),
z: Math.min(a.min.z, b.min.z), z: Math.min(a.min.z, b.min.z),
}, },
max: {
x: Math.max(a.max.x, b.max.x),
y: Math.max(a.max.y, b.max.y),
z: Math.max(a.max.z, b.max.z),
},
} satisfies BoundingBox; } satisfies BoundingBox;
} }
+1 -1
View File
@@ -28,7 +28,7 @@ const files = filesRaw.filter((file) => file.endsWith('.proto'));
const args = [ const args = [
`--plugin=./node_modules/.bin/protoc-gen-ts_proto${executableFileExtension}`, `--plugin=./node_modules/.bin/protoc-gen-ts_proto${executableFileExtension}`,
'--ts_proto_opt=esModuleInterop=true', '--ts_proto_opt=esModuleInterop=true',
'--ts_proto_opt=oneof=unions', '--ts_proto_opt=oneof=unions-value',
'--ts_proto_opt=removeEnumPrefix=true', '--ts_proto_opt=removeEnumPrefix=true',
'--ts_proto_out=.', '--ts_proto_out=.',
...files.map((file) => `${ROOT}/${file}`), ...files.map((file) => `${ROOT}/${file}`),
@@ -1,4 +1,4 @@
import { type TankDefinition, tankIcon } from '@blitzkit/core'; import { type TankDefinition, tankIcon, TankType } from '@blitzkit/core';
import { Link } from '@radix-ui/themes'; import { Link } from '@radix-ui/themes';
import { classIcons } from './ClassIcon'; import { classIcons } from './ClassIcon';
import { ExperimentIcon } from './ExperimentIcon'; import { ExperimentIcon } from './ExperimentIcon';
@@ -32,13 +32,13 @@ export function TankRowHeaderCell({ tank }: TankRowHeaderCellProps) {
<Link <Link
color={ color={
tank.treeType === 'collector' tank.type === TankType.COLLECTOR
? 'blue' ? 'blue'
: tank.treeType === 'premium' : tank.type === TankType.PREMIUM
? 'amber' ? 'amber'
: 'gray' : 'gray'
} }
highContrast={tank.treeType === 'researchable'} highContrast={tank.type === TankType.RESEARCHABLE}
underline="hover" underline="hover"
wrap="nowrap" wrap="nowrap"
href={`/tools/tankopedia/${tank.id}`} href={`/tools/tankopedia/${tank.id}`}
@@ -1,6 +1,6 @@
import { import {
asset, asset,
gameDefinitions, fetchGameDefinitions,
TANK_CLASSES, TANK_CLASSES,
TIER_ROMAN_NUMERALS, TIER_ROMAN_NUMERALS,
type Tier, type Tier,
@@ -10,7 +10,6 @@ import { useStore } from '@nanostores/react';
import { ReloadIcon } from '@radix-ui/react-icons'; import { ReloadIcon } from '@radix-ui/react-icons';
import { Box, Flex, IconButton, Text, Tooltip } from '@radix-ui/themes'; import { Box, Flex, IconButton, Text, Tooltip } from '@radix-ui/themes';
import { times } from 'lodash-es'; import { times } from 'lodash-es';
import { useAwait } from '../../../hooks/useAwait';
import { $tankFilters, initialTankFilters } from '../../../stores/tankFilters'; import { $tankFilters, initialTankFilters } from '../../../stores/tankFilters';
import { classIcons } from '../../ClassIcon'; import { classIcons } from '../../ClassIcon';
import { ExperimentIcon } from '../../ExperimentIcon'; import { ExperimentIcon } from '../../ExperimentIcon';
@@ -22,8 +21,9 @@ interface FilterControlProps {
compact?: boolean; compact?: boolean;
} }
const gameDefinitions = await fetchGameDefinitions();
export function FilterControl({ compact }: FilterControlProps) { export function FilterControl({ compact }: FilterControlProps) {
const awaitedGameDefinitions = useAwait(gameDefinitions);
const tankFilters = useStore($tankFilters); const tankFilters = useStore($tankFilters);
return ( return (
@@ -126,8 +126,8 @@ export function FilterControl({ compact }: FilterControlProps) {
style={{ borderRadius: 'var(--radius-5)' }} style={{ borderRadius: 'var(--radius-5)' }}
> >
<Flex direction={compact ? 'column' : { sm: 'row', initial: 'column' }}> <Flex direction={compact ? 'column' : { sm: 'row', initial: 'column' }}>
{awaitedGameDefinitions.nations {gameDefinitions.nations
.slice(0, Math.ceil(awaitedGameDefinitions.nations.length / 2)) .slice(0, Math.ceil(gameDefinitions.nations.length / 2))
.map((nation) => { .map((nation) => {
const selected = tankFilters.nations?.includes(nation); const selected = tankFilters.nations?.includes(nation);
@@ -180,8 +180,8 @@ export function FilterControl({ compact }: FilterControlProps) {
})} })}
</Flex> </Flex>
<Flex direction={compact ? 'column' : { sm: 'row', initial: 'column' }}> <Flex direction={compact ? 'column' : { sm: 'row', initial: 'column' }}>
{awaitedGameDefinitions.nations {gameDefinitions.nations
.slice(Math.ceil(awaitedGameDefinitions.nations.length / 2)) .slice(Math.ceil(gameDefinitions.nations.length / 2))
.map((nation) => { .map((nation) => {
const selected = tankFilters.nations?.includes(nation); const selected = tankFilters.nations?.includes(nation);
@@ -1,7 +1,7 @@
import type { TreeType } from '@blitzkit/core'; import { TankType } from '@blitzkit/core';
export const treeTypeOrder: TreeType[] = [ export const treeTypeOrder = [
'researchable', TankType.RESEARCHABLE,
'premium', TankType.PREMIUM,
'collector', TankType.COLLECTOR,
]; ];
@@ -7,7 +7,6 @@ import {
normalizeBoundingBox, normalizeBoundingBox,
resolveDpm, resolveDpm,
resolveGun, resolveGun,
resolveNearPenetration,
unionBoundingBox, unionBoundingBox,
type TankDefinition, type TankDefinition,
} from '@blitzkit/core'; } from '@blitzkit/core';
@@ -96,7 +95,7 @@ export const TankSearch = memo<TankSearchProps>(
case 'survivability.viewRange': case 'survivability.viewRange':
sorted = filtered.sort( sorted = filtered.sort(
(a, b) => (a, b) =>
a.turrets.at(-1)!.view_range - b.turrets.at(-1)!.view_range, a.turrets.at(-1)!.viewRange - b.turrets.at(-1)!.viewRange,
); );
break; break;
@@ -153,8 +152,8 @@ export const TankSearch = memo<TankSearchProps>(
case 'survivability.length': case 'survivability.length':
sorted = filtered.sort((a, b) => { sorted = filtered.sort((a, b) => {
const aTankModelDefinition = modelDefinitions[a.id]; const aTankModelDefinition = modelDefinitions.models[a.id];
const bTankModelDefinition = modelDefinitions[b.id]; const bTankModelDefinition = modelDefinitions.models[b.id];
const aTurretModelDefinition = const aTurretModelDefinition =
aTankModelDefinition.turrets[a.turrets.at(-1)!.id]; aTankModelDefinition.turrets[a.turrets.at(-1)!.id];
const bTurretModelDefinition = const bTurretModelDefinition =
@@ -183,11 +182,11 @@ export const TankSearch = memo<TankSearchProps>(
(a, b) => (a, b) =>
resolveDpm( resolveDpm(
a.turrets.at(-1)!.guns.at(-1)!, a.turrets.at(-1)!.guns.at(-1)!,
a.turrets.at(-1)!.guns.at(-1)!.shells[0], a.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.shells[0],
) - ) -
resolveDpm( resolveDpm(
b.turrets.at(-1)!.guns.at(-1)!, b.turrets.at(-1)!.guns.at(-1)!,
b.turrets.at(-1)!.guns.at(-1)!.shells[0], b.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.shells[0],
), ),
); );
break; break;
@@ -195,16 +194,18 @@ export const TankSearch = memo<TankSearchProps>(
case 'fire.dpmPremium': case 'fire.dpmPremium':
sorted = filtered.sort( sorted = filtered.sort(
(a, b) => (a, b) =>
(a.turrets.at(-1)!.guns.at(-1)!.shells[1] (a.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.shells[1]
? resolveDpm( ? resolveDpm(
a.turrets.at(-1)!.guns.at(-1)!, a.turrets.at(-1)!.guns.at(-1)!,
a.turrets.at(-1)!.guns.at(-1)!.shells[1], a.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun
.shells[1],
) )
: 0) - : 0) -
(b.turrets.at(-1)!.guns.at(-1)!.shells[1] (b.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.shells[1]
? resolveDpm( ? resolveDpm(
b.turrets.at(-1)!.guns.at(-1)!, b.turrets.at(-1)!.guns.at(-1)!,
b.turrets.at(-1)!.guns.at(-1)!.shells[1], b.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun
.shells[1],
) )
: 0), : 0),
); );
@@ -221,112 +222,118 @@ export const TankSearch = memo<TankSearchProps>(
case 'fire.caliber': case 'fire.caliber':
sorted = filtered.sort( sorted = filtered.sort(
(a, b) => (a, b) =>
a.turrets.at(-1)!.guns.at(-1)!.shells[0].caliber - a.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.shells[0]
b.turrets.at(-1)!.guns.at(-1)!.shells[0].caliber, .caliber -
b.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.shells[0]
.caliber,
); );
break; break;
case 'fire.standardPenetration': case 'fire.standardPenetration':
sorted = filtered.sort( sorted = filtered.sort(
(a, b) => (a, b) =>
resolveNearPenetration( a.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.shells[0]
a.turrets.at(-1)!.guns.at(-1)!.shells[0].penetration, .penetration.near -
) - b.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.shells[0]
resolveNearPenetration( .penetration.near,
b.turrets.at(-1)!.guns.at(-1)!.shells[0].penetration,
),
); );
break; break;
case 'fire.premiumPenetration': case 'fire.premiumPenetration':
sorted = filtered.sort( sorted = filtered.sort(
(a, b) => (a, b) =>
resolveNearPenetration( (a.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.shells[1]
a.turrets.at(-1)!.guns.at(-1)!.shells[1]?.penetration ?? 0, ?.penetration.near ?? 0) -
) - (b.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.shells[1]
resolveNearPenetration( ?.penetration.near ?? 0),
b.turrets.at(-1)!.guns.at(-1)!.shells[1]?.penetration ?? 0,
),
); );
break; break;
case 'fire.damage': case 'fire.damage':
sorted = filtered.sort( sorted = filtered.sort(
(a, b) => (a, b) =>
a.turrets.at(-1)!.guns.at(-1)!.shells[0].damage.armor - a.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.shells[0]
b.turrets.at(-1)!.guns.at(-1)!.shells[0].damage.armor, .armorDamage -
b.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.shells[0]
.armorDamage,
); );
break; break;
case 'fire.shellVelocity': case 'fire.shellVelocity':
sorted = filtered.sort( sorted = filtered.sort(
(a, b) => (a, b) =>
a.turrets.at(-1)!.guns.at(-1)!.shells[0].speed - a.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.shells[0]
b.turrets.at(-1)!.guns.at(-1)!.shells[0].speed, .velocity -
b.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.shells[0]
.velocity,
); );
break; break;
case 'fire.aimTime': case 'fire.aimTime':
sorted = filtered.sort( sorted = filtered.sort(
(a, b) => (a, b) =>
a.turrets.at(-1)!.guns.at(-1)!.aimTime - a.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.aimTime -
b.turrets.at(-1)!.guns.at(-1)!.aimTime, b.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.aimTime,
); );
break; break;
case 'fire.dispersionStill': case 'fire.dispersionStill':
sorted = filtered.sort( sorted = filtered.sort(
(a, b) => (a, b) =>
a.turrets.at(-1)!.guns.at(-1)!.dispersion.base - a.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun
b.turrets.at(-1)!.guns.at(-1)!.dispersion.base, .dispersionBase -
b.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun
.dispersionBase,
); );
break; break;
case 'fire.dispersionMoving': case 'fire.dispersionMoving':
sorted = filtered.sort( sorted = filtered.sort(
(a, b) => (a, b) =>
a.tracks.at(-1)!.dispersion.move - a.tracks.at(-1)!.dispersionMove -
b.tracks.at(-1)!.dispersion.move, b.tracks.at(-1)!.dispersionMove,
); );
break; break;
case 'fire.gunDepression': case 'fire.gunDepression':
sorted = filtered.sort( sorted = filtered.sort(
(a, b) => (a, b) =>
modelDefinitions[a.id].turrets[a.turrets.at(-1)!.id].guns[ modelDefinitions.models[a.id].turrets[a.turrets.at(-1)!.id]
a.turrets.at(-1)!.guns.at(-1)!.id .guns[a.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.id]
].pitch.max + .pitch.max +
(modelDefinitions[a.id].turretRotation?.pitch ?? 0) - (modelDefinitions.models[a.id].initialTurretRotation?.pitch ??
modelDefinitions[b.id].turrets[b.turrets.at(-1)!.id].guns[ 0) -
b.turrets.at(-1)!.guns.at(-1)!.id modelDefinitions.models[b.id].turrets[b.turrets.at(-1)!.id]
].pitch.max - .guns[b.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.id]
(modelDefinitions[b.id].turretRotation?.pitch ?? 0), .pitch.max -
(modelDefinitions.models[b.id].initialTurretRotation?.pitch ??
0),
); );
break; break;
case 'fire.gunElevation': case 'fire.gunElevation':
sorted = filtered.sort( sorted = filtered.sort(
(a, b) => (a, b) =>
modelDefinitions[b.id].turrets[b.turrets.at(-1)!.id].guns[ modelDefinitions.models[b.id].turrets[b.turrets.at(-1)!.id]
b.turrets.at(-1)!.guns.at(-1)!.id .guns[b.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.id]
].pitch.min + .pitch.min +
(modelDefinitions[b.id].turretRotation?.pitch ?? 0) - (modelDefinitions.models[b.id].initialTurretRotation?.pitch ??
modelDefinitions[a.id].turrets[a.turrets.at(-1)!.id].guns[ 0) -
a.turrets.at(-1)!.guns.at(-1)!.id modelDefinitions.models[a.id].turrets[a.turrets.at(-1)!.id]
].pitch.min - .guns[a.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.id]
(modelDefinitions[a.id].turretRotation?.pitch ?? 0), .pitch.min -
(modelDefinitions.models[a.id].initialTurretRotation?.pitch ??
0),
); );
break; break;
case 'maneuverability.forwardsSpeed': case 'maneuverability.forwardsSpeed':
sorted = filtered.sort( sorted = filtered.sort((a, b) => a.speedForwards - b.speedForwards);
(a, b) => a.speed.forwards - b.speed.forwards,
);
break; break;
case 'maneuverability.backwardsSpeed': case 'maneuverability.backwardsSpeed':
sorted = filtered.sort( sorted = filtered.sort(
(a, b) => a.speed.backwards - b.speed.backwards, (a, b) => a.speedBackwards - b.speedBackwards,
); );
break; break;
@@ -344,13 +351,13 @@ export const TankSearch = memo<TankSearchProps>(
a.engines.at(-1)!.weight + a.engines.at(-1)!.weight +
a.tracks.at(-1)!.weight + a.tracks.at(-1)!.weight +
a.turrets.at(-1)!.weight + a.turrets.at(-1)!.weight +
a.turrets.at(-1)!.guns.at(-1)!.weight) - a.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.weight) -
b.engines.at(-1)!.power / b.engines.at(-1)!.power /
(b.weight + (b.weight +
b.engines.at(-1)!.weight + b.engines.at(-1)!.weight +
b.tracks.at(-1)!.weight + b.tracks.at(-1)!.weight +
b.turrets.at(-1)!.weight + b.turrets.at(-1)!.weight +
b.turrets.at(-1)!.guns.at(-1)!.weight), b.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.weight),
); );
break; break;
@@ -361,12 +368,12 @@ export const TankSearch = memo<TankSearchProps>(
a.engines.at(-1)!.weight + a.engines.at(-1)!.weight +
a.tracks.at(-1)!.weight + a.tracks.at(-1)!.weight +
a.turrets.at(-1)!.weight + a.turrets.at(-1)!.weight +
a.turrets.at(-1)!.guns.at(-1)!.weight - a.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.weight -
(b.weight + (b.weight +
b.engines.at(-1)!.weight + b.engines.at(-1)!.weight +
b.tracks.at(-1)!.weight + b.tracks.at(-1)!.weight +
b.turrets.at(-1)!.weight + b.turrets.at(-1)!.weight +
b.turrets.at(-1)!.guns.at(-1)!.weight), b.turrets.at(-1)!.guns.at(-1)!.gunType!.value.gun.weight),
); );
break; break;
@@ -386,7 +393,7 @@ export const TankSearch = memo<TankSearchProps>(
keys: ['searchableName', 'searchableNameDeburr', 'camouflages'], keys: ['searchableName', 'searchableNameDeburr', 'camouflages'],
}); });
const searchedTanks = searchedRaw.map( const searchedTanks = searchedRaw.map(
(result) => tankDefinitions[result.obj.id], (result) => tankDefinitions.tanks[result.obj.id],
); );
return searchedTanks; return searchedTanks;
} }
+7 -4
View File
@@ -1,12 +1,15 @@
import { CompositeStatsKey } from '@blitzkit/core'; import type { CompositeStatsKey } from '@blitzkit/core';
import { grayA, grayDark, grayDarkA } from '@radix-ui/colors'; import { grayA, grayDark, grayDarkA } from '@radix-ui/colors';
import { ReactNode } from 'react'; import type { ReactNode } from 'react';
import { import {
BreakdownPreview, BreakdownPreview,
compositeStatsKeysOptions, compositeStatsKeysOptions,
} from '../../../website-legacy/src/app/tools/embed/configurations/breakdown'; } from '../../../website-legacy/src/app/tools/embed/configurations/breakdown';
import { EmbedConfig, ExtractEmbedConfigTypes } from '../../../website-legacy/src/stores/embedState'; import type {
import { EmbedItemType } from '../../../website-legacy/src/stores/embedState/constants'; EmbedConfig,
ExtractEmbedConfigTypes,
} from '../stores/embedState';
import { EmbedItemType } from '../stores/embedState/constants';
export const breakdownConfig = { export const breakdownConfig = {
width: { type: EmbedItemType.Slider, default: 320, min: 128, max: 640 }, width: { type: EmbedItemType.Slider, default: 320, min: 128, max: 640 },
@@ -6,7 +6,7 @@ export function filterTank(filters: TankFilters, tank: TankDefinition) {
(filters.tiers.length === 0 || filters.tiers.includes(tank.tier)) && (filters.tiers.length === 0 || filters.tiers.includes(tank.tier)) &&
(filters.nations.length === 0 || filters.nations.includes(tank.nation)) && (filters.nations.length === 0 || filters.nations.includes(tank.nation)) &&
(filters.classes.length === 0 || filters.classes.includes(tank.class)) && (filters.classes.length === 0 || filters.classes.includes(tank.class)) &&
(filters.types.length === 0 || filters.types.includes(tank.treeType)) && (filters.types.length === 0 || filters.types.includes(tank.type)) &&
(filters.testing === 'include' || (filters.testing === 'include' ||
(filters.testing === 'only' && tank.testing) || (filters.testing === 'only' && tank.testing) ||
(filters.testing === 'exclude' && !tank.testing)) (filters.testing === 'exclude' && !tank.testing))
@@ -1,13 +1,19 @@
import type { GunDefinition } from '@blitzkit/core'; import type { GunDefinition } from '@blitzkit/core';
export function resolveReload(gun: GunDefinition) { export function resolveReload(gun: GunDefinition) {
if (gun.type === 'regular') { if (gun.gunType!.$case === 'regular') {
return gun.reload; return gun.gunType!.value.regular.reload;
} else if (gun.type === 'autoLoader') { } else if (gun.gunType!.$case === 'autoLoader') {
return gun.reload + (gun.count - 1) * gun.intraClip; return (
gun.gunType!.value.autoLoader.clipReload +
(gun.gunType!.value.autoLoader.shellCount - 1) *
gun.gunType!.value.autoLoader.intraClip
);
} else { } else {
return ( return (
gun.reload.reduce((a, b) => a + b, 0) + (gun.count - 1) * gun.intraClip gun.gunType!.value.autoReloader.shellReloads.reduce((a, b) => a + b, 0) +
(gun.gunType!.value.autoReloader.shellCount - 1) *
gun.gunType!.value.autoReloader.intraClip
); );
} }
} }
@@ -1,6 +1,6 @@
import type { ModelArmor } from '@blitzkit/core'; import type { Armor } from '@blitzkit/core';
export function resolveArmor(armor: ModelArmor, index: number) { export function resolveArmor(armor: Armor, index: number) {
const spaced = armor.spaced?.includes(index) ?? false; const spaced = armor.spaced?.includes(index) ?? false;
const thickness = index === -1 ? 0 : (armor.thickness[index] ?? 0); const thickness = index === -1 ? 0 : (armor.thickness[index] ?? 0);
@@ -1,12 +1,12 @@
import { EquipmentPreset } from '@blitzkit/core'; import { EquipmentPreset } from '@blitzkit/core';
import { EquipmentMatrix } from '../stores/duel'; import type { EquipmentMatrix } from '../stores/duel';
export function useAppliedEquipments( export function useAppliedEquipments(
matrix: EquipmentMatrix, matrix: EquipmentMatrix,
preset: EquipmentPreset, preset: EquipmentPreset,
) { ) {
const flatMatrix = matrix.flat(); const flatMatrix = matrix.flat();
return preset return preset.slots.map(
.flat() (options, index) => options[flatMatrix[index] == 1 ? 'right' : 'left'],
.map((options, index) => options[flatMatrix[index] == 1 ? 1 : 0]); );
} }
@@ -1,7 +1,10 @@
import { averageDefinitions, discoveredIdsDefinitions } from '@blitzkit/core'; import {
fetchAverageDefinitions,
fetchDiscoveredIdsDefinitions,
} from '@blitzkit/core';
const awaitedDiscoveredIdsDefinitions = await discoveredIdsDefinitions; const awaitedDiscoveredIdsDefinitions = await fetchDiscoveredIdsDefinitions();
const awaitedAverageDefinitions = await averageDefinitions; const awaitedAverageDefinitions = await fetchAverageDefinitions();
export function useAveragesExclusionRatio() { export function useAveragesExclusionRatio() {
return ( return (
@@ -1,7 +1,8 @@
import { equipmentDefinitions } from '@blitzkit/core'; import { fetchEquipmentDefinitions } from '@blitzkit/core';
import { useAwait } from './useAwait'; import { useAwait } from './useAwait';
const equipmentDefinitions = useAwait(fetchEquipmentDefinitions());
export function useEquipmentPreset(preset: string) { export function useEquipmentPreset(preset: string) {
const awaitedEquipmentDefinitions = useAwait(equipmentDefinitions); return equipmentDefinitions.presets[preset];
return awaitedEquipmentDefinitions.presets[preset];
} }