← FantasíaObjeto 3Dfogon/golem
Golem
Arrastrá para girarlo// «Golem» · gpt-6-sol (medium)
// A friendly stone golem: a huge chunky body made of mossy grey stone blocks, wide shoulders, a small head sunk between them with two glowing cyan eyes and a glowing cyan rune carved on the chest, very long thick arms with big blocky fists reaching almost to the floor, short thick legs. Green moss and a tiny flower on its shoulders.
// Friendly mossy stone golem
const stone = "#777e79";
const lightStone = "#929b92";
const darkStone = "#59635f";
const deepStone = "#424e4c";
const moss = "#426d49";
const mossLight = "#60925a";
const mossDark = "#315b40";
// Short, sturdy legs and broad feet.
for (const x of [18, 30]) {
ellipsoid(x, 24, 8, 5, 5, 8, darkStone);
box(x - 4, 20, 5, x + 4, 28, 14, stone);
ellipsoid(x, 21, 3, 6, 7, 3, stone);
box(x - 5, 15, 0, x + 5, 25, 2, darkStone);
box(x - 4, 15, 2, x + 4, 18, 3, lightStone);
for (const dx of [-3, 0, 3]) {
box(x + dx - 1, 14, 1, x + dx + 1, 16, 2, lightStone);
}
}
// Heavy, softly rounded torso with a wide shoulder line.
ellipsoid(24, 24, 23, 12, 9, 12, stone);
box(15, 18, 16, 33, 30, 30, stone);
ellipsoid(24, 24, 16, 10, 8, 5, darkStone);
ellipsoid(24, 25, 32, 12, 6, 4, lightStone);
for (const x of [15, 33]) {
ellipsoid(x, 24, 31, 6, 7, 6, stone);
box(x - 3, 18, 34, x + 3, 28, 35, lightStone);
}
// Small head nestled between the shoulders.
ellipsoid(24, 17, 34, 5, 5, 5, stone);
box(21, 13, 32, 27, 19, 37, lightStone);
ellipsoid(24, 14, 31, 3, 3, 2, stone);
// Weathering on exposed stone. Keep the speckles sparse and chunky.
forEach((x, y, z, color) => {
if (color !== stone && color !== lightStone && color !== darkStone) return;
if (rand() < 0.035 && !get(x, y - 1, z)) {
set(x, y, z, rand() < 0.65 ? lightStone : deepStone);
} else if (rand() < 0.035 && !get(x, y, z + 1)) {
set(x, y, z, lightStone);
}
});
// Moss climbing the shoulders and collecting along their tops.
for (const x of [12, 13, 14, 15, 16, 17, 31, 32, 33, 34, 35, 36]) {
for (let y = 19; y <= 29; y += 2) {
if (rand() < 0.8) {
const z = 35 + (rand() < 0.4 ? 1 : 0);
set(x, y, z, rand() < 0.5 ? moss : mossLight);
if (rand() < 0.35) set(x, y, z - 1, mossDark);
}
}
}
box(21, 16, 39, 26, 20, 39, moss);
box(23, 15, 39, 25, 17, 40, mossLight);
for (const [x, y, z] of [[16, 17, 32], [17, 17, 31], [32, 17, 32], [30, 16, 29], [19, 15, 25]]) {
box(x, y, z, x + 1, y, z + 1, moss);
set(x, y - 1, z, mossLight);
}
// Tiny shoulder flower and a little mushroom.
line(15, 20, 36, 15, 20, 39, 0, mossLight);
for (const [dx, dy, dz] of [[-1, 0, 0], [1, 0, 0], [0, -1, 0], [0, 1, 0], [0, 0, 1]]) {
set(15 + dx, 20 + dy, 40 + dz, "#ee82b7");
}
set(15, 19, 40, "#ffe5a0");
box(34, 23, 36, 34, 23, 37, "#dfd2a8");
box(33, 22, 38, 35, 24, 38, "#bc657e");
set(34, 22, 38, "#ffe6ce");
// Long swinging arms. Each shoulder is its own pivot.
function makeArm(name, pivotX, side, speed) {
part(name, [pivotX, 24, 30]);
const outer = pivotX + side * 3;
ellipsoid(pivotX, 24, 29, 5, 6, 5, darkStone);
ellipsoid(outer, 24, 28, 5, 6, 6, stone);
box(outer - 3, 20, 16, outer + 3, 28, 27, stone);
ellipsoid(outer, 24, 19, 4, 5, 9, stone);
box(outer - 3, 19, 11, outer + 3, 27, 15, darkStone);
const handX = outer + side;
ellipsoid(handX, 23, 6, 5, 5, 5, darkStone);
box(handX - 4, 19, 3, handX + 4, 27, 8, stone);
box(handX - 3, 18, 4, handX + 3, 18, 7, lightStone);
for (const dx of [-2, 0, 2]) {
box(handX + dx, 17, 3, handX + dx + 1, 18, 5, lightStone);
}
box(outer - 3, 18, 23, outer + 3, 18, 26, lightStone);
for (let i = 0; i < 9; i++) {
const z = 17 + Math.floor(rand() * 12);
set(outer + Math.floor(rand() * 5) - 2, 19, z, rand() < 0.5 ? moss : mossLight);
}
animate(name, { type: "swing", axis: "x", speed, amplitude: 0.35 });
}
makeArm("leftArm", 11, -1, 2);
makeArm("rightArm", 37, 1, -2);
part("body");
// Dark inset makes the magical rune legible from a distance.
box(19, 14, 19, 29, 14, 29, deepStone);
line(19, 14, 20, 19, 14, 28, 0, darkStone);
line(29, 14, 20, 29, 14, 28, 0, darkStone);
line(20, 14, 29, 28, 14, 29, 0, lightStone);
line(20, 14, 19, 28, 14, 19, 0, darkStone);
// Friendly smile beneath the bright eyes.
set(21, 11, 31, deepStone);
box(22, 11, 30, 26, 11, 30, deepStone);
set(27, 11, 31, deepStone);
set(24, 11, 32, lightStone);
// Eyes and chest rune share one pulsing magical glow.
part("magicGlow", [24, 17, 27]);
for (const x of [21, 27]) {
box(x - 1, 11, 34, x + 1, 11, 35, "#33e7e3");
set(x, 10, 35, "#d6ffff");
}
line(24, 13, 28, 20, 13, 24, 0, "#30ede1");
line(20, 13, 24, 24, 13, 20, 0, "#30ede1");
line(24, 13, 20, 28, 13, 24, 0, "#30ede1");
line(28, 13, 24, 24, 13, 28, 0, "#30ede1");
line(24, 12, 26, 24, 12, 22, 0, "#bcffff");
set(24, 11, 24, "#e0ffff");
animate("magicGlow", {
type: "colors",
palette: ["#23d8d6", "#42fff0", "#c9ffff"],
pattern: "pulse",
glow: 0.9
});
part("body");import { draw } from "./assets/voxel";
import { golem } from "./assets/golem";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, golem, x, y, { size: 64, angle: 0, t: performance.now() / 1000 });
// size: lo que mide en px su lado más largo
// angle: giro sobre el piso, en radianes
// t: segundos; si se mueve, se anima solo con eso# En una terminal, en la carpeta del juego
fogon assets add golem
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["golem"] })
# Queda en client/assets/golem.ts
# https://fogon.page/object/golem