← Level kit3D assetfogon/nivel-ventana
Ventana
Drag to turn it// «Ventana» · gpt-6-sol (medium)
// A modular wall segment with a window, matching the brick wall: exactly 48 blocks long on x (x 0..47), 10 thick on y (y 19..28), 40 tall, red bricks in running bond with light grey mortar and a light grey stone cap on top. In the middle, a square window opening 20 wide and 18 tall starting at z 12, with a white stone frame and sill sticking out 2 blocks at the front, a white cross-shaped mullion dividing it into four panes, light blue glass with a white diagonal glint, and two green wooden shutters open on both sides.
// Mortar core and running-bond brickwork.
box(0, 19, 0, 47, 28, 37, "#d4d0c8");
const bricks = ["#c94b39", "#d95640", "#e16046", "#c74a38"];
for (let course = 0; course < 10; course++) {
const z0 = course * 4;
const z1 = Math.min(z0 + 2, 37);
const offset = course % 2 ? -5 : 0;
for (let start = offset; start < 48; start += 10) {
const x0 = Math.max(0, start);
const x1 = Math.min(47, start + 8);
if (x0 > x1) continue;
const color = bricks[Math.floor(rand() * bricks.length)];
box(x0, 19, z0, x1, 28, z1, color);
// A restrained highlight keeps the brick courses crisp.
if (z0 + 1 <= z1) {
box(x0, 19, z0 + 1, x1, 19, z0 + 1, "#df6048");
}
}
}
// Clear the full depth of the window opening.
for (let x = 14; x <= 33; x++)
for (let y = 19; y <= 28; y++)
for (let z = 12; z <= 29; z++)
set(x, y, z, null);
// Light-grey stone cap, flush with the modular wall footprint.
box(0, 19, 38, 47, 28, 38, "#bfc6ca");
box(0, 19, 39, 47, 28, 39, "#e5e9e8");
box(0, 19, 38, 47, 19, 38, "#d6dddf");
// White stone window surround and projecting sill.
box(12, 18, 12, 13, 20, 31, "#f1f1e9");
box(34, 18, 12, 35, 20, 31, "#f1f1e9");
box(12, 18, 30, 35, 20, 31, "#f5f5ee");
box(12, 27, 12, 13, 28, 31, "#e3e6e1");
box(34, 27, 12, 35, 28, 31, "#e3e6e1");
box(12, 27, 30, 35, 28, 31, "#e9ebe7");
box(12, 17, 10, 35, 28, 10, "#c9d0d0");
box(12, 17, 11, 35, 28, 11, "#f5f6f0");
box(12, 17, 11, 35, 17, 11, "#ffffff");
// Four blue panes.
for (const [xa, xb] of [[14, 22], [25, 33]]) {
for (const [za, zb] of [[12, 19], [22, 29]]) {
box(xa, 21, za, xb, 23, zb, "#8cdaf2");
box(xa, 21, za, xb, 21, za + 1, "#acdff2");
box(xa, 21, zb, xb, 21, zb, "#63b9dc");
box(xa, 22, za, xa, 22, zb, "#5eb5da");
}
}
// Chunky white cross mullion.
box(23, 20, 12, 24, 24, 29, "#f5f6ef");
box(14, 20, 20, 33, 24, 21, "#f5f6ef");
box(24, 20, 12, 24, 20, 29, "#dce3e1");
box(14, 20, 20, 33, 20, 20, "#ffffff");
// Short diagonal glints, one per pane.
for (const [x, z] of [[16, 26], [27, 26], [16, 16], [27, 16]]) {
for (let i = 0; i < 4; i++) set(x + i, 20, z + 3 - i, "#ffffff");
}
// Open green wooden shutters, mounted against the front face.
for (const [x0, x1, hingeX] of [[5, 11, 11], [36, 42, 36]]) {
box(x0, 18, 13, x1, 19, 28, "#257c42");
box(x0 + 1, 17, 14, x1 - 1, 17, 27, "#51b75a");
for (let z = 17; z <= 25; z += 5)
box(x0 + 1, 17, z, x1 - 1, 17, z, "#308b45");
box(x0, 17, 13, x1, 17, 13, "#33994c");
box(x0, 17, 28, x1, 17, 28, "#73cb69");
box(x0, 17, 13, x0, 17, 28, "#389d4d");
box(x1, 17, 13, x1, 17, 28, "#247b40");
for (const z of [16, 25])
box(hingeX, 17, z, hingeX, 17, z + 1, "#f3cf67");
}import { draw } from "./assets/voxel";
import { nivelVentana } from "./assets/nivel-ventana";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, nivelVentana, 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-ventana
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["nivel-ventana"] })
# It lands in client/assets/nivel-ventana.ts
# https://fogon.page/object/nivel-ventana