diff --git a/scripts/buildAssets/definitions.ts b/scripts/buildAssets/definitions.ts index e21b2d3c2..c28b08627 100644 --- a/scripts/buildAssets/definitions.ts +++ b/scripts/buildAssets/definitions.ts @@ -499,18 +499,33 @@ export async function definitions(production: boolean) { const squadBattleTypeStyles = await readYAMLDVPL( `${DATA}/UI/Screens3/Lobby/Hangar/Squad/SquadBattleType.yaml.dvpl`, ); + const gameTypeSelectorStyles = await readYAMLDVPL( + `${DATA}/UI/Screens/Lobby/Hangar/GameTypeSelector.yaml.dvpl`, + ); + const gameModeNativeNames: Record = {}; for (const match of squadBattleTypeStyles.Prototypes[0].components.UIDataLocalBindingsComponent.data[1][2].matchAll( - /"(\d+)" -> "(battleType\/[a-zA-Z]+)"/g, + /"(\d+)" -> "(battleType\/([a-zA-Z]+))"/g, )) { const id = Number(match[1]); const name = strings[match[2]]; + gameModeNativeNames[match[3]] = id; gameDefinitions.gameModes[id] = { name, }; } + for (const match of gameTypeSelectorStyles.Prototypes[0].components.UIDataLocalBindingsComponent.data[1][2].matchAll( + /eGameMode\.([a-zA-Z]+) -> "~res:\/Gfx\/UI\/Hangar\/GameTypes\/battle-type_([^"]+)"/g, + )) { + Object.entries(gameModeNativeNames).forEach(([key, value]) => { + if (key.toLowerCase() === match[2].toLowerCase()) { + gameModeNativeNames[match[1]] = value; + } + }); + } + camouflagesXmlEntries.forEach(([camoKey, camo]) => { const yamlEntry = camouflagesYaml[camoKey]; const fullName = yamlEntry.userString @@ -706,7 +721,7 @@ export async function definitions(production: boolean) { tankDefinitions[tankId] = { id: tankId, - roles: tank.combatRole ?? {}, + roles: {}, camouflages: camouflages.length === 0 ? undefined : camouflages, description: wargamingTankopedia.data[tankId]?.description ?? undefined, @@ -747,6 +762,22 @@ export async function definitions(production: boolean) { tracks: [], }; + if (tank.combatRole) { + Object.entries(tank.combatRole).forEach(([gameMode, role]) => { + const id = Object.entries(gameModeNativeNames).find( + ([key]) => key.toLowerCase() === gameMode.toLowerCase(), + )?.[1]; + + if (id === undefined) { + throw new Error( + `Unknown game mode in tank ${tankKey}: ${gameMode}`, + ); + } + + tankDefinitions[tankId].roles[id] = role; + }); + } + if (tankDefinitions[tankId].name === tankDefinitions[tankId].nameFull) { delete tankDefinitions[tankId].nameFull; } @@ -1336,7 +1367,6 @@ export async function definitions(production: boolean) { }; }); - return; await commitAssets( 'definitions', [ diff --git a/scripts/buildAssets/gameModeIcons.ts b/scripts/buildAssets/gameModeBanners.ts similarity index 91% rename from scripts/buildAssets/gameModeIcons.ts rename to scripts/buildAssets/gameModeBanners.ts index 90e3463d4..a3fcc6d8f 100644 --- a/scripts/buildAssets/gameModeIcons.ts +++ b/scripts/buildAssets/gameModeBanners.ts @@ -6,7 +6,9 @@ import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles'; import { DATA } from './constants'; import { SquadBattleTypeStyles } from './definitions'; -export async function gameModeIcons(production: boolean) { +export async function gameModeBanners(production: boolean) { + console.log('Building game mode banners...'); + const changes: FileChange[] = []; const gameTypeSelectorStyles = await readYAMLDVPL( `${DATA}/UI/Screens/Lobby/Hangar/GameTypeSelector.yaml.dvpl`, @@ -48,5 +50,5 @@ export async function gameModeIcons(production: boolean) { }); } - await commitAssets('game mode icons', changes, production); + await commitAssets('game mode banners', changes, production); } diff --git a/scripts/buildAssets/index.ts b/scripts/buildAssets/index.ts index 0bd4afe59..6a37cf087 100644 --- a/scripts/buildAssets/index.ts +++ b/scripts/buildAssets/index.ts @@ -17,7 +17,7 @@ import { consumableProvisionIcons } from './consumableProvisionIcons'; import { currencies } from './currencies'; import { definitions } from './definitions'; import { equipmentIcons } from './equipmentIcons'; -import { gameModeIcons } from './gameModeIcons'; +import { gameModeBanners } from './gameModeBanners'; import { moduleIcons } from './moduleIcons'; import { scratchedFlags } from './scratchedFlags'; import { shellIcons } from './shellIcons'; @@ -30,7 +30,7 @@ import { videos } from './videos'; if (!targets && !allTargets) throw new Error('No target(s) specified'); const methods = [ - gameModeIcons, + gameModeBanners, definitions, tankIcons, videos, diff --git a/src/app/tools/tankopedia/[id]/components/Model/GameModeSection.tsx b/src/app/tools/tankopedia/[id]/components/Model/GameModeSection.tsx new file mode 100644 index 000000000..cead10659 --- /dev/null +++ b/src/app/tools/tankopedia/[id]/components/Model/GameModeSection.tsx @@ -0,0 +1,56 @@ +import { Box, Flex, Heading } from '@radix-ui/themes'; +import { use } from 'react'; +import { asset } from '../../../../../../core/blitzkit/asset'; +import { gameDefinitions } from '../../../../../../core/blitzkit/gameDefinitions'; +import * as Duel from '../../../../../../stores/duel'; + +export function GameModeSection() { + const tank = Duel.use((state) => state.protagonist.tank); + const awaitedGameDefinitions = use(gameDefinitions); + + return ( + + Game mode abilities + + + {Object.entries(tank.roles).map(([key, value]) => { + const id = Number(key); + const gameMode = awaitedGameDefinitions.gameModes[id]; + + return ( + + + + + {gameMode.name} + + + ); + })} + + + ); +} diff --git a/src/app/tools/tankopedia/[id]/components/Model/TankopediaPlug.tsx b/src/app/tools/tankopedia/[id]/components/Model/TankopediaPlug.tsx deleted file mode 100644 index a50ec3315..000000000 --- a/src/app/tools/tankopedia/[id]/components/Model/TankopediaPlug.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { Flex, Link, Text } from '@radix-ui/themes'; -import PageWrapper from '../../../../../../components/PageWrapper'; -import { PatreonIcon } from '../../../../../../icons/Patreon'; - -export function TankopediaPlug() { - return ( - - - - Liking BlitzKit? Consider donating on{' '} - - {' '} - Patreon - - . - - - - ); -} diff --git a/src/app/tools/tankopedia/[id]/components/Model/TechTreeSection.tsx b/src/app/tools/tankopedia/[id]/components/Model/TechTreeSection.tsx index 3961388bd..8f82fac94 100644 --- a/src/app/tools/tankopedia/[id]/components/Model/TechTreeSection.tsx +++ b/src/app/tools/tankopedia/[id]/components/Model/TechTreeSection.tsx @@ -126,6 +126,7 @@ export function TechTreeSection() { return ( } {!exempt && } + diff --git a/src/components/Armor/components/PrimaryArmorScene.tsx b/src/components/Armor/components/PrimaryArmorScene.tsx index d8c2492d3..5ab77f777 100644 --- a/src/components/Armor/components/PrimaryArmorScene.tsx +++ b/src/components/Armor/components/PrimaryArmorScene.tsx @@ -7,7 +7,6 @@ import { useArmor } from '../../../hooks/useArmor'; import { useTankModelDefinition } from '../../../hooks/useTankModelDefinition'; import { useTankTransform } from '../../../hooks/useTankTransform'; import * as Duel from '../../../stores/duel'; -import * as TankopediaPersistent from '../../../stores/tankopediaPersistent'; import { ModelTankWrapper } from './ModelTankWrapper'; import { PrimaryArmorSceneComponent } from './PrimaryArmorSceneComponent'; @@ -29,13 +28,6 @@ export const PrimaryArmorScene = memo(() => { const hullOrigin = correctZYTuple(trackModelDefinition.origin); const turretOrigin = correctZYTuple(tankModelDefinition.turretOrigin); const gunOrigin = correctZYTuple(turretModelDefinition.gunOrigin); - const tankopediaPersistentStore = TankopediaPersistent.useStore(); - - console.log( - tankModelDefinition.armor, - turretModelDefinition.armor, - gunModelDefinition.armor, - ); useTankTransform(protagonist, turretContainer, gunContainer); diff --git a/src/core/blitzkit/tankCharacteristics.ts b/src/core/blitzkit/tankCharacteristics.ts index 5eee4c6bf..884950f30 100644 --- a/src/core/blitzkit/tankCharacteristics.ts +++ b/src/core/blitzkit/tankCharacteristics.ts @@ -75,8 +75,6 @@ export function tankCharacteristics( provisionDefinitions: ProvisionDefinitions; }, ) { - console.log(tank.crew); - const presetRows = equipmentDefinitions.presets[tank.equipment]; const turretModelDefinition = tankModelDefinition.turrets[turret.id]; const gunModelDefinition = turretModelDefinition.guns[gun.id]; diff --git a/src/core/blitzkit/tankDefinitions/index.ts b/src/core/blitzkit/tankDefinitions/index.ts index 5710b464a..ab70c86a8 100644 --- a/src/core/blitzkit/tankDefinitions/index.ts +++ b/src/core/blitzkit/tankDefinitions/index.ts @@ -40,7 +40,7 @@ export type ModuleDefinition = | GunDefinition; export interface TankDefinition { id: number; - roles: Record; + roles: Record; description?: string; fixedCamouflage?: boolean; camouflages?: number[]; @@ -173,13 +173,8 @@ export const tankDefinitions = fetchCdonLz4( asset('definitions/tanks.cdon.lz4'), ); -const entries = new Promise(async (resolve) => { - resolve(Object.entries(await tankDefinitions).map(([, entry]) => entry)); -}); -export const tanksDefinitionsArray = new Promise( - async (resolve) => { - resolve((await entries).map((entry) => entry)); // TODO: wtf? - }, +export const tanksDefinitionsArray = tankDefinitions.then((tanks) => + Object.values(tanks), ); export type Tier = (typeof TIERS)[number];