blitz scripts

This commit is contained in:
tresabhi committed 2026-09-22 15:25:25 -05:00
1 parent 1733180f2c
commit 402b6d5113
8 files changed
+90 -302

No files matched your search

+2
View File
@@ -1,9 +1,11 @@
{
"words": [
"Debuff",
"gamemodes",
"Passability",
"Recoverkit",
"Repairkit",
"Respawns",
"Tankopedia"
]
}
+2
View File
@@ -10,6 +10,7 @@ import {
SkillDefinitions,
TankDefinitions,
} from "@blitzkit/core";
import { BlitzScripts } from "../../types/blitzScripts";
export abstract class BlitzKitAPI {
abstract skills(): Promise<SkillDefinitions>;
@@ -22,6 +23,7 @@ export abstract class BlitzKitAPI {
abstract tanks(): Promise<TankDefinitions>;
abstract game(): Promise<GameDefinitions>;
abstract gallery(): Promise<Gallery>;
abstract scripts(): Promise<BlitzScripts>;
async tank(id: number) {
const tanks = await this.tanks();
@@ -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<string, number>;
type BonusValues = RSN & {
chancesToHit?: ModuleConstants;
modulesMaxHpFactors?: ModuleConstants;
modulesMaxRegenHpFactors?: ModuleConstants;
item?: RSN[];
};
interface ModuleConstants {
modules: Record<string, number | number[]>;
}
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;
}
+5
View File
@@ -0,0 +1,5 @@
export interface BlitzScripts {
consumables: Record<number, BlitzEffectScript>;
provisions: Record<number, BlitzEffectScript>;
equipment: Record<number, BlitzEffectScript>;
}
@@ -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;
}
-43
View File
@@ -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<string, number> entries from
* script.bonusValues.
*
* I also augment Record<string, number | ""> 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<string, float> values = 2;
}
@@ -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();
@@ -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...`,