← Monstruos y enemigosObjeto 3Dfogon/cactus-enojado
Cactus enojado
Arrastrá 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");import { draw } from "./assets/voxel";
import { cactusEnojado } from "./assets/cactus-enojado";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, cactusEnojado, 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 cactus-enojado
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["cactus-enojado"] })
# Queda en client/assets/cactus-enojado.ts
# https://fogon.page/object/cactus-enojado