← Level pieces 23D assetfogon/nivel-jaula
Jaula
Drag to turn it// «Jaula» · gpt-6-sol (medium)
// A cage: a square iron cage 36x36 and 36 tall, centered, made of vertical dark iron bars 2 blocks thick every 5 blocks, with a solid iron frame at the bottom and top, a domed top with a ring handle, and a front door section with a big gold padlock.
const iron = "#394c5b";
const ironDark = "#263744";
const ironLight = "#60798a";
const ironShine = "#8ca3ae";
const gold = "#f2ac25";
const goldLight = "#ffe06a";
const goldDark = "#b86e1d";
// The cage occupies x/y 6..41: a 36×36 footprint.
function squareRail(lo, hi, z0, z1, color, width = 2) {
box(lo, lo, z0, hi, lo + width - 1, z1, color);
box(lo, hi - width + 1, z0, hi, hi, z1, color);
box(lo, lo, z0, lo + width - 1, hi, z1, color);
box(hi - width + 1, lo, z0, hi, hi, z1, color);
}
// Chunky bottom frame and a sparse floor grate.
squareRail(6, 41, 0, 2, ironDark, 3);
box(7, 6, 2, 40, 6, 2, ironLight);
box(6, 7, 2, 6, 40, 2, ironLight);
for (let p = 10; p <= 38; p += 5) {
box(p, 9, 0, p + 1, 38, 0, iron);
box(9, p, 0, 38, p + 1, 0, iron);
}
// Two-block-thick vertical bars, spaced five blocks apart.
for (let p = 8; p <= 38; p += 5) {
box(p, 7, 3, p + 1, 8, 24, iron);
box(p, 39, 3, p + 1, 40, 24, ironDark);
box(7, p, 3, 8, p + 1, 24, iron);
box(39, p, 3, 40, p + 1, 24, ironDark);
box(p, 7, 5, p, 7, 22, ironLight);
box(7, p, 5, 7, p, 22, ironLight);
}
// Strong corner posts.
for (const x of [6, 39]) {
for (const y of [6, 39]) {
box(x, y, 3, x + 2, y + 2, 26, ironDark);
box(x, y, 5, x, y, 24, ironLight);
}
}
// Solid-looking top frame, with crisp highlights on its front edges.
squareRail(6, 41, 25, 27, ironDark, 3);
box(7, 6, 27, 40, 6, 27, ironShine);
box(6, 7, 27, 6, 40, 27, ironLight);
box(9, 8, 25, 38, 8, 25, ironLight);
// A clearly framed door in the front wall.
box(15, 6, 3, 16, 7, 24, ironDark);
box(31, 6, 3, 32, 7, 24, ironDark);
box(15, 6, 3, 32, 7, 4, ironDark);
box(15, 6, 23, 32, 7, 24, ironDark);
box(16, 6, 5, 16, 6, 22, ironShine);
box(16, 6, 24, 31, 6, 24, ironLight);
for (const x of [18, 23, 28]) {
box(x, 6, 5, x + 1, 6, 22, iron);
box(x, 6, 6, x, 6, 21, ironLight);
}
for (const z of [7, 19]) {
box(13, 6, z, 16, 7, z + 2, ironLight);
set(14, 6, z + 1, ironShine);
}
box(31, 6, 12, 35, 7, 15, ironLight); // Door latch.
// Open, stepped iron dome.
const dome = [
[7, 40, 28],
[9, 38, 29],
[12, 35, 30],
[15, 32, 31],
[19, 28, 32]
];
for (const [lo, hi, z] of dome) {
squareRail(lo, hi, z, z, iron, 2);
box(lo + 2, lo, z, hi - 2, lo, z, ironLight);
}
// Ribs join the nested rings at the four compass points.
for (let i = 0; i < dome.length - 1; i++) {
const [outer, far, z] = dome[i];
const [inner, near] = dome[i + 1];
line(23, outer, z, 23, inner, z + 1, 1, ironLight);
line(23, far, z, 23, near, z + 1, 1, iron);
line(outer, 23, z, inner, 23, z + 1, 1, ironLight);
line(far, 23, z, near, 23, z + 1, 1, iron);
}
box(21, 21, 32, 26, 26, 32, ironDark);
// Upright ring handle, open through its center.
box(19, 21, 32, 20, 24, 34, ironDark);
box(27, 21, 32, 28, 24, 34, ironDark);
box(20, 21, 35, 27, 24, 35, iron);
box(20, 21, 35, 27, 21, 35, ironShine);
box(19, 21, 33, 19, 21, 34, ironLight);
// Oversized, shiny gold padlock on the door's front.
box(28, 6, 16, 29, 7, 19, goldDark);
box(33, 6, 16, 34, 7, 19, goldDark);
box(29, 6, 19, 33, 7, 20, goldLight);
box(29, 6, 17, 29, 6, 19, goldLight);
box(33, 6, 17, 33, 6, 19, gold);
box(27, 6, 9, 35, 7, 16, goldDark);
box(28, 6, 10, 34, 6, 16, gold);
box(28, 6, 16, 34, 6, 16, goldLight);
box(28, 6, 11, 28, 6, 15, goldLight);
box(29, 6, 10, 33, 6, 10, goldLight);
// Readable dark keyhole.
box(31, 6, 13, 32, 6, 14, ironDark);
set(31, 6, 12, ironDark);
set(32, 6, 12, ironDark);import { draw } from "./assets/voxel";
import { nivelJaula } from "./assets/nivel-jaula";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, nivelJaula, 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 nivel-jaula
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["nivel-jaula"] })
# It lands in client/assets/nivel-jaula.ts
# https://fogon.page/object/nivel-jaula