From 4b7b8b3392b73c9cea0bdd79e27915aee0ded0b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 28 Apr 2026 16:56:38 -0500 Subject: [PATCH] feat: module selection Co-authored-by: Copilot --- bun.lock | 5 +- packages/varuna/package.json | 3 +- packages/varuna/src/index.ts | 4 +- .../core/tankopedia/computeCharacteristics.ts | 2 +- .../src/core/tankopedia/createTankState.ts | 28 ++++--- .../src/core/tankopedia/tankState.ts | 12 ++- .../pages/[...locale]/tanks/[slug]/_index.tsx | 78 ++++++++++++++++--- .../[...locale]/tanks/[slug]/index.astro | 2 +- packages/website-ue/src/stores/tankopedia.ts | 13 ++-- 9 files changed, 109 insertions(+), 38 deletions(-) diff --git a/bun.lock b/bun.lock index 4cc486810..17c5159d4 100644 --- a/bun.lock +++ b/bun.lock @@ -136,9 +136,10 @@ "name": "varuna", "dependencies": { "@types/lodash-es": "^4.17.12", + "@types/react": "^19.2.14", "immer": "^10.1.3", "lodash-es": "^4.17.21", - "react": "^19.1.1", + "react": "^19.2.5", }, }, "packages/website": { @@ -3217,6 +3218,8 @@ "utif2/pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "varuna/react": ["react@19.2.5", "", {}, "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA=="], + "vscode-json-languageservice/jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], "which-builtin-type/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], diff --git a/packages/varuna/package.json b/packages/varuna/package.json index 61c334de6..fb719945c 100644 --- a/packages/varuna/package.json +++ b/packages/varuna/package.json @@ -4,8 +4,9 @@ "main": "src/index.ts", "dependencies": { "@types/lodash-es": "^4.17.12", + "@types/react": "^19.2.14", "immer": "^10.1.3", "lodash-es": "^4.17.21", - "react": "^19.1.1" + "react": "^19.2.5" } } diff --git a/packages/varuna/src/index.ts b/packages/varuna/src/index.ts index 3cde9a71a..d6a636f69 100644 --- a/packages/varuna/src/index.ts +++ b/packages/varuna/src/index.ts @@ -11,7 +11,7 @@ export class Varuna { constructor( private creator: Type | ((...args: Arguments[]) => Type), - private persistence?: string + private persistence?: string, ) { if (typeof creator !== "function") this.initialize(creator); } @@ -100,7 +100,7 @@ export class Varuna { } use( - slicer: (state: Type) => Slice = (state) => state as unknown as Slice + slicer: (state: Type) => Slice = (state) => state as unknown as Slice, ) { return this.useDeferred(slicer, slicer(this.state)); } diff --git a/packages/website-ue/src/core/tankopedia/computeCharacteristics.ts b/packages/website-ue/src/core/tankopedia/computeCharacteristics.ts index 1bc34737d..aab219bb0 100644 --- a/packages/website-ue/src/core/tankopedia/computeCharacteristics.ts +++ b/packages/website-ue/src/core/tankopedia/computeCharacteristics.ts @@ -1,4 +1,4 @@ -import type { Tank } from "@blitzkit/closed/protos/blitzkit/tank"; +import type { Tank } from "@protos/blitzkit/tank"; import { ShellUpgradeSingleChange_AttributeName, TankAttributeChange_AttributeName, diff --git a/packages/website-ue/src/core/tankopedia/createTankState.ts b/packages/website-ue/src/core/tankopedia/createTankState.ts index 0d6bcb507..bf277b846 100644 --- a/packages/website-ue/src/core/tankopedia/createTankState.ts +++ b/packages/website-ue/src/core/tankopedia/createTankState.ts @@ -1,16 +1,26 @@ -import type { TankCatalogComponent } from "@protos/blitz_static_tank_component"; -import { TerrainHardness } from "./tankState"; +import type { Tank } from "@protos/blitzkit/tank"; +import { TerrainHardness, type TankState } from "./tankState"; + +export function createTankState({ tank, id }: Tank) { + const upgrades: Record = {}; + + for (const upgradeLine of tank!.upgrade_lines) { + upgrades[upgradeLine.name] = upgradeLine.stages.length - 1; + } -export function createTankState(tank: TankCatalogComponent) { return { - stage: tank.upgrade_stages.length, + id, + + upgrades, + shell: 0, - isGunDamaged: false, - isHullTraversing: false, - isShooting: false, - isTurretTraversing: false, speed: 0, terrainHardness: TerrainHardness.Hard, + + isShooting: false, + isGunDamaged: false, + isTurretTraversing: false, + isHullTraversing: false, isCaughtOnFire: false, - }; + } satisfies TankState; } diff --git a/packages/website-ue/src/core/tankopedia/tankState.ts b/packages/website-ue/src/core/tankopedia/tankState.ts index ae7df9d55..b901cb320 100644 --- a/packages/website-ue/src/core/tankopedia/tankState.ts +++ b/packages/website-ue/src/core/tankopedia/tankState.ts @@ -5,13 +5,17 @@ export enum TerrainHardness { } export interface TankState { - stage: number; + id: string; + + upgrades: Record; + shell: number; speed: number; - isHullTraversing: boolean; - isTurretTraversing: boolean; + terrainHardness: TerrainHardness; + isShooting: boolean; isGunDamaged: boolean; - terrainHardness: TerrainHardness; + isTurretTraversing: boolean; + isHullTraversing: boolean; isCaughtOnFire: boolean; } diff --git a/packages/website-ue/src/pages/[...locale]/tanks/[slug]/_index.tsx b/packages/website-ue/src/pages/[...locale]/tanks/[slug]/_index.tsx index 364faf7d3..3a7aa68f7 100644 --- a/packages/website-ue/src/pages/[...locale]/tanks/[slug]/_index.tsx +++ b/packages/website-ue/src/pages/[...locale]/tanks/[slug]/_index.tsx @@ -7,28 +7,82 @@ import { characteristicsOrder } from "../../../../core/tankopedia/characteristic import { computeCharacteristics } from "../../../../core/tankopedia/computeCharacteristics"; import { TerrainHardness } from "../../../../core/tankopedia/tankState"; import { useAwait } from "../../../../hooks/useAwait"; +import { useGameStrings } from "../../../../hooks/useGameStrings"; +import { LocaleProvider } from "../../../../hooks/useLocale"; import { Tankopedia, TankopediaCompare } from "../../../../stores/tankopedia"; -export function Page({ id }: { id: string }) { +interface PageProps { + id: string; + locale: string; +} + +export function Page({ id, locale }: PageProps) { + const tank = useAwait(() => api.tank(id), `tank-${id}`); + + Tankopedia.useInitialization(tank); + + return ( + + + + ); + return ( - + ); } -function Content({ id }: { id: string }) { - const tank = useAwait(() => api.tank(id), `tank-${id}`); - // const tankList = useAwait(() => api.tankList(), "tank-list"); - // const otherTanks = useAwait(() => api.tanks(), "tanks"); - - Tankopedia.useInitialization(tank.tank!); +function Content() { + const tankEntityGameStrings = useGameStrings("TankEntity"); const protagonist = Tankopedia.use((state) => state.protagonist); + const protagonistTank = useAwait( + () => api.tank(protagonist.id), + `tank-${protagonist.id}`, + ); + + return ( + <> +

{protagonist.id}

+ +
+ + {protagonistTank.tank!.upgrade_lines.map((line) => { + return ( + <> +

+ {line.name} ({protagonist.upgrades[line.name]}) +

+ +
+ {line.stages.map((stage, index) => { + return ( + + ); + })} +
+ + ); + })} + + ); + const compare = Tankopedia.use((state) => state.compare); const characteristics = useMemo( () => computeCharacteristics(id, tank, protagonist), - [protagonist] + [protagonist], ); // const otherCharacteristics = useMemo( // () => @@ -187,7 +241,7 @@ function Content({ id }: { id: string }) { {TerrainHardness[hardness]}{" "} {hardness === protagonist.terrainHardness && "(selected)"} - ) + ), )} @@ -222,7 +276,7 @@ function Content({ id }: { id: string }) { > {TankopediaCompare[c]} {c === compare && "(selected)"} - ) + ), )} @@ -242,7 +296,7 @@ function Content({ id }: { id: string }) { others={[]} config={config} /> - ) + ), )} ))} diff --git a/packages/website-ue/src/pages/[...locale]/tanks/[slug]/index.astro b/packages/website-ue/src/pages/[...locale]/tanks/[slug]/index.astro index 79d8db675..7bd293a23 100644 --- a/packages/website-ue/src/pages/[...locale]/tanks/[slug]/index.astro +++ b/packages/website-ue/src/pages/[...locale]/tanks/[slug]/index.astro @@ -19,5 +19,5 @@ const { id, locale } = Astro.props; --- - + diff --git a/packages/website-ue/src/stores/tankopedia.ts b/packages/website-ue/src/stores/tankopedia.ts index ada47433d..e005a0da1 100644 --- a/packages/website-ue/src/stores/tankopedia.ts +++ b/packages/website-ue/src/stores/tankopedia.ts @@ -1,4 +1,4 @@ -import type { TankCatalogComponent } from "@protos/game/proto/legacy/blitz_static_tank_component"; +import type { Tank } from "@protos/blitzkit/tank"; import { Varuna } from "varuna"; import { createTankState } from "../core/tankopedia/createTankState"; import { type TankState } from "../core/tankopedia/tankState"; @@ -14,9 +14,8 @@ export enum TankopediaCompare { All, } -export const Tankopedia = new Varuna( - (tank) => ({ - compare: TankopediaCompare.TierAndClass, - protagonist: createTankState(tank), - }), -); +export const Tankopedia = new Varuna((tank) => ({ + compare: TankopediaCompare.TierAndClass, + + protagonist: createTankState(tank), +}));