fogón

← Fantasy3D assetfogon/golem

Golem

by fogonCC014988 blocks
GolemDrag to turn it
// «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");