← Whole house3D assetfogon/radio-antigua
Radio antigua
Drag to turn it// «Radio antigua» · gpt-6-sol (medium)
// A vintage tabletop radio: an arched wooden case with a big fabric speaker grille in cream with vertical stripes, a small golden tuning dial window and two round knobs at the bottom.
// Arched honey-wood case
const top = x => Math.round(27 + 10 * Math.sqrt(Math.max(0, 1 - ((x - 24) / 19) ** 2)));
const wood = ["#ad6938", "#b9763f", "#c38349", "#d09154"];
const walnut = "#744527";
const honey = "#e2aa65";
for (let x = 6; x <= 42; x++) {
for (let y = 16; y <= 32; y++) {
for (let z = 0; z <= top(x); z++) {
let shade = z >= top(x) - 2 ? 3 : z < 4 ? 0 : y < 19 ? 2 : 1;
if (rand() < 0.08) shade = Math.max(0, shade - 1);
set(x, y, z, wood[shade]);
}
}
}
// Rounded-looking dark plinth and its honey highlight
box(8, 15, 0, 40, 33, 2, walnut);
box(7, 16, 1, 41, 32, 2, "#94582f");
box(9, 14, 2, 39, 15, 2, honey);
// Front wooden surround
for (let x = 7; x <= 41; x++) {
for (let z = 3; z <= top(x) - 1; z++) {
set(x, 15, z, z >= top(x) - 2 ? honey : wood[rand() < 0.12 ? 1 : 2]);
}
}
// Dark recessed border around the arched speaker
for (let x = 9; x <= 39; x++) {
for (let z = 11; z <= top(x) - 2; z++) {
set(x, 14, z, "#754829");
}
}
// Cream fabric grille, gently following the arch
for (let x = 10; x <= 38; x++) {
for (let z = 12; z <= top(x) - 4; z++) {
let color = "#f5e8ca";
if (x % 4 === 0) color = "#d5bd94";
else if (x % 4 === 1) color = "#e8d8b7";
else if ((x + z) % 5 === 0) color = "#fff0d3";
set(x, 13, z, color);
}
}
// Carved wooden edges and the bright curved crown
for (let x = 8; x <= 40; x++) {
set(x, 13, 10, "#e5ac69");
set(x, 13, top(x) - 2, "#e5ac69");
if (x >= 10 && x <= 38) set(x, 12, 11, "#b78050");
}
for (let z = 12; z <= top(9) - 2; z++) set(9, 13, z, "#d79b5d");
for (let z = 12; z <= top(39) - 2; z++) set(39, 13, z, "#d79b5d");
// Walnut control panel
box(9, 14, 3, 39, 14, 9, "#804b2d");
box(10, 13, 9, 38, 13, 9, "#bb7a43");
box(10, 13, 3, 38, 13, 3, "#a86a39");
// Small golden tuning window
box(19, 12, 4, 29, 12, 8, "#d39843");
box(20, 11, 5, 28, 11, 7, "#f9dc8a");
box(21, 10, 6, 27, 10, 6, "#b97835");
for (let x = 21; x <= 27; x += 2) set(x, 9, 7, "#fff1bd");
box(24, 9, 5, 24, 9, 7, "#70432d");
// Two chunky round knobs with brass rims and pale highlights
for (const x of [13, 35]) {
cylinder(x, 11, 6, 3, 3, "#5d3928", "y");
cylinder(x, 10, 6, 2.5, 2, "#dfaa58", "y");
cylinder(x, 9, 6, 1.7, 2, "#976039", "y");
set(x - 1, 8, 7, "#f5ce81");
set(x, 8, 8, "#f5ce81");
}
// Tiny brass feet
box(10, 17, 0, 14, 20, 0, "#c18b4e");
box(34, 17, 0, 38, 20, 0, "#c18b4e");
box(10, 28, 0, 14, 31, 0, "#a4703c");
box(34, 28, 0, 38, 31, 0, "#a4703c");import { draw } from "./assets/voxel";
import { radioAntigua } from "./assets/radio-antigua";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, radioAntigua, 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 radio-antigua
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["radio-antigua"] })
# It lands in client/assets/radio-antigua.ts
# https://fogon.page/object/radio-antigua