feat: migrated tankopedia search

This commit is contained in:
TrèsAbhi committed 2024-09-06 22:05:06 -05:00
1 parent 73c7bdf0c0
commit e1c8194beb
59 files changed
+146 -131

No files matched your search

BIN
View File
Binary file not shown.
-1
View File
@@ -38,7 +38,6 @@
"@resvg/resvg-js": "^2.6.2", "@resvg/resvg-js": "^2.6.2",
"@types/three": "^0.160.0", "@types/three": "^0.160.0",
"@vanilla-extract/css": "^1.15.5", "@vanilla-extract/css": "^1.15.5",
"@vanilla-extract/dynamic": "^2.1.2",
"adm-zip": "^0.5.16", "adm-zip": "^0.5.16",
"bepaint": "^0.1.0-beta.3", "bepaint": "^0.1.0-beta.3",
"csv-parse": "^5.5.6", "csv-parse": "^5.5.6",
File renamed without changes.
File renamed without changes.
File renamed without changes.
+8
View File
@@ -0,0 +1,8 @@
export const TREE_TYPES = ['researchable', 'premium', 'collector'] as const;
export const TANK_CLASSES = [
'lightTank',
'mediumTank',
'heavyTank',
'AT-SPG',
] as const;
+2
View File
@@ -1 +1,3 @@
export * from './constants';
export * from './idToRegion'; export * from './idToRegion';
export * from './resolveNearPenetration';
@@ -1,5 +1,5 @@
import { assertSecret } from '@blitzkit/core/src/blitzkit/assertSecret'; import { assertSecret } from '@blitzkit/core/src/blitzkit/assertSecret';
import { ASSETS_REPO } from '../../constants/assets'; import { ASSETS_REPO } from '../../../../src/constants/assets';
export function asset(path: string) { export function asset(path: string) {
return `https://raw.githubusercontent.com/tresabhi/${ASSETS_REPO}/${assertSecret( return `https://raw.githubusercontent.com/tresabhi/${ASSETS_REPO}/${assertSecret(
@@ -1,5 +1,5 @@
import { asset } from './asset'; import { asset } from '@blitzkit/core/src/blitzkit/asset';
import { fetchCdonLz4 } from './fetchCdonLz4'; import { fetchCdonLz4 } from '@blitzkit/core/src/blitzkit/fetchCdonLz4';
export type CamouflageDefinitions = Record< export type CamouflageDefinitions = Record<
number, number,
File renamed without changes.
@@ -1,4 +1,4 @@
import { TankFilters } from '../../../packages/website/src/stores/tankFilters'; import { TankFilters } from '../../../website/src/stores/tankFilters';
import { TankDefinition } from './tankDefinitions'; import { TankDefinition } from './tankDefinitions';
export function filterTank(filters: TankFilters, tank: TankDefinition) { export function filterTank(filters: TankFilters, tank: TankDefinition) {
@@ -1,5 +1,5 @@
import { asset } from '../../../../src/core/blitzkit/asset'; import { asset } from './asset';
import { fetchCdonLz4 } from '../../../../src/core/blitzkit/fetchCdonLz4'; import { fetchCdonLz4 } from './fetchCdonLz4';
interface GameMode { interface GameMode {
name: string; name: string;
+8
View File
@@ -1,4 +1,12 @@
export * from './assertSecret'; export * from './assertSecret';
export * from './asset';
export * from './camouflageDefinitions';
export * from './fetchCdonLz4';
export * from './filterTank';
export * from './gameDefinitions'; export * from './gameDefinitions';
export * from './modelDefinitions';
export * from './superCompress'; export * from './superCompress';
export * from './superDecompress'; export * from './superDecompress';
export * from './tankDefinitions';
export * from './tankIcon';
export * from './tankNames';
@@ -1,5 +1,4 @@
import { CrewMember, GunDefinition, ShellType, Tier } from '.'; import { CrewMember, GunDefinition, ShellType, Tier } from '.';
import { TankClass } from '../../../components/Tanks';
export const SHELL_NAMES: Record<ShellType, string> = { export const SHELL_NAMES: Record<ShellType, string> = {
ap: 'AP', ap: 'AP',
@@ -59,3 +58,15 @@ export const TIER_ROMAN_NUMERALS: Record<Tier, string> = {
9: 'IX', 9: 'IX',
10: 'X', 10: 'X',
}; };
export const flags: Record<string, string> = {
ussr: '<:ussr:1218421042033197197>',
germany: '🇩🇪',
usa: '🇺🇸',
china: '🇨🇳',
uk: '🇬🇧',
france: '🇫🇷',
japan: '🇯🇵',
european: '🇪🇺',
other: '<:other:1218421572243558482>',
};
@@ -179,14 +179,4 @@ export const tankDefinitionsArray = tankDefinitions.then((tanks) =>
); );
export type Tier = (typeof TIERS)[number]; export type Tier = (typeof TIERS)[number];
export const flags: Record<string, string> = { export * from './constants';
ussr: '<:ussr:1218421042033197197>',
germany: '🇩🇪',
usa: '🇺🇸',
china: '🇨🇳',
uk: '🇬🇧',
france: '🇫🇷',
japan: '🇯🇵',
european: '🇪🇺',
other: '<:other:1218421572243558482>',
};
@@ -1,4 +1,4 @@
import { asset } from './asset'; import { asset } from '@blitzkit/core/src/blitzkit/asset';
export function tankIcon(id: number, size: 'big' | 'small' = 'big') { export function tankIcon(id: number, size: 'big' | 'small' = 'big') {
return asset(`icons/tanks/${size}/${id}.webp`); return asset(`icons/tanks/${size}/${id}.webp`);
@@ -1,6 +1,5 @@
import { deburr } from 'lodash'; import { deburr } from 'lodash';
import { tankDefinitionsArray } from '.'; import { camouflageDefinitions, tankDefinitionsArray } from '.';
import { camouflageDefinitions } from '../camouflageDefinitions';
export const tankNames = Promise.all([ export const tankNames = Promise.all([
tankDefinitionsArray, tankDefinitionsArray,
+1
View File
@@ -20,6 +20,7 @@
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-fuzzysort": "^1.0.1", "react-fuzzysort": "^1.0.1",
"immer": "^10.1.1", "immer": "^10.1.1",
"@vanilla-extract/dynamic": "^2.1.2",
"zustand": "^4.5.5", "zustand": "^4.5.5",
"react-promise-suspense": "^0.3.4" "react-promise-suspense": "^0.3.4"
}, },
@@ -1,5 +1,13 @@
'use client'; 'use client';
import {
asset,
gameDefinitions,
TANK_CLASSES,
Tier,
TIER_ROMAN_NUMERALS,
} from '@blitzkit/core';
import strings from '@blitzkit/core/lang/en-US.json';
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'; import { times } from 'lodash';
@@ -9,12 +17,6 @@ import { ExperimentIcon } from '../../../../components/ExperimentIcon';
import { ResearchedIcon } from '../../../../components/ResearchedIcon'; import { ResearchedIcon } from '../../../../components/ResearchedIcon';
import { ScienceIcon } from '../../../../components/ScienceIcon'; import { ScienceIcon } from '../../../../components/ScienceIcon';
import { ScienceOffIcon } from '../../../../components/ScienceOffIcon'; import { ScienceOffIcon } from '../../../../components/ScienceOffIcon';
import { TANK_CLASSES } from '../../../../components/Tanks/components/Item/constants';
import { asset } from '../../../../core/blitzkit/asset';
import { gameDefinitions } from '../../../../core/blitzkit/gameDefinitions';
import { Tier } from '../../../../core/blitzkit/tankDefinitions';
import { TIER_ROMAN_NUMERALS } from '../../../../core/blitzkit/tankDefinitions/constants';
import strings from '../../../../lang/en-US.json';
import * as TankFilters from '../../../../stores/tankFilters'; import * as TankFilters from '../../../../stores/tankFilters';
interface FilterControlProps { interface FilterControlProps {
@@ -1,17 +1,15 @@
import {
asset,
modelDefinitions,
resolveNearPenetration,
TankDefinition,
tankIcon,
} from '@blitzkit/core';
import { Flex, Text } from '@radix-ui/themes'; import { Flex, Text } from '@radix-ui/themes';
import { assignInlineVars } from '@vanilla-extract/dynamic'; import { assignInlineVars } from '@vanilla-extract/dynamic';
import Link from 'next/link'; import Link from 'next/link';
import { use, useMemo } from 'react'; import { use, useMemo } from 'react';
import { classIcons } from '../../../../components/ClassIcon'; import { classIcons } from '../../../../components/ClassIcon';
import { resolveNearPenetration } from '../../../../core/blitz/resolveNearPenetration';
import { asset } from '../../../../core/blitzkit/asset';
import { modelDefinitions } from '../../../../core/blitzkit/modelDefinitions';
import { normalizeBoundingBox } from '../../../../core/blitzkit/normalizeBoundingBox';
import { resolveDpm } from '../../../../core/blitzkit/resolveDpm';
import { resolveReload } from '../../../../core/blitzkit/resolveReload';
import { TankDefinition } from '../../../../core/blitzkit/tankDefinitions';
import { tankIcon } from '../../../../core/blitzkit/tankIcon';
import { unionBoundingBox } from '../../../../core/blitzkit/unionBoundingBox';
import * as TankopediaSort from '../../../../stores/tankopediaSort'; import * as TankopediaSort from '../../../../stores/tankopediaSort';
import * as styles from './TankCard.css'; import * as styles from './TankCard.css';
@@ -139,14 +137,16 @@ export function TankCard({ tank, onSelect }: TankCardProps) {
tank.treeType === 'collector' tank.treeType === 'collector'
? 'blue' ? 'blue'
: tank.treeType === 'premium' : tank.treeType === 'premium'
? 'amber' ? 'amber'
: 'gray' : 'gray'
} }
highContrast={tank.treeType === 'researchable'} highContrast={tank.treeType === 'researchable'}
onClick={onSelect ? () => onSelect(tank) : undefined} onClick={onSelect ? () => onSelect(tank) : undefined}
className={styles.card} className={styles.card}
style={assignInlineVars({ style={assignInlineVars({
[styles.cardBackgroundVar]: `top left / contain no-repeat url(${asset(`flags/scratched/${tank.nation}.webp`)})`, [styles.cardBackgroundVar]: `top left / contain no-repeat url(${asset(
`flags/scratched/${tank.nation}.webp`,
)})`,
})} })}
> >
<Link <Link
@@ -1,26 +1,22 @@
'use client'; 'use client';
import {
TANK_CLASSES,
TankDefinition,
filterTank,
gameDefinitions,
modelDefinitions,
resolveNearPenetration,
tankDefinitions,
tankDefinitionsArray,
tankNames,
} from '@blitzkit/core';
import { Callout, Flex, FlexProps, Link, Text } from '@radix-ui/themes'; import { Callout, Flex, FlexProps, Link, Text } from '@radix-ui/themes';
import { go } from 'fuzzysort'; import { go } from 'fuzzysort';
import { times } from 'lodash'; import { times } from 'lodash';
import { Fragment, memo, use, useEffect, useMemo, useState } from 'react'; import { Fragment, memo, use, useEffect, useMemo, useState } from 'react';
import { AdMidSectionResponsive } from '../../../../../components/AdMidSectionResponsive'; import { AdMidSectionResponsive } from '../../../../../components/AdMidSectionResponsive';
import { ExperimentIcon } from '../../../../../components/ExperimentIcon'; import { ExperimentIcon } from '../../../../../components/ExperimentIcon';
import { TANK_CLASSES } from '../../../../../components/Tanks/components/Item/constants';
import { resolveNearPenetration } from '../../../../../core/blitz/resolveNearPenetration';
import { filterTank } from '../../../../../core/blitzkit/filterTank';
import { gameDefinitions } from '../../../../../core/blitzkit/gameDefinitions';
import { modelDefinitions } from '../../../../../core/blitzkit/modelDefinitions';
import { normalizeBoundingBox } from '../../../../../core/blitzkit/normalizeBoundingBox';
import { resolveDpm } from '../../../../../core/blitzkit/resolveDpm';
import { resolveReload } from '../../../../../core/blitzkit/resolveReload';
import {
TankDefinition,
tankDefinitions,
tankDefinitionsArray,
} from '../../../../../core/blitzkit/tankDefinitions';
import { tankNames } from '../../../../../core/blitzkit/tankDefinitions/tankNames';
import { unionBoundingBox } from '../../../../../core/blitzkit/unionBoundingBox';
import { useAdExempt } from '../../../../../hooks/useAdExempt'; import { useAdExempt } from '../../../../../hooks/useAdExempt';
import * as TankFilters from '../../../../../stores/tankFilters'; import * as TankFilters from '../../../../../stores/tankFilters';
import { import {
@@ -1,7 +1,7 @@
import { assertSecret } from '@blitzkit/core'; import { assertSecret } from '@blitzkit/core';
import strings from '@blitzkit/core/lang/en-US.json';
import { Button, ButtonProps, Dialog, Flex } from '@radix-ui/themes'; import { Button, ButtonProps, Dialog, Flex } from '@radix-ui/themes';
import { REGIONS } from '../../../../../../src/constants/regions'; import { REGIONS } from '../../../../../../src/constants/regions';
import strings from '../../../../../../src/lang/en-US.json';
import { Link } from '../../Link'; import { Link } from '../../Link';
import { WargamingIcon } from '../../WargamingIcon'; import { WargamingIcon } from '../../WargamingIcon';
-1
View File
@@ -1,7 +1,6 @@
import { ObjectMap, useLoader } from '@react-three/fiber'; import { ObjectMap, useLoader } from '@react-three/fiber';
import { Mesh, MeshStandardMaterial } from 'three'; import { Mesh, MeshStandardMaterial } from 'three';
import { GLTF, GLTFLoader } from 'three-stdlib'; import { GLTF, GLTFLoader } from 'three-stdlib';
import { asset } from '../core/blitzkit/asset';
const cache: Record< const cache: Record<
number, number,
+1 -3
View File
@@ -1,9 +1,7 @@
'use client'; 'use client';
import { Tier, createNextSafeStore } from '@blitzkit/core';
import { create } from 'zustand'; import { create } from 'zustand';
import { TankClass, TreeType } from '../components/Tanks';
import { Tier } from '../core/blitzkit/tankDefinitions';
import { createNextSafeStore } from '../core/zustand/createNextSafeStore';
export interface TankFilters { export interface TankFilters {
tiers: Tier[]; tiers: Tier[];
@@ -1,12 +1,10 @@
'use client'; 'use client';
import { createNextSafeStore } from '@blitzkit/core';
import { merge } from 'lodash'; import { merge } from 'lodash';
import { create } from 'zustand'; import { create } from 'zustand';
import { persist, subscribeWithSelector } from 'zustand/middleware'; import { persist, subscribeWithSelector } from 'zustand/middleware';
import { ENVIRONMENTS } from '../../app/tools/tankopedia/[id]/components/Lighting'; import { ENVIRONMENTS } from '../../app/tools/tankopedia/[id]/components/Lighting';
import { TankClass, TreeType } from '../../components/Tanks';
import { Tier } from '../../core/blitzkit/tankDefinitions';
import { createNextSafeStore } from '../../core/zustand/createNextSafeStore';
import { SORT_NAMES, TankopediaDisplay } from './constants'; import { SORT_NAMES, TankopediaDisplay } from './constants';
export type TankopediaSortBy = keyof typeof SORT_NAMES; export type TankopediaSortBy = keyof typeof SORT_NAMES;
@@ -1,7 +1,7 @@
'use client'; 'use client';
import { createNextSafeStore } from '@blitzkit/core';
import { create } from 'zustand'; import { create } from 'zustand';
import { createNextSafeStore } from '../core/zustand/createNextSafeStore';
import { import {
TankopediaSortBy, TankopediaSortBy,
TankopediaSortDirection, TankopediaSortDirection,
+1 -1
View File
@@ -1,3 +1,4 @@
import { tankIcon } from '@blitzkit/core/src/blitzkit/tankIcon';
import { clamp } from 'lodash'; import { clamp } from 'lodash';
import CommandWrapper from '../components/CommandWrapper'; import CommandWrapper from '../components/CommandWrapper';
import TitleBar from '../components/TitleBar'; import TitleBar from '../components/TitleBar';
@@ -9,7 +10,6 @@ import { mapDefinitions } from '../core/blitzkit/mapDefinitions';
import { RenderConfiguration } from '../core/blitzkit/renderConfiguration'; import { RenderConfiguration } from '../core/blitzkit/renderConfiguration';
import { tankDefinitions } from '../core/blitzkit/tankDefinitions'; import { tankDefinitions } from '../core/blitzkit/tankDefinitions';
import { TIER_ROMAN_NUMERALS } from '../core/blitzkit/tankDefinitions/constants'; import { TIER_ROMAN_NUMERALS } from '../core/blitzkit/tankDefinitions/constants';
import { tankIcon } from '../core/blitzkit/tankIcon';
import { tankAverages } from '../core/blitzstars/tankAverages'; import { tankAverages } from '../core/blitzstars/tankAverages';
import buttonLink from '../core/discord/buttonLink'; import buttonLink from '../core/discord/buttonLink';
import { createLocalizedCommand } from '../core/discord/createLocalizedCommand'; import { createLocalizedCommand } from '../core/discord/createLocalizedCommand';
@@ -1,3 +1,4 @@
import { resolveNearPenetration } from '@blitzkit/core/src/blitzkit/resolveNearPenetration';
import { useFrame } from '@react-three/fiber'; import { useFrame } from '@react-three/fiber';
import { useEffect } from 'react'; import { useEffect } from 'react';
import { MeshBasicMaterial, Object3D, ShaderMaterial, Vector2 } from 'three'; import { MeshBasicMaterial, Object3D, ShaderMaterial, Vector2 } from 'three';
@@ -6,7 +7,6 @@ import * as Duel from '../../../../../packages/website/src/stores/duel';
import * as TankopediaPersistent from '../../../../../packages/website/src/stores/tankopediaPersistent'; import * as TankopediaPersistent from '../../../../../packages/website/src/stores/tankopediaPersistent';
import { canSplash } from '../../../../core/blitz/canSplash'; import { canSplash } from '../../../../core/blitz/canSplash';
import { isExplosive } from '../../../../core/blitz/isExplosive'; import { isExplosive } from '../../../../core/blitz/isExplosive';
import { resolveNearPenetration } from '../../../../core/blitz/resolveNearPenetration';
import { resolvePenetrationCoefficient } from '../../../../core/blitz/resolvePenetrationCoefficient'; import { resolvePenetrationCoefficient } from '../../../../core/blitz/resolvePenetrationCoefficient';
import { hasEquipment } from '../../../../core/blitzkit/hasEquipment'; import { hasEquipment } from '../../../../core/blitzkit/hasEquipment';
import { jsxTree } from '../../../../core/blitzkit/jsxTree'; import { jsxTree } from '../../../../core/blitzkit/jsxTree';
@@ -1,3 +1,4 @@
import { resolveNearPenetration } from '@blitzkit/core/src/blitzkit/resolveNearPenetration';
import { useEffect } from 'react'; import { useEffect } from 'react';
import { import {
AdditiveBlending, AdditiveBlending,
@@ -8,7 +9,6 @@ import {
} from 'three'; } from 'three';
import { ArmorUserData, ExternalModuleVariant } from '../..'; import { ArmorUserData, ExternalModuleVariant } from '../..';
import * as Duel from '../../../../../../../packages/website/src/stores/duel'; import * as Duel from '../../../../../../../packages/website/src/stores/duel';
import { resolveNearPenetration } from '../../../../../../core/blitz/resolveNearPenetration';
import { resolvePenetrationCoefficient } from '../../../../../../core/blitz/resolvePenetrationCoefficient'; import { resolvePenetrationCoefficient } from '../../../../../../core/blitz/resolvePenetrationCoefficient';
import { hasEquipment } from '../../../../../../core/blitzkit/hasEquipment'; import { hasEquipment } from '../../../../../../core/blitzkit/hasEquipment';
import { jsxTree } from '../../../../../../core/blitzkit/jsxTree'; import { jsxTree } from '../../../../../../core/blitzkit/jsxTree';
@@ -1,3 +1,4 @@
import { resolveNearPenetration } from '@blitzkit/core/src/blitzkit/resolveNearPenetration';
import { useEffect } from 'react'; import { useEffect } from 'react';
import { import {
AdditiveBlending, AdditiveBlending,
@@ -9,7 +10,6 @@ import { degToRad } from 'three/src/math/MathUtils';
import { ArmorUserData } from '../..'; import { ArmorUserData } from '../..';
import * as Duel from '../../../../../../../packages/website/src/stores/duel'; import * as Duel from '../../../../../../../packages/website/src/stores/duel';
import { isExplosive } from '../../../../../../core/blitz/isExplosive'; import { isExplosive } from '../../../../../../core/blitz/isExplosive';
import { resolveNearPenetration } from '../../../../../../core/blitz/resolveNearPenetration';
import { resolvePenetrationCoefficient } from '../../../../../../core/blitz/resolvePenetrationCoefficient'; import { resolvePenetrationCoefficient } from '../../../../../../core/blitz/resolvePenetrationCoefficient';
import { hasEquipment } from '../../../../../../core/blitzkit/hasEquipment'; import { hasEquipment } from '../../../../../../core/blitzkit/hasEquipment';
import { jsxTree } from '../../../../../../core/blitzkit/jsxTree'; import { jsxTree } from '../../../../../../core/blitzkit/jsxTree';
@@ -1,3 +1,4 @@
import { resolveNearPenetration } from '@blitzkit/core/src/blitzkit/resolveNearPenetration';
import { useThree } from '@react-three/fiber'; import { useThree } from '@react-three/fiber';
import { useCallback } from 'react'; import { useCallback } from 'react';
import { import {
@@ -14,7 +15,6 @@ import { degToRad } from 'three/src/math/MathUtils';
import * as Duel from '../../../../../packages/website/src/stores/duel'; import * as Duel from '../../../../../packages/website/src/stores/duel';
import * as TankopediaEphemeral from '../../../../../packages/website/src/stores/tankopediaEphemeral'; import * as TankopediaEphemeral from '../../../../../packages/website/src/stores/tankopediaEphemeral';
import { isExplosive } from '../../../../core/blitz/isExplosive'; import { isExplosive } from '../../../../core/blitz/isExplosive';
import { resolveNearPenetration } from '../../../../core/blitz/resolveNearPenetration';
import { resolvePenetrationCoefficient } from '../../../../core/blitz/resolvePenetrationCoefficient'; import { resolvePenetrationCoefficient } from '../../../../core/blitz/resolvePenetrationCoefficient';
import { hasEquipment } from '../../../../core/blitzkit/hasEquipment'; import { hasEquipment } from '../../../../core/blitzkit/hasEquipment';
import { jsxTree } from '../../../../core/blitzkit/jsxTree'; import { jsxTree } from '../../../../core/blitzkit/jsxTree';
@@ -190,8 +190,8 @@ export function SpacedArmorSceneComponent({
shell.type === ShellType.HE shell.type === ShellType.HE
? 'blocked' ? 'blocked'
: blocked : blocked
? 'blocked' ? 'blocked'
: 'penetration', : 'penetration',
variant: layer.variant, variant: layer.variant,
}); });
} else { } else {
@@ -241,8 +241,8 @@ export function SpacedArmorSceneComponent({
shell.type === ShellType.HE && layer.type !== ArmorType.Primary shell.type === ShellType.HE && layer.type !== ArmorType.Primary
? 'blocked' ? 'blocked'
: blocked : blocked
? 'blocked' ? 'blocked'
: 'penetration', : 'penetration',
angle, angle,
}); });
} }
+1 -1
View File
@@ -1,4 +1,4 @@
import { asset } from '../core/blitzkit/asset'; import { asset } from '@blitzkit/core/src/blitzkit/asset';
interface FlagProps { interface FlagProps {
nation: string; nation: string;
+1 -1
View File
@@ -1,4 +1,4 @@
import { asset } from '../../core/blitzkit/asset'; import { asset } from '@blitzkit/core/src/blitzkit/asset';
import { GenericTankComponentButton } from './GenericTankComponentButton'; import { GenericTankComponentButton } from './GenericTankComponentButton';
import { TankComponentButtonProps } from './TankComponentButton'; import { TankComponentButtonProps } from './TankComponentButton';
+4 -4
View File
@@ -1,6 +1,6 @@
import { tankIcon } from '@blitzkit/core/src/blitzkit/tankIcon';
import { classIcons } from '../../packages/website/src/components/ClassIcon';
import { TankDefinition } from '../core/blitzkit/tankDefinitions'; import { TankDefinition } from '../core/blitzkit/tankDefinitions';
import { tankIcon } from '../core/blitzkit/tankIcon';
import { classIcons } from './ClassIcon';
import { ExperimentIcon } from './ExperimentIcon'; import { ExperimentIcon } from './ExperimentIcon';
import { Link } from './Link'; import { Link } from './Link';
import { StickyRowHeaderCell } from './StickyRowHeaderCell'; import { StickyRowHeaderCell } from './StickyRowHeaderCell';
@@ -36,8 +36,8 @@ export function TankRowHeaderCell({ tank }: TankRowHeaderCellProps) {
tank.treeType === 'collector' tank.treeType === 'collector'
? 'blue' ? 'blue'
: tank.treeType === 'premium' : tank.treeType === 'premium'
? 'amber' ? 'amber'
: 'gray' : 'gray'
} }
highContrast={tank.treeType === 'researchable'} highContrast={tank.treeType === 'researchable'}
underline="hover" underline="hover"
@@ -5,15 +5,6 @@ import {
TANK_ICONS_PREMIUM, TANK_ICONS_PREMIUM,
} from '../../../../core/blitzkit/tankDefinitions/constants'; } from '../../../../core/blitzkit/tankDefinitions/constants';
export const TREE_TYPES = ['researchable', 'premium', 'collector'] as const; // BIG TODO: REMOVE THIS AFTER LOCALIZATION
export const TANK_CLASSES = [
'lightTank',
'mediumTank',
'heavyTank',
'AT-SPG',
] as const;
export const TREE_TYPE_NAMES: Record<TreeType, string> = { export const TREE_TYPE_NAMES: Record<TreeType, string> = {
researchable: 'Tech tree', researchable: 'Tech tree',
premium: 'Premium', premium: 'Premium',
+12 -12
View File
@@ -2,6 +2,10 @@ import { amberDark, blueDark } from '@radix-ui/colors';
import { Flex, Text } from '@radix-ui/themes'; import { Flex, Text } from '@radix-ui/themes';
import { times } from 'lodash'; import { times } from 'lodash';
import { ReactNode } from 'react'; import { ReactNode } from 'react';
import { ClassHeavy } from '../../packages/website/src/components/ClassIcon/components/ClassHeavy';
import { ClassLight } from '../../packages/website/src/components/ClassIcon/components/ClassLight';
import { ClassMedium } from '../../packages/website/src/components/ClassIcon/components/ClassMedium';
import { ClassTankDestroyer } from '../../packages/website/src/components/ClassIcon/components/ClassTankDestroyer';
import { useEmbedStateCurry } from '../../packages/website/src/stores/embedState/utilities'; import { useEmbedStateCurry } from '../../packages/website/src/stores/embedState/utilities';
import { breakdownConfig } from '../app/tools/embed/configurations/breakdown'; import { breakdownConfig } from '../app/tools/embed/configurations/breakdown';
import { toRadiusVar } from '../app/tools/embed/utilities'; import { toRadiusVar } from '../app/tools/embed/utilities';
@@ -9,10 +13,6 @@ import { TankDefinition } from '../core/blitzkit/tankDefinitions';
import { previewCompositeStat } from '../core/statistics/compositeStats'; import { previewCompositeStat } from '../core/statistics/compositeStats';
import { CompositeStatsKey } from '../core/statistics/compositeStats/constants'; import { CompositeStatsKey } from '../core/statistics/compositeStats/constants';
import strings from '../lang/en-US.json'; import strings from '../lang/en-US.json';
import { ClassHeavy } from './ClassIcon/components/ClassHeavy';
import { ClassLight } from './ClassIcon/components/ClassLight';
import { ClassMedium } from './ClassIcon/components/ClassMedium';
import { ClassTankDestroyer } from './ClassIcon/components/ClassTankDestroyer';
interface BreakdownEmbedWrapperProps { interface BreakdownEmbedWrapperProps {
children: ReactNode; children: ReactNode;
@@ -62,14 +62,14 @@ export function BreakdownEmbedCard({ tank }: BreakdownEmbedCardProps) {
tank === null tank === null
? undefined ? undefined
: tank.treeType === 'researchable' || : tank.treeType === 'researchable' ||
!useState('cardTitleTypeColor') !useState('cardTitleTypeColor')
? undefined ? undefined
: { : {
color: color:
tank.treeType === 'premium' tank.treeType === 'premium'
? amberDark.amber11 ? amberDark.amber11
: blueDark.blue11, : blueDark.blue11,
}, },
}} }}
> >
<Flex align="center" gap="1"> <Flex align="center" gap="1">
+4 -1
View File
@@ -1,6 +1,9 @@
import {
PitchLimits,
YawLimits,
} from '@blitzkit/core/src/blitzkit/modelDefinitions';
import { clamp } from 'lodash'; import { clamp } from 'lodash';
import { degToRad } from 'three/src/math/MathUtils'; import { degToRad } from 'three/src/math/MathUtils';
import { PitchLimits, YawLimits } from '../blitzkit/modelDefinitions';
import { normalizeAngleRad } from '../math/normalizeAngleRad'; import { normalizeAngleRad } from '../math/normalizeAngleRad';
export function applyPitchYawLimits( export function applyPitchYawLimits(
+1 -1
View File
@@ -1,4 +1,4 @@
import { asset } from './asset'; import { asset } from '@blitzkit/core/src/blitzkit/asset';
export interface DiscoveredIdsDefinitions { export interface DiscoveredIdsDefinitions {
time: number; time: number;
+2 -2
View File
@@ -1,5 +1,5 @@
import { asset } from './asset'; import { asset } from '@blitzkit/core/src/blitzkit/asset';
import { fetchCdonLz4 } from './fetchCdonLz4'; import { fetchCdonLz4 } from '@blitzkit/core/src/blitzkit/fetchCdonLz4';
export interface MapDefinitions { export interface MapDefinitions {
[id: number]: { [id: number]: {
+1 -1
View File
@@ -1,5 +1,5 @@
import { BoundingBox } from '@blitzkit/core/src/blitzkit/modelDefinitions';
import { Vector3Tuple } from 'three'; import { Vector3Tuple } from 'three';
import { BoundingBox } from './modelDefinitions';
export function normalizeBoundingBox(boundingBox: BoundingBox) { export function normalizeBoundingBox(boundingBox: BoundingBox) {
return boundingBox.max.map( return boundingBox.max.map(
+1 -1
View File
@@ -1,4 +1,4 @@
import { ModelArmor } from './modelDefinitions'; import { ModelArmor } from '@blitzkit/core/src/blitzkit/modelDefinitions';
export function resolveArmor(armor: ModelArmor, index: number) { export function resolveArmor(armor: ModelArmor, index: number) {
const spaced = armor.spaced?.includes(index) ?? false; const spaced = armor.spaced?.includes(index) ?? false;
+1 -1
View File
@@ -1,5 +1,5 @@
import { decode } from '../protobuf/decode'; import { decode } from '../protobuf/decode';
import { asset } from './asset'; import { asset } from '@blitzkit/core/src/blitzkit/asset';
export interface Reviews { export interface Reviews {
reviews: Record<number, Review>; reviews: Record<number, Review>;
+2 -2
View File
@@ -1,6 +1,6 @@
import { TankClass } from '../../components/Tanks'; import { TankClass } from '../../components/Tanks';
import { asset } from './asset'; import { asset } from '@blitzkit/core/src/blitzkit/asset';
import { fetchCdonLz4 } from './fetchCdonLz4'; import { fetchCdonLz4 } from '@blitzkit/core/src/blitzkit/fetchCdonLz4';
export interface SkillDefinitions { export interface SkillDefinitions {
classes: Record<TankClass, string[]>; classes: Record<TankClass, string[]>;
+18 -18
View File
@@ -1,11 +1,11 @@
import { ModelDefinition } from '@blitzkit/core/src/blitzkit/modelDefinitions';
import { resolveNearPenetration } from '@blitzkit/core/src/blitzkit/resolveNearPenetration';
import { EquipmentMatrix } from '../../../packages/website/src/stores/duel'; import { EquipmentMatrix } from '../../../packages/website/src/stores/duel';
import { isExplosive } from '../blitz/isExplosive'; import { isExplosive } from '../blitz/isExplosive';
import { resolveNearPenetration } from '../blitz/resolveNearPenetration';
import { resolvePenetrationCoefficient } from '../blitz/resolvePenetrationCoefficient'; import { resolvePenetrationCoefficient } from '../blitz/resolvePenetrationCoefficient';
import { coefficient } from './coefficient'; import { coefficient } from './coefficient';
import { degressiveStat } from './degressiveStat'; import { degressiveStat } from './degressiveStat';
import { EquipmentDefinitions } from './equipmentDefinitions'; import { EquipmentDefinitions } from './equipmentDefinitions';
import { ModelDefinition } from './modelDefinitions';
import { normalizeBoundingBox } from './normalizeBoundingBox'; import { normalizeBoundingBox } from './normalizeBoundingBox';
import { progressiveStat } from './progressiveStat'; import { progressiveStat } from './progressiveStat';
import { ProvisionDefinitions } from './provisionDefinitions'; import { ProvisionDefinitions } from './provisionDefinitions';
@@ -238,10 +238,10 @@ export function tankCharacteristics(
tank.class === 'heavyTank' tank.class === 'heavyTank'
? 0.06 ? 0.06
: tank.class === 'mediumTank' : tank.class === 'mediumTank'
? 0.08 ? 0.08
: tank.class === 'lightTank' : tank.class === 'lightTank'
? 0.11 ? 0.11
: 0.04, : 0.04,
]) * coefficient([true, progressiveStat(commanderMastery)]); ]) * coefficient([true, progressiveStat(commanderMastery)]);
const fireChanceCoefficient = coefficient([hasProtectiveKit, -0.2]); const fireChanceCoefficient = coefficient([hasProtectiveKit, -0.2]);
@@ -263,8 +263,8 @@ export function tankCharacteristics(
tank.class === 'AT-SPG' tank.class === 'AT-SPG'
? 0.04 ? 0.04
: tank.class === 'heavyTank' : tank.class === 'heavyTank'
? 0.03 ? 0.03
: 0.02, : 0.02,
]), ]),
], ],
[ [
@@ -272,10 +272,10 @@ export function tankCharacteristics(
tank.class === 'heavyTank' tank.class === 'heavyTank'
? 0.02 ? 0.02
: tank.class === 'mediumTank' : tank.class === 'mediumTank'
? 0.04 ? 0.04
: tank.class === 'lightTank' : tank.class === 'lightTank'
? 0.07 ? 0.07
: 0.1, : 0.1,
], ],
); );
const camouflageCoefficientStill = sum( const camouflageCoefficientStill = sum(
@@ -287,8 +287,8 @@ export function tankCharacteristics(
tank.class === 'AT-SPG' tank.class === 'AT-SPG'
? 0.04 ? 0.04
: tank.class === 'heavyTank' : tank.class === 'heavyTank'
? 0.03 ? 0.03
: 0.02, : 0.02,
], ],
[true, crewSkills.camouflage * (3 / 100)], [true, crewSkills.camouflage * (3 / 100)],
), ),
@@ -298,10 +298,10 @@ export function tankCharacteristics(
tank.class === 'heavyTank' tank.class === 'heavyTank'
? 0.04 ? 0.04
: tank.class === 'mediumTank' : tank.class === 'mediumTank'
? 0.08 ? 0.08
: tank.class === 'lightTank' : tank.class === 'lightTank'
? 0.14 ? 0.14
: 0.2, : 0.2,
], ],
); );
+1 -1
View File
@@ -1,5 +1,5 @@
import { tankIcon } from '@blitzkit/core/src/blitzkit/tankIcon';
import { iconPng } from './iconPng'; import { iconPng } from './iconPng';
import { tankIcon } from './tankIcon';
export function tankIconPng(id: number) { export function tankIconPng(id: number) {
return iconPng(tankIcon(id)); return iconPng(tankIcon(id));
+1 -1
View File
@@ -1,5 +1,5 @@
import { BoundingBox } from '@blitzkit/core/src/blitzkit/modelDefinitions';
import { Vector3Tuple } from 'three'; import { Vector3Tuple } from 'three';
import { BoundingBox } from './modelDefinitions';
export function unionBoundingBox(a: BoundingBox, b: BoundingBox) { export function unionBoundingBox(a: BoundingBox, b: BoundingBox) {
return { return {
+12 -2
View File
@@ -37,7 +37,17 @@
"packages/website/src/components/Party3.tsx", "packages/website/src/components/Party3.tsx",
"packages/website/src/components/PageWrapper.tsx", "packages/website/src/components/PageWrapper.tsx",
"packages/core/src/blitzkit/gameDefinitions.ts", "packages/core/src/blitzkit/gameDefinitions.ts",
"packages/core/src/zustand/createNextSafeStore.tsx" "packages/core/src/zustand/createNextSafeStore.tsx",
, "packages/core/src/blitzkit/superDecompress.ts", "packages/core/src/blitzkit/superCompress.ts" ], "packages/core/src/blitzkit/superDecompress.ts",
"packages/core/src/blitzkit/superCompress.ts",
"packages/website/src/components/ClassIcon",
"packages/core/src/blitzkit/asset.ts",
"packages/core/src/blitzkit/fetchCdonLz4.ts",
"packages/core/src/blitz/resolveNearPenetration.ts",
"packages/core/src/blitzkit/modelDefinitions.ts",
"packages/core/src/blitzkit/camouflageDefinitions.ts",
"packages/core/src/blitzkit/filterTank.ts",
"packages/core/src/blitzkit/tankIcon.ts"
],
"exclude": ["node_modules/**/*", "dist", "scripts"] "exclude": ["node_modules/**/*", "dist", "scripts"]
} }