← Monsters and enemies3D assetfogon/rey-esqueleto
Rey esqueleto
Drag to turn it// «Rey esqueleto» · gpt-6-sol (medium)
// A big boss: a tall cartoon skeleton king facing -y, sitting slightly hunched: ivory bones, a skull with glowing blue eyes, a heavy gold crown with red gems, a tattered royal purple cape with gold trim, and a tall bone scepter with a glowing blue gem in the right hand.
const bone = "#eee5c8", boneLight = "#fff7db", boneShade = "#bfb394";
const purple = "#64269a", purpleLight = "#8538b6", purpleDark = "#3b185f";
const gold = "#efb83e", goldLight = "#ffe074", goldDark = "#a86b22";
const cyan = "#45eaff", dark = "#211b33";
// A low throne gives the king a clear seated pose.
box(14, 23, 10, 34, 35, 12, "#393047");
box(15, 32, 12, 33, 35, 29, "#302840");
box(13, 20, 10, 15, 34, 19, "#40334f");
box(33, 20, 10, 35, 34, 19, "#40334f");
box(13, 19, 18, 16, 30, 19, "#665172");
box(32, 19, 18, 35, 30, 19, "#665172");
box(16, 31, 7, 19, 34, 10, "#302840");
box(30, 31, 7, 33, 34, 10, "#302840");
// Broad, uneven cape, hanging behind the throne and pooling on the floor.
for (let z = 0; z <= 30; z++) {
const half = z < 15 ? 17 - Math.floor(z / 10) : 16 - Math.floor((z - 15) / 5);
for (let x = 24 - half; x <= 24 + half; x++) {
const edge = Math.abs(x - 24);
const ragged = (x * 7) % 5;
if (z < 3 + ragged && edge > 10) continue;
const front = z < 16 ? 31 : 29;
const back = z < 12 ? 39 : 37 - Math.floor((z - 12) / 9);
for (let y = front; y <= back; y++) {
const trim = edge >= half - 1 || (z <= 2 && y >= 35);
set(x, y, z, trim ? (rand() < 0.25 ? goldLight : gold) :
rand() < 0.12 ? purpleLight : rand() < 0.28 ? purpleDark : purple);
}
}
}
// Cape shoulders and two hanging front corners.
ellipsoid(24, 29, 28, 13, 6, 4, purple);
for (const x of [12, 35]) {
box(x, 23, 12, x + 2, 28, 27, purpleDark);
box(x, 22, 15, x, 25, 27, gold);
box(x + 1, 22, 23, x + 2, 23, 27, purpleLight);
}
// Pelvis, narrow spine, and a rib cage with dark spaces between the bones.
ellipsoid(24, 23, 17, 7, 5, 3, boneShade);
ellipsoid(24, 22, 18, 6, 4, 2, bone);
box(23, 24, 19, 25, 26, 29, boneShade);
ellipsoid(24, 23, 25, 9, 6, 7, dark);
for (const z of [21, 24, 27]) {
line(17, 17, z, 22, 16, z - 1, 1, boneShade);
line(18, 16, z + 1, 23, 15, z, 1, bone);
line(26, 15, z, 30, 16, z + 1, 1, bone);
line(27, 16, z - 1, 31, 17, z, 1, boneShade);
}
box(23, 14, 22, 25, 16, 29, bone);
line(16, 20, 29, 23, 18, 29, 1, boneLight);
line(25, 18, 29, 32, 20, 29, 1, boneLight);
box(22, 19, 29, 26, 23, 32, boneShade);
// Crown and oversized friendly-spooky skull.
ellipsoid(24, 20, 35, 8, 7, 7, boneShade);
ellipsoid(24, 19, 36, 8, 7, 6, bone);
ellipsoid(24, 18, 39, 6, 5, 3, boneLight);
ellipsoid(24, 18, 30, 6, 5, 2, boneShade);
box(19, 13, 29, 29, 15, 30, boneLight);
for (let x = 20; x <= 28; x += 2) box(x, 12, 29, x, 13, 30, boneLight);
// Deep eye sockets, bright cyan eyes and a small triangular nose.
for (const x of [20, 28]) {
box(x - 2, 12, 34, x + 1, 14, 37, "#423c4d");
box(x - 1, 11, 35, x, 12, 36, "#1488b6");
box(x - 1, 10, 35, x, 11, 36, cyan);
set(x - 1, 9, 36, "#d9ffff");
}
set(24, 11, 33, "#625a60");
box(23, 11, 32, 25, 12, 32, "#625a60");
box(19, 13, 31, 21, 14, 32, boneLight);
box(27, 13, 31, 29, 14, 32, boneLight);
// Heavy gold circlet with tall, crenellated points.
for (let z = 40; z <= 42; z++) {
for (let x = 16; x <= 32; x++) {
for (let y = 13; y <= 25; y++) {
const dx = (x - 24) / 8, dy = (y - 19) / 6;
if (dx * dx + dy * dy <= 1.05 && dx * dx + dy * dy >= 0.58)
set(x, y, z, z === 42 ? goldLight : z === 40 ? goldDark : gold);
}
}
}
for (const x of [17, 21, 24, 27, 31]) {
const top = x === 24 ? 46 : x === 17 || x === 31 ? 44 : 45;
box(x - 1, 13, 42, x + 1, 16, top, goldDark);
box(x - 1, 12, 43, x + 1, 13, top, gold);
box(x, 12, top, x, 13, top, goldLight);
}
for (const x of [20, 24, 28]) {
box(x - 1, 11, 41, x + 1, 12, 42, "#a72e48");
set(x, 10, 42, "#ff5c6a");
}
// The free arm rests against the throne.
line(33, 20, 28, 36, 16, 22, 2, boneShade);
sphere(36, 16, 22, 2, bone);
line(36, 16, 22, 33, 13, 18, 2, bone);
sphere(33, 13, 18, 2, boneLight);
// Separate seated legs, bent forward from the hips.
for (const [name, x, speed] of [["leftLeg", 19, 2], ["rightLeg", 29, -2]]) {
part(name, [x, 23, 17]);
sphere(x, 22, 16, 3, boneShade);
line(x, 22, 16, x, 15, 11, 2, bone);
sphere(x, 15, 11, 3, boneLight);
line(x, 15, 10, x, 11, 3, 2, boneShade);
line(x, 13, 7, x, 11, 2, 2, bone);
ellipsoid(x, 8, 1, 3, 5, 2, boneLight);
for (let t = -2; t <= 2; t += 2)
box(x + t, 4, 0, x + t + 1, 7, 1, bone);
animate(name, { type: "swing", axis: "x", speed, amplitude: 0.3 });
}
part("body");
// Scepter arm: the staff travels with the slowly swinging hand.
part("scepterArm", [15, 20, 28]);
sphere(15, 20, 28, 3, bone);
line(15, 20, 28, 10, 17, 23, 2, boneShade);
sphere(10, 17, 23, 2, boneLight);
line(10, 17, 23, 9, 12, 19, 2, bone);
sphere(9, 12, 19, 2, boneLight);
box(8, 11, 19, 10, 13, 21, boneShade);
// Tall carved bone shaft, with gold fittings and an ornate head.
box(8, 11, 3, 9, 12, 39, boneShade);
box(8, 10, 5, 8, 10, 38, boneLight);
for (const z of [5, 17, 29, 36]) {
box(7, 10, z, 10, 13, z + 1, goldDark);
box(7, 10, z + 1, 10, 11, z + 1, goldLight);
}
line(8, 11, 37, 5, 11, 40, 1, gold);
line(9, 11, 37, 12, 11, 40, 1, gold);
box(6, 10, 40, 11, 12, 40, goldLight);
animate("scepterArm", { type: "swing", axis: "x", speed: 2, amplitude: 0.25 });
part("body");
// Independently pulsing blue gem.
part("scepterGem", [8, 11, 41]);
ellipsoid(8, 11, 42, 3, 3, 3, "#228fd5");
ellipsoid(8, 9, 42, 2, 1, 2, "#69f2ff");
set(7, 8, 43, "#f2ffff");
animate("scepterGem", {
type: "colors",
palette: ["#168ad2", "#25caff", "#7af4ff", "#ffffff"],
pattern: "pulse",
glow: 0.9
});
part("body");import { draw } from "./assets/voxel";
import { reyEsqueleto } from "./assets/rey-esqueleto";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, reyEsqueleto, 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 rey-esqueleto
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["rey-esqueleto"] })
# It lands in client/assets/rey-esqueleto.ts
# https://fogon.page/object/rey-esqueleto