diff --git a/packages/core/src/protos/tank_definitions.proto b/packages/core/src/protos/tank_definitions.proto index f38834482..475be1259 100644 --- a/packages/core/src/protos/tank_definitions.proto +++ b/packages/core/src/protos/tank_definitions.proto @@ -40,7 +40,7 @@ message TankDefinition { required string equipment_preset = 30; required uint32 weight = 31; required string dev_name = 32; - required Equalizer equalizer = 33; + optional Equalizer equalizer = 33; } message Equalizer { diff --git a/packages/core/src/protos/tank_definitions.ts b/packages/core/src/protos/tank_definitions.ts index 16c86e1df..6416ca442 100644 --- a/packages/core/src/protos/tank_definitions.ts +++ b/packages/core/src/protos/tank_definitions.ts @@ -291,7 +291,7 @@ export interface TankDefinition { equipment_preset: string; weight: number; dev_name: string; - equalizer: Equalizer | undefined; + equalizer?: Equalizer | undefined; } export interface TankDefinition_RolesEntry { diff --git a/packages/scripts/src/buildAssets/definitions.ts b/packages/scripts/src/buildAssets/definitions.ts index 00ac6b427..467a99b85 100644 --- a/packages/scripts/src/buildAssets/definitions.ts +++ b/packages/scripts/src/buildAssets/definitions.ts @@ -8,6 +8,7 @@ import { ConsumableTankCategoryFilterCategory, Crew, CrewType, + Equalizer, EquipmentDefinitions, EquipmentSlot, GameDefinitions, @@ -32,6 +33,7 @@ import { } from "@blitzkit/core"; import { SUPPORTED_LOCALE_BLITZ_MAP } from "@blitzkit/i18n"; import locales from "@blitzkit/i18n/locales.json"; +import { readFile } from "fs/promises"; import { deburr } from "lodash-es"; import { parse as parsePath } from "path"; import type { Vector3Tuple } from "three"; @@ -688,6 +690,24 @@ export async function definitions() { ); const consumableNativeNames: Record = {}; const provisionNativeNames: Record = {}; + let equalizerDefinitions: string[][]; + + if ( + await vfs.resolve("Data/XML/item_defs/vehicles/common/tier_equializer.csv") + ) { + equalizerDefinitions = await vfs.csv( + `Data/XML/item_defs/vehicles/common/tier_equializer.csv`, + { delimiter: ";" }, + ); + } else { + const stubEqualizerDefinitions = await readFile("stub/equalizer.csv").then( + (buffer) => buffer.toString(), + ); + + equalizerDefinitions = await vfs._csv(stubEqualizerDefinitions, { + delimiter: ";", + }); + } for (const match of squadBattleTypeStyles.Prototypes[0].components.UIDataLocalBindingsComponent.data[1][2].matchAll( /"(\d+)" -> "(battleType\/([a-zA-Z]+))"/g, @@ -998,6 +1018,18 @@ export async function definitions() { }) .map(([, camo]) => camo.id); + let equalizerEntry = equalizerDefinitions.find( + (line) => line[0] === `${nation}:${tankKey}`, + ); + + let equalizer: Equalizer | undefined; + + if (equalizerEntry) { + const [health, penetration, module_health, damage, armor] = + equalizerEntry?.slice(1).map(Number); + equalizer = { health, penetration, module_health, damage, armor }; + } + tankDefinitions.tanks[tankId] = { ancestors: [], successors: [], @@ -1037,6 +1069,7 @@ export async function definitions() { turrets: [], engines: [], tracks: [], + equalizer, }; if (tank.combatRole) { diff --git a/packages/scripts/src/core/vfs/abstract.ts b/packages/scripts/src/core/vfs/abstract.ts index 7f41c1ffe..9cae1309b 100644 --- a/packages/scripts/src/core/vfs/abstract.ts +++ b/packages/scripts/src/core/vfs/abstract.ts @@ -1,7 +1,8 @@ import { readDVPL } from "@blitzkit/core"; +import { Options, parse as parseCSV } from "csv-parse/sync"; import { XMLParser } from "fast-xml-parser"; import { normalize } from "path/posix"; -import { parse } from "yaml"; +import { parse as parseYaml } from "yaml"; export abstract class AbstractVFS { textDecoder = new TextDecoder(); @@ -54,7 +55,7 @@ export abstract class AbstractVFS { async yaml(path: string) { const file = await this.text(path); - return parse(file) as Type; + return parseYaml(file) as Type; } async xml(path: string) { @@ -62,6 +63,16 @@ export abstract class AbstractVFS { return this.xmlParser.parse(file) as Type; } + async _csv(text: string, options: Options = {}) { + const parsed = parseCSV(text, options); + return parsed; + } + + async csv(path: string, options: Options = {}) { + const text = await this.text(path); + return await this._csv(text, options); + } + [Symbol.dispose]() { this.dispose(); } diff --git a/packages/scripts/stub/equializer.csv b/packages/scripts/stub/equalizer.csv similarity index 100% rename from packages/scripts/stub/equializer.csv rename to packages/scripts/stub/equalizer.csv