fogón

← Monstruos y enemigosObjeto 3Dfogon/cactus-enojado

Cactus enojado

de fogonCC07469 bloques
Cactus enojadoArrastrá para girarlo
// «Cactus enojado» · gpt-6-sol (medium)
// A cartoon angry cactus monster facing -y: a tall green saguaro body with lighter ribs and white spines, two arms bent upward, an angry face (frowning brows, red glowing eyes, a jagged mouth) and a pink flower on top, standing on two short root-like feet.

// Chunky saguaro body, shaded darker toward the roots.
ellipsoid(24, 25, 20, 9, 8, 16, "#278d3b");
forEach((x, y, z, color) => {
  if (color !== "#278d3b") return;
  if (z < 10) set(x, y, z, "#176b31");
  else if (y > 28) set(x, y, z, "#207c35");
  else if (y < 22 && rand() < 0.09) set(x, y, z, "#36a747");
});

// Raised, lighter ribs down the front.
for (const dx of [-6, -3, 0, 3, 6]) {
  for (let z = 8; z <= 34; z++) {
    const shape = 1 - (dx / 9) ** 2 - ((z - 20) / 16) ** 2;
    if (shape <= 0) continue;
    const y = Math.round(25 - 8 * Math.sqrt(shape));
    set(24 + dx, y - 1, z, z < 12 ? "#298c39" : "#54be53");
    if (z > 12 && z < 32 && rand() < 0.28)
      set(24 + dx, y - 2, z, "#77ce65");
  }
}

// Scattered ivory spines, kept clear of the face.
for (const dx of [-6, -3, 0, 3, 6]) {
  for (let z = 10; z <= 34; z += 4) {
    const x = 24 + dx;
    if (z >= 18 && z <= 32 && x >= 18 && x <= 30) continue;
    const shape = 1 - (dx / 9) ** 2 - ((z - 20) / 16) ** 2;
    if (shape <= 0) continue;
    const y = Math.round(25 - 8 * Math.sqrt(shape));
    set(x, y - 2, z, "#fff2cc");
    if (rand() < 0.65) set(x, y - 3, z, "#fffaf0");
  }
}

// Two squat roots with forward-projecting toes.
for (const x of [19, 29]) {
  ellipsoid(x, 24, 4, 4, 4, 5, "#176c30");
  ellipsoid(x, 21, 2, 4, 5, 2, "#218139");
  box(x - 2, 17, 0, x + 2, 22, 1, "#145d2b");
  for (const toeX of [x - 2, x + 1])
    box(toeX, 16, 1, toeX, 19, 2, "#349947");
}

// Deep sockets, slanted brows, and glowing red eyes.
box(18, 15, 25, 22, 17, 29, "#174329");
box(26, 15, 25, 30, 17, 29, "#174329");
box(19, 14, 26, 21, 14, 28, "#f13b31");
box(27, 14, 26, 29, 14, 28, "#f13b31");
set(20, 13, 27, "#ffb34b");
set(28, 13, 27, "#ffb34b");
for (let i = 0; i < 6; i++) {
  box(17 + i, 13, 32 - Math.floor(i / 2), 18 + i, 15,
      32 - Math.floor(i / 2), "#124b2b");
  box(26 + i, 13, 30 + Math.floor(i / 2), 27 + i, 15,
      30 + Math.floor(i / 2), "#124b2b");
}

// Jagged, grumpy mouth with little triangular-looking teeth.
box(20, 15, 19, 28, 16, 22, "#123d29");
for (const x of [21, 23, 25, 27]) {
  set(x, 14, 22, "#fff2d6");
  set(x + 1, 14, 19, "#fff2d6");
}
set(19, 15, 23, "#174b2a");
set(29, 15, 23, "#174b2a");

// Pink flower perched on the crown.
cylinder(24, 25, 35, 1, 5, "#217b35");
for (const [x, y, z] of [
  [20, 25, 41], [28, 25, 41], [24, 21, 41],
  [24, 29, 41], [24, 25, 43]
]) {
  ellipsoid(x, y, z, 2, 2, 2, "#ef70aa");
  set(x, y - 2, z + 1, "#ffacd1");
}
sphere(24, 23, 41, 2, "#ffd35a");
set(24, 20, 41, "#fff1a0");

// Each bent saguaro arm swings independently from its shoulder.
function cactusArm(name, side, speed) {
  const shoulderX = 24 + side * 8;
  const elbowX = 24 + side * 16;
  part(name, [shoulderX, 25, 22]);

  line(shoulderX, 25, 21, elbowX, 25, 18, 3, "#217d35");
  line(elbowX, 25, 18, elbowX, 25, 30, 3, "#258b3a");
  ellipsoid(elbowX, 25, 30, 3, 3, 4, "#2a9940");

  // Bright front ridge and a few widely spaced spines.
  for (let z = 20; z <= 32; z++) {
    set(elbowX, 21, z, "#48b34c");
    if (z % 4 === 0) {
      set(elbowX, 20, z, "#fff2d6");
      set(elbowX + side * 3, 24, z + 1, "#fff2d6");
    }
  }
  animate(name, { type: "swing", axis: "y", speed, amplitude: 0.3 });
}

cactusArm("left arm", -1, 3);
cactusArm("right arm", 1, -3);
part("body");