From e1c8194beb959c6665a6861e74a78fd8099954e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Fri, 6 Sep 2024 22:05:06 -0500 Subject: [PATCH] feat: migrated tankopedia search --- bun.lockb | Bin 196124 -> 196531 bytes package.json | 1 - {src => packages/core}/lang/en-US.json | 0 {src => packages/core}/lang/es-ES.json | 0 {src => packages/core}/lang/hr.json | 0 packages/core/src/blitz/constants.ts | 8 ++++ packages/core/src/blitz/index.ts | 2 + .../core/src}/blitz/resolveNearPenetration.ts | 0 .../core/src}/blitzkit/asset.ts | 2 +- .../src}/blitzkit/camouflageDefinitions.ts | 4 +- .../core/src}/blitzkit/fetchCdonLz4.ts | 0 .../core/src}/blitzkit/filterTank.ts | 2 +- packages/core/src/blitzkit/gameDefinitions.ts | 4 +- packages/core/src/blitzkit/index.ts | 8 ++++ .../core/src}/blitzkit/modelDefinitions.ts | 0 .../blitzkit/tankDefinitions/constants.ts | 13 ++++++- .../src}/blitzkit/tankDefinitions/index.ts | 12 +----- .../core/src}/blitzkit/tankIcon.ts | 2 +- .../core/src/blitzkit}/tankNames.ts | 3 +- packages/website/package.json | 1 + .../tankopedia/components/FilterControl.tsx | 14 ++++--- .../tools/tankopedia/components/TankCard.tsx | 24 ++++++------ .../components/TankSearch/index.tsx | 26 ++++++------- .../ClassIcon/components/ClassHeavy.tsx | 0 .../ClassIcon/components/ClassLight.tsx | 0 .../ClassIcon/components/ClassMedium.tsx | 0 .../components/ClassTankDestroyer.tsx | 0 .../src}/components/ClassIcon/index.ts | 0 .../src}/components/ExperimentIcon.tsx | 0 .../components/WargamingLoginButton.tsx | 2 +- .../src}/components/ResearchedIcon.tsx | 0 .../website/src}/components/ScienceIcon.tsx | 0 .../src}/components/ScienceOffIcon.tsx | 0 .../website/src}/components/VerifiedIcon.tsx | 0 packages/website/src/hooks/useModel.ts | 1 - packages/website/src/stores/tankFilters.ts | 4 +- .../src/stores/tankopediaPersistent/index.ts | 4 +- packages/website/src/stores/tankopediaSort.ts | 2 +- src/commands/replay.tsx | 2 +- .../PrimaryArmorSceneComponent/index.tsx | 2 +- .../SpacedArmorSubExternal/index.tsx | 2 +- .../components/SpacedArmorSubSpaced/index.tsx | 2 +- .../SpacedArmorSceneComponent/index.tsx | 10 ++--- src/components/Flag.tsx | 2 +- src/components/ModuleButtons/ShellButton.tsx | 2 +- src/components/TankRowHeaderCell.tsx | 8 ++-- .../Tanks/components/Item/constants.ts | 9 ----- src/components/TanksEmbed.tsx | 24 ++++++------ src/core/blitz/applyPitchYawLimits.ts | 5 ++- src/core/blitzkit/discoveredIdDefinitions.ts | 2 +- src/core/blitzkit/mapDefinitions.ts | 4 +- src/core/blitzkit/normalizeBoundingBox.ts | 2 +- src/core/blitzkit/resolveThickness.ts | 2 +- src/core/blitzkit/reviews.ts | 2 +- src/core/blitzkit/skillDefinitions.ts | 4 +- src/core/blitzkit/tankCharacteristics.ts | 36 +++++++++--------- src/core/blitzkit/tankIconPng.ts | 2 +- src/core/blitzkit/unionBoundingBox.ts | 2 +- tsconfig.json | 14 ++++++- 59 files changed, 146 insertions(+), 131 deletions(-) rename {src => packages/core}/lang/en-US.json (100%) rename {src => packages/core}/lang/es-ES.json (100%) rename {src => packages/core}/lang/hr.json (100%) create mode 100644 packages/core/src/blitz/constants.ts rename {src/core => packages/core/src}/blitz/resolveNearPenetration.ts (100%) rename {src/core => packages/core/src}/blitzkit/asset.ts (79%) rename {src/core => packages/core/src}/blitzkit/camouflageDefinitions.ts (67%) rename {src/core => packages/core/src}/blitzkit/fetchCdonLz4.ts (100%) rename {src/core => packages/core/src}/blitzkit/filterTank.ts (88%) rename {src/core => packages/core/src}/blitzkit/modelDefinitions.ts (100%) rename {src/core => packages/core/src}/blitzkit/tankDefinitions/constants.ts (85%) rename {src/core => packages/core/src}/blitzkit/tankDefinitions/index.ts (93%) rename {src/core => packages/core/src}/blitzkit/tankIcon.ts (67%) rename {src/core/blitzkit/tankDefinitions => packages/core/src/blitzkit}/tankNames.ts (85%) rename {src => packages/website/src}/components/ClassIcon/components/ClassHeavy.tsx (100%) rename {src => packages/website/src}/components/ClassIcon/components/ClassLight.tsx (100%) rename {src => packages/website/src}/components/ClassIcon/components/ClassMedium.tsx (100%) rename {src => packages/website/src}/components/ClassIcon/components/ClassTankDestroyer.tsx (100%) rename {src => packages/website/src}/components/ClassIcon/index.ts (100%) rename {src => packages/website/src}/components/ExperimentIcon.tsx (100%) rename {src => packages/website/src}/components/ResearchedIcon.tsx (100%) rename {src => packages/website/src}/components/ScienceIcon.tsx (100%) rename {src => packages/website/src}/components/ScienceOffIcon.tsx (100%) rename {src => packages/website/src}/components/VerifiedIcon.tsx (100%) diff --git a/bun.lockb b/bun.lockb index 5acc93c9cf2d5402b2c510654f2cf1fe619129ea..8f14b447516971be8c9edfc78d348aa246121769 100644 GIT binary patch delta 36638 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 C6LKy9 diff --git a/package.json b/package.json index 312950d6d..6dccd3980 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,6 @@ "@resvg/resvg-js": "^2.6.2", "@types/three": "^0.160.0", "@vanilla-extract/css": "^1.15.5", - "@vanilla-extract/dynamic": "^2.1.2", "adm-zip": "^0.5.16", "bepaint": "^0.1.0-beta.3", "csv-parse": "^5.5.6", diff --git a/src/lang/en-US.json b/packages/core/lang/en-US.json similarity index 100% rename from src/lang/en-US.json rename to packages/core/lang/en-US.json diff --git a/src/lang/es-ES.json b/packages/core/lang/es-ES.json similarity index 100% rename from src/lang/es-ES.json rename to packages/core/lang/es-ES.json diff --git a/src/lang/hr.json b/packages/core/lang/hr.json similarity index 100% rename from src/lang/hr.json rename to packages/core/lang/hr.json diff --git a/packages/core/src/blitz/constants.ts b/packages/core/src/blitz/constants.ts new file mode 100644 index 000000000..bf4dcadb8 --- /dev/null +++ b/packages/core/src/blitz/constants.ts @@ -0,0 +1,8 @@ +export const TREE_TYPES = ['researchable', 'premium', 'collector'] as const; + +export const TANK_CLASSES = [ + 'lightTank', + 'mediumTank', + 'heavyTank', + 'AT-SPG', +] as const; diff --git a/packages/core/src/blitz/index.ts b/packages/core/src/blitz/index.ts index 83c62317b..8943a0afa 100644 --- a/packages/core/src/blitz/index.ts +++ b/packages/core/src/blitz/index.ts @@ -1 +1,3 @@ +export * from './constants'; export * from './idToRegion'; +export * from './resolveNearPenetration'; diff --git a/src/core/blitz/resolveNearPenetration.ts b/packages/core/src/blitz/resolveNearPenetration.ts similarity index 100% rename from src/core/blitz/resolveNearPenetration.ts rename to packages/core/src/blitz/resolveNearPenetration.ts diff --git a/src/core/blitzkit/asset.ts b/packages/core/src/blitzkit/asset.ts similarity index 79% rename from src/core/blitzkit/asset.ts rename to packages/core/src/blitzkit/asset.ts index 6a395b5e0..0d35a0dab 100644 --- a/src/core/blitzkit/asset.ts +++ b/packages/core/src/blitzkit/asset.ts @@ -1,5 +1,5 @@ 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) { return `https://raw.githubusercontent.com/tresabhi/${ASSETS_REPO}/${assertSecret( diff --git a/src/core/blitzkit/camouflageDefinitions.ts b/packages/core/src/blitzkit/camouflageDefinitions.ts similarity index 67% rename from src/core/blitzkit/camouflageDefinitions.ts rename to packages/core/src/blitzkit/camouflageDefinitions.ts index 53c9bc3d0..88da12119 100644 --- a/src/core/blitzkit/camouflageDefinitions.ts +++ b/packages/core/src/blitzkit/camouflageDefinitions.ts @@ -1,5 +1,5 @@ -import { asset } from './asset'; -import { fetchCdonLz4 } from './fetchCdonLz4'; +import { asset } from '@blitzkit/core/src/blitzkit/asset'; +import { fetchCdonLz4 } from '@blitzkit/core/src/blitzkit/fetchCdonLz4'; export type CamouflageDefinitions = Record< number, diff --git a/src/core/blitzkit/fetchCdonLz4.ts b/packages/core/src/blitzkit/fetchCdonLz4.ts similarity index 100% rename from src/core/blitzkit/fetchCdonLz4.ts rename to packages/core/src/blitzkit/fetchCdonLz4.ts diff --git a/src/core/blitzkit/filterTank.ts b/packages/core/src/blitzkit/filterTank.ts similarity index 88% rename from src/core/blitzkit/filterTank.ts rename to packages/core/src/blitzkit/filterTank.ts index 180b1fc7d..6b1677c85 100644 --- a/src/core/blitzkit/filterTank.ts +++ b/packages/core/src/blitzkit/filterTank.ts @@ -1,4 +1,4 @@ -import { TankFilters } from '../../../packages/website/src/stores/tankFilters'; +import { TankFilters } from '../../../website/src/stores/tankFilters'; import { TankDefinition } from './tankDefinitions'; export function filterTank(filters: TankFilters, tank: TankDefinition) { diff --git a/packages/core/src/blitzkit/gameDefinitions.ts b/packages/core/src/blitzkit/gameDefinitions.ts index fda4af1b9..4270a07dd 100644 --- a/packages/core/src/blitzkit/gameDefinitions.ts +++ b/packages/core/src/blitzkit/gameDefinitions.ts @@ -1,5 +1,5 @@ -import { asset } from '../../../../src/core/blitzkit/asset'; -import { fetchCdonLz4 } from '../../../../src/core/blitzkit/fetchCdonLz4'; +import { asset } from './asset'; +import { fetchCdonLz4 } from './fetchCdonLz4'; interface GameMode { name: string; diff --git a/packages/core/src/blitzkit/index.ts b/packages/core/src/blitzkit/index.ts index 9f7c10453..f312f33a8 100644 --- a/packages/core/src/blitzkit/index.ts +++ b/packages/core/src/blitzkit/index.ts @@ -1,4 +1,12 @@ export * from './assertSecret'; +export * from './asset'; +export * from './camouflageDefinitions'; +export * from './fetchCdonLz4'; +export * from './filterTank'; export * from './gameDefinitions'; +export * from './modelDefinitions'; export * from './superCompress'; export * from './superDecompress'; +export * from './tankDefinitions'; +export * from './tankIcon'; +export * from './tankNames'; diff --git a/src/core/blitzkit/modelDefinitions.ts b/packages/core/src/blitzkit/modelDefinitions.ts similarity index 100% rename from src/core/blitzkit/modelDefinitions.ts rename to packages/core/src/blitzkit/modelDefinitions.ts diff --git a/src/core/blitzkit/tankDefinitions/constants.ts b/packages/core/src/blitzkit/tankDefinitions/constants.ts similarity index 85% rename from src/core/blitzkit/tankDefinitions/constants.ts rename to packages/core/src/blitzkit/tankDefinitions/constants.ts index 3d49f6330..2e5210c85 100644 --- a/src/core/blitzkit/tankDefinitions/constants.ts +++ b/packages/core/src/blitzkit/tankDefinitions/constants.ts @@ -1,5 +1,4 @@ import { CrewMember, GunDefinition, ShellType, Tier } from '.'; -import { TankClass } from '../../../components/Tanks'; export const SHELL_NAMES: Record = { ap: 'AP', @@ -59,3 +58,15 @@ export const TIER_ROMAN_NUMERALS: Record = { 9: 'IX', 10: 'X', }; + +export const flags: Record = { + ussr: '<:ussr:1218421042033197197>', + germany: 'πŸ‡©πŸ‡ͺ', + usa: 'πŸ‡ΊπŸ‡Έ', + china: 'πŸ‡¨πŸ‡³', + uk: 'πŸ‡¬πŸ‡§', + france: 'πŸ‡«πŸ‡·', + japan: 'πŸ‡―πŸ‡΅', + european: 'πŸ‡ͺπŸ‡Ί', + other: '<:other:1218421572243558482>', +}; diff --git a/src/core/blitzkit/tankDefinitions/index.ts b/packages/core/src/blitzkit/tankDefinitions/index.ts similarity index 93% rename from src/core/blitzkit/tankDefinitions/index.ts rename to packages/core/src/blitzkit/tankDefinitions/index.ts index c71876e65..b2a11a12b 100644 --- a/src/core/blitzkit/tankDefinitions/index.ts +++ b/packages/core/src/blitzkit/tankDefinitions/index.ts @@ -179,14 +179,4 @@ export const tankDefinitionsArray = tankDefinitions.then((tanks) => ); export type Tier = (typeof TIERS)[number]; -export const flags: Record = { - ussr: '<:ussr:1218421042033197197>', - germany: 'πŸ‡©πŸ‡ͺ', - usa: 'πŸ‡ΊπŸ‡Έ', - china: 'πŸ‡¨πŸ‡³', - uk: 'πŸ‡¬πŸ‡§', - france: 'πŸ‡«πŸ‡·', - japan: 'πŸ‡―πŸ‡΅', - european: 'πŸ‡ͺπŸ‡Ί', - other: '<:other:1218421572243558482>', -}; +export * from './constants'; diff --git a/src/core/blitzkit/tankIcon.ts b/packages/core/src/blitzkit/tankIcon.ts similarity index 67% rename from src/core/blitzkit/tankIcon.ts rename to packages/core/src/blitzkit/tankIcon.ts index 1ebe0aef3..a20d23d9b 100644 --- a/src/core/blitzkit/tankIcon.ts +++ b/packages/core/src/blitzkit/tankIcon.ts @@ -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') { return asset(`icons/tanks/${size}/${id}.webp`); diff --git a/src/core/blitzkit/tankDefinitions/tankNames.ts b/packages/core/src/blitzkit/tankNames.ts similarity index 85% rename from src/core/blitzkit/tankDefinitions/tankNames.ts rename to packages/core/src/blitzkit/tankNames.ts index b9aa1468a..643b28afd 100644 --- a/src/core/blitzkit/tankDefinitions/tankNames.ts +++ b/packages/core/src/blitzkit/tankNames.ts @@ -1,6 +1,5 @@ import { deburr } from 'lodash'; -import { tankDefinitionsArray } from '.'; -import { camouflageDefinitions } from '../camouflageDefinitions'; +import { camouflageDefinitions, tankDefinitionsArray } from '.'; export const tankNames = Promise.all([ tankDefinitionsArray, diff --git a/packages/website/package.json b/packages/website/package.json index 29ce7024b..d405713fd 100644 --- a/packages/website/package.json +++ b/packages/website/package.json @@ -20,6 +20,7 @@ "react-dom": "^18.3.1", "react-fuzzysort": "^1.0.1", "immer": "^10.1.1", + "@vanilla-extract/dynamic": "^2.1.2", "zustand": "^4.5.5", "react-promise-suspense": "^0.3.4" }, diff --git a/packages/website/src/app/tools/tankopedia/components/FilterControl.tsx b/packages/website/src/app/tools/tankopedia/components/FilterControl.tsx index 0ab1e2e8e..2bdb186fb 100644 --- a/packages/website/src/app/tools/tankopedia/components/FilterControl.tsx +++ b/packages/website/src/app/tools/tankopedia/components/FilterControl.tsx @@ -1,5 +1,13 @@ '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 { Box, Flex, IconButton, Text, Tooltip } from '@radix-ui/themes'; import { times } from 'lodash'; @@ -9,12 +17,6 @@ import { ExperimentIcon } from '../../../../components/ExperimentIcon'; import { ResearchedIcon } from '../../../../components/ResearchedIcon'; import { ScienceIcon } from '../../../../components/ScienceIcon'; 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'; interface FilterControlProps { diff --git a/packages/website/src/app/tools/tankopedia/components/TankCard.tsx b/packages/website/src/app/tools/tankopedia/components/TankCard.tsx index 8401c53d3..48b8dae4e 100644 --- a/packages/website/src/app/tools/tankopedia/components/TankCard.tsx +++ b/packages/website/src/app/tools/tankopedia/components/TankCard.tsx @@ -1,17 +1,15 @@ +import { + asset, + modelDefinitions, + resolveNearPenetration, + TankDefinition, + tankIcon, +} from '@blitzkit/core'; import { Flex, Text } from '@radix-ui/themes'; import { assignInlineVars } from '@vanilla-extract/dynamic'; import Link from 'next/link'; import { use, useMemo } from 'react'; 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 styles from './TankCard.css'; @@ -139,14 +137,16 @@ export function TankCard({ tank, onSelect }: TankCardProps) { tank.treeType === 'collector' ? 'blue' : tank.treeType === 'premium' - ? 'amber' - : 'gray' + ? 'amber' + : 'gray' } highContrast={tank.treeType === 'researchable'} onClick={onSelect ? () => onSelect(tank) : undefined} className={styles.card} 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`, + )})`, })} > = { researchable: 'Tech tree', premium: 'Premium', diff --git a/src/components/TanksEmbed.tsx b/src/components/TanksEmbed.tsx index caeda4cdf..db3612291 100644 --- a/src/components/TanksEmbed.tsx +++ b/src/components/TanksEmbed.tsx @@ -2,6 +2,10 @@ import { amberDark, blueDark } from '@radix-ui/colors'; import { Flex, Text } from '@radix-ui/themes'; import { times } from 'lodash'; 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 { breakdownConfig } from '../app/tools/embed/configurations/breakdown'; import { toRadiusVar } from '../app/tools/embed/utilities'; @@ -9,10 +13,6 @@ import { TankDefinition } from '../core/blitzkit/tankDefinitions'; import { previewCompositeStat } from '../core/statistics/compositeStats'; import { CompositeStatsKey } from '../core/statistics/compositeStats/constants'; 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 { children: ReactNode; @@ -62,14 +62,14 @@ export function BreakdownEmbedCard({ tank }: BreakdownEmbedCardProps) { tank === null ? undefined : tank.treeType === 'researchable' || - !useState('cardTitleTypeColor') - ? undefined - : { - color: - tank.treeType === 'premium' - ? amberDark.amber11 - : blueDark.blue11, - }, + !useState('cardTitleTypeColor') + ? undefined + : { + color: + tank.treeType === 'premium' + ? amberDark.amber11 + : blueDark.blue11, + }, }} > diff --git a/src/core/blitz/applyPitchYawLimits.ts b/src/core/blitz/applyPitchYawLimits.ts index 639a9412d..10fb13a15 100644 --- a/src/core/blitz/applyPitchYawLimits.ts +++ b/src/core/blitz/applyPitchYawLimits.ts @@ -1,6 +1,9 @@ +import { + PitchLimits, + YawLimits, +} from '@blitzkit/core/src/blitzkit/modelDefinitions'; import { clamp } from 'lodash'; import { degToRad } from 'three/src/math/MathUtils'; -import { PitchLimits, YawLimits } from '../blitzkit/modelDefinitions'; import { normalizeAngleRad } from '../math/normalizeAngleRad'; export function applyPitchYawLimits( diff --git a/src/core/blitzkit/discoveredIdDefinitions.ts b/src/core/blitzkit/discoveredIdDefinitions.ts index 183c674ea..668b46500 100644 --- a/src/core/blitzkit/discoveredIdDefinitions.ts +++ b/src/core/blitzkit/discoveredIdDefinitions.ts @@ -1,4 +1,4 @@ -import { asset } from './asset'; +import { asset } from '@blitzkit/core/src/blitzkit/asset'; export interface DiscoveredIdsDefinitions { time: number; diff --git a/src/core/blitzkit/mapDefinitions.ts b/src/core/blitzkit/mapDefinitions.ts index fb47c7007..9b8031c3a 100644 --- a/src/core/blitzkit/mapDefinitions.ts +++ b/src/core/blitzkit/mapDefinitions.ts @@ -1,5 +1,5 @@ -import { asset } from './asset'; -import { fetchCdonLz4 } from './fetchCdonLz4'; +import { asset } from '@blitzkit/core/src/blitzkit/asset'; +import { fetchCdonLz4 } from '@blitzkit/core/src/blitzkit/fetchCdonLz4'; export interface MapDefinitions { [id: number]: { diff --git a/src/core/blitzkit/normalizeBoundingBox.ts b/src/core/blitzkit/normalizeBoundingBox.ts index c29c75056..0df64fab6 100644 --- a/src/core/blitzkit/normalizeBoundingBox.ts +++ b/src/core/blitzkit/normalizeBoundingBox.ts @@ -1,5 +1,5 @@ +import { BoundingBox } from '@blitzkit/core/src/blitzkit/modelDefinitions'; import { Vector3Tuple } from 'three'; -import { BoundingBox } from './modelDefinitions'; export function normalizeBoundingBox(boundingBox: BoundingBox) { return boundingBox.max.map( diff --git a/src/core/blitzkit/resolveThickness.ts b/src/core/blitzkit/resolveThickness.ts index a4727c1e1..f85a32a14 100644 --- a/src/core/blitzkit/resolveThickness.ts +++ b/src/core/blitzkit/resolveThickness.ts @@ -1,4 +1,4 @@ -import { ModelArmor } from './modelDefinitions'; +import { ModelArmor } from '@blitzkit/core/src/blitzkit/modelDefinitions'; export function resolveArmor(armor: ModelArmor, index: number) { const spaced = armor.spaced?.includes(index) ?? false; diff --git a/src/core/blitzkit/reviews.ts b/src/core/blitzkit/reviews.ts index 9ac16340d..2dd9f041f 100644 --- a/src/core/blitzkit/reviews.ts +++ b/src/core/blitzkit/reviews.ts @@ -1,5 +1,5 @@ import { decode } from '../protobuf/decode'; -import { asset } from './asset'; +import { asset } from '@blitzkit/core/src/blitzkit/asset'; export interface Reviews { reviews: Record; diff --git a/src/core/blitzkit/skillDefinitions.ts b/src/core/blitzkit/skillDefinitions.ts index 660d87bb6..f2d6c88ec 100644 --- a/src/core/blitzkit/skillDefinitions.ts +++ b/src/core/blitzkit/skillDefinitions.ts @@ -1,6 +1,6 @@ import { TankClass } from '../../components/Tanks'; -import { asset } from './asset'; -import { fetchCdonLz4 } from './fetchCdonLz4'; +import { asset } from '@blitzkit/core/src/blitzkit/asset'; +import { fetchCdonLz4 } from '@blitzkit/core/src/blitzkit/fetchCdonLz4'; export interface SkillDefinitions { classes: Record; diff --git a/src/core/blitzkit/tankCharacteristics.ts b/src/core/blitzkit/tankCharacteristics.ts index f1914f86f..03c69f1d9 100644 --- a/src/core/blitzkit/tankCharacteristics.ts +++ b/src/core/blitzkit/tankCharacteristics.ts @@ -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 { isExplosive } from '../blitz/isExplosive'; -import { resolveNearPenetration } from '../blitz/resolveNearPenetration'; import { resolvePenetrationCoefficient } from '../blitz/resolvePenetrationCoefficient'; import { coefficient } from './coefficient'; import { degressiveStat } from './degressiveStat'; import { EquipmentDefinitions } from './equipmentDefinitions'; -import { ModelDefinition } from './modelDefinitions'; import { normalizeBoundingBox } from './normalizeBoundingBox'; import { progressiveStat } from './progressiveStat'; import { ProvisionDefinitions } from './provisionDefinitions'; @@ -238,10 +238,10 @@ export function tankCharacteristics( tank.class === 'heavyTank' ? 0.06 : tank.class === 'mediumTank' - ? 0.08 - : tank.class === 'lightTank' - ? 0.11 - : 0.04, + ? 0.08 + : tank.class === 'lightTank' + ? 0.11 + : 0.04, ]) * coefficient([true, progressiveStat(commanderMastery)]); const fireChanceCoefficient = coefficient([hasProtectiveKit, -0.2]); @@ -263,8 +263,8 @@ export function tankCharacteristics( tank.class === 'AT-SPG' ? 0.04 : tank.class === 'heavyTank' - ? 0.03 - : 0.02, + ? 0.03 + : 0.02, ]), ], [ @@ -272,10 +272,10 @@ export function tankCharacteristics( tank.class === 'heavyTank' ? 0.02 : tank.class === 'mediumTank' - ? 0.04 - : tank.class === 'lightTank' - ? 0.07 - : 0.1, + ? 0.04 + : tank.class === 'lightTank' + ? 0.07 + : 0.1, ], ); const camouflageCoefficientStill = sum( @@ -287,8 +287,8 @@ export function tankCharacteristics( tank.class === 'AT-SPG' ? 0.04 : tank.class === 'heavyTank' - ? 0.03 - : 0.02, + ? 0.03 + : 0.02, ], [true, crewSkills.camouflage * (3 / 100)], ), @@ -298,10 +298,10 @@ export function tankCharacteristics( tank.class === 'heavyTank' ? 0.04 : tank.class === 'mediumTank' - ? 0.08 - : tank.class === 'lightTank' - ? 0.14 - : 0.2, + ? 0.08 + : tank.class === 'lightTank' + ? 0.14 + : 0.2, ], ); diff --git a/src/core/blitzkit/tankIconPng.ts b/src/core/blitzkit/tankIconPng.ts index 97b076bf9..60e845ba4 100644 --- a/src/core/blitzkit/tankIconPng.ts +++ b/src/core/blitzkit/tankIconPng.ts @@ -1,5 +1,5 @@ +import { tankIcon } from '@blitzkit/core/src/blitzkit/tankIcon'; import { iconPng } from './iconPng'; -import { tankIcon } from './tankIcon'; export function tankIconPng(id: number) { return iconPng(tankIcon(id)); diff --git a/src/core/blitzkit/unionBoundingBox.ts b/src/core/blitzkit/unionBoundingBox.ts index 86d026a0d..a34fad5b7 100644 --- a/src/core/blitzkit/unionBoundingBox.ts +++ b/src/core/blitzkit/unionBoundingBox.ts @@ -1,5 +1,5 @@ +import { BoundingBox } from '@blitzkit/core/src/blitzkit/modelDefinitions'; import { Vector3Tuple } from 'three'; -import { BoundingBox } from './modelDefinitions'; export function unionBoundingBox(a: BoundingBox, b: BoundingBox) { return { diff --git a/tsconfig.json b/tsconfig.json index 38f3b4076..3bfc1c040 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -37,7 +37,17 @@ "packages/website/src/components/Party3.tsx", "packages/website/src/components/PageWrapper.tsx", "packages/core/src/blitzkit/gameDefinitions.ts", - "packages/core/src/zustand/createNextSafeStore.tsx" -, "packages/core/src/blitzkit/superDecompress.ts", "packages/core/src/blitzkit/superCompress.ts" ], + "packages/core/src/zustand/createNextSafeStore.tsx", + "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"] }