← Ancient and prehistory3D assetfogon/esfinge
Esfinge
Drag to turn it// «Esfinge» · gpt-6-sol (medium)
// A cartoon Great Sphinx lying down, body horizontal along y: a lion body of sandstone with front paws stretched forward (-y), and a human head wearing a striped royal headdress (blue and gold stripes) facing front, calm face. Built of warm sandstone in several shades with a few chips and cracks.
const sand = "#d9ad69";
const light = "#edc784";
const shade = "#b9854c";
const deep = "#94683d";
const gold = "#f1ca55";
const goldDark = "#c99532";
const blue = "#164d91";
const blueLight = "#2876b1";
const turquoise = "#35b8b1";
// Lion body and rounded haunches.
ellipsoid(24, 27, 13, 11, 13, 9, sand);
ellipsoid(24, 27, 18, 10, 12, 5, light);
ellipsoid(15, 35, 10, 6, 6, 8, sand);
ellipsoid(33, 35, 10, 6, 6, 8, sand);
// Four sturdy legs. The front pair stretch toward the viewer.
for (const x of [16, 32]) {
ellipsoid(x, 19, 11, 5, 8, 8, shade);
box(x - 4, 13, 2, x + 4, 27, 13, sand);
box(x - 4, 11, 0, x + 4, 17, 8, light);
box(x - 5, 3, 0, x + 5, 15, 5, light);
box(x - 5, 3, 0, x + 5, 5, 3, sand);
// Three broad, readable toes.
for (const dx of [-3, 0, 3]) {
box(x + dx - 1, 2, 0, x + dx + 1, 5, 3, light);
set(x + dx + 1, 2, 1, shade);
}
}
for (const x of [15, 33]) {
box(x - 4, 32, 0, x + 4, 39, 9, shade);
ellipsoid(x, 36, 6, 5, 5, 6, sand);
}
// Upright chest supporting the human head.
ellipsoid(24, 17, 17, 8, 7, 10, sand);
ellipsoid(24, 13, 18, 7, 4, 8, light);
// Curled lion tail, visible beside the right haunch.
line(38, 38, 7, 41, 41, 7, 2, sand);
line(41, 41, 7, 42, 39, 11, 2, sand);
ellipsoid(42, 38, 12, 2, 3, 3, shade);
// Blue-and-gold nemes headdress: broad crown and hanging side flaps.
ellipsoid(24, 12, 36, 10, 7, 5, blue);
for (let z = 17; z <= 35; z++) {
const lower = z < 24;
for (const [a, b] of lower ? [[13, 19], [29, 35]] : [[12, 19], [29, 36]]) {
box(a, 9, z, b, 17, z, Math.floor(z / 3) % 2 ? gold : blue);
box(a, 8, z, b, 9, z, Math.floor(z / 3) % 2 ? gold : blueLight);
}
}
// Bands follow the rounded crown rather than filling a rectangular cap.
for (let x = 14; x <= 34; x++)
for (let y = 5; y <= 19; y++)
for (let z = 34; z <= 41; z++)
if (get(x, y, z) === blue && Math.floor(z / 2) % 2 === 0)
set(x, y, z, gold);
// Calm, softly rounded sandstone face in front of the headdress.
ellipsoid(24, 10, 29, 7, 6, 8, light);
ellipsoid(24, 7, 27, 5, 3, 5, light);
box(20, 5, 34, 28, 6, 35, goldDark);
box(20, 5, 35, 28, 6, 35, gold);
// Ears and gently arched brows.
box(17, 6, 27, 18, 8, 31, shade);
box(30, 6, 27, 31, 8, 31, shade);
box(19, 4, 32, 22, 4, 32, shade);
box(26, 4, 32, 29, 4, 32, shade);
// Large dark eyes with tiny white glints and turquoise liner.
for (const x of [21, 27]) {
box(x - 2, 4, 30, x + 1, 4, 30, turquoise);
box(x - 1, 3, 30, x, 3, 31, "#302b2a");
set(x - 1, 2, 31, "#fff5d5");
}
// Nose, serene smile, and striped ceremonial beard.
box(23, 3, 27, 25, 5, 30, light);
box(23, 2, 27, 25, 3, 27, sand);
set(21, 4, 25, shade);
box(22, 3, 24, 26, 3, 24, deep);
set(27, 4, 25, shade);
box(22, 5, 19, 26, 8, 23, blue);
for (const z of [19, 22]) box(22, 4, z, 26, 5, z, gold);
box(23, 4, 18, 25, 7, 18, goldDark);
// Small royal cobra rising from the forehead.
box(23, 4, 36, 25, 6, 40, gold);
box(22, 4, 39, 26, 6, 41, gold);
set(24, 3, 40, turquoise);
set(23, 3, 40, blue);
set(25, 3, 40, blue);
// Subtle variation on exposed sandstone, without speckling the face.
const stone = new Set([sand, light, shade]);
const flecks = [];
forEach((x, y, z, color) => {
if (stone.has(color) && y >= 11 && rand() < 0.065 &&
(!get(x, y - 1, z) || !get(x, y, z + 1)))
flecks.push([x, y, z, color === light ? sand : color === sand ? light : sand]);
});
for (const p of flecks) set(...p);
// A few carved-looking chips and short cracks on the lion's back.
for (const [x, y, z] of [
[20, 25, 23], [21, 25, 22], [22, 26, 22],
[29, 31, 21], [30, 31, 20], [30, 32, 19],
[13, 30, 15], [13, 31, 14]
]) {
if (get(x, y, z)) set(x, y, z, shade);
}import { draw } from "./assets/voxel";
import { esfinge } from "./assets/esfinge";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, esfinge, 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 esfinge
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["esfinge"] })
# It lands in client/assets/esfinge.ts
# https://fogon.page/object/esfinge