diff --git a/packages/core/src/blitzkit/api/base.ts b/packages/core/src/blitzkit/api/base.ts new file mode 100644 index 000000000..4de3155a9 --- /dev/null +++ b/packages/core/src/blitzkit/api/base.ts @@ -0,0 +1,5 @@ +import { GameDefinitions } from "../../protos"; + +export abstract class BlitzKitAPI { + abstract game(): Promise; +} diff --git a/packages/core/src/blitzkit/api/client.ts b/packages/core/src/blitzkit/api/client.ts new file mode 100644 index 000000000..82f751ce1 --- /dev/null +++ b/packages/core/src/blitzkit/api/client.ts @@ -0,0 +1,9 @@ +import { fetchPB } from "../../protobuf"; +import { GameDefinitions } from "../../protos"; +import { BlitzKitAPI } from "./base"; + +export class ClientBlitzKitAPI extends BlitzKitAPI { + game() { + return fetchPB("/api/definitions/game.pb", GameDefinitions); + } +} diff --git a/packages/core/src/blitzkit/api/index.ts b/packages/core/src/blitzkit/api/index.ts new file mode 100644 index 000000000..2087a06c6 --- /dev/null +++ b/packages/core/src/blitzkit/api/index.ts @@ -0,0 +1,3 @@ +export * from "./base"; +export * from "./client"; +export * from "./server"; diff --git a/packages/core/src/blitzkit/api/server.ts b/packages/core/src/blitzkit/api/server.ts new file mode 100644 index 000000000..3cfc74a66 --- /dev/null +++ b/packages/core/src/blitzkit/api/server.ts @@ -0,0 +1,69 @@ +import { + AbstractVFS, + AvailableNationsYaml, + SquadBattleTypeStylesYaml, +} from "@blitzkit/core"; +import { GameDefinitions } from "../../protos"; +import { BlitzKitAPI } from "./base"; + +export class ServerBlitzKitAPI extends BlitzKitAPI { + vfs: AbstractVFS; + + constructor(vfs: AbstractVFS) { + super(); + + this.vfs = vfs; + } + + async game() { + const versionFile = await this.vfs.text("Data/version.txt"); + const version = versionFile.split(" ")[0]; + + const availableNations = await this.vfs.yaml( + "Data/available_nations.yaml", + ); + const nations = availableNations.available_nations; + + const game: GameDefinitions = { + version, + nations, + gameModes: {}, + roles: {}, + }; + + const squadBattleTypeStyles = + await this.vfs.yaml( + `Data/UI/Screens3/Lobby/Hangar/Squad/SquadBattleType.yaml`, + ); + + 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]); + + gameModeNativeNames[match[3]] = id; + game.gameModes[id] = { + name, + }; + } + + Object.entries(combatRoles).forEach(([, value]) => { + gameDefinitions.roles[value.id] = { provisions: [], consumables: [] }; + + 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}`); + }); + }); + + return game; + } +} diff --git a/packages/core/src/blitzkit/gameDefinitions.ts b/packages/core/src/blitzkit/gameDefinitions.ts deleted file mode 100644 index d7573adb0..000000000 --- a/packages/core/src/blitzkit/gameDefinitions.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { fetchPB } from '../protobuf'; -import { GameDefinitions } from '../protos'; -import { asset } from './asset'; - -export function fetchGameDefinitions() { - return fetchPB(asset('definitions/game.pb'), GameDefinitions); -} diff --git a/packages/core/src/blitzkit/index.ts b/packages/core/src/blitzkit/index.ts index fdae4b28d..935f5e654 100644 --- a/packages/core/src/blitzkit/index.ts +++ b/packages/core/src/blitzkit/index.ts @@ -7,15 +7,16 @@ export * from "./averageDefinitions"; export * from "./coefficient"; export * from "./consumableDefinitions"; // export * from './context'; +export * from "./api"; export * from "./createDefaultSkills"; export * from "./degressiveStat"; export * from "./discoveredIdDefinitions"; export * from "./emblemURL"; export * from "./equipmentDefinitions"; export * from "./eventManager"; -export * from "./gameDefinitions"; export * from "./getArchivedLatestSeasonNumber"; export * from "./sluggify"; +export * from "./vfs"; // export * from './getArchivedRatingInfo'; export * from "./getArchivedRatingLeaderboard"; // export * from './getArchivedRatingMidnightLeaderboard'; diff --git a/packages/scripts/src/core/vfs/abstract.ts b/packages/core/src/blitzkit/vfs/abstract.ts similarity index 100% rename from packages/scripts/src/core/vfs/abstract.ts rename to packages/core/src/blitzkit/vfs/abstract.ts diff --git a/packages/core/src/blitzkit/vfs/index.ts b/packages/core/src/blitzkit/vfs/index.ts new file mode 100644 index 000000000..939b46d1c --- /dev/null +++ b/packages/core/src/blitzkit/vfs/index.ts @@ -0,0 +1,5 @@ +export * from "./abstract"; +export * from "./local"; +export * from "./mixed"; +export * from "./steam"; +export * from "./zip"; diff --git a/packages/scripts/src/core/vfs/local.ts b/packages/core/src/blitzkit/vfs/local.ts similarity index 100% rename from packages/scripts/src/core/vfs/local.ts rename to packages/core/src/blitzkit/vfs/local.ts diff --git a/packages/scripts/src/core/vfs/mixed.ts b/packages/core/src/blitzkit/vfs/mixed.ts similarity index 100% rename from packages/scripts/src/core/vfs/mixed.ts rename to packages/core/src/blitzkit/vfs/mixed.ts diff --git a/packages/scripts/src/core/vfs/steam.ts b/packages/core/src/blitzkit/vfs/steam.ts similarity index 100% rename from packages/scripts/src/core/vfs/steam.ts rename to packages/core/src/blitzkit/vfs/steam.ts diff --git a/packages/scripts/src/core/vfs/zip.ts b/packages/core/src/blitzkit/vfs/zip.ts similarity index 100% rename from packages/scripts/src/core/vfs/zip.ts rename to packages/core/src/blitzkit/vfs/zip.ts diff --git a/packages/core/src/types/availableNationsYaml.ts b/packages/core/src/types/availableNationsYaml.ts new file mode 100644 index 000000000..735642b69 --- /dev/null +++ b/packages/core/src/types/availableNationsYaml.ts @@ -0,0 +1,3 @@ +export interface AvailableNationsYaml { + available_nations: string[]; +} diff --git a/packages/core/src/types/index.ts b/packages/core/src/types/index.ts index c47180e45..4b42a8d8b 100644 --- a/packages/core/src/types/index.ts +++ b/packages/core/src/types/index.ts @@ -1,2 +1,4 @@ -export * from './glossary'; -export * from './tanksStats'; +export * from "./availableNationsYaml"; +export * from "./glossary"; +export * from "./squadBattleTypeStylesYaml"; +export * from "./tanksStats"; diff --git a/packages/core/src/types/squadBattleTypeStylesYaml.ts b/packages/core/src/types/squadBattleTypeStylesYaml.ts new file mode 100644 index 000000000..f8d3d30ca --- /dev/null +++ b/packages/core/src/types/squadBattleTypeStylesYaml.ts @@ -0,0 +1,9 @@ +export interface SquadBattleTypeStylesYaml { + Prototypes: { + components: { + UIDataLocalBindingsComponent: { + data: [string, string, string][]; + }; + }; + }[]; +} diff --git a/packages/scripts/src/buildAssets/definitions.ts b/packages/scripts/src/buildAssets/definitions.ts index b2b10160d..71afd37b1 100644 --- a/packages/scripts/src/buildAssets/definitions.ts +++ b/packages/scripts/src/buildAssets/definitions.ts @@ -11,7 +11,6 @@ import { Equalizer, EquipmentDefinitions, EquipmentSlot, - GameDefinitions, GunDefinition, I18nString, MapDefinitions, @@ -491,20 +490,6 @@ export interface MapAlly { points: Array; } -interface AvailableNationsYaml { - available_nations: string[]; -} - -export interface SquadBattleTypeStyles { - Prototypes: { - components: { - UIDataLocalBindingsComponent: { - data: [string, string, string][]; - }; - }; - }[]; -} - type CombatRolesYaml = Record< string, { @@ -548,14 +533,7 @@ export async function definitions() { console.log("Building definitions..."); const uploader = new AssetUploader("definitions"); - const gameDefinitions: GameDefinitions = { - version: (await vfs.text("Data/version.txt")).split(" ")[0], - nations: ( - await vfs.yaml("Data/available_nations.yaml") - ).available_nations, - gameModes: {}, - roles: {}, - }; + const tankDefinitions: TankDefinitions = { tanks: {} }; const camouflageDefinitions: CamouflageDefinitions = { camouflages: {} }; const modelDefinitions: ModelDefinitions = { models: {} }; @@ -673,10 +651,10 @@ export async function definitions() { `Data/camouflages.yaml`, ); const camouflagesXmlEntries = Object.entries(camouflagesXml.root.camouflages); - const squadBattleTypeStyles = await vfs.yaml( + const squadBattleTypeStyles = await vfs.yaml( `Data/UI/Screens3/Lobby/Hangar/Squad/SquadBattleType.yaml`, ); - const gameTypeSelectorStyles = await vfs.yaml( + const gameTypeSelectorStyles = await vfs.yaml( `Data/UI/Screens/Lobby/Hangar/GameTypeSelector.yaml`, ); const gameModeNativeNames: Record = {}; @@ -708,12 +686,8 @@ export async function definitions() { /"(\d+)" -> "(battleType\/([a-zA-Z]+))"/g, )) { const id = Number(match[1]); - const name = getString(match[2]); gameModeNativeNames[match[3]] = id; - gameDefinitions.gameModes[id] = { - name, - }; } for (const match of gameTypeSelectorStyles.Prototypes[0].components.UIDataLocalBindingsComponent.data[1][2].matchAll( @@ -1767,22 +1741,6 @@ export async function definitions() { } }); - Object.entries(combatRoles).forEach(([, value]) => { - gameDefinitions.roles[value.id] = { provisions: [], consumables: [] }; - - 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}`); - }); - }); - Object.entries(avatar.root.skillsByClasses).forEach(([tankClass, skills]) => { skillDefinitions.classes[ blitzTankClassToBlitzkit[tankClass as BlitzTankClass] @@ -1798,10 +1756,6 @@ export async function definitions() { }; }); - await uploader.add({ - content: GameDefinitions.encode(gameDefinitions).finish(), - path: "definitions/game.pb", - }); await uploader.add({ content: TankDefinitions.encode(tankDefinitions).finish(), path: "definitions/tanks.pb", diff --git a/packages/scripts/src/buildAssets/gameModeBanners.ts b/packages/scripts/src/buildAssets/gameModeBanners.ts index df8a6a73d..1e53a68a3 100644 --- a/packages/scripts/src/buildAssets/gameModeBanners.ts +++ b/packages/scripts/src/buildAssets/gameModeBanners.ts @@ -1,16 +1,16 @@ import sharp from "sharp"; import { AssetUploader } from "../core/github/assetUploader"; import { vfs } from "./constants"; -import { SquadBattleTypeStyles } from "./definitions"; +import { SquadBattleTypeStylesYaml } from "./definitions"; export async function gameModeBanners() { console.log("Building game mode banners..."); using uploader = new AssetUploader("game mode banners"); - const gameTypeSelectorStyles = await vfs.yaml( + const gameTypeSelectorStyles = await vfs.yaml( `Data/UI/Screens/Lobby/Hangar/GameTypeSelector.yaml`, ); - const squadBattleTypeStyles = await vfs.yaml( + const squadBattleTypeStyles = await vfs.yaml( `Data/UI/Screens3/Lobby/Hangar/Squad/SquadBattleType.yaml`, ); const bannerMatches: { name: string; path: string }[] = []; diff --git a/packages/website/src/components/Footer.astro b/packages/website/src/components/Footer.astro index 196f62f34..7db12917e 100644 --- a/packages/website/src/components/Footer.astro +++ b/packages/website/src/components/Footer.astro @@ -1,7 +1,8 @@ --- -import { assertSecret, fetchGameDefinitions } from "@blitzkit/core"; +import { assertSecret } from "@blitzkit/core"; import { Box, Code, Flex, Heading, Link, Text } from "@radix-ui/themes"; import packageJson from "../../../../package.json"; +import { api } from "../core/blitzkit/api"; import { getStrings } from "../core/i18n/getStrings"; import { LinkI18n } from "./LinkI18n"; import { LocaleSwitcherThemeWrapper } from "./LocaleSwitcher"; @@ -10,7 +11,7 @@ export interface Props { locale: string; } -const gameDefinitions = await fetchGameDefinitions(); +const gameDefinitions = await api.game(); const PUBLIC_ASSET_BRANCH = assertSecret(import.meta.env.PUBLIC_BRANCH); const { locale } = Astro.props; const strings = getStrings(locale); diff --git a/packages/website/src/core/blitzkit/api.ts b/packages/website/src/core/blitzkit/api.ts new file mode 100644 index 000000000..904849c84 --- /dev/null +++ b/packages/website/src/core/blitzkit/api.ts @@ -0,0 +1,15 @@ +import { + ClientBlitzKitAPI, + ServerBlitzKitAPI, + type BlitzKitAPI, +} from "@blitzkit/core"; + +let _api: BlitzKitAPI; + +if (import.meta.env.SSR) { + _api = new ServerBlitzKitAPI(); +} else { + _api = new ClientBlitzKitAPI(); +} + +export const api = _api;