From 3058756346912e0b48944519c121968d63b6338a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 13 Aug 2024 19:38:05 -0500 Subject: [PATCH] feat: camouflage definitiosn --- scripts/buildAssets/definitions.ts | 103 ++++++++++++++++++++- src/core/blitzkit/camouflageDefinitions.ts | 16 ++++ src/core/blitzkit/tankDefinitions/index.ts | 1 + 3 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 src/core/blitzkit/camouflageDefinitions.ts diff --git a/scripts/buildAssets/definitions.ts b/scripts/buildAssets/definitions.ts index 83f4f83f3..2f5023037 100644 --- a/scripts/buildAssets/definitions.ts +++ b/scripts/buildAssets/definitions.ts @@ -8,6 +8,7 @@ import { readStringDVPL } from '../../src/core/blitz/readStringDVPL'; import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL'; import { readYAMLDVPL } from '../../src/core/blitz/readYAMLDVPL'; import { toUniqueId } from '../../src/core/blitz/toUniqueId'; +import { CamouflageDefinitions } from '../../src/core/blitzkit/camouflageDefinitions'; import { commitAssets } from '../../src/core/blitzkit/commitAssets'; import { ConsumableDefinitions, @@ -323,6 +324,48 @@ export interface ProvisionsCommon { }; } +type CamouflagesInclude = + | { + nations?: string; + } + | { + vehicle?: { name?: string; minLevel?: number; maxLevel?: number }; + }; + +interface CamouflagesXML { + camouflages: Record< + string, + { + id: number; + userString: string; + description: string; + category: string; + group: string; + kind: string; + notInShop: boolean; + unlockCostCategory?: string; + vehicleFilter: { + include?: CamouflagesInclude | CamouflagesInclude[]; + }; + script: string[] | string; + icon?: string; + unlockPremium?: string; + unlockQuest?: string; + unlockClanLevel?: number; + unlockShopBundle?: string; + unlockTankRank?: number; + } + >; +} + +type CamouflagesYaml = Record< + string, + { + userString?: string; + shortUserString?: string; + } +>; + type ConsumablesVehicleFilter = | { minLevel: number; maxLevel: number } | { name: string } @@ -389,6 +432,7 @@ export async function definitions(production: boolean) { ).available_nations, }; const tankDefinitions: TankDefinitions = {}; + const camouflageDefinitions: CamouflageDefinitions = {}; const modelDefinitions: ModelDefinitions = {}; const mapDefinitions: MapDefinitions = {}; const equipmentDefinitions: EquipmentDefinitions = { @@ -431,6 +475,33 @@ export async function definitions(production: boolean) { ); const maps = await readYAMLDVPL(`${DATA}/maps.yaml.dvpl`); const tankXps = new Map(); + const camouflagesXml = await readXMLDVPL<{ root: CamouflagesXML }>( + `${DATA}/XML/item_defs/vehicles/common/camouflages.xml.dvpl`, + ); + const camouflagesYaml = await readYAMLDVPL( + `${DATA}/camouflages.yaml.dvpl`, + ); + const camouflagesXmlEntries = Object.entries(camouflagesXml.root.camouflages); + + camouflagesXmlEntries.forEach(([camoKey, camo]) => { + const yamlEntry = camouflagesYaml[camoKey]; + const fullName = yamlEntry.userString + ? strings[yamlEntry.userString] + : undefined; + const shortName = yamlEntry.shortUserString + ? strings[yamlEntry.shortUserString] + : undefined; + const resolvedTankName = shortName ?? fullName; + const resolvedTankNameFull = + resolvedTankName === fullName ? undefined : fullName; + + camouflageDefinitions[camo.id] = { + id: camo.id, + name: strings[camo.userString], + tankName: resolvedTankName, + tankNameFull: resolvedTankNameFull, + }; + }); await Promise.all( nations.map(async (nation) => { @@ -554,11 +625,11 @@ export async function definitions(production: boolean) { const fixedCamouflage = tankTags.includes('eventCamouflage_user'); const totalUnlocks: UnlocksListing[] = []; - Object.entries(tankDefinition.root.crew).forEach(([key, value]) => { + Object.entries(tankDefinition.root.crew).forEach(([crewKey, value]) => { let entry: Crew; - const index = crew.findIndex(({ type }) => type === key); + const index = crew.findIndex(({ type }) => type === crewKey); if (index === -1) { - entry = { type: key as CrewMember }; + entry = { type: crewKey as CrewMember }; crew.push(entry); } else { entry = crew[index]; @@ -589,8 +660,29 @@ export async function definitions(production: boolean) { } }); + const camouflages = camouflagesXmlEntries + .filter(([, camo]) => { + if (!camo.vehicleFilter.include) return false; + if (camo.unlockCostCategory !== 'legendary-skins-gold') + return false; + + const includeArray = Array.isArray(camo.vehicleFilter.include) + ? camo.vehicleFilter.include + : [camo.vehicleFilter.include]; + + return includeArray.some((filter) => { + if ('vehicle' in filter && filter.vehicle?.name) { + return filter.vehicle.name === `${nation}:${tankKey}`; + } + + return false; + }); + }) + .map(([, camo]) => camo.id); + tankDefinitions[tankId] = { id: tankId, + camouflages: camouflages.length === 0 ? undefined : camouflages, description: wargamingTankopedia.data[tankId]?.description ?? undefined, fixedCamouflage: fixedCamouflage ? true : undefined, @@ -1262,6 +1354,11 @@ export async function definitions(production: boolean) { encoding: 'base64', path: 'definitions/maps.cdon.lz4', }, + { + content: superCompress(camouflageDefinitions), + encoding: 'base64', + path: 'definitions/camouflages.cdon.lz4', + }, ], production, ); diff --git a/src/core/blitzkit/camouflageDefinitions.ts b/src/core/blitzkit/camouflageDefinitions.ts new file mode 100644 index 000000000..53c9bc3d0 --- /dev/null +++ b/src/core/blitzkit/camouflageDefinitions.ts @@ -0,0 +1,16 @@ +import { asset } from './asset'; +import { fetchCdonLz4 } from './fetchCdonLz4'; + +export type CamouflageDefinitions = Record< + number, + { + id: number; + name: string; + tankName?: string; + tankNameFull?: string; + } +>; + +export const camouflageDefinitions = fetchCdonLz4( + asset('definitions/camouflages.cdon.lz4'), +); diff --git a/src/core/blitzkit/tankDefinitions/index.ts b/src/core/blitzkit/tankDefinitions/index.ts index c345dc972..dccd7789a 100644 --- a/src/core/blitzkit/tankDefinitions/index.ts +++ b/src/core/blitzkit/tankDefinitions/index.ts @@ -43,6 +43,7 @@ export interface TankDefinition { id: number; description?: string; fixedCamouflage?: boolean; + camouflages?: number[]; ancestors?: number[]; successors?: number[]; crew: Crew[];