← Basics3D assetfogon/archivero
Archivero
Drag to turn it// «Archivero» · gpt-6-sol (medium)
// Filing cabinet («Archivero»).
// Filing cabinet — dark teal steel with an open top drawer.
const C = {
shadow: "#203936",
side: "#304b47",
sideLight: "#395753",
body: "#405d59",
edge: "#587c79",
edgeLight: "#779e9b",
top: "#86b4b3",
topInset: "#79aaa9",
drawer: "#527472",
drawerLight: "#668a87",
drawerDark: "#334f4d",
metalDark: "#536560",
metal: "#abbcb4",
metalLight: "#d3ded2",
paper: "#c99850",
paperLight: "#e1bd76",
paperDark: "#936b3c"
};
// Recessed base and the solid cabinet.
box(10, 13, 0, 38, 36, 2, C.shadow);
box(8, 11, 2, 39, 38, 38, C.body);
box(8, 11, 3, 12, 38, 38, C.side);
box(9, 12, 5, 9, 37, 36, C.sideLight);
box(12, 10, 2, 39, 12, 37, C.shadow);
box(12, 10, 3, 13, 10, 37, C.edge);
box(38, 11, 3, 39, 38, 37, C.side);
box(13, 10, 3, 38, 10, 37, C.drawerDark);
// Slightly projecting beveled top.
box(6, 8, 38, 41, 40, 39, C.shadow);
box(5, 8, 40, 41, 40, 41, C.edgeLight);
box(7, 10, 41, 39, 38, 41, C.top);
box(9, 12, 42, 37, 36, 42, C.topInset);
box(5, 8, 40, 41, 9, 41, "#a1c6c2");
box(5, 8, 40, 6, 40, 41, "#9fc4c0");
box(7, 39, 39, 40, 40, 40, C.side);
for (let i = 0; i < 105; i++) {
const x = 10 + Math.floor(rand() * 27);
const y = 13 + Math.floor(rand() * 23);
if (rand() < 0.42) set(x, y, 42, "#86b4b1");
}
// Three closed drawers. Each has a dark reveal, a raised rim, and a broad handle.
for (const [lo, hi] of [[3, 10], [11, 18], [19, 26]]) {
box(13, 8, lo - 1, 39, 10, hi + 1, C.drawerDark);
box(14, 7, lo, 38, 9, hi, C.drawer);
box(14, 7, hi, 38, 9, hi, C.drawerLight);
box(14, 7, lo, 15, 9, hi, C.edgeLight);
box(37, 7, lo, 38, 9, hi, C.side);
box(16, 6, lo + 1, 36, 6, lo + 1, C.drawerDark);
const hz = lo + 4;
box(22, 5, hz - 2, 35, 6, hz + 1, C.metalDark);
box(23, 4, hz - 1, 34, 4, hz, C.metal);
box(24, 4, hz, 33, 4, hz, C.metalLight);
box(22, 4, hz - 1, 23, 5, hz + 1, C.metalLight);
box(34, 4, hz - 1, 35, 5, hz + 1, C.metalLight);
box(24, 5, hz - 2, 33, 5, hz - 2, C.shadow);
}
// Top drawer pulled out: tray bottom and thick side walls.
box(14, 3, 26, 43, 19, 27, C.shadow);
box(15, 4, 28, 42, 18, 28, C.drawerDark);
box(14, 3, 27, 16, 19, 34, C.drawer);
box(41, 3, 27, 43, 19, 34, C.drawerDark);
box(14, 17, 27, 43, 19, 33, C.side);
box(14, 3, 34, 16, 19, 34, C.edgeLight);
box(41, 3, 34, 43, 19, 34, C.edgeLight);
box(17, 18, 33, 40, 19, 33, C.edge);
// Upright manila folders visible inside the open tray.
for (let y = 9; y <= 16; y += 2) {
const shade = y % 4 === 1 ? C.paperLight : C.paper;
box(19, y, 29, 38, y, 35, shade);
box(20, y, 36, 34, y, 36, C.paperLight);
box(19, y + 1, 30, 38, y + 1, 34, C.paperDark);
}
box(24, 7, 29, 38, 7, 34, C.paper);
box(28, 7, 35, 35, 7, 35, C.paperLight);
box(18, 6, 29, 21, 6, 33, C.paperDark);
// The pulled-out drawer's front covers the near edge of the folders.
box(14, 2, 27, 43, 4, 33, C.drawer);
box(14, 2, 33, 43, 4, 34, C.edgeLight);
box(14, 2, 27, 16, 4, 34, C.side);
box(41, 2, 27, 43, 4, 34, C.drawerDark);
box(17, 1, 27, 40, 1, 27, C.shadow);
box(23, 1, 29, 36, 1, 31, C.metalDark);
box(24, 0, 30, 35, 0, 31, C.metal);
box(25, 0, 31, 34, 0, 31, C.metalLight);
box(23, 0, 29, 24, 1, 31, C.metalLight);
box(35, 0, 29, 36, 1, 31, C.metalLight);
// Small corner highlights and the lower toe-kick.
box(13, 8, 2, 14, 10, 3, C.edgeLight);
box(37, 8, 2, 39, 10, 3, C.edgeLight);
box(13, 11, 1, 38, 12, 2, C.side);import { draw } from "./assets/voxel";
import { archivero } from "./assets/archivero";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, archivero, x, y, { size: 64, angle: 0, t: performance.now() / 1000 });
// size: its longest side, in px
// angle: turn on the floor, in radians
// t: seconds; if it moves, that animates it# In a terminal, in the game's folder
fogon assets add archivero
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["archivero"] })
# It lands in client/assets/archivero.ts
# https://fogon.page/object/archivero