← Monsters and enemies3D assetfogon/zombi
Zombi
Drag to turn it// «Zombi» · gpt-6-sol (medium)
// A shambling cartoon zombie standing upright facing -y: greenish-grey skin, a big square head with one droopy eye and one wide glowing yellow eye, messy dark hair, a torn blue shirt and ragged brown pants, bare green feet. Both arms stretched straight forward at shoulder height like classic zombies.
// Shambling cartoon zombie — front faces -y.
const skin = "#879c78", skinLight = "#a2b58b", skinDark = "#637a62";
const blue = "#3279ad", blueLight = "#4a99c5", blueDark = "#24547e";
const brown = "#735443", brownLight = "#947058", brownDark = "#513b36";
const hair = "#292b32", hairLight = "#41434a", hairDark = "#1d2028";
// Torso and ragged shirt.
box(16, 19, 18, 32, 31, 28, blue);
box(16, 18, 21, 32, 18, 27, blueLight);
box(16, 18, 18, 32, 19, 20, blueDark);
box(15, 20, 22, 16, 29, 27, blueDark);
box(32, 20, 22, 33, 29, 27, blueDark);
box(20, 19, 28, 28, 28, 29, blueDark);
box(21, 18, 28, 27, 24, 29, skinDark); // open collar
box(22, 18, 29, 26, 23, 29, skin);
box(17, 18, 18, 19, 20, 19, skinDark); // torn hem
box(29, 18, 18, 31, 20, 19, skinDark);
box(24, 17, 20, 27, 18, 21, blueDark); // loose shirt tear
box(25, 17, 20, 26, 17, 20, skinDark);
// Shirt seams, patches and restrained surface texture.
box(17, 17, 24, 18, 18, 27, blueDark);
box(29, 17, 22, 31, 18, 24, blueDark);
box(30, 17, 23, 31, 17, 23, blueLight);
for (let i = 0; i < 80; i++) {
const x = 17 + Math.floor(rand() * 15);
const z = 20 + Math.floor(rand() * 8);
if (get(x, 18, z) === blueLight)
set(x, 17, z, rand() < 0.55 ? blue : blueLight);
}
// Thick neck and oversized square head.
box(21, 21, 27, 27, 28, 31, skinDark);
box(13, 15, 30, 35, 33, 40, skin);
box(14, 14, 31, 34, 15, 39, skinLight);
box(13, 15, 30, 14, 32, 37, skinDark);
box(34, 15, 30, 35, 32, 37, skinDark);
box(15, 14, 29, 33, 30, 31, skinDark); // chunky jaw
box(17, 13, 31, 32, 14, 33, skin);
box(16, 14, 39, 33, 18, 40, skinLight);
box(13, 21, 32, 14, 27, 35, skinDark); // ears
box(34, 21, 32, 35, 27, 35, skinDark);
set(13, 20, 35, skinLight);
set(35, 20, 35, skinLight);
// One sleepy, drooping eye.
box(16, 13, 34, 22, 14, 38, "#435650");
box(17, 12, 35, 21, 13, 36, "#d4d8b0");
box(19, 11, 35, 20, 12, 36, "#667963");
box(16, 11, 37, 22, 12, 38, hairDark);
box(16, 11, 34, 21, 12, 34, skinDark);
// The other eye is wide and brightly glowing.
box(25, 13, 34, 33, 14, 39, hairDark);
box(26, 12, 35, 32, 13, 38, "#f2e6a0");
box(28, 11, 35, 31, 12, 38, "#ffe34b");
box(29, 10, 36, 30, 11, 37, "#fff98a");
set(28, 10, 38, "#fff9b1");
box(25, 12, 39, 33, 13, 39, skinDark);
// Lopsided nose, friendly crooked grin, and two teeth.
box(23, 12, 32, 25, 14, 35, skinDark);
box(24, 11, 32, 26, 12, 33, skinLight);
box(20, 12, 30, 29, 13, 30, "#384b43");
box(22, 11, 30, 24, 12, 30, "#e5dfb4");
box(27, 11, 30, 28, 12, 30, "#e5dfb4");
set(19, 12, 31, skinDark);
set(30, 12, 31, skinDark);
box(16, 13, 32, 18, 13, 32, skinDark);
box(31, 13, 32, 33, 13, 32, skinDark);
// Messy, blocky dark hair with an uneven fringe.
box(12, 16, 40, 36, 33, 42, hair);
box(13, 15, 41, 35, 21, 42, hairDark);
box(14, 14, 39, 19, 17, 41, hair);
box(20, 14, 40, 24, 17, 41, hair);
box(30, 14, 40, 35, 18, 41, hair);
box(12, 17, 36, 14, 21, 40, hairDark);
box(34, 19, 37, 36, 24, 40, hairDark);
box(15, 17, 43, 19, 22, 44, hair);
box(23, 20, 43, 27, 26, 43, hairLight);
box(30, 16, 43, 33, 21, 44, hairDark);
box(13, 26, 42, 17, 31, 43, hair);
for (let i = 0; i < 90; i++) {
const x = 13 + Math.floor(rand() * 23);
const y = 16 + Math.floor(rand() * 17);
const z = 41 + Math.floor(rand() * 2);
if (get(x, y, z) === hair) set(x, y, z, hairLight);
}
// Legs pivot separately at the hips and swing in opposition.
part("left-leg", [19, 25, 17]);
box(15, 21, 7, 22, 30, 17, brown);
box(15, 20, 14, 22, 21, 17, brownLight);
box(15, 20, 7, 22, 21, 9, brownDark);
box(15, 20, 7, 17, 22, 8, brownLight);
box(20, 20, 8, 22, 22, 9, brownDark);
box(16, 19, 6, 20, 28, 7, brownDark);
box(17, 20, 4, 21, 29, 6, skinDark);
box(15, 16, 0, 23, 30, 4, skin);
box(15, 16, 0, 23, 20, 1, skinDark);
box(16, 13, 0, 18, 17, 2, skinLight);
box(19, 13, 0, 21, 17, 2, skinLight);
box(22, 15, 0, 23, 19, 2, skinLight);
animate("left-leg", { type: "swing", axis: "x", speed: 2, amplitude: 0.3 });
part("right-leg", [29, 25, 17]);
box(26, 21, 7, 33, 30, 17, brown);
box(26, 20, 14, 33, 21, 17, brownLight);
box(26, 20, 7, 33, 21, 9, brownDark);
box(26, 20, 8, 28, 22, 9, brownDark);
box(31, 20, 7, 33, 22, 8, brownLight);
box(27, 19, 6, 31, 28, 7, brownDark);
box(27, 20, 4, 31, 29, 6, skinDark);
box(25, 16, 0, 33, 30, 4, skin);
box(25, 16, 0, 33, 20, 1, skinDark);
box(25, 15, 0, 26, 19, 2, skinLight);
box(27, 13, 0, 29, 17, 2, skinLight);
box(30, 13, 0, 32, 17, 2, skinLight);
animate("right-leg", { type: "swing", axis: "x", speed: -2, amplitude: 0.3 });
// Both arms share a shoulder-height pivot: classic forward zombie reach.
part("arms", [24, 24, 27]);
box(9, 19, 24, 16, 27, 29, blue);
box(9, 18, 26, 16, 20, 29, blueLight);
box(9, 18, 24, 16, 19, 25, blueDark);
box(10, 9, 24, 15, 19, 27, skin);
box(10, 9, 24, 15, 13, 24, skinDark);
box(9, 5, 23, 16, 10, 28, skinLight);
box(9, 5, 23, 16, 7, 24, skinDark);
box(9, 4, 23, 10, 6, 25, skin);
box(12, 4, 23, 13, 6, 25, skin);
box(15, 4, 23, 16, 6, 25, skin);
box(32, 19, 24, 39, 27, 29, blue);
box(32, 18, 26, 39, 20, 29, blueLight);
box(32, 18, 24, 39, 19, 25, blueDark);
box(33, 9, 24, 38, 19, 27, skin);
box(33, 9, 24, 38, 13, 24, skinDark);
box(32, 5, 23, 39, 10, 28, skinLight);
box(32, 5, 23, 39, 7, 24, skinDark);
box(32, 4, 23, 33, 6, 25, skin);
box(35, 4, 23, 36, 6, 25, skin);
box(38, 4, 23, 39, 6, 25, skin);
animate("arms", { type: "swing", axis: "x", speed: 2, amplitude: 0.2 });import { draw } from "./assets/voxel";
import { zombi } from "./assets/zombi";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, zombi, 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 zombi
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["zombi"] })
# It lands in client/assets/zombi.ts
# https://fogon.page/object/zombi