← Fantasy3D assetfogon/fenix
Fénix
Drag to turn it// «Fénix» · gpt-6-sol (medium)
// A cartoon phoenix bird with spread wings facing front (-y): a body of bright orange and red feathers, a golden crest of flame-like feathers on the head, a short yellow beak, and a long trailing tail of flame feathers going from red to yellow, perched on a small dark rock.
const stone = ["#34383f", "#42464c", "#51545a"];
const moss = ["#55704b", "#72925b", "#8ca965"];
// Small, mossy perch.
ellipsoid(24, 25, 2, 9, 7, 3, stone[1]);
ellipsoid(20, 25, 2, 5, 5, 3, stone[0]);
ellipsoid(29, 27, 2, 5, 4, 3, stone[2]);
forEach((x, y, z, color) => {
if (z >= 3 && z <= 5 && stone.includes(color) && !get(x, y, z + 1) && rand() < 0.22)
set(x, y, z, moss[Math.floor(rand() * moss.length)]);
});
// Tiny mushrooms tucked beside the perch.
for (const [x, y] of [[17, 21], [31, 24]]) {
box(x, y, 4, x, y, 6, "#e9d7ad");
ellipsoid(x, y, 7, 2, 2, 1, "#ae4b69");
set(x, y - 2, 7, "#f8d68a");
}
// Fanned flame-tail: red at the base, glowing yellow at the tips.
part("tail", [24, 29, 17]);
for (const [dx, endY, endZ] of [
[-13, 35, 10], [-9, 38, 8], [-5, 41, 7], [0, 43, 6],
[5, 41, 7], [9, 38, 8], [13, 35, 10]
]) {
const midX = 24 + dx * 0.48;
const midY = 32 + (endY - 32) * 0.43;
line(24, 29, 18, midX, midY, 15, 2, "#b92e36");
line(midX, midY, 15, 24 + dx * 0.78, endY - 3, endZ + 3, 2, "#ef642c");
line(24 + dx * 0.78, endY - 3, endZ + 3,
24 + dx, endY, endZ, 1, "#ffc044");
ellipsoid(24 + dx, endY, endZ, 2, 2, 2, "#ffdb61");
set(24 + dx, endY, endZ, "#fff0b0");
}
animate("tail", {
type: "colors",
palette: ["#d63032", "#ff752c", "#ffcf43", "#fff4c3"],
pattern: "flicker",
glow: 1
});
// Broad, individually flapping wings.
for (const side of [-1, 1]) {
const name = side < 0 ? "leftWing" : "rightWing";
part(name, [24 + side * 6, 23, 29]);
// Rounded leading edge.
line(24 + side * 6, 23, 29, 24 + side * 20, 23, 34, 3, "#b93335");
line(24 + side * 7, 21, 30, 24 + side * 20, 21, 35, 2, "#f26b2b");
// Overlapping, scalloped flight feathers.
for (let d = 9; d <= 20; d += 2) {
const upper = 33 + (d - 9) * 0.2;
const tip = 18 + (d - 9) * 0.8;
const center = (upper + tip) / 2;
ellipsoid(24 + side * d, 23, center, 2, 3, (upper - tip) / 2, "#c73a36");
ellipsoid(24 + side * d, 20, center + 1, 1.5, 1.5,
Math.max(2, (upper - tip) / 2 - 2), "#eb592e");
ellipsoid(24 + side * d, 19, upper - 2, 1, 1, 2, "#ffad3c");
}
ellipsoid(24 + side * 20, 22, 33, 3, 2, 4, "#e74c31");
ellipsoid(24 + side * 21, 20, 35, 2, 1, 2, "#ffbd48");
animate(name, { type: "swing", axis: "y", speed: side < 0 ? 4 : -4, amplitude: 0.5 });
}
part("body");
// Sturdy little legs and forward-reaching golden toes.
for (const x of [21, 27]) {
cylinder(x, 22, 6, 2, 6, "#b76729");
ellipsoid(x, 19, 7, 2, 3, 1, "#f5ad37");
for (const offset of [-1, 1])
line(x, 19, 7, x + offset * 2, 16, 6, 0, "#ffd060");
}
// Plump red-orange body and sunny breast.
ellipsoid(24, 24, 19, 8, 7, 11, "#ae3034");
ellipsoid(24, 21, 21, 7, 6, 9, "#ed592e");
ellipsoid(24, 18, 19, 5, 3, 8, "#ff9237");
ellipsoid(24, 16, 17, 3, 1, 5, "#ffbb4c");
for (const [x, z] of [[21, 14], [27, 15], [20, 21], [28, 22], [24, 25]])
ellipsoid(x, 16, z, 1, 1, 2, "#ffd06a");
// Big, friendly head with warm feathered cheeks.
ellipsoid(24, 21, 32, 7, 6, 7, "#d84131");
ellipsoid(24, 18, 33, 6, 4, 6, "#ff7932");
ellipsoid(19, 17, 30, 2, 2, 2, "#f69b3d");
ellipsoid(29, 17, 30, 2, 2, 2, "#f69b3d");
// Flame-shaped golden crest, with staggered pointed tips.
for (const [x, baseZ, tipZ] of [
[19, 37, 41], [21, 38, 44], [24, 38, 46],
[27, 38, 44], [29, 37, 41]
]) {
ellipsoid(x, 20, baseZ + 1, 2, 2, 3, "#f29330");
line(x, 20, baseZ + 1, x + (x - 24) * 0.25, 21, tipZ, 1, "#ffcd4c");
set(x + Math.round((x - 24) * 0.25), 21, tipZ, "#fff19a");
}
// Large cream eyes, dark pupils, and crisp little catchlights.
for (const x of [21, 27]) {
ellipsoid(x, 15, 34, 2, 1, 3, "#82343a");
ellipsoid(x, 14, 34, 2, 1, 2, "#fff1cc");
ellipsoid(x, 13, 34, 1, 1, 2, "#302b35");
set(x - 1, 12, 35, "#ffffff");
}
ellipsoid(19, 15, 30, 2, 1, 1, "#ffae69");
ellipsoid(29, 15, 30, 2, 1, 1, "#ffae69");
// Short, rounded yellow beak.
ellipsoid(24, 13, 30, 2, 3, 2, "#ffc746");
ellipsoid(24, 11, 29, 1, 1, 1, "#f3982e");
set(24, 10, 30, "#fff0a2");import { draw } from "./assets/voxel";
import { fenix } from "./assets/fenix";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, fenix, 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 fenix
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["fenix"] })
# It lands in client/assets/fenix.ts
# https://fogon.page/object/fenix