From 402b6d5113ed8c0b6f06504b04cb63833f726d26 Mon Sep 17 00:00:00 2001 From: tresabhi <43380238+tresabhi@users.noreply.github.com> Date: Tue, 22 Sep 2026 15:25:25 -0500 Subject: [PATCH] blitz scripts --- cspell.json | 2 + packages/core/src/blitzkit/api/base.ts | 2 + packages/core/src/types/blitzEffectScript.ts | 76 ++++++ packages/core/src/types/blitzScripts.ts | 5 + .../src/types/provisionConsumableScript.ts | 257 ------------------ packages/protos/src/blitzkit/script.proto | 43 --- .../definitions/provisions.pb.ts | 3 +- .../icons/consumables/[id].webp.ts | 4 +- 8 files changed, 90 insertions(+), 302 deletions(-) create mode 100644 packages/core/src/types/blitzEffectScript.ts create mode 100644 packages/core/src/types/blitzScripts.ts delete mode 100644 packages/core/src/types/provisionConsumableScript.ts delete mode 100644 packages/protos/src/blitzkit/script.proto diff --git a/cspell.json b/cspell.json index f3d36a919..a1933694d 100644 --- a/cspell.json +++ b/cspell.json @@ -1,9 +1,11 @@ { "words": [ + "Debuff", "gamemodes", "Passability", "Recoverkit", "Repairkit", + "Respawns", "Tankopedia" ] } diff --git a/packages/core/src/blitzkit/api/base.ts b/packages/core/src/blitzkit/api/base.ts index a51ba18e7..c3cc46ffc 100644 --- a/packages/core/src/blitzkit/api/base.ts +++ b/packages/core/src/blitzkit/api/base.ts @@ -10,6 +10,7 @@ import { SkillDefinitions, TankDefinitions, } from "@blitzkit/core"; +import { BlitzScripts } from "../../types/blitzScripts"; export abstract class BlitzKitAPI { abstract skills(): Promise; @@ -22,6 +23,7 @@ export abstract class BlitzKitAPI { abstract tanks(): Promise; abstract game(): Promise; abstract gallery(): Promise; + abstract scripts(): Promise; async tank(id: number) { const tanks = await this.tanks(); diff --git a/packages/core/src/types/blitzEffectScript.ts b/packages/core/src/types/blitzEffectScript.ts new file mode 100644 index 000000000..032f99384 --- /dev/null +++ b/packages/core/src/types/blitzEffectScript.ts @@ -0,0 +1,76 @@ +type BlitzEffectScript = RSN & { + "#text": string; + attribute?: string; + + cooldown?: number; + duration?: number; + startCooldown?: number; + + automatic?: boolean; + keepSpoted?: boolean; + breakTracks?: boolean; + disableTracksCollisionDamage?: boolean; + simpleMode?: boolean; + + shotEffect?: string; + contusionChances?: string; + modules?: string; + damageFactors?: string; + + extrasMustBeStopped?: string; + targetExtrasMustBeStopped?: string; + conflictExtras?: string; + effectExtraName?: string; + clientEffectVariant?: string; + + piercingFactors?: RSN; + visionRadiusPercentageBonus?: RSN; + bonus?: RSN; + enginePowerPercentageBonus?: RSN; + bonusPercentage?: RSN; + attributes?: RSN; + respawnBoost?: RSN; + maxHealthFactor?: RSN; + + bonusValues?: BonusValues; + modulesHealthFactors?: ModuleConstants; + chancesToHit?: ChangesToHit; + respawns?: Respawns; + slowDebuff?: SlowDebuff; +}; + +type RSN = Record; + +type BonusValues = RSN & { + chancesToHit?: ModuleConstants; + modulesMaxHpFactors?: ModuleConstants; + modulesMaxRegenHpFactors?: ModuleConstants; + item?: RSN[]; +}; + +interface ModuleConstants { + modules: Record; +} + +interface ModulesMaxHPFactorsModules { + ammoBayHealth: number; +} + +interface ChangesToHit { + crew: number; + modules: RSN; +} + +interface Respawns { + respawn: RSN; +} + +interface SlowDebuff { + item: SlowDebuffItem[]; +} + +interface SlowDebuffItem { + duration: number; + enginePowerFactor: RSN; + speedLimitsFactor: RSN; +} diff --git a/packages/core/src/types/blitzScripts.ts b/packages/core/src/types/blitzScripts.ts new file mode 100644 index 000000000..a4c4fb585 --- /dev/null +++ b/packages/core/src/types/blitzScripts.ts @@ -0,0 +1,5 @@ +export interface BlitzScripts { + consumables: Record; + provisions: Record; + equipment: Record; +} diff --git a/packages/core/src/types/provisionConsumableScript.ts b/packages/core/src/types/provisionConsumableScript.ts deleted file mode 100644 index da58fcd01..000000000 --- a/packages/core/src/types/provisionConsumableScript.ts +++ /dev/null @@ -1,257 +0,0 @@ -interface ProvisionConsumableScript { - attribute?: string; - bonusValues?: BonusValuesClass | string; - "#text": string; - piercingFactors?: PiercingFactors; - modulesHealthFactors?: ModulesHealthFactorsClass | string; - rammingAbsorptionPercent?: number | string; - chancesToHit?: ChancesToHitChancesToHit | string; - largeCaliberHighExplosiveDamageFactor?: number; - largeCaliberHighExplosivePiercingFactor?: number; - maxHpBonusPercent?: number; - modules?: string; - visionRadiusPercentageBonus?: Bonus; - activateWhenStillSec?: number; - activateBonusFactor?: number; - bonus?: Bonus; - bonusPercentage?: BonusPercentage; - enginePowerPercentageBonus?: Bonus; - weight?: number; - automatic?: boolean; - cooldown?: number; - duration?: number; - enginePowerIncrease?: number; - rotationSpeedFactor?: number; - fwdSpeedLimitBias?: number; - bkwdSpeedLimitBias?: number; - shotDispersionAngleFactor?: number; - aimingTimeFactor?: number; - clipReloadTimeFactor?: number; - gunReloadTimeFactor?: number; - shieldCoef?: number; - minDamageFactor?: number; - maxDamageFactor?: number; - shotEffect?: string; - deactivateStates?: number; - activateStates?: number; - contusionChances?: string; - abortVelocity?: number; - distance?: number; - activationDamageFactor?: number; - damageFactor?: number; - startCooldown?: number; - keepSpoted?: boolean; - conflictExtras?: string; - effectExtraName?: string; - clientEffectVariant?: string; - range?: number; - healthFactor?: number; - burstForce?: number; - damageFactors?: string; - flyTime?: number; - distanceOffset?: number; - timeSeconds?: number; - extrasMustBeStopped?: string; - breakTracks?: boolean; - minAngleDegrees?: number; - maxAngleDegrees?: number; - attributes?: { [key: string]: number }; - acceleration?: number; - burstRange?: number; - burstDamagePercent?: number; - projectileSpeed?: number; - healWaveDelay?: number; - healWavesCount?: number; - healFactorPercent?: number; - selfHealReducePercent?: number; - shieldDuration?: number; - targetExtrasMustBeStopped?: string; - maxHealthSelfDamageFactor?: number; - maxHealthDamageFactor?: number; - disableTracksCollisionDamage?: boolean; - maxHealthDamagePercent?: number; - poisonTicks?: number; - poisonTickDelay?: number; - effectDuration?: number; - radius?: number; - attractorMass?: number; - hpStockPercent?: number; - invisibilityInMovingFactor?: number; - maxBonusSources?: number; - sixthSenseDelay?: number; - stopObservingDelayFactor?: number; - revengeDamagePercentage?: number; - timeForComeBack?: number; - simpleMode?: boolean; - respawns?: Respawns; - curseStrength?: number; - curseReduction?: number; - curseHeal?: number; - explodeDamagePercent?: number; - damageReductionPercent?: number; - respawnBoost?: RespawnBoost; - slowDebuff?: SlowDebuff; - maxHealthFactor?: Bonus; - minRammingDamageMaxHealthRatio?: number; - minRammingDamageCooldown?: number; - optDeviceRammingDamageOverride?: number; -} - -interface Bonus { - lightTank: number; - mediumTank: number; - heavyTank: number; - "AT-SPG": number; - SPG?: number; -} - -interface BonusPercentage { - rotationSpeedFactor?: number; - firmGroundPassabilityIncrease?: number; - softGroundPassabilityIncrease?: number; - mediumGroundPassabilityIncrease?: number; -} - -interface BonusValuesClass { - percent?: number; - value?: number; - projectileSpeedFactor?: number; - piercingPenaltyFactor500m?: number; - circularVisionRadiusIncrease?: number; - upperPitchLimitIncrease?: number; - lowerPitchLimitIncrease?: number; - enginePowerIncrease?: number; - gunReloadSpeedIncrease?: number; - damageReductionPercent?: number; - rammingDamageFactor?: number; - sacrificeLoss?: number; - damagePercentBonus?: number; - enginePowerFactor?: number; - maxVelocityFactor?: number; - terrainResistanceFactor?: number; - chassisHealthFactor?: number; - rotationSpeedFactor?: number; - damageReflectionPercent?: number; - enginePowerAbilityFactor?: number; - speedLimitAbilityBonus?: number; - crewLevelIncrease?: number; - factor?: number; - turretRotationSpeedIncrease?: number; - crewChanceToHitFactor?: number; - repairSpeedIncrease?: number; - fireProtectionIncrease?: number; - explosivesHealthIncrease?: number; - fwdSpeedLimitBias?: number; - bkwdSpeedLimitBias?: number; - lifestealFactor?: number; - lifestealRandomFactor?: number; - killHealFactor?: number; - healFactor?: number; - healRandomFactor?: number; - dealingRammingDamageFactor?: number; - gunReloadingBonus?: number; - gunAimingTimeBonus?: number; - visionRadiusBonus?: number; - shotDispersionAngleFactor?: number; - aimingTimeFactor?: number; - timeBetweenShots?: number; - increasedDamageChance?: number; - increaseDamageFactor?: number; - gunReloadFactor?: number; - commonDamageFactor?: number; - speedLimitsFactor?: number; - maxHealthPercentBonus?: number; - maxStaticsDamagePercent?: number; - chancesToHit?: BonusValuesChancesToHit; - modulesMaxHpFactors?: ModulesMaxHPFactors; - modulesMaxRegenHpFactors?: ModulesMaxHPFactors; - item?: BonusValuesItem[]; -} - -interface BonusValuesChancesToHit { - modules: PurpleModules; -} - -interface PurpleModules { - engineHealth: number; - fuelTankHealth: number; - turretRotatorHealth: number; - surveyingDeviceHealth: number[]; - ammoBayHealth: number; -} - -interface BonusValuesItem { - commonDamageFactor: number; - reloadSpeedFactor: number; -} - -interface ModulesMaxHPFactors { - modules: ModulesMaxHPFactorsModules; -} - -interface ModulesMaxHPFactorsModules { - ammoBayHealth: number; -} - -interface ChancesToHitChancesToHit { - crew: number; - modules: FluffyModules; -} - -interface FluffyModules { - engineHealth: number; - ammoBayHealth: number; - commanderHealth: number; - driverHealth: number; - gunner1Health: number; - gunner2Health: number; - loader1Health: number; - loader2Health: number; -} - -interface ModulesHealthFactorsClass { - modules: ModulesHealthFactorsModules; -} - -interface ModulesHealthFactorsModules { - leftTrackHealth: number; - rightTrackHealth: number; - fuelTankHealth: number; - ammoBayHealth: number; -} - -interface PiercingFactors { - ARMOR_PIERCING: number; - HOLLOW_CHARGE: number; - HIGH_EXPLOSIVE: number; - ARMOR_PIERCING_HE: number; - ARMOR_PIERCING_CR: number; -} - -interface RespawnBoost { - duration: number; - enginePowerFactor: number; - speedLimitAbilityBonus: number; -} - -interface Respawns { - respawn: Respawn[]; -} - -interface Respawn { - respawnIndex: number; - bonusDamage: number; - bonusReloadSpeed: number; - bonusMaxSpeed: number; - bonusEnginePower: number; -} - -interface SlowDebuff { - item: SlowDebuffItem[]; -} - -interface SlowDebuffItem { - duration: number; - enginePowerFactor: Bonus; - speedLimitsFactor: Bonus; -} diff --git a/packages/protos/src/blitzkit/script.proto b/packages/protos/src/blitzkit/script.proto deleted file mode 100644 index 12b941a9d..000000000 --- a/packages/protos/src/blitzkit/script.proto +++ /dev/null @@ -1,43 +0,0 @@ -syntax = "proto3"; - -package blitzkit; - -import "tank_definitions.proto"; - -/** - * Wargaming's script system for provisions, consumables, and equipment is - * genuinely the most repulsive and inconsistent XML schema I have ever seen. - * Here are my notes on how I normalize the data into BlitzKit. I can totally - * see why they want to move to Unreal Engine. This is unhealthy. - */ -message Script { - /** - * If #text is "StaticFactorDevice", type will be script.attribute, otherwise - * type will assume the value of #text. Same for "StaticAdditiveDevice". - */ - string type = 1; - - optional bool automatic = 2; - optional float cooldown = 3; - optional float duration = 4; - bool keep_spotted = 5; - - /** - * Bonus values enjoys Record entries from - * script.bonusValues. - * - * I also augment Record values from the root of the - * script object. That is, if an entry on the root script object isn't - * "attribute", "bonusValues", "#text", etc., it goes in here. Empty strings - * values get omitted. - * - * Values from script.visionRadiusPercentageBonus from type CoatedOptics will - * also be merged into here to be consistent with CamouflageNet. God fucking - * damn it Wargaming. - * - * Same goes for all these: - * - enginePowerPercentageBonus - * - visionRadiusPercentageBonus - */ - map values = 2; -} \ No newline at end of file diff --git a/packages/website/src/pages/[...chunk_api]/definitions/provisions.pb.ts b/packages/website/src/pages/[...chunk_api]/definitions/provisions.pb.ts index bb9c9a43f..8cb6b62da 100644 --- a/packages/website/src/pages/[...chunk_api]/definitions/provisions.pb.ts +++ b/packages/website/src/pages/[...chunk_api]/definitions/provisions.pb.ts @@ -1,12 +1,13 @@ import { ProvisionDefinitions } from "@blitzkit/core"; import { api } from "../../../blitzkit/api"; +import { vfs } from "../../../core/blitzkit/vfs"; export { getStaticPaths } from "../_index"; export async function GET() { const definitions = await api.provisions(); - return Response.json(definitions); + return Response.json(await vfs.yaml("Data/Strings/en.yaml")); const bytes = ProvisionDefinitions.encode(definitions).finish(); diff --git a/packages/website/src/pages/[...chunk_api]/icons/consumables/[id].webp.ts b/packages/website/src/pages/[...chunk_api]/icons/consumables/[id].webp.ts index baf7df8a9..ed6526901 100644 --- a/packages/website/src/pages/[...chunk_api]/icons/consumables/[id].webp.ts +++ b/packages/website/src/pages/[...chunk_api]/icons/consumables/[id].webp.ts @@ -1,9 +1,9 @@ import type { ConsumablesCommon } from "@blitzkit/core"; import type { APIContext, GetStaticPathsItem } from "astro"; import sharp from "sharp"; +import { mixStaticPaths } from "../../../../astro/mixStaticPaths"; import { extractPackedIcon } from "../../../../core/blitz/extractPackedIcon"; import { parsePackedSpriteRect } from "../../../../core/blitz/parsePackedSpriteRect"; -import { mixStaticPaths } from "../../../../astro/mixStaticPaths"; import { vfs } from "../../../../core/blitzkit/vfs"; import { getStaticPaths as _getStaticPaths } from "../../_index"; @@ -47,6 +47,8 @@ export const getStaticPaths = mixStaticPaths(_getStaticPaths, async () => { ), ); + console.log(consumable); + if (!styleSheet) { console.warn( `No style sheet found for consumable ${consumable.icon}; skipping...`,