diff --git a/packages/website/src/components/ModuleButtons/ModuleButton.tsx b/packages/website/src/components/ModuleButtons/ModuleButton.tsx
index 663293425..3f343b0fe 100644
--- a/packages/website/src/components/ModuleButtons/ModuleButton.tsx
+++ b/packages/website/src/components/ModuleButtons/ModuleButton.tsx
@@ -1,6 +1,5 @@
-import { asset } from '@blitzkit/core';
-import { GenericTankComponentButton } from './GenericTankComponentButton';
-import type { TankComponentButtonProps } from './TankComponentButton';
+import { GenericTankComponentButton } from "./GenericTankComponentButton";
+import type { TankComponentButtonProps } from "./TankComponentButton";
interface ModuleProps extends TankComponentButtonProps {
module: string;
@@ -9,11 +8,11 @@ interface ModuleProps extends TankComponentButtonProps {
export function ModuleButton({ module, ...props }: ModuleProps) {
return (
diff --git a/packages/website/src/components/SmallTankIcon.tsx b/packages/website/src/components/SmallTankIcon.tsx
index 9bf36d757..b133d4b07 100644
--- a/packages/website/src/components/SmallTankIcon.tsx
+++ b/packages/website/src/components/SmallTankIcon.tsx
@@ -1,5 +1,3 @@
-import { asset } from '@blitzkit/core';
-
interface SmallTankIconProps {
id: number;
size?: number;
@@ -13,16 +11,16 @@ export function SmallTankIcon({ id, size = HEIGHT }: SmallTankIconProps) {
diff --git a/packages/website/src/pages/[...chunk_api]/tanks/[id]/icons/big.webp.ts b/packages/website/src/pages/[...chunk_api]/tanks/[id]/icons/big.webp.ts
index 53863090c..c2b517a63 100644
--- a/packages/website/src/pages/[...chunk_api]/tanks/[id]/icons/big.webp.ts
+++ b/packages/website/src/pages/[...chunk_api]/tanks/[id]/icons/big.webp.ts
@@ -36,40 +36,32 @@ export async function GET({ props }: APIContext<{ id: number }>) {
const bigPath = `Data/${parameters.resourcesPath.bigIconPath
.replace(/~res:\//, "")
.replace(/\..+/, "")}.packed.webp`;
- const big = await extractPackedTankIcon(
- await vfs.file(bigPath),
- `tank ${tankKey} big`,
- );
+ const big = await extractPackedTankIcon(await vfs.file(bigPath));
return new Response(big);
}
}
}
-export async function extractPackedTankIcon(
- bytes: Uint8Array,
- context: string,
-) {
+export async function extractPackedTankIcon(bytes: Uint8Array) {
const texture = sharp(bytes);
const spriteRect = parsePackedSpriteRect(bytes);
if (!spriteRect) {
- throw new Error(`Missing RIFF sprite bounds for ${context}`);
+ throw new Error(`Missing RIFF sprite bounds`);
}
const [left, top, width, height] = spriteRect;
const bounds = [left, top, width, height];
if (!bounds.every(Number.isInteger)) {
- throw new Error(
- `Invalid RIFF sprite bounds for ${context}: ${bounds.join(" ")}`,
- );
+ throw new Error(`Invalid RIFF sprite bounds: ${bounds.join(" ")}`);
}
const metadata = await texture.metadata();
if (metadata.width === undefined || metadata.height === undefined) {
- throw new Error(`Failed to read image dimensions for ${context}`);
+ throw new Error(`Failed to read image dimensions`);
}
if (
@@ -81,7 +73,7 @@ export async function extractPackedTankIcon(
top + height > metadata.height
) {
throw new Error(
- `Out-of-bounds RIFF sprite for ${context}: ${bounds.join(" ")} in ${metadata.width}x${metadata.height}`,
+ `Out-of-bounds RIFF sprite: ${bounds.join(" ")} in ${metadata.width}x${metadata.height}`,
);
}
diff --git a/packages/website/src/pages/[...chunk_api]/tanks/[id]/icons/small.webp.ts b/packages/website/src/pages/[...chunk_api]/tanks/[id]/icons/small.webp.ts
new file mode 100644
index 000000000..16725b661
--- /dev/null
+++ b/packages/website/src/pages/[...chunk_api]/tanks/[id]/icons/small.webp.ts
@@ -0,0 +1,43 @@
+import {
+ NATION_IDS,
+ type TankParameters,
+ type VehicleDefinitionList,
+} from "@blitzkit/core";
+import type { APIContext } from "astro";
+import { vfs } from "../../../../../core/blitzkit/vfs";
+import { extractPackedTankIcon } from "./big.webp";
+
+export { getStaticPaths } from "../_index";
+
+export async function GET({ props }: APIContext<{ id: number }>) {
+ const nations = await vfs
+ .dir(`Data/XML/item_defs/vehicles`)
+ .then((files) => files.filter((nation) => nation !== "common"));
+
+ for (const nation of nations) {
+ const tanks = await vfs.xml<{ root: VehicleDefinitionList }>(
+ `Data/XML/item_defs/vehicles/${nation}/list.xml`,
+ );
+
+ for (const tankKey in tanks.root) {
+ const tank = tanks.root[tankKey];
+
+ if (tankKey.includes("tutorial_bot")) continue;
+
+ const nationVehicleId = tank.id;
+ const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1;
+
+ if (id !== props.id) continue;
+
+ const parameters = await vfs.yaml(
+ `Data/3d/Tanks/Parameters/${nation}/${tankKey}.yaml`,
+ );
+ const bigPath = `Data/${parameters.resourcesPath.smallIconPath
+ .replace(/~res:\//, "")
+ .replace(/\..+/, "")}.packed.webp`;
+ const big = await extractPackedTankIcon(await vfs.file(bigPath));
+
+ return new Response(big);
+ }
+ }
+}