← City3D assetfogon/kiosco
Kiosco
Drag to turn it// «Kiosco» · gpt-6-sol (medium)
// A small Buenos Aires corner kiosk: a narrow boxy shop with a wide open front window counter facing -y, shelves full of colorful candy and drinks visible inside, a striped red and white awning over the window, a small fridge with a glass door beside it, and a bright sign on top reading KIOSCO. Brick sides painted pastel.
// Sidewalk and curb
box(3, 6, 0, 45, 43, 0, "#c7c9c4");
box(3, 6, 0, 45, 7, 0, "#a5aaa6");
for (let x = 5; x <= 43; x += 7) {
line(x, 8, 0, x, 12, 0, 0, "#b3b8b3");
}
// Solid floor, back wall, and pastel-painted brick sides
box(6, 14, 1, 42, 40, 2, "#777c79");
box(7, 15, 2, 41, 39, 2, "#e6d8c7");
box(6, 16, 3, 8, 40, 31, "#e9ac9f");
box(40, 16, 3, 42, 40, 31, "#e9ac9f");
box(7, 38, 3, 41, 40, 31, "#f0c4af");
// Little staggered brick marks on the visible side walls
for (let z = 5; z < 30; z += 3) {
for (let y = 18 + ((z / 3) % 2) * 2; y < 39; y += 5) {
set(42, y, z, rand() < 0.35 ? "#f6c9b4" : "#d9998d");
set(6, y, z, "#d9998d");
}
}
box(6, 15, 3, 6, 40, 4, "#d58e84");
box(42, 15, 3, 42, 40, 4, "#d58e84");
// Front wall, built around the large open serving window
box(6, 13, 3, 42, 16, 10, "#f4d3bc");
box(6, 13, 11, 9, 16, 31, "#f4d3bc");
box(30, 13, 11, 32, 16, 31, "#f4d3bc");
box(40, 13, 11, 42, 16, 31, "#f4d3bc");
box(6, 13, 28, 42, 16, 32, "#f4d3bc");
box(6, 13, 3, 42, 13, 4, "#d98d81");
// Dark green framing around the open window
box(9, 12, 14, 9, 14, 27, "#286b61");
box(30, 12, 14, 30, 14, 27, "#286b61");
box(9, 12, 27, 30, 14, 27, "#286b61");
box(9, 12, 11, 30, 14, 13, "#286b61");
// Counter, with a pale stone top and decorative front
box(9, 10, 9, 30, 17, 13, "#bc6257");
box(8, 9, 13, 31, 18, 14, "#f5dfbb");
box(9, 9, 10, 30, 9, 10, "#9d4848");
for (let x = 11; x <= 28; x += 4) {
box(x, 9, 11, x + 1, 9, 11, "#f2bd65");
}
line(10, 9, 12, 29, 9, 12, 0, "#e3946b");
// Interior shelves, readable through the open front
box(9, 36, 13, 38, 37, 29, "#8c705d");
for (const z of [15, 21, 27]) {
box(10, 29, z, 31, 36, z, "#dfaa72");
box(10, 29, z - 1, 31, 29, z - 1, "#8e5949");
}
const sweets = ["#f04e67", "#ffd356", "#56c6bb", "#8b78d5", "#f79448"];
for (const shelf of [15, 21]) {
for (let x = 11; x <= 29; x += 2) {
const c = sweets[(x + shelf) % sweets.length];
box(x, 30, shelf + 1, x + 1, 32, shelf + 3 + (x % 3 === 0 ? 1 : 0), c);
set(x, 29, shelf + 2, "#fff0c3");
}
}
for (let x = 11; x <= 30; x += 2) {
const c = sweets[(x + 2) % sweets.length];
box(x, 31, 28, x, 32, 30, c);
set(x, 31, 30, "#f7eddd");
}
// Extra merchandise close to the window: jars, bottles, and a till
for (let x = 11; x <= 20; x += 3) {
const c = sweets[(x + 1) % sweets.length];
box(x, 15, 15, x + 1, 16, 18, c);
box(x, 15, 19, x + 1, 16, 19, "#f5e8d2");
set(x, 14, 17, "#fff2d3");
}
for (let x = 22; x <= 26; x += 2) {
box(x, 19, 15, x, 19, 18, "#55b8a1");
set(x, 19, 19, "#e8eee1");
}
box(27, 18, 15, 29, 20, 17, "#375d5b");
box(27, 17, 18, 29, 18, 19, "#85d5bd");
set(28, 17, 18, "#e9f2d7");
// Small glass-door drink fridge beside the serving window
box(33, 12, 4, 39, 20, 27, "#d4e2d8");
box(34, 13, 6, 38, 19, 25, "#344f60");
for (const z of [10, 16, 22]) {
box(34, 13, z, 38, 18, z, "#9aa6a0");
}
for (const z of [7, 13, 19]) {
for (let x = 34; x <= 38; x += 2) {
const c = sweets[(x + z) % sweets.length];
box(x, 14, z, x, 16, z + 2, c);
set(x, 14, z + 3, "#e8ebe1");
}
}
box(33, 11, 4, 39, 11, 27, "#e3e9de");
box(34, 10, 6, 38, 10, 25, "#305869");
for (let z = 8; z < 25; z += 5) {
box(35, 9, z, 35, 9, z + 2, "#69a7b0");
}
box(33, 9, 4, 33, 11, 27, "#f4f0dc");
box(39, 9, 4, 39, 11, 27, "#f4f0dc");
box(33, 9, 26, 39, 11, 27, "#f4f0dc");
box(33, 9, 4, 39, 11, 5, "#b1beb5");
box(37, 8, 13, 37, 8, 18, "#f5d369");
// Striped red-and-white canvas awning over the open window
for (let x = 8; x <= 32; x++) {
const color = Math.floor((x - 8) / 3) % 2 ? "#fff3dd" : "#d94749";
box(x, 8, 29, x, 15, 30, color);
box(x, 8, 27, x, 9, 28, color);
}
box(8, 8, 31, 32, 15, 31, "#9e3e42");
box(8, 8, 27, 32, 8, 27, "#e3ad8f");
// Flat roof and raised parapet
box(6, 14, 32, 42, 40, 33, "#e7c9ad");
box(6, 14, 34, 42, 40, 34, "#fff0d5");
box(6, 14, 33, 42, 14, 34, "#d68f80");
box(6, 40, 33, 42, 40, 34, "#d68f80");
box(6, 15, 33, 6, 40, 34, "#d68f80");
box(42, 15, 33, 42, 40, 34, "#d68f80");
// Bright rooftop KIOSCO sign
box(10, 11, 35, 39, 16, 43, "#f5cf71");
box(11, 10, 36, 38, 10, 42, "#176e70");
box(10, 10, 35, 39, 11, 35, "#cc6760");
box(10, 10, 43, 39, 11, 43, "#fff0b1");
box(10, 10, 36, 10, 11, 42, "#fff0b1");
box(39, 10, 36, 39, 11, 42, "#fff0b1");
const letters = {
K: ["101", "110", "100", "110", "101"],
I: ["111", "010", "010", "010", "111"],
O: ["111", "101", "101", "101", "111"],
S: ["111", "100", "111", "001", "111"],
C: ["111", "100", "100", "100", "111"]
};
"KIOSCO".split("").forEach((letter, i) => {
letters[letter].forEach((row, r) => {
for (let c = 0; c < 3; c++) {
if (row[c] === "1") set(13 + i * 4 + c, 9, 41 - r, "#fff4c9");
}
});
});
// Pastel side display window and a touch of Buenos Aires-style flourish
box(42, 23, 15, 42, 33, 25, "#286b61");
box(42, 24, 16, 42, 32, 24, "#75b8bd");
box(42, 26, 17, 42, 27, 23, "#b7d9d0");
box(42, 23, 15, 42, 33, 15, "#f1d8b0");
box(42, 23, 25, 42, 33, 25, "#f1d8b0");
for (const x of [7, 41]) {
set(x, 13, 29, "#286b61");
set(x, 13, 28, "#efbe66");
set(x, 13, 27, "#286b61");
}import { draw } from "./assets/voxel";
import { kiosco } from "./assets/kiosco";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, kiosco, 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 kiosco
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["kiosco"] })
# It lands in client/assets/kiosco.ts
# https://fogon.page/object/kiosco