fogón

← Monsters and enemies3D assetfogon/escorpion

Escorpión

by fogonCC07543 blocks
EscorpiónDrag to turn it
// «Escorpión» · gpt-6-sol (medium)
// A big cartoon scorpion, horizontal and low: a segmented shiny dark red-brown body with lighter plates, two big pincer claws reaching forward toward -y, six short legs, and a segmented tail curling up and forward over the back ending in a glowing yellow-green stinger.

const dark = "#451b25";
const shadow = "#682634";
const shellRed = "#923443";
const plate = "#ba5660";
const shine = "#dc7775";
const glow = "#dfff48";

// Six short, splayed legs. The round joints keep them chunky at game scale.
for (const side of [-1, 1]) {
  for (const [y, reach, footY] of [
    [19, 7, 13],
    [27, 10, 27],
    [34, 8, 40]
  ]) {
    const rootX = 24 + side * 8;
    const kneeX = 24 + side * (reach + 10);
    const footX = Math.max(3, Math.min(45, kneeX + side * 2));

    line(rootX, y, 9, kneeX, (y + footY) / 2, 5, 2.3, shadow);
    sphere(kneeX, (y + footY) / 2, 5, 2.6, shellRed);
    line(kneeX, (y + footY) / 2, 5, footX, footY, 1, 1.8, dark);
    ellipsoid(footX, footY, 1, 2.4, 2.3, 1.2, shellRed);
    set(footX, footY - 1, 2, plate);
  }
}

// Low, broad body, with a darker lower edge.
ellipsoid(24, 29, 9, 10, 11, 6, dark);
ellipsoid(24, 28, 11, 9, 11, 5, shadow);
ellipsoid(24, 19, 10, 9, 7, 5, dark);
ellipsoid(24, 19, 11, 8, 6, 4, shellRed);

// Separate raised back plates and dark grooves between them.
for (const [y, rx, ry] of [
  [24, 8, 3],
  [30, 9, 3],
  [36, 7, 2.5]
]) {
  ellipsoid(24, y, 13, rx, ry, 3, shadow);
  ellipsoid(24, y - 0.4, 14, rx - 0.7, ry - 0.7, 2, plate);
  ellipsoid(22, y - 1, 15, 4, 1, 0.8, shine);
}

// A little irregular shine on the broad carapace.
forEach((x, y, z, color) => {
  if (color === shellRed && z >= 13 && rand() < 0.07) {
    set(x, y, z, plate);
  }
});

// Friendly, bright eyes on the forward-facing head.
for (const x of [20, 28]) {
  ellipsoid(x, 12, 13, 2.3, 1.3, 2.2, dark);
  ellipsoid(x, 10.9, 13, 1.35, 0.8, 1.35, glow);
  set(x - 1, 10, 14, "#ffffff");
}
box(22, 12, 7, 26, 12, 7, dark);
set(21, 12, 8, plate);
set(27, 12, 8, plate);

// Tail: a thick chain curling up from the rear and forward over the back.
part("tail", [24, 35, 13]);
const tailNodes = [
  [24, 35, 13, 4],
  [24, 39, 17, 3.8],
  [24, 40, 22, 3.5],
  [24, 38, 27, 3.2],
  [24, 34, 31, 2.9],
  [24, 29, 32, 2.6]
];
for (let i = 0; i < tailNodes.length - 1; i++) {
  const a = tailNodes[i], b = tailNodes[i + 1];
  line(a[0], a[1], a[2], b[0], b[1], b[2], Math.min(a[3], b[3]) - 0.5, dark);
}
for (const [x, y, z, r] of tailNodes) {
  sphere(x, y, z, r, shadow);
  ellipsoid(x, y - 0.5, z + 0.8, r - 0.5, r - 0.7, r - 0.8, shellRed);
  ellipsoid(x - 1, y - 0.8, z + r - 0.7, 1.3, 1, 0.7, plate);
}
ellipsoid(24, 26, 31, 2.7, 3.2, 2.5, dark);
ellipsoid(24, 25, 31, 2.2, 2.7, 2, "#aabf37");
ellipsoid(24, 23, 30, 1.7, 2, 1.7, glow);
line(24, 22, 29, 24, 20, 26, 1, glow);
set(24, 20, 26, "#f5ff9a");
animate("tail", { type: "swing", axis: "x", speed: 3, amplitude: 0.3 });

part("body");

// Two oversized pincers, each hinged where its arm meets the body.
for (const side of [-1, 1]) {
  const name = side < 0 ? "leftClaw" : "rightClaw";
  const pivotX = 24 + side * 9;
  const palmX = 24 + side * 15;

  part(name, [pivotX, 17, 10]);

  sphere(pivotX, 17, 10, 2.8, dark);
  line(pivotX, 17, 10, 24 + side * 12, 12, 9, 2.5, shadow);
  sphere(24 + side * 12, 12, 9, 2.5, plate);
  line(24 + side * 12, 12, 9, palmX, 9, 10, 2.7, dark);

  ellipsoid(palmX, 8, 10, 4.5, 4, 3.7, dark);
  ellipsoid(palmX, 8, 11, 3.9, 3.5, 3, shellRed);
  ellipsoid(palmX - side, 8, 13, 2.4, 2, 0.8, plate);
  set(palmX - side, 7, 14, shine);

  // Two hooked fingers leave a visible notch at the front of each claw.
  line(palmX + side * 3, 7, 10, palmX + side * 4, 3, 9, 1.7, shadow);
  line(palmX + side * 4, 3, 9, palmX + side * 2, 1, 9, 1.2, plate);
  line(palmX - side * 3, 7, 10, palmX - side * 3, 3, 9, 1.7, shellRed);
  line(palmX - side * 3, 3, 9, palmX - side, 1, 9, 1.2, plate);

  animate(name, {
    type: "swing",
    axis: "z",
    speed: side < 0 ? 3 : -3,
    amplitude: 0.25
  });
  part("body");
}