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