← Asian3D assetfogon/leon-guardian
León guardián
Drag to turn it// «León guardián» · gpt-6-sol (medium)
// A Chinese guardian lion statue (shishi) in grey stone sitting on a square pedestal, curly mane in rows of round curls, big round eyes, open mouth, one front paw resting on a ball.
// Square stone pedestal with a stepped temple-style profile.
box(5, 5, 0, 42, 42, 0, "#777872");
box(7, 7, 1, 40, 40, 3, "#999b94");
box(6, 6, 4, 41, 41, 5, "#b5b7ae");
box(7, 7, 6, 40, 40, 6, "#858981");
for (let x = 8; x <= 39; x += 4) {
box(x, 6, 4, x + 1, 6, 4, "#84877e");
}
box(18, 5, 1, 30, 5, 3, "#aa9160");
box(19, 4, 2, 29, 4, 2, "#993e34");
box(22, 3, 2, 26, 3, 2, "#d6b773");
// Seated body: broad haunches, upright chest, and heavy shoulders.
ellipsoid(24, 28, 17, 11, 10, 11, "#92948e");
ellipsoid(17, 32, 12, 6, 6, 6, "#858780");
ellipsoid(31, 32, 12, 6, 6, 6, "#858780");
ellipsoid(24, 21, 21, 9, 8, 12, "#a5a7a0");
ellipsoid(24, 18, 24, 7, 6, 9, "#b4b5ad");
// Curled tail visible beside the right haunch.
line(34, 34, 9, 38, 34, 13, 2, "#777a74");
line(38, 34, 13, 39, 32, 19, 2, "#888b84");
line(39, 32, 19, 37, 29, 22, 2, "#999b93");
sphere(36, 29, 22, 2, "#b8b9af");
sphere(38, 30, 23, 2, "#8c8e86");
// Forelegs and the planted left paw.
line(17, 20, 23, 17, 15, 11, 3, "#969891");
cylinder(17, 15, 8, 3, 7, "#a5a79f");
ellipsoid(17, 11, 8, 4, 5, 2, "#b4b5ac");
// The right foreleg reaches down onto a carved ball.
line(31, 20, 23, 32, 12, 16, 3, "#989a93");
sphere(32, 10, 10, 4, "#bfc0b4");
sphere(32, 10, 10, 3, "#aaaDA2");
line(30, 6, 8, 33, 6, 11, 0, "#777d75");
line(33, 6, 11, 34, 7, 12, 0, "#777d75");
line(30, 7, 12, 32, 6, 13, 0, "#d8d6c5");
ellipsoid(32, 10, 15, 4, 4, 2, "#b3b5ac");
// A deep, rounded mane forms the silhouette behind the face.
ellipsoid(24, 20, 30, 11, 9, 11, "#787b76");
ellipsoid(24, 15, 31, 8, 7, 8, "#a9aaa2");
// Rows of individually rounded stone curls.
const curls = [];
for (const x of [16, 20, 24, 28, 32]) curls.push([x, 15, 39]);
for (const x of [14, 17, 31, 34]) {
for (const z of [27, 31, 35]) curls.push([x, 15, z]);
}
for (const y of [19, 23]) {
for (const z of [25, 29, 33, 37]) {
curls.push([15, y, z], [33, y, z]);
}
}
for (const x of [19, 24, 29]) curls.push([x, 23, 39]);
for (let i = 0; i < curls.length; i++) {
const [x, y, z] = curls[i];
sphere(x, y, z, 2, i % 3 === 0 ? "#a2a49c" : "#8e9089");
set(x - 1, y - 2, z + 1, "#c0c0b5");
set(x + 1, y - 2, z, "#70736d");
}
// Ears peeking out of the crown.
sphere(15, 15, 37, 3, "#aaaBA2");
sphere(33, 15, 37, 3, "#aaaBA2");
set(15, 12, 37, "#73766f");
set(33, 12, 37, "#73766f");
// Broad muzzle, open mouth, lower jaw, and prominent nose.
sphere(20, 9, 28, 3, "#c0c0b5");
sphere(28, 9, 28, 3, "#c0c0b5");
box(21, 5, 24, 27, 8, 26, "#393c3b");
box(20, 7, 23, 28, 9, 23, "#777a74");
ellipsoid(24, 8, 22, 5, 3, 2, "#aaaBA1");
box(22, 5, 26, 22, 5, 27, "#e2dfcb");
box(26, 5, 26, 26, 5, 27, "#e2dfcb");
box(23, 5, 23, 25, 5, 23, "#dbd8c5");
box(23, 4, 29, 25, 6, 30, "#484b49");
set(24, 3, 29, "#696b63");
// Round, alert eyes set into dark sockets.
for (const x of [20, 28]) {
ellipsoid(x, 8, 33, 3, 2, 3, "#777a73");
sphere(x, 6, 33, 2, "#dedccd");
set(x, 3, 33, "#333b39");
set(x - 1, 3, 34, "#ffffff");
line(x - 2, 6, 36, x + 2, 6, 36, 1, "#92948c");
}
// Claws and restrained carved accents.
for (const x of [15, 17, 19]) {
set(x, 6, 8, "#dedac8");
}
for (const x of [30, 32, 34]) {
set(x, 6, 15, "#dedac8");
}
for (let z = 17; z <= 23; z += 3) {
set(24, 12, z, "#d0cdbb");
}
// Sparse stone grain, leaving the face and decorative colors crisp.
forEach((x, y, z, color) => {
if (
z >= 7 &&
y >= 12 &&
(color === "#92948e" || color === "#a5a7a0" ||
color === "#a9aaa2" || color === "#b4b5ad") &&
rand() < 0.035
) {
set(x, y, z, "#bbbcb2");
}
});import { draw } from "./assets/voxel";
import { leonGuardian } from "./assets/leon-guardian";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, leonGuardian, 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 leon-guardian
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["leon-guardian"] })
# It lands in client/assets/leon-guardian.ts
# https://fogon.page/object/leon-guardian