← Monsters and enemies3D assetfogon/rata-gigante
Rata gigante
Drag to turn it// «Rata gigante» · gpt-6-sol (medium)
// A big scruffy cartoon rat, horizontal on four legs: dusty grey-brown fur, a long pointed snout at the front (-y) with a pink nose and whiskers, two big buck teeth, red beady eyes, round pink ears, and a long thin pink tail behind.
// Chunky body and scruffy back
ellipsoid(24, 27, 17, 13, 13, 11, "#51483f");
ellipsoid(24, 27, 18, 12, 12, 10, "#75675a");
ellipsoid(24, 26, 22, 11, 11, 5, "#887968");
ellipsoid(24, 38, 17, 8, 4, 7, "#695c50");
// Broad head and cheeks
ellipsoid(24, 15, 22, 11, 10, 10, "#52483e");
ellipsoid(24, 14, 23, 10, 9, 9, "#7b6c5d");
ellipsoid(24, 12, 27, 8, 6, 5, "#8b7a68");
ellipsoid(17, 10, 19, 5, 5, 5, "#716153");
ellipsoid(31, 10, 19, 5, 5, 5, "#716153");
// Tapered, downward-pointing muzzle
for (let y = 3; y <= 14; y++) {
const t = (y - 3) / 11;
const rx = 2.3 + 5.6 * t;
const rz = 2 + 3.2 * t;
const cz = 17.5 + 2.5 * t;
for (let x = Math.ceil(24 - rx); x <= Math.floor(24 + rx); x++) {
for (let z = Math.ceil(cz - rz); z <= Math.floor(cz + rz); z++) {
const d = ((x - 24) / rx) ** 2 + ((z - cz) / rz) ** 2;
if (d <= 1) set(x, y, z, z > cz ? "#948171" : "#6e5d50");
}
}
}
ellipsoid(20, 6, 17, 3, 3, 2, "#aa8b82");
ellipsoid(28, 6, 17, 3, 3, 2, "#aa8b82");
// Mouth and oversized buck teeth
ellipsoid(24, 5, 13, 5, 2, 3, "#382f30");
box(21, 2, 11, 23, 4, 15, "#fff0d5");
box(25, 2, 11, 27, 4, 15, "#fff0d5");
box(21, 2, 11, 23, 2, 12, "#d4c8af");
box(25, 2, 11, 27, 2, 12, "#d4c8af");
box(24, 2, 11, 24, 3, 15, "#534844");
// Pink nose at the very tip
ellipsoid(24, 3, 18, 3, 2, 2, "#d77f8a");
set(23, 2, 19, "#f4adb0");
set(26, 2, 18, "#a65766");
// Big round ears, with dark furry rims
for (const x of [14, 34]) {
ellipsoid(x, 13, 32, 5, 3, 6, "#594c44");
ellipsoid(x, 11, 33, 4, 2, 5, "#c17b82");
ellipsoid(x, 10, 34, 3, 1, 4, "#e69a9b");
ellipsoid(x, 9, 32, 2, 1, 2, "#a9606e");
}
// Dark sockets and bright red, beady eyes
for (const x of [16, 32]) {
ellipsoid(x, 8, 27, 3, 2, 3, "#3c3231");
ellipsoid(x, 6, 27, 2, 1, 2, "#e83748");
set(x - 1, 5, 28, "#ffaaa3");
line(x - 3, 8, 30, x + 2, 7, 30, 0, "#55483e");
}
// Pale whiskers, fanning out to either side
for (const side of [-1, 1]) {
for (const [dy, dz] of [[-1, 2], [2, 0], [4, -2]]) {
line(24 + side * 3, 5, 17,
24 + side * 17, 5 + dy, 17 + dz, 0, "#d5c8b6");
}
for (let i = 0; i < 3; i++) {
set(24 + side * (3 + i), 4, 16 + i, "#594b47");
}
}
// A few chunky fur tufts along the outline
for (const [x, y, z, dx, dy] of [
[14, 25, 24, -2, -2], [12, 31, 21, -2, 1],
[34, 23, 25, 2, -2], [36, 31, 20, 2, 1],
[18, 36, 25, -2, 2], [29, 36, 25, 2, 2],
[19, 18, 31, -1, -2], [29, 19, 31, 1, -2]
]) {
line(x, y, z, x + dx, y + dy, z + 1, 1, "#877564");
}
// Subtle uneven fur on exposed surfaces
forEach((x, y, z, color) => {
if (["#75675a", "#887968", "#7b6c5d", "#8b7a68"].includes(color) &&
(!get(x, y - 1, z) || !get(x, y, z + 1)) && rand() < 0.11) {
set(x, y, z, z < 17 ? "#65584d" : "#9a8774");
}
});
// Four independently walking legs
function leg(name, x, y, speed) {
part(name, [x, y, 13]);
ellipsoid(x, y, 10, 4, 4, 5, "#574b42");
ellipsoid(x, y - 1, 7, 3, 3, 6, "#756455");
ellipsoid(x, y - 3, 2, 4, 4, 2, "#817061");
ellipsoid(x, y - 4, 1, 4, 3, 1, "#a27d78");
for (let d = -2; d <= 2; d += 2) {
box(x + d, y - 7, 0, x + d + 1, y - 6, 1, "#d7a3a0");
}
animate(name, { type: "swing", axis: "x", speed, amplitude: 0.3 });
}
leg("frontLeft", 14, 18, 5);
leg("frontRight", 34, 18, -5);
leg("rearLeft", 14, 34, -5);
leg("rearRight", 34, 34, 5);
// Thin, curling tail, hinged at the rump
part("tail", [24, 38, 17]);
line(24, 37, 17, 24, 40, 15, 2, "#a86770");
line(24, 40, 15, 26, 43, 12, 1, "#c47e86");
line(26, 43, 12, 30, 46, 12, 1, "#d58d94");
line(30, 46, 12, 34, 46, 15, 1, "#d58d94");
set(34, 46, 15, "#efa6a9");
animate("tail", { type: "swing", axis: "z", speed: 1.4, amplitude: 0.45 });
part("body", [24, 24, 16]);import { draw } from "./assets/voxel";
import { rataGigante } from "./assets/rata-gigante";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, rataGigante, x, y, { size: 64, angle: 0, t: performance.now() / 1000 });
// size: its longest side, in px
// angle: turn on the floor, in radians
// t: seconds; if it moves, that animates it# In a terminal, in the game's folder
fogon assets add rata-gigante
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["rata-gigante"] })
# It lands in client/assets/rata-gigante.ts
# https://fogon.page/object/rata-gigante