← Whole house3D assetfogon/licuadora
Licuadora
Drag to turn it// «Licuadora» · gpt-6-sol (medium)
// A blender: a sturdy white motor base with three colored buttons on the front, a tall clear light-blue tinted jug on top filled halfway with a pink fruit smoothie, and a black lid.
const white = "#f7f5f0";
const glass = "#b8e5ed";
function roundedLayer(x0, x1, y0, y1, z, color) {
for (let x = x0; x <= x1; x++)
for (let y = y0; y <= y1; y++) {
const corner = (x === x0 || x === x1) && (y === y0 || y === y1);
if (!corner) set(x, y, z, color);
}
}
function roundedVolume(x0, x1, y0, y1, z0, z1, color) {
for (let z = z0; z <= z1; z++) roundedLayer(x0, x1, y0, y1, z, color);
}
part("body");
// Sturdy, softly tapered motor base.
roundedVolume(11, 37, 12, 36, 0, 2, "#b6babd");
roundedLayer(12, 36, 12, 36, 0, "#858b90");
roundedVolume(11, 37, 12, 36, 3, 9, white);
roundedVolume(12, 36, 13, 35, 10, 11, "#f1f0eb");
roundedVolume(14, 34, 15, 33, 12, 14, "#eceef0");
roundedLayer(14, 34, 15, 33, 14, "#ffffff");
// Gentle variation on the broad white face.
for (let x = 12; x <= 36; x++)
for (let z = 4; z <= 9; z++)
if (rand() < 0.10) set(x, 12, z, "#efeeea");
box(14, 11, 4, 34, 11, 10, "#d0d4d5");
box(15, 10, 5, 33, 10, 9, "#f9f8f5");
box(15, 10, 10, 33, 11, 10, "#ffffff");
// Three big toy-like controls, facing -y.
const buttons = [
{ x: 17, color: "#83d3bc", light: "#b7ead9" },
{ x: 24, color: "#f4a58f", light: "#ffd0b8" },
{ x: 31, color: "#e4b94d", light: "#f9dc85" }
];
for (const b of buttons) {
for (let dx = -3; dx <= 3; dx++)
for (let dz = -3; dz <= 3; dz++) {
const d = dx * dx + dz * dz;
if (d <= 9) set(b.x + dx, 9, 7 + dz, "#a8adb1");
if (d <= 5) {
set(b.x + dx, 8, 7 + dz, b.color);
if (dz >= 1 && dx <= 0) set(b.x + dx, 7, 7 + dz, b.light);
}
}
}
box(22, 11, 12, 26, 11, 12, "#aeb9bd");
// Chrome collar supporting the jug.
roundedVolume(18, 30, 18, 30, 14, 15, "#a6b1b7");
roundedLayer(19, 29, 19, 29, 16, "#dce5e7");
box(19, 18, 15, 29, 18, 15, "#e8f0f1");
// Smoothie: a solid, clearly visible half-full pink interior.
part("smoothie", [24, 24, 23]);
for (let z = 17; z <= 27; z++) {
for (let x = 17; x <= 31; x++)
for (let y = 17; y <= 31; y++) {
if ((x === 17 || x === 31) && (y === 17 || y === 31)) continue;
const c = rand() < 0.16 ? "#f4a0ae" : "#ec849b";
set(x, y, z, z < 19 ? "#d96c87" : c);
}
}
roundedLayer(18, 30, 18, 30, 28, "#f5a6b5");
for (let x = 19; x <= 29; x += 2)
set(x, 18 + Math.round(3 * Math.sin(x)), 28, "#ffd0cf");
animate("smoothie", {
type: "colors",
palette: ["#e77191", "#f18ca4", "#f7a8b5", "#dd637f", "#f39aaa"],
pattern: "wave",
glow: 0.2
});
part("body");
// Jug's blue-tinted back and sides. Its open-looking front lets the pink show.
for (let z = 17; z <= 38; z++) {
const wide = z >= 31;
const xl = wide ? 14 : 15, xr = wide ? 34 : 33;
const yf = wide ? 14 : 15, yb = wide ? 34 : 33;
for (let x = xl + 1; x < xr; x++)
set(x, yb, z, z > 27 ? "#caeef1" : "#9bd5e2");
for (let y = yf + 1; y < yb; y++) {
set(xl, y, z, z % 5 === 0 ? "#e5f8f8" : glass);
set(xr, y, z, "#9bcbd9");
}
// An almost-clear upper front pane; below it, only slender glass edges.
if (z >= 29)
for (let x = xl + 1; x < xr; x++)
set(x, yf, z, (x % 7 === 0) ? "#f1ffff" : "#d8f3f5");
set(xl + 1, yf, z, "#e9fbfb");
set(xr - 1, yf, z, "#a9dce5");
}
// Fine reflections across the lower front glass.
for (let x = 18; x <= 30; x++) {
if (x % 3 !== 0) set(x, 15, 19, "#cceff0");
if (x % 4 !== 0) set(x, 15, 27, "#e1f6f5");
}
box(17, 14, 30, 17, 14, 36, "#f7ffff");
box(20, 14, 33, 21, 14, 36, "#edfdfd");
box(30, 14, 31, 30, 14, 37, "#b5e4eb");
// Chunky clear handle with an unmistakable open grip.
box(34, 20, 32, 40, 27, 35, "#a8d7e2");
box(34, 20, 21, 40, 27, 24, "#a8d7e2");
box(40, 20, 23, 42, 27, 33, "#b8e5ed");
box(41, 20, 25, 42, 20, 31, "#e5f8f8");
box(35, 20, 34, 39, 20, 34, "#e5f8f8");
box(35, 20, 23, 39, 20, 23, "#d5f1f3");
// Thick, rounded black lid and its small central cap.
roundedVolume(13, 35, 13, 35, 39, 40, "#30353a");
roundedLayer(14, 34, 14, 34, 41, "#41474b");
roundedLayer(16, 32, 16, 32, 42, "#30363a");
roundedLayer(21, 27, 21, 27, 43, "#51575a");
box(17, 13, 40, 31, 13, 40, "#565d60");
box(18, 14, 42, 29, 14, 42, "#62696b");import { draw } from "./assets/voxel";
import { licuadora } from "./assets/licuadora";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, licuadora, 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 licuadora
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["licuadora"] })
# It lands in client/assets/licuadora.ts
# https://fogon.page/object/licuadora