← Whole house3D assetfogon/alacena
Alacena
Drag to turn it// «Alacena» · gpt-6-sol (medium)
// A kitchen pantry cabinet: a tall cabinet in mint green painted wood with two glass doors on top showing plates and jars inside, two solid doors below with small brass knobs, and a crown molding on top.
const mint = "#a8d9be";
const mintLight = "#c6ead1";
const mintMid = "#91c9ad";
const mintDark = "#6fa98e";
const cream = "#fff0d5";
const honey = "#bd8855";
const brass = "#d9ad54";
function paintedBox(x0, y0, z0, x1, y1, z1, base, light, dark) {
for (let x = x0; x <= x1; x++) {
for (let y = y0; y <= y1; y++) {
for (let z = z0; z <= z1; z++) {
const n = rand();
set(x, y, z, n < 0.055 ? light : n < 0.09 ? dark : base);
}
}
}
}
// Feet and stepped plinth.
box(10, 17, 0, 14, 30, 2, mintDark);
box(33, 17, 0, 37, 30, 2, mintDark);
box(8, 14, 2, 39, 33, 3, mintDark);
box(7, 12, 3, 40, 34, 4, mintLight);
box(8, 12, 5, 39, 33, 5, mintDark);
// Cabinet sides, back, and interior.
paintedBox(7, 13, 6, 9, 34, 40, mint, mintLight, mintMid);
paintedBox(38, 13, 6, 40, 34, 40, mintMid, mint, mintDark);
paintedBox(10, 32, 6, 37, 34, 40, mint, mintLight, mintMid);
box(10, 30, 22, 37, 31, 39, "#ddcfaa");
box(10, 29, 23, 37, 29, 39, "#f2e2ba");
box(10, 14, 21, 37, 31, 22, honey);
box(10, 14, 40, 37, 33, 41, mintDark);
// Display shelves with honey-colored front edges.
box(11, 17, 23, 36, 30, 23, "#deb47d");
box(11, 15, 23, 36, 17, 24, honey);
box(11, 17, 32, 36, 30, 32, "#deb47d");
box(11, 15, 32, 36, 17, 33, honey);
// Plates facing forward through the glass.
function plate(cx, cz, rim) {
for (let dx = -3; dx <= 3; dx++) {
for (let dz = -3; dz <= 3; dz++) {
const d = dx * dx + dz * dz;
if (d <= 10) {
const color = d >= 6 ? rim : d >= 3 ? cream : "#fff9e9";
set(cx + dx, 21, cz + dz, color);
if (d >= 6) {
set(cx + dx, 22, cz + dz, "#dbcaa7");
}
}
}
}
set(cx - 1, 20, cz + 1, "#ffffff");
}
plate(16, 28, "#98c4d1");
plate(18, 37, "#e6a49a");
// Pantry jars.
function jar(x, z, body, lid) {
box(x, 21, z, x + 3, 24, z + 4, body);
box(x, 20, z + 1, x + 3, 20, z + 3, "#eff9ef");
box(x + 1, 20, z + 2, x + 2, 20, z + 3, "#fff7e6");
box(x, 21, z + 5, x + 3, 24, z + 5, lid);
box(x + 1, 20, z + 5, x + 2, 20, z + 5, lid);
}
jar(27, 25, "#d58563", brass);
jar(32, 25, "#e3b95c", "#a16e45");
jar(27, 34, "#a7c7aa", brass);
jar(32, 34, "#d99582", "#c7a465");
// Two solid lower doors with recessed panels.
for (const [left, right] of [[9, 23], [24, 38]]) {
paintedBox(left, 11, 6, right, 13, 21, mint, mintLight, mintMid);
box(left + 2, 10, 8, right - 2, 10, 19, mintDark);
paintedBox(left + 3, 9, 9, right - 3, 9, 18, mintMid, mint, mintDark);
box(left + 2, 9, 19, right - 2, 9, 19, mintLight);
box(left + 2, 9, 8, right - 2, 9, 8, mintLight);
box(left + 2, 9, 9, left + 2, 9, 18, mintLight);
box(right - 2, 9, 9, right - 2, 9, 18, mintDark);
}
box(23, 9, 5, 24, 12, 21, mintLight);
// Brass lower-door knobs.
for (const x of [20, 27]) {
box(x, 8, 12, x + 1, 9, 13, "#94713e");
box(x, 7, 12, x + 1, 7, 13, brass);
set(x, 7, 13, "#ffe19a");
}
// Upper glass-door frames leave the dishes visible.
for (const [left, right] of [[9, 23], [24, 38]]) {
box(left, 11, 22, left + 2, 13, 40, mintLight);
box(right - 2, 11, 22, right, 13, 40, mintMid);
box(left, 11, 22, right, 13, 24, mint);
box(left, 11, 39, right, 13, 40, mintLight);
box(left + 2, 11, 31, right - 2, 12, 32, mint);
box(left + 2, 12, 25, left + 2, 12, 30, "#d7eee4");
box(right - 2, 12, 33, right - 2, 12, 38, "#d7eee4");
}
// Small pale-blue glass glints.
for (const [a, b] of [[12, 20], [27, 35]]) {
line(a, 13, 37, a + 2, 13, 35, 0, "#d5f2ee");
line(b - 2, 13, 28, b, 13, 26, 0, "#c8e9e6");
set(a + 1, 13, 27, "#e7faf4");
set(b - 1, 13, 36, "#e7faf4");
}
box(22, 10, 22, 25, 12, 40, mintLight);
box(23, 9, 22, 24, 10, 40, mint);
// Brass pulls on the glass doors.
for (const x of [20, 27]) {
box(x, 8, 32, x + 1, 10, 33, "#a97c42");
box(x, 7, 32, x + 1, 7, 33, brass);
set(x, 7, 33, "#ffe3a0");
}
// Broad, stepped crown molding.
box(7, 12, 41, 40, 35, 41, mintLight);
box(6, 11, 42, 41, 35, 42, mintMid);
box(6, 10, 43, 41, 36, 43, mintLight);
box(7, 11, 44, 40, 35, 44, mint);
box(8, 10, 43, 39, 10, 43, "#e0f3d9");import { draw } from "./assets/voxel";
import { alacena } from "./assets/alacena";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, alacena, 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 alacena
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["alacena"] })
# It lands in client/assets/alacena.ts
# https://fogon.page/object/alacena