From 17c54be1c824b67e9f9535b7606663a9977f850f Mon Sep 17 00:00:00 2001 From: tresabhi <43380238+tresabhi@users.noreply.github.com> Date: Sat, 1 Aug 2026 12:56:12 -0500 Subject: [PATCH] some definitions headers --- packages/core/src/blitzkit/api/base.ts | 4 +- packages/core/src/blitzkit/api/server.ts | 143 ++++++++++++------ packages/core/src/types/blitzStrings.ts | 3 + packages/core/src/types/combatRolesYaml.ts | 7 + packages/core/src/types/consumablesCommon.ts | 24 +++ .../src/types/consumablesVehicleFilter.ts | 4 + packages/core/src/types/index.ts | 7 + .../core/src/types/optionalDeviceSlots.ts | 13 ++ packages/core/src/types/optionalDevices.ts | 10 ++ packages/core/src/types/provisionsCommon.ts | 22 +++ packages/scripts/src/buildAssets/constants.ts | 14 +- .../scripts/src/buildAssets/definitions.ts | 120 +-------------- packages/website/src/core/blitzkit/api.ts | 2 +- 13 files changed, 206 insertions(+), 167 deletions(-) create mode 100644 packages/core/src/types/blitzStrings.ts create mode 100644 packages/core/src/types/combatRolesYaml.ts create mode 100644 packages/core/src/types/consumablesCommon.ts create mode 100644 packages/core/src/types/consumablesVehicleFilter.ts create mode 100644 packages/core/src/types/optionalDeviceSlots.ts create mode 100644 packages/core/src/types/optionalDevices.ts create mode 100644 packages/core/src/types/provisionsCommon.ts diff --git a/packages/core/src/blitzkit/api/base.ts b/packages/core/src/blitzkit/api/base.ts index 4de3155a9..5b7460efb 100644 --- a/packages/core/src/blitzkit/api/base.ts +++ b/packages/core/src/blitzkit/api/base.ts @@ -1,5 +1,3 @@ -import { GameDefinitions } from "../../protos"; - export abstract class BlitzKitAPI { - abstract game(): Promise; + // abstract game(): Promise; } diff --git a/packages/core/src/blitzkit/api/server.ts b/packages/core/src/blitzkit/api/server.ts index 3cfc74a66..b155390e7 100644 --- a/packages/core/src/blitzkit/api/server.ts +++ b/packages/core/src/blitzkit/api/server.ts @@ -1,69 +1,124 @@ import { AbstractVFS, - AvailableNationsYaml, - SquadBattleTypeStylesYaml, + BlitzStrings, + CamouflageDefinitions, + ConsumableDefinitions, + ConsumablesCommon, + EquipmentDefinitions, + I18nString, + MapDefinitions, + ModelDefinitions, + OptionalDevices, + OptionalDeviceSlots, + ProvisionDefinitions, + ProvisionsCommon, + SkillDefinitions, + TankDefinitions, } from "@blitzkit/core"; -import { GameDefinitions } from "../../protos"; +import { SUPPORTED_LOCALE_BLITZ_MAP } from "@blitzkit/i18n"; +import locales from "@blitzkit/i18n/locales.json"; +import { parse as parseYaml } from "yaml"; import { BlitzKitAPI } from "./base"; export class ServerBlitzKitAPI extends BlitzKitAPI { - vfs: AbstractVFS; + private vfs: AbstractVFS; + + private stringsI18n: Record> = {}; + + private nationsDir?: string[]; + consumablesCommon: ConsumablesCommon = {}; + provisionsCommon: ProvisionsCommon = {}; + + private optionalDevices?: { root: OptionalDevices }; + private optionalDeviceSlots?: { root: OptionalDeviceSlots }; constructor(vfs: AbstractVFS) { super(); - this.vfs = vfs; } - async game() { - const versionFile = await this.vfs.text("Data/version.txt"); - const version = versionFile.split(" ")[0]; + async init() { + await Promise.all( + locales.supported.map(async ({ locale }) => { + const blitzLocale = SUPPORTED_LOCALE_BLITZ_MAP[locale]; + const cache = await fetch( + `https://stufficons.wgcdn.co/localizations/${blitzLocale}.yaml`, + ) + .then((response) => response.text()) + .then((string) => parseYaml(string) as BlitzStrings); + const preInstalled = await this.vfs.yaml( + `Data/Strings/${blitzLocale}.yaml`, + ); - const availableNations = await this.vfs.yaml( - "Data/available_nations.yaml", + this.stringsI18n[locale] = { + ...cache, + ...preInstalled, + }; + }), ); - const nations = availableNations.available_nations; - const game: GameDefinitions = { - version, - nations, - gameModes: {}, - roles: {}, + this.nationsDir = await this.vfs + .dir("Data/XML/item_defs/vehicles") + .then((files) => files.filter((nation) => nation !== "common")); + + this.optionalDevices = await this.vfs.xml<{ root: OptionalDevices }>( + "Data/XML/item_defs/vehicles/common/optional_devices.xml", + ); + this.optionalDeviceSlots = await this.vfs.xml<{ + root: OptionalDeviceSlots; + }>(`Data/XML/item_defs/vehicles/common/optional_device_slots.xml`); + } + + private getString(name: string) { + const collection: Record = { + [locales.default]: this.stringsI18n[locales.default][name], }; - const squadBattleTypeStyles = - await this.vfs.yaml( - `Data/UI/Screens3/Lobby/Hangar/Squad/SquadBattleType.yaml`, - ); + for (const { locale } of locales.supported) { + const localizedString = this.stringsI18n[locale][name]; - for (const match of squadBattleTypeStyles.Prototypes[0].components.UIDataLocalBindingsComponent.data[1][2].matchAll( - /"(\d+)" -> "(battleType\/([a-zA-Z]+))"/g, - )) { - const id = Number(match[1]); - const name = getString(match[2]); + if ( + localizedString === undefined || + localizedString === collection[locales.default] + ) { + continue; + } - gameModeNativeNames[match[3]] = id; - game.gameModes[id] = { - name, - }; + collection[locale] = localizedString; } - Object.entries(combatRoles).forEach(([, value]) => { - gameDefinitions.roles[value.id] = { provisions: [], consumables: [] }; + return { locales: collection } satisfies I18nString; + } - value.default_abilities.forEach((ability) => { - if (ability in consumableNativeNames) { - gameDefinitions.roles[value.id].consumables.push( - consumableNativeNames[ability], - ); - } else if (ability in provisionNativeNames) { - gameDefinitions.roles[value.id].provisions.push( - provisionNativeNames[ability], - ); - } else throw new Error(`Unknown ability ${ability}`); - }); - }); + async tankDefinitions() { + const tankDefinitions = TankDefinitions.create(); + } - return game; + async camouflageDefinitions() { + const camouflageDefinitions = CamouflageDefinitions.create(); + } + + async modelDefinitions() { + const modelDefinitions = ModelDefinitions.create(); + } + + async mapDefinitions() { + const mapDefinitions = MapDefinitions.create(); + } + + async equipmentDefinitions() { + const equipmentDefinitions = EquipmentDefinitions.create(); + } + + async consumableDefinitions() { + const consumableDefinitions = ConsumableDefinitions.create(); + } + + async provisionDefinitions() { + const provisionDefinitions = ProvisionDefinitions.create(); + } + + async skillDefinitions() { + const skillDefinitions = SkillDefinitions.create(); } } diff --git a/packages/core/src/types/blitzStrings.ts b/packages/core/src/types/blitzStrings.ts new file mode 100644 index 000000000..c57857a90 --- /dev/null +++ b/packages/core/src/types/blitzStrings.ts @@ -0,0 +1,3 @@ +export interface BlitzStrings { + [key: string]: string; +} diff --git a/packages/core/src/types/combatRolesYaml.ts b/packages/core/src/types/combatRolesYaml.ts new file mode 100644 index 000000000..a0a42a393 --- /dev/null +++ b/packages/core/src/types/combatRolesYaml.ts @@ -0,0 +1,7 @@ +export type CombatRolesYaml = Record< + string, + { + id: number; + default_abilities: string[]; + } +>; diff --git a/packages/core/src/types/consumablesCommon.ts b/packages/core/src/types/consumablesCommon.ts new file mode 100644 index 000000000..6b4068edf --- /dev/null +++ b/packages/core/src/types/consumablesCommon.ts @@ -0,0 +1,24 @@ +import { ConsumablesVehicleFilter } from "./consumablesVehicleFilter"; + +export interface ConsumablesCommon { + [key: string]: { + id: number; + userString: string; + description: string; + icon: string; + category: string; + tags: string; + vehicleFilter?: { + include: { vehicle: ConsumablesVehicleFilter; nations?: string }; + exclude?: { vehicle: ConsumablesVehicleFilter; nations?: string }; + }; + script: { + "#text": string; + automatic?: boolean; + cooldown: number; + duration?: number; + shotEffect?: string; + bonusValues?: { [key: string]: number }; + } & Record; + }; +} diff --git a/packages/core/src/types/consumablesVehicleFilter.ts b/packages/core/src/types/consumablesVehicleFilter.ts new file mode 100644 index 000000000..637664919 --- /dev/null +++ b/packages/core/src/types/consumablesVehicleFilter.ts @@ -0,0 +1,4 @@ +export type ConsumablesVehicleFilter = + | { minLevel: number; maxLevel: number } + | { name: string } + | { extendedTags: string }; diff --git a/packages/core/src/types/index.ts b/packages/core/src/types/index.ts index 4b42a8d8b..a0f1104fc 100644 --- a/packages/core/src/types/index.ts +++ b/packages/core/src/types/index.ts @@ -1,4 +1,11 @@ export * from "./availableNationsYaml"; +export * from "./blitzStrings"; +export * from "./combatRolesYaml"; +export * from "./consumablesCommon"; +export * from "./consumablesVehicleFilter"; export * from "./glossary"; +export * from "./optionalDevices"; +export * from "./optionalDeviceSlots"; +export * from "./provisionsCommon"; export * from "./squadBattleTypeStylesYaml"; export * from "./tanksStats"; diff --git a/packages/core/src/types/optionalDeviceSlots.ts b/packages/core/src/types/optionalDeviceSlots.ts new file mode 100644 index 000000000..df1dd9427 --- /dev/null +++ b/packages/core/src/types/optionalDeviceSlots.ts @@ -0,0 +1,13 @@ +export interface OptionalDeviceSlots { + presets: { + [key: string]: { + level0: OptionalDeviceSlotRow; + level1: OptionalDeviceSlotRow; + level2: OptionalDeviceSlotRow; + }; + }; +} + +interface OptionalDeviceSlotRow { + [key: string]: { device0: string; device1: string }; +} diff --git a/packages/core/src/types/optionalDevices.ts b/packages/core/src/types/optionalDevices.ts new file mode 100644 index 000000000..26e14bc27 --- /dev/null +++ b/packages/core/src/types/optionalDevices.ts @@ -0,0 +1,10 @@ +export interface OptionalDevices { + [key: string]: { + id: number; + userString: string; + description: string; + icon: string; + script: unknown; + display_params: unknown; + }; +} diff --git a/packages/core/src/types/provisionsCommon.ts b/packages/core/src/types/provisionsCommon.ts new file mode 100644 index 000000000..9bd27ad3e --- /dev/null +++ b/packages/core/src/types/provisionsCommon.ts @@ -0,0 +1,22 @@ +import { ConsumablesVehicleFilter } from "./consumablesVehicleFilter"; + +export interface ProvisionsCommon { + [key: string]: { + id: number; + userString: string; + description: string; + icon: string; + category: string; + tags: string; + vehicleFilter?: { + include: { vehicle: ConsumablesVehicleFilter; nations?: string }; + exclude?: { vehicle: ConsumablesVehicleFilter; nations?: string }; + }; + script: { + "#text": string; + automatic?: boolean; + shotEffect?: string; + bonusValues?: { [key: string]: number }; + } & Record; + }; +} diff --git a/packages/scripts/src/buildAssets/constants.ts b/packages/scripts/src/buildAssets/constants.ts index d295c7ad6..1cc136550 100644 --- a/packages/scripts/src/buildAssets/constants.ts +++ b/packages/scripts/src/buildAssets/constants.ts @@ -1,9 +1,11 @@ -import { assertSecret } from "@blitzkit/core"; -import { AbstractVFS } from "../core/vfs/abstract"; -import { LocalVFS } from "../core/vfs/local"; -import { MixedVFS } from "../core/vfs/mixed"; -import { SteamVFS } from "../core/vfs/steam"; -import { ZipVFS } from "../core/vfs/zip"; +import { + AbstractVFS, + assertSecret, + LocalVFS, + MixedVFS, + SteamVFS, + ZipVFS, +} from "@blitzkit/core"; export const PATCHES_ROOT = "../../temp/patches"; diff --git a/packages/scripts/src/buildAssets/definitions.ts b/packages/scripts/src/buildAssets/definitions.ts index 71afd37b1..8d7f4ac99 100644 --- a/packages/scripts/src/buildAssets/definitions.ts +++ b/packages/scripts/src/buildAssets/definitions.ts @@ -12,7 +12,6 @@ import { EquipmentDefinitions, EquipmentSlot, GunDefinition, - I18nString, MapDefinitions, ModelDefinitions, ModuleType, @@ -22,6 +21,7 @@ import { ShellType, SkillDefinitions, sluggify, + SquadBattleTypeStylesYaml, TankClass, TankDefinitions, TankPrice, @@ -31,13 +31,9 @@ import { Unlock, Vector3, } from "@blitzkit/core"; -import { SUPPORTED_LOCALE_BLITZ_MAP } from "@blitzkit/i18n"; -import locales from "@blitzkit/i18n/locales.json"; import { readFile } from "fs/promises"; import { parse as parsePath } from "path"; import type { Vector3Tuple } from "three"; -import { parse as parseYaml } from "yaml"; -import { AssetUploader } from "../core/github/assetUploader"; import { vfs } from "./constants"; import type { Avatar } from "./skillIcons"; import type { TankParameters } from "./tankIcons"; @@ -350,31 +346,6 @@ interface GunDefinitionsList { }; }; } - -export interface OptionalDevices { - [key: string]: { - id: number; - userString: string; - description: string; - icon: string; - script: unknown; - display_params: unknown; - }; -} - -interface OptionalDeviceSlots { - presets: { - [key: string]: { - level0: OptionalDeviceSlotRow; - level1: OptionalDeviceSlotRow; - level2: OptionalDeviceSlotRow; - }; - }; -} - -interface OptionalDeviceSlotRow { - [key: string]: { device0: string; device1: string }; -} export interface ConsumablesCommon { [key: string]: { id: number; @@ -530,84 +501,7 @@ function assignArmor( } export async function definitions() { - console.log("Building definitions..."); - - const uploader = new AssetUploader("definitions"); - - const tankDefinitions: TankDefinitions = { tanks: {} }; - const camouflageDefinitions: CamouflageDefinitions = { camouflages: {} }; - const modelDefinitions: ModelDefinitions = { models: {} }; - const mapDefinitions: MapDefinitions = { maps: {} }; - const equipmentDefinitions: EquipmentDefinitions = { - presets: {}, - equipments: {}, - }; - const consumableDefinitions: ConsumableDefinitions = { consumables: {} }; - const provisionDefinitions: ProvisionDefinitions = { provisions: {} }; - const skillDefinitions: SkillDefinitions = { - classes: { - [TankClass.TANK_CLASS_LIGHT]: { skills: [] }, - [TankClass.TANK_CLASS_MEDIUM]: { skills: [] }, - [TankClass.TANK_CLASS_HEAVY]: { skills: [] }, - [TankClass.TANK_CLASS_TANK_DESTROYER]: { skills: [] }, - }, - }; - const nations = await vfs - .dir("Data/XML/item_defs/vehicles") - .then((files) => files.filter((nation) => nation !== "common")); const tankStringIdMap: Record = {}; - const optionalDevices = await vfs.xml<{ root: OptionalDevices }>( - "Data/XML/item_defs/vehicles/common/optional_devices.xml", - ); - const stringsI18n: Record> = {}; - - await Promise.all( - locales.supported.map(async ({ locale }) => { - const blitzLocale = SUPPORTED_LOCALE_BLITZ_MAP[locale]; - const cache = await fetch( - `https://stufficons.wgcdn.co/localizations/${blitzLocale}.yaml`, - ) - .then((response) => response.text()) - .then((string) => parseYaml(string) as BlitzStrings); - const preInstalled = await vfs.yaml( - `Data/Strings/${blitzLocale}.yaml`, - ); - - stringsI18n[locale] = { - ...cache, - ...preInstalled, - }; - - console.log(`Loaded strings for ${locale}`); - }), - ); - - function getString(name: string) { - const collection: Record = { - [locales.default]: stringsI18n[locales.default][name], - }; - - for (const { locale } of locales.supported) { - const localizedString = stringsI18n[locale][name]; - - if ( - localizedString === undefined || - localizedString === collection[locales.default] - ) { - continue; - } - - collection[locale] = localizedString; - } - - return { locales: collection } satisfies I18nString; - } - - const optionalDeviceSlots = await vfs.xml<{ - root: OptionalDeviceSlots; - }>(`Data/XML/item_defs/vehicles/common/optional_device_slots.xml`); - const consumables: ConsumablesCommon = {}; - const provisions: ProvisionsCommon = {}; for (const match of ( await vfs.text(`Data/XML/item_defs/vehicles/common/consumables/list.xml`) @@ -615,7 +509,7 @@ export async function definitions() { if (match[1] === "prototypes") continue; Object.assign( - consumables, + consumablesCommon, ( await vfs.xml<{ root: ConsumablesCommon }>( `Data/XML/item_defs/vehicles/common/consumables/${match[1]}.xml`, @@ -630,7 +524,7 @@ export async function definitions() { if (match[1] === "prototypes") continue; Object.assign( - provisions, + provisionsCommon, ( await vfs.xml<{ root: ConsumablesCommon }>( `Data/XML/item_defs/vehicles/common/provisions/${match[1]}.xml`, @@ -723,7 +617,7 @@ export async function definitions() { const slugRequesters = new Map(); const idToNation: Record = {}; - for (const nation of nations) { + for (const nation of nationsDir) { const tankList = await vfs.xml<{ root: VehicleDefinitionList }>( `Data/XML/item_defs/vehicles/${nation}/list.xml`, ); @@ -803,7 +697,7 @@ export async function definitions() { } }); - for (const nation of nations) { + for (const nation of nationsDir) { const tankList = await vfs.xml<{ root: VehicleDefinitionList }>( `Data/XML/item_defs/vehicles/${nation}/list.xml`, ); @@ -1538,7 +1432,7 @@ export async function definitions() { }, ); - Object.entries(consumables).forEach(([key, consumable]) => { + Object.entries(consumablesCommon).forEach(([key, consumable]) => { consumableNativeNames[key] = consumable.id; const entry: Consumable = { @@ -1638,7 +1532,7 @@ export async function definitions() { } }); - Object.entries(provisions).forEach(([key, provision]) => { + Object.entries(provisionsCommon).forEach(([key, provision]) => { provisionNativeNames[key] = provision.id; const entry: Provision = { diff --git a/packages/website/src/core/blitzkit/api.ts b/packages/website/src/core/blitzkit/api.ts index 904849c84..ac76d15c0 100644 --- a/packages/website/src/core/blitzkit/api.ts +++ b/packages/website/src/core/blitzkit/api.ts @@ -7,7 +7,7 @@ import { let _api: BlitzKitAPI; if (import.meta.env.SSR) { - _api = new ServerBlitzKitAPI(); + _api = await new ServerBlitzKitAPI(vfs).init(); } else { _api = new ClientBlitzKitAPI(); }