← Basics3D assetfogon/mesa-en-c
Mesa en C
Drag to turn it// «Mesa en C» · gpt-6-sol (medium)
// C shaped table («Mesa en C»).
// A warm wooden C-shaped table, with a book and a pencil mug on top.
const wood = ["#bd7442", "#c77b45", "#ce8249", "#d5894e"];
const dark = "#925532";
const grain = "#a96438";
// Low shelf: the bottom stroke of the C.
box(9, 9, 0, 39, 41, 2, dark);
box(9, 10, 2, 39, 41, 3, "#ae683a");
box(10, 11, 4, 38, 40, 4, "#cc8048");
// Upright back panel, solid enough to support the overhanging top.
box(9, 8, 3, 39, 13, 30, "#ad663a");
box(10, 8, 5, 38, 8, 28, "#bd7542");
box(10, 13, 5, 38, 13, 29, "#c47a43");
// Broad, thin tabletop.
box(9, 12, 30, 39, 42, 32, "#a76339");
box(9, 15, 33, 39, 42, 33, "#c57a42");
// The exposed back edge rises in a few shallow, layered steps.
box(9, 8, 27, 39, 10, 29, "#a45f35");
box(9, 10, 29, 39, 12, 31, "#b66c3a");
box(9, 12, 31, 39, 15, 33, "#c37840");
// Long planks and gently varied grain across the three wooden surfaces.
for (let x = 10; x <= 38; x++) {
const plank = Math.floor((x - 10) / 5);
const c = wood[plank % wood.length];
for (let y = 16; y <= 41; y++)
set(x, y, 34, c);
for (let y = 12; y <= 40; y++)
set(x, y, 4, wood[(plank + 1) % wood.length]);
// Vertical boards on the outside of the upright.
for (let z = 5; z <= 27; z++)
set(x, 7, z, wood[(plank + 2) % wood.length]);
}
// Fine, subdued joints between boards.
for (let x = 14; x <= 35; x += 5) {
for (let y = 17; y <= 41; y++) {
if (rand() > 0.19) set(x, y, 34, "#b26a3b");
}
for (let y = 12; y <= 40; y++) {
if (rand() > 0.24) set(x, y, 4, "#ad6639");
}
for (let z = 5; z <= 27; z++)
if (rand() > 0.12) set(x, 7, z, "#a45f36");
}
// Sparse irregular wood fibers, kept lighter than the board joints.
for (let i = 0; i < 115; i++) {
const x = 11 + Math.floor(rand() * 27);
const y = 17 + Math.floor(rand() * 23);
const z = rand() < 0.55 ? 34 : 4;
const yy = z === 34 ? y : Math.min(y, 39);
const shade = rand() < 0.55 ? "#da8c51" : "#b96f3d";
for (let t = 0; t < 2 + Math.floor(rand() * 4); t++)
set(x, Math.min(41, yy + t), z, shade);
}
for (let i = 0; i < 65; i++) {
const x = 10 + Math.floor(rand() * 29);
const z = 6 + Math.floor(rand() * 21);
set(x, 7, z, rand() < 0.5 ? "#d0874d" : grain);
if (rand() < 0.55) set(x, 7, z + 1, "#bd7441");
}
// Warm layered rims, especially visible along the open side.
box(9, 42, 30, 39, 42, 30, "#92542f");
box(9, 42, 31, 39, 42, 31, "#a76439");
box(9, 42, 32, 39, 42, 32, "#b66d3c");
box(9, 41, 33, 39, 41, 33, "#db8b4e");
box(9, 41, 0, 39, 41, 0, "#854c2d");
box(9, 41, 2, 39, 41, 2, "#a76136");
box(10, 40, 4, 38, 40, 4, "#d8894d");
box(9, 8, 4, 39, 8, 4, "#89502e");
box(9, 8, 27, 39, 8, 27, "#8f522f");
// A closed, deep teal book resting flat on the tabletop.
box(17, 20, 35, 32, 30, 36, "#153c43");
box(18, 20, 37, 32, 30, 37, "#20565b");
box(17, 21, 38, 31, 30, 38, "#28676a");
box(17, 20, 36, 32, 20, 36, "#102e37");
box(19, 20, 36, 30, 20, 36, "#d4cbb1"); // page edges
box(18, 21, 37, 31, 21, 37, "#17444c");
// Two short pale lines on the cover.
box(22, 23, 39, 27, 23, 39, "#d9d8b9");
box(21, 25, 39, 28, 25, 39, "#b7d0b9");
// Small brown pencil lying beside the book.
line(32, 23, 35, 37, 23, 35, 0, "#7f4930");
set(37, 23, 35, "#e5b779");
set(33, 23, 35, "#d19856");
// Ribbed ivory pencil cup, behind the book.
box(17, 34, 35, 24, 40, 41, "#bcb4a0");
box(18, 34, 36, 23, 34, 41, "#d6cdb8");
box(17, 35, 36, 17, 39, 41, "#a69e8d");
box(18, 35, 42, 23, 39, 42, "#e2dac5");
box(19, 36, 42, 22, 38, 42, "#59564b");
for (let x of [18, 20, 22, 24])
box(x, 34, 36, x, 34, 40, x === 24 ? "#eee4cd" : "#b9b19d");
// Pale angular handle on the right.
box(25, 36, 39, 27, 36, 41, "#e5ddca");
box(27, 36, 37, 27, 36, 41, "#d2cab6");
box(25, 36, 37, 27, 36, 37, "#c3bba8");
set(26, 36, 39, null);
// A few dark pencil tips showing above the cup.
for (const [x, y, c] of [
[19, 36, "#67594b"], [21, 37, "#876b4d"],
[23, 36, "#524c43"], [20, 39, "#78604d"]
]) {
set(x, y, 43, c);
}import { draw } from "./assets/voxel";
import { mesaEnC } from "./assets/mesa-en-c";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, mesaEnC, 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 mesa-en-c
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["mesa-en-c"] })
# It lands in client/assets/mesa-en-c.ts
# https://fogon.page/object/mesa-en-c