← Parties and Christmas3D assetfogon/reno
Reno
Drag to turn it// «Reno» · gpt-6-sol (medium)
// A cute cartoon reindeer standing, with a horizontal body along y: warm brown body with a cream belly, four thin legs with dark hooves, a short fluffy cream tail at the back, a head at the front (-y) with big branching tan antlers, black dot eyes and a big round glowing red nose. A red collar with a small golden bell around the neck.
// Warm, rounded body
ellipsoid(24, 25, 20, 9, 14, 7, "#a86739");
forEach((x, y, z, color) => {
if (color === "#a86739" && rand() < 0.045)
set(x, y, z, rand() < 0.5 ? "#b87543" : "#98582f");
});
ellipsoid(24, 24, 17, 7.5, 12, 3.5, "#f5e8cb");
ellipsoid(24, 25, 25, 6.5, 10, 1.5, "#b87543");
// Four independently swinging legs
function leg(name, x, y, speed) {
part(name, [x, y, 16]);
ellipsoid(x, y, 13, 2, 2.2, 4, "#a86739");
line(x, y, 13, x, y, 4, 1.35, "#9d6035");
ellipsoid(x, y, 3, 1.7, 1.7, 2.5, "#a86739");
box(x - 2, y - 2, 0, x + 2, y + 1, 2, "#46352f");
box(x - 2, y - 2, 2, x + 2, y + 1, 3, "#5b4338");
box(x - 1, y - 2, 3, x + 1, y - 1, 3, "#776052");
animate(name, { type: "swing", axis: "x", speed, amplitude: 0.3 });
part("body");
}
leg("front-left", 18, 16, 5);
leg("front-right", 30, 16, -5);
leg("rear-left", 18, 34, -5);
leg("rear-right", 30, 34, 5);
// Fluffy tail at the back
ellipsoid(24, 38, 23, 3.5, 3.5, 3, "#f2dfbd");
sphere(23, 41, 24, 2.5, "#fff1d5");
sphere(26, 41, 23, 2, "#f8e7c8");
sphere(24, 43, 24, 1.5, "#fff1d5");
// Upright neck, red collar, and little golden bell
ellipsoid(24, 15, 25, 5, 5, 7, "#a86739");
ellipsoid(24, 13, 25, 5.5, 4.5, 1.7, "#d92f3a");
box(19, 12, 25, 29, 14, 25, "#f04a50");
set(20, 10, 25, "#ff9b85");
set(28, 10, 25, "#ff9b85");
sphere(24, 9, 22, 2, "#f3bd37");
set(23, 8, 23, "#ffe68b");
box(23, 7, 20, 25, 8, 20, "#bd8426");
set(24, 7, 20, "#6c472a");
// Big ears, with pink inner fur
ellipsoid(15, 12, 33, 4.5, 2, 2.2, "#a86739");
ellipsoid(33, 12, 33, 4.5, 2, 2.2, "#a86739");
ellipsoid(14, 10, 33, 2.5, 0.8, 1.1, "#eaa5a2");
ellipsoid(34, 10, 33, 2.5, 0.8, 1.1, "#eaa5a2");
// Cheerful face and cream muzzle
ellipsoid(24, 11, 31, 7, 6, 6, "#ac6b3b");
ellipsoid(24, 7, 27, 4.5, 3.5, 3, "#f5e8cb");
ellipsoid(24, 10, 36, 2.5, 2, 1, "#bf8049");
sphere(20, 5, 32, 1.2, "#211d20");
sphere(28, 5, 32, 1.2, "#211d20");
set(20, 4, 33, "#ffffff");
set(28, 4, 33, "#ffffff");
// Broad, branching antlers
function antler(side) {
const X = n => 24 + side * n;
const branch = (a, b, c, d, radius = 1) =>
line(X(a), 11, b, X(c), 11, d, radius, "#c99255");
branch(4, 35, 6, 39, 1.35);
branch(6, 39, 11, 42, 1.25);
branch(11, 42, 15, 43, 1);
branch(6, 39, 7, 44);
branch(10, 41, 11, 45);
branch(14, 43, 16, 45);
branch(4, 35, 5, 38, 0.5);
// Bright edges catch the light on the front.
line(X(6), 10, 39, X(11), 10, 42, 0, "#efc584");
line(X(11), 10, 42, X(15), 10, 43, 0, "#efc584");
}
antler(-1);
antler(1);
// Rudolph's glowing nose is its own animated part.
part("nose", [24, 3, 28]);
sphere(24, 2, 28, 2.6, "#f7283d");
set(23, 0, 29, "#ffacb1");
animate("nose", {
type: "colors",
palette: ["#dd1735", "#f7283d", "#ff5266", "#ff8a9a"],
pattern: "pulse",
glow: 1
});
part("body");import { draw } from "./assets/voxel";
import { reno } from "./assets/reno";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, reno, 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 reno
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["reno"] })
# It lands in client/assets/reno.ts
# https://fogon.page/object/reno