From 7cfc30c7a19f0d1c77faed6a1f747e2f127747bb Mon Sep 17 00:00:00 2001 From: GonnaHetzMe Date: Tue, 7 Apr 2026 22:35:17 +0200 Subject: [PATCH 01/12] feat: add RIFF container support --- .../buildAssets/consumableProvisionIcons.ts | 61 +++++++++++++++++-- .../src/core/blitz/parsePackedSpriteRect.ts | 53 ++++++++++++++++ 2 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 packages/scripts/src/core/blitz/parsePackedSpriteRect.ts diff --git a/packages/scripts/src/buildAssets/consumableProvisionIcons.ts b/packages/scripts/src/buildAssets/consumableProvisionIcons.ts index 5622ddd88..d933ae28e 100644 --- a/packages/scripts/src/buildAssets/consumableProvisionIcons.ts +++ b/packages/scripts/src/buildAssets/consumableProvisionIcons.ts @@ -1,5 +1,6 @@ import sharp from "sharp"; import { AssetUploader } from "../core/github/assetUploader"; +import { parsePackedSpriteRect } from "../core/blitz/parsePackedSpriteRect"; import { vfs } from "./constants"; import { ConsumablesCommon, ProvisionsCommon } from "./definitions"; @@ -57,8 +58,35 @@ export async function consumableProvisionIcons() { .replace(".txt", ""); if (await vfs.resolve(`Data/${configPath}.packed.webp`)) { - const image = sharp(await vfs.file(`Data/${configPath}.packed.webp`)); - const content = await image.trim({ threshold: 100 }).toBuffer(); + const packedBuffer = await vfs.file(`Data/${configPath}.packed.webp`); + const consumablesTexture = sharp(packedBuffer); + const sizes = parsePackedSpriteRect(packedBuffer); + let content: Buffer; + + if (sizes) { + try { + content = await consumablesTexture + .clone() + .extract({ + left: sizes[0], + top: sizes[1], + width: sizes[2], + height: sizes[3], + }) + .toBuffer(); + } catch { + console.warn( + `Failed to extract consumable ${consumable.icon} from RIFF data; falling back to trim...`, + ); + content = await consumablesTexture + .trim({ threshold: 100 }) + .toBuffer(); + } + } else { + content = await consumablesTexture + .trim({ threshold: 100 }) + .toBuffer(); + } await uploader.add({ path: `icons/consumables/${consumable.id}.webp`, @@ -122,8 +150,33 @@ export async function consumableProvisionIcons() { .replace(".txt", ""); if (await vfs.resolve(`Data/${configPath}.packed.webp`)) { - const image = sharp(await vfs.file(`Data/${configPath}.packed.webp`)); - const content = await image.trim({ threshold: 100 }).toBuffer(); + const packedBuffer = await vfs.file(`Data/${configPath}.packed.webp`); + const provisionsTexture = sharp(packedBuffer); + const sizes = parsePackedSpriteRect(packedBuffer); + let content: Buffer; + + if (sizes) { + try { + content = await provisionsTexture + .clone() + .extract({ + left: sizes[0], + top: sizes[1], + width: sizes[2], + height: sizes[3], + }) + .toBuffer(); + } catch { + console.warn( + `Failed to extract provision ${provision.icon} from RIFF data; falling back to trim...`, + ); + content = await provisionsTexture + .trim({ threshold: 100 }) + .toBuffer(); + } + } else { + content = await provisionsTexture.trim({ threshold: 100 }).toBuffer(); + } await uploader.add({ path: `icons/provisions/${provision.id}.webp`, diff --git a/packages/scripts/src/core/blitz/parsePackedSpriteRect.ts b/packages/scripts/src/core/blitz/parsePackedSpriteRect.ts new file mode 100644 index 000000000..e47f0e8e9 --- /dev/null +++ b/packages/scripts/src/core/blitz/parsePackedSpriteRect.ts @@ -0,0 +1,53 @@ +const textDecoder = new TextDecoder(); + +function readFourCC(buffer: Uint8Array, offset: number) { + return textDecoder.decode(buffer.subarray(offset, offset + 4)); +} + +export function parsePackedSpriteRect(buffer: Uint8Array): number[] | null { + if ( + buffer.length < 12 || + readFourCC(buffer, 0) !== "RIFF" || + readFourCC(buffer, 8) !== "WEBP" + ) { + return null; + } + + const view = new DataView( + buffer.buffer, + buffer.byteOffset, + buffer.byteLength, + ); + let offset = 12; + + while (offset + 8 <= buffer.length) { + const chunkId = readFourCC(buffer, offset); + const chunkSize = view.getUint32(offset + 4, true); + const dataStart = offset + 8; + const dataEnd = dataStart + chunkSize; + + if (dataEnd > buffer.length) return null; + + if (chunkId === "extr") { + const lines = textDecoder + .decode(buffer.subarray(dataStart, dataEnd)) + .replace(/\0/g, "") + .split(/\r?\n/) + .map((line) => line.trim().split(/\s+/).map(Number)); + + for (const values of lines) { + if (values.length < 4) continue; + if (!values.slice(0, 4).every(Number.isFinite)) continue; + if (values[2] <= 0 || values[3] <= 0) continue; + + return values; + } + + return null; + } + + offset = dataEnd + (chunkSize % 2); + } + + return null; +} From 504f143ff7269ec31f6235f8677b8642f1b9aa55 Mon Sep 17 00:00:00 2001 From: GonnaHetzMe Date: Tue, 7 Apr 2026 23:15:26 +0200 Subject: [PATCH 02/12] fix: resolve requested changes --- .../buildAssets/consumableProvisionIcons.ts | 88 ++++++++++--------- 1 file changed, 48 insertions(+), 40 deletions(-) diff --git a/packages/scripts/src/buildAssets/consumableProvisionIcons.ts b/packages/scripts/src/buildAssets/consumableProvisionIcons.ts index d933ae28e..a9031bb24 100644 --- a/packages/scripts/src/buildAssets/consumableProvisionIcons.ts +++ b/packages/scripts/src/buildAssets/consumableProvisionIcons.ts @@ -14,6 +14,42 @@ interface Mappings { const listItemsPattern = //g; +async function extractPackedIcon( + texture: sharp.Sharp, + sizes: number[], + context: string, +) { + const [left, top, width, height] = sizes; + const bounds = [left, top, width, height]; + + if (!bounds.every(Number.isInteger)) { + throw new Error( + `Invalid RIFF sprite bounds for ${context}: ${bounds.join(" ")}`, + ); + } + + const metadata = await texture.metadata(); + + if (metadata.width === undefined || metadata.height === undefined) { + throw new Error(`Failed to read image dimensions for ${context}`); + } + + if ( + left < 0 || + top < 0 || + width <= 0 || + height <= 0 || + left + width > metadata.width || + top + height > metadata.height + ) { + throw new Error( + `Out-of-bounds RIFF sprite for ${context}: ${bounds.join(" ")} in ${metadata.width}x${metadata.height}`, + ); + } + + return await texture.clone().extract({ left, top, width, height }).toBuffer(); +} + export async function consumableProvisionIcons() { console.log("Building consumable and provision icons..."); @@ -64,28 +100,13 @@ export async function consumableProvisionIcons() { let content: Buffer; if (sizes) { - try { - content = await consumablesTexture - .clone() - .extract({ - left: sizes[0], - top: sizes[1], - width: sizes[2], - height: sizes[3], - }) - .toBuffer(); - } catch { - console.warn( - `Failed to extract consumable ${consumable.icon} from RIFF data; falling back to trim...`, - ); - content = await consumablesTexture - .trim({ threshold: 100 }) - .toBuffer(); - } + content = await extractPackedIcon( + consumablesTexture, + sizes, + `consumable ${consumable.icon}`, + ); } else { - content = await consumablesTexture - .trim({ threshold: 100 }) - .toBuffer(); + content = await consumablesTexture.trim({ threshold: 80 }).toBuffer(); } await uploader.add({ @@ -156,26 +177,13 @@ export async function consumableProvisionIcons() { let content: Buffer; if (sizes) { - try { - content = await provisionsTexture - .clone() - .extract({ - left: sizes[0], - top: sizes[1], - width: sizes[2], - height: sizes[3], - }) - .toBuffer(); - } catch { - console.warn( - `Failed to extract provision ${provision.icon} from RIFF data; falling back to trim...`, - ); - content = await provisionsTexture - .trim({ threshold: 100 }) - .toBuffer(); - } + content = await extractPackedIcon( + provisionsTexture, + sizes, + `provision ${provision.icon}`, + ); } else { - content = await provisionsTexture.trim({ threshold: 100 }).toBuffer(); + content = await provisionsTexture.trim({ threshold: 80 }).toBuffer(); } await uploader.add({ From 0df2acd5e6afb71bf58a81ae1c39bfca5403ff38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 7 Apr 2026 16:43:48 -0500 Subject: [PATCH 03/12] fix: equalizer in characteristics --- packages/cue4parse | 1 + .../website/src/core/blitzkit/tankCharacteristics.ts | 11 ++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) create mode 160000 packages/cue4parse diff --git a/packages/cue4parse b/packages/cue4parse new file mode 160000 index 000000000..b8c9dab50 --- /dev/null +++ b/packages/cue4parse @@ -0,0 +1 @@ +Subproject commit b8c9dab50010ac800e6810622e71f6ca8874a288 diff --git a/packages/website/src/core/blitzkit/tankCharacteristics.ts b/packages/website/src/core/blitzkit/tankCharacteristics.ts index 77b11c739..2f75f8930 100644 --- a/packages/website/src/core/blitzkit/tankCharacteristics.ts +++ b/packages/website/src/core/blitzkit/tankCharacteristics.ts @@ -183,11 +183,12 @@ export function tankCharacteristics( (coefficient([hasGunRammer, -0.05]) * coefficient([true, degressiveStat(loaderMastery)])) / coefficient([hasAdrenaline && gun.gun_type!.$case === "regular", 0.17]); - const penetrationCoefficient = - coefficient([ - hasCalibratedShells, - resolvePenetrationCoefficient(true, equalize, shell.type, equalizer) - 1, - ]) * equalizer.penetration; + const penetrationCoefficient = resolvePenetrationCoefficient( + hasCalibratedShells, + equalize, + shell.type, + equalizer, + ); const healthCoefficient = coefficient( [hasSandbagArmor, 0.03], From e43231aa9736b1e967f9333d4a26c2d79b451786 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 7 Apr 2026 16:44:03 -0500 Subject: [PATCH 04/12] fix: remove cue4parse --- packages/cue4parse | 1 - 1 file changed, 1 deletion(-) delete mode 160000 packages/cue4parse diff --git a/packages/cue4parse b/packages/cue4parse deleted file mode 160000 index b8c9dab50..000000000 --- a/packages/cue4parse +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b8c9dab50010ac800e6810622e71f6ca8874a288 From 2cdcf95822e128433a9f3bb5aebdf3a42772233f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 7 Apr 2026 16:57:04 -0500 Subject: [PATCH 05/12] fix: don't repeat reveal animation on scroll for tank sandbox --- .../components/TankSandbox/components/Lighting.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/Lighting.tsx b/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/Lighting.tsx index 7e69f49c6..a5d6fa550 100644 --- a/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/Lighting.tsx +++ b/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/Lighting.tsx @@ -38,19 +38,19 @@ export function Lighting() { draft.revealed = true; }); - t0.current = clock.elapsedTime - REVEAL_ANIMATION_TIME; + t0.current = performance.now() / 1000 - REVEAL_ANIMATION_TIME; }, []); useFrame(({ invalidate }) => { if (transition.current) { transition.current = false; - t0.current = clock.elapsedTime; + t0.current = performance.now() / 1000; } const x = clamp( - (clock.elapsedTime - t0.current) / animationTime.current, + (performance.now() / 1000 - t0.current) / animationTime.current, 0, - 2 + 2, ); const t = (0.5 * Math.sin(Math.PI * (x + 0.5)) + 0.5) ** 2; From 069edf084741e7ef5d636299522fdde997e417b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 7 Apr 2026 17:00:35 -0500 Subject: [PATCH 06/12] feat: hot script --- packages/website/src/components/Meta.astro | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/website/src/components/Meta.astro b/packages/website/src/components/Meta.astro index b8890591c..a92f46bcb 100644 --- a/packages/website/src/components/Meta.astro +++ b/packages/website/src/components/Meta.astro @@ -1,3 +1,4 @@ + From 5365044017c8adfb9120b131ff11079b38c88d33 Mon Sep 17 00:00:00 2001 From: GonnaHetzMe Date: Wed, 8 Apr 2026 08:48:53 +0200 Subject: [PATCH 07/12] fix: position of child nodes --- packages/scripts/src/core/blitz/extractModel/index.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/scripts/src/core/blitz/extractModel/index.ts b/packages/scripts/src/core/blitz/extractModel/index.ts index 362898414..846dd80c9 100644 --- a/packages/scripts/src/core/blitz/extractModel/index.ts +++ b/packages/scripts/src/core/blitz/extractModel/index.ts @@ -170,8 +170,12 @@ export async function extractModel(vfs: AbstractVFS, path: string) { break; case "TransformComponent": { - component["tc.localTranslation"] = [0, 0, 0]; // Game when is loading model resets position to [0, 0, 0], so any set value is ignored. - node.setTranslation(component["tc.localTranslation"]); + const localTranslation = component["tc.localTranslation"]; + // The game resets top-level node translation to [0, 0, 0] on load. + // Child nodes must keep their authored local offsets. + node.setTranslation( + parent instanceof Scene ? [0, 0, 0] : localTranslation, + ); node.setRotation(component["tc.localRotation"]); node.setScale(component["tc.localScale"]); From 7d9d322405c8fab93377c4c2a51981c3dee2db9c Mon Sep 17 00:00:00 2001 From: GonnaHetzMe Date: Wed, 8 Apr 2026 14:04:06 +0200 Subject: [PATCH 08/12] fix: correct input pitch offset for initial turret rotation --- .../Options/components/QuickInputs/index.tsx | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/packages/website/src/components/Tankopedia/HeroSection/components/Options/components/QuickInputs/index.tsx b/packages/website/src/components/Tankopedia/HeroSection/components/Options/components/QuickInputs/index.tsx index 27881773b..d4fd3d5b6 100644 --- a/packages/website/src/components/Tankopedia/HeroSection/components/Options/components/QuickInputs/index.tsx +++ b/packages/website/src/components/Tankopedia/HeroSection/components/Options/components/QuickInputs/index.tsx @@ -21,19 +21,20 @@ export function QuickInputs() { const turretModelDefinition = tankModelDefinition.turrets[protagonist.turret.id]; const gunModelDefinition = turretModelDefinition.guns[protagonist.gun.id]; - const initialGunPitch = + const initialTurretPitch = tankModelDefinition.initial_turret_rotation?.pitch ?? 0; const hasImprovedVerticalStabilizer = useEquipment(122); const hasDownImprovedVerticalStabilizer = useEquipment(124); + function displayPitch(pitch: number) { + return radToDeg(pitch) - initialTurretPitch; + } + useEffect(() => { function syncInputValues(data: ModelTransformEventData) { if (!pitchInput.current || !yawInput.current) return; - pitchInput.current.value = ( - radToDeg(data.pitch) + - (tankModelDefinition.initial_turret_rotation?.pitch ?? 0) - ).toFixed(1); + pitchInput.current.value = displayPitch(data.pitch).toFixed(1); yawInput.current.value = radToDeg(data.yaw).toFixed(1); } @@ -49,7 +50,7 @@ export function QuickInputs() { return () => { modelTransformEvent.off(handleTransformEvent); }; - }, [initialGunPitch]); + }, [initialTurretPitch]); return ( { const value = Number(pitchInput.current!.value); if (isNaN(value)) { - pitchInput.current!.value = ( - radToDeg(modelTransformEvent.last!.pitch) + initialGunPitch + pitchInput.current!.value = displayPitch( + modelTransformEvent.last!.pitch, ).toFixed(1); return; } const [pitch, yaw] = applyPitchYawLimits( - degToRad(value + initialGunPitch), + degToRad(value + initialTurretPitch), modelTransformEvent.last!.yaw, gunModelDefinition.pitch!, turretModelDefinition.yaw, @@ -135,8 +134,8 @@ export function QuickInputs() { hasDownImprovedVerticalStabilizer, ); modelTransformEvent.dispatch({ pitch, yaw }); - pitchInput.current!.value = ( - radToDeg(modelTransformEvent.last!.pitch) + initialGunPitch + pitchInput.current!.value = displayPitch( + modelTransformEvent.last!.pitch, ).toFixed(1); }} onKeyDown={(event) => { From 4b86e20a139fe59fbc2b330aef4b43232fa42d13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 8 Apr 2026 08:38:28 -0500 Subject: [PATCH 09/12] New Crowdin updates (#232) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Japanese) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Russian) --- packages/i18n/strings/es.json | 9 ++++++++- packages/i18n/strings/fr.json | 9 ++++++++- packages/i18n/strings/ja.json | 9 ++++++++- packages/i18n/strings/pl.json | 9 ++++++++- packages/i18n/strings/pt.json | 9 ++++++++- packages/i18n/strings/ru.json | 9 ++++++++- packages/i18n/strings/uk.json | 9 ++++++++- packages/i18n/strings/zh.json | 9 ++++++++- 8 files changed, 64 insertions(+), 8 deletions(-) diff --git a/packages/i18n/strings/es.json b/packages/i18n/strings/es.json index 843e8a18a..6e32c3c07 100644 --- a/packages/i18n/strings/es.json +++ b/packages/i18n/strings/es.json @@ -960,6 +960,7 @@ "tier": "Nivel", "type": "Tipo", "dev_id": "DEV: ID", + "dev_name": "DEV: NAME", "purchase": "Precio de compra", "restoration": "Precio de restauración", "sale": "Precio de venta", @@ -980,6 +981,11 @@ }, "configuration": { "title": "", + "equalizer": { + "title": "Equalizer", + "equalize": "Equalize", + "beta": "Beta" + }, "modules": { "title": "Módulos", "stock": "Base", @@ -1149,7 +1155,8 @@ }, "skills": { "clear": "Limpiar", - "maximize": "Maximizar" + "maximize": "Maximizar", + "equalize": "Equalize" }, "modules": { "stock": "Base", diff --git a/packages/i18n/strings/fr.json b/packages/i18n/strings/fr.json index de28071c3..cac1eae89 100644 --- a/packages/i18n/strings/fr.json +++ b/packages/i18n/strings/fr.json @@ -960,6 +960,7 @@ "tier": "Rang", "type": "Type", "dev_id": "DEV: ID", + "dev_name": "DEV: NAME", "purchase": "Purchase price", "restoration": "Restoration price", "sale": "Sale price", @@ -980,6 +981,11 @@ }, "configuration": { "title": "Configuration", + "equalizer": { + "title": "Equalizer", + "equalize": "Equalize", + "beta": "Beta" + }, "modules": { "title": "Modules", "stock": "Stock", @@ -1149,7 +1155,8 @@ }, "skills": { "clear": "Clear", - "maximize": "Maximize" + "maximize": "Maximize", + "equalize": "Equalize" }, "modules": { "stock": "Stock", diff --git a/packages/i18n/strings/ja.json b/packages/i18n/strings/ja.json index b77731786..07342801c 100644 --- a/packages/i18n/strings/ja.json +++ b/packages/i18n/strings/ja.json @@ -960,6 +960,7 @@ "tier": "Tier", "type": "タイプ", "dev_id": "DEV: ID", + "dev_name": "DEV: NAME", "purchase": "購入価格", "restoration": "再購入価格", "sale": "売却価格", @@ -980,6 +981,11 @@ }, "configuration": { "title": "構成", + "equalizer": { + "title": "Equalizer", + "equalize": "Equalize", + "beta": "Beta" + }, "modules": { "title": "モジュール", "stock": "初期装備", @@ -1149,7 +1155,8 @@ }, "skills": { "clear": "クリア", - "maximize": "最大" + "maximize": "最大", + "equalize": "Equalize" }, "modules": { "stock": "初期装備", diff --git a/packages/i18n/strings/pl.json b/packages/i18n/strings/pl.json index 667d5801e..8d3f05461 100644 --- a/packages/i18n/strings/pl.json +++ b/packages/i18n/strings/pl.json @@ -960,6 +960,7 @@ "tier": "Poziom", "type": "Rodzaj", "dev_id": "DEV: ID", + "dev_name": "DEV: NAME", "purchase": "Purchase price", "restoration": "Restoration price", "sale": "Sale price", @@ -980,6 +981,11 @@ }, "configuration": { "title": "Configuration", + "equalizer": { + "title": "Equalizer", + "equalize": "Equalize", + "beta": "Beta" + }, "modules": { "title": "Modules", "stock": "Stock", @@ -1149,7 +1155,8 @@ }, "skills": { "clear": "Clear", - "maximize": "Maximize" + "maximize": "Maximize", + "equalize": "Equalize" }, "modules": { "stock": "Stock", diff --git a/packages/i18n/strings/pt.json b/packages/i18n/strings/pt.json index f2e2768b7..4d1a14687 100644 --- a/packages/i18n/strings/pt.json +++ b/packages/i18n/strings/pt.json @@ -960,6 +960,7 @@ "tier": "Nível", "type": "Tipo", "dev_id": "DEV: ID", + "dev_name": "DEV: NAME", "purchase": "Preço de compra", "restoration": "Preço de recuperação", "sale": "Preço de venda", @@ -980,6 +981,11 @@ }, "configuration": { "title": "Configuração", + "equalizer": { + "title": "Equalizer", + "equalize": "Equalize", + "beta": "Beta" + }, "modules": { "title": "Módulos", "stock": "Padrão", @@ -1149,7 +1155,8 @@ }, "skills": { "clear": "Limpar", - "maximize": "Maximizar" + "maximize": "Maximizar", + "equalize": "Equalize" }, "modules": { "stock": "Padrão", diff --git a/packages/i18n/strings/ru.json b/packages/i18n/strings/ru.json index a01b626c6..85014a4fa 100644 --- a/packages/i18n/strings/ru.json +++ b/packages/i18n/strings/ru.json @@ -960,6 +960,7 @@ "tier": "Уровень", "type": "Тип", "dev_id": "DEV: ID", + "dev_name": "DEV: NAME", "purchase": "Цена покупки", "restoration": "Цена восстановления", "sale": "Цена продажи", @@ -980,6 +981,11 @@ }, "configuration": { "title": "Конфигурация", + "equalizer": { + "title": "Уравнение", + "equalize": "Уравнять", + "beta": "Бета" + }, "modules": { "title": "Модули", "stock": "Сток", @@ -1149,7 +1155,8 @@ }, "skills": { "clear": "Очистить", - "maximize": "Максимум" + "maximize": "Максимум", + "equalize": "Уравнять" }, "modules": { "stock": "Сток", diff --git a/packages/i18n/strings/uk.json b/packages/i18n/strings/uk.json index ca6682471..e30623ee7 100644 --- a/packages/i18n/strings/uk.json +++ b/packages/i18n/strings/uk.json @@ -960,6 +960,7 @@ "tier": "Рівень", "type": "Вид", "dev_id": "DEV: ID", + "dev_name": "DEV: NAME", "purchase": "Purchase price", "restoration": "Restoration price", "sale": "Sale price", @@ -980,6 +981,11 @@ }, "configuration": { "title": "Configuration", + "equalizer": { + "title": "Equalizer", + "equalize": "Equalize", + "beta": "Beta" + }, "modules": { "title": "Модулі", "stock": "Stock", @@ -1149,7 +1155,8 @@ }, "skills": { "clear": "Очистити", - "maximize": "Збільшити все" + "maximize": "Збільшити все", + "equalize": "Equalize" }, "modules": { "stock": "Stock", diff --git a/packages/i18n/strings/zh.json b/packages/i18n/strings/zh.json index c8b842b3f..31c8cd519 100644 --- a/packages/i18n/strings/zh.json +++ b/packages/i18n/strings/zh.json @@ -960,6 +960,7 @@ "tier": "阶级", "type": "战车类型", "dev_id": "开发参数:ID", + "dev_name": "DEV: NAME", "purchase": "购买价格", "restoration": "恢复坦克价格", "sale": "出售价格", @@ -980,6 +981,11 @@ }, "configuration": { "title": "配置设定", + "equalizer": { + "title": "Equalizer", + "equalize": "Equalize", + "beta": "Beta" + }, "modules": { "title": "坦克模块", "stock": "白板", @@ -1149,7 +1155,8 @@ }, "skills": { "clear": "清除", - "maximize": "最大化" + "maximize": "最大化", + "equalize": "Equalize" }, "modules": { "stock": "白板", From 455f1be041ba670d3e4887b82aed9053ad5e6569 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 8 Apr 2026 09:05:10 -0500 Subject: [PATCH 10/12] fix: use asset for diff --- packages/scripts/src/core/github/assetUploader.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/scripts/src/core/github/assetUploader.ts b/packages/scripts/src/core/github/assetUploader.ts index 858339b44..ff8254a7f 100644 --- a/packages/scripts/src/core/github/assetUploader.ts +++ b/packages/scripts/src/core/github/assetUploader.ts @@ -1,4 +1,4 @@ -import { assertSecret } from "@blitzkit/core"; +import { assertSecret, asset } from "@blitzkit/core"; import { Octokit } from "@octokit/rest"; import ProgressBar from "progress"; import { compareUint8Arrays } from "./compareUint8Arrays"; @@ -49,9 +49,8 @@ export class AssetUploader { } async add(change: FileChange) { - const blobPath = `${this.owner}/${this.repo}/${this.branch}/${change.path}`; const response = await fetch( - `https://raw.githubusercontent.com/${blobPath}`, + asset(change.path), { headers: { "Accept-Encoding": "identity" } }, ); let diff: { change: number; status: DiffStatus }; From e2e38dc4b33698ae20d931b71a634bcb3ab6bed1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Thu, 9 Apr 2026 21:12:16 -0500 Subject: [PATCH 11/12] revert --- packages/website/src/components/Analytics.astro | 6 +++--- packages/website/src/components/Meta.astro | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/website/src/components/Analytics.astro b/packages/website/src/components/Analytics.astro index c818fbff5..415a4cd5d 100644 --- a/packages/website/src/components/Analytics.astro +++ b/packages/website/src/components/Analytics.astro @@ -1,5 +1,5 @@ --- -import { assertSecret } from '@blitzkit/core'; +import { assertSecret } from "@blitzkit/core"; const PUBLIC_GOOGLE_TAG_MANAGER_ID = assertSecret( import.meta.env.PUBLIC_GOOGLE_TAG_MANAGER_ID, @@ -19,7 +19,7 @@ const PUBLIC_GOOGLE_TAG_MANAGER_ID = assertSecret( dataLayer.push(arguments); } - gtag('js', new Date()); + gtag("js", new Date()); - gtag('config', PUBLIC_GOOGLE_TAG_MANAGER_ID); + gtag("config", PUBLIC_GOOGLE_TAG_MANAGER_ID); diff --git a/packages/website/src/components/Meta.astro b/packages/website/src/components/Meta.astro index a92f46bcb..b8890591c 100644 --- a/packages/website/src/components/Meta.astro +++ b/packages/website/src/components/Meta.astro @@ -1,4 +1,3 @@ - From 8b0077295860bc9f1b6495a68151864bd96c4d93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Thu, 9 Apr 2026 21:17:34 -0500 Subject: [PATCH 12/12] feat: logs --- docs/changelogs/1.30.2.md | 12 ++++++++++++ package.json | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 docs/changelogs/1.30.2.md diff --git a/docs/changelogs/1.30.2.md b/docs/changelogs/1.30.2.md new file mode 100644 index 000000000..e6437cad0 --- /dev/null +++ b/docs/changelogs/1.30.2.md @@ -0,0 +1,12 @@ +# BlitzKit 1.30.2 + +Thank you to [GonnaHetzMe](https://github.com/karelpak1) for your contributions this update. + +## Fixes + +- [GonnaHetzMe] Tungsten shells are now properly cropped +- Equalizer no longer gives insanely high penetration values +- The tank reveal animation no longer repeats when you scroll away and back to the tank sandbox +- [GonnaHetzMe] The RHM. Pzw.'s turret no longer has the floating plate + - Please give BlitzKit up to 1 hour to update the model +- [GonnaHetzMe] Tanks with inclined turret rings like the Minotauro now display the correct pitch in the tank sandbox inputs diff --git a/package.json b/package.json index fb1528452..ed634eb22 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blitzkit", - "version": "1.30.1", + "version": "1.30.2", "license": "BlitzKit License", "private": true, "scripts": {