← Monsters and enemies3D assetfogon/hombre-lobo
Hombre lobo
Drag to turn it// «Hombre lobo» · gpt-6-sol (medium)
// A hulking cartoon werewolf on two legs facing -y: shaggy dark brown-grey fur with a lighter chest, a wolf head with a long snout, black nose, pointed ears, glowing yellow eyes and white fangs, torn purple pants, big clawed hands and feet. Hunched forward with broad shoulders.
const fur = "#514940", furLight = "#665a4c", furDark = "#393530";
const mane = "#746552", chest = "#ae9672", chestLight = "#c5ac82";
const purple = "#65427e", purpleLight = "#80559a", purpleDark = "#473052";
const claw = "#e8dfc4", clawShade = "#bdb49d";
// Hunched, broad body.
ellipsoid(24, 25, 24, 11, 9, 11, furDark);
ellipsoid(24, 23, 26, 12, 9, 10, fur);
ellipsoid(24, 19, 27, 10, 5, 8, furLight);
ellipsoid(24, 16, 26, 7, 2, 7, chest);
ellipsoid(24, 15, 28, 5, 1, 5, chestLight);
// Shaggy chest and shoulder tufts.
for (let x of [18, 21, 24, 27, 30]) {
line(x, 15, 25, x + (x < 24 ? -1 : x > 24 ? 1 : 0), 16, 20, 1, chest);
}
for (let x of [13, 16, 32, 35]) {
line(x, 19, 31, x + (x < 24 ? -2 : 2), 20, 26, 1, mane);
}
for (let i = 0; i < 42; i++) {
const x = 15 + Math.floor(rand() * 19);
const z = 20 + Math.floor(rand() * 12);
const y = 16 + Math.floor(rand() * 4);
if (get(x, y, z) === furLight) set(x, y, z, rand() < 0.5 ? mane : fur);
}
// Torn waistband stays with the torso.
box(17, 21, 16, 31, 29, 19, purpleDark);
box(18, 20, 18, 30, 29, 19, purple);
box(21, 19, 18, 27, 20, 19, purpleLight);
// Oversized wolf head, thrust forward.
ellipsoid(24, 16, 36, 8, 7, 7, furDark);
ellipsoid(24, 14, 37, 8, 6, 6, fur);
ellipsoid(24, 11, 33, 7, 4, 4, furLight);
ellipsoid(24, 9, 32, 6, 3, 2, furDark); // lower jaw
box(20, 6, 31, 28, 10, 32, furLight);
// Tall pointed ears.
for (const side of [-1, 1]) {
const cx = 24 + side * 6;
for (let z = 40; z <= 45; z++) {
const half = Math.max(0, 3 - Math.floor((z - 40) / 2));
box(cx - half, 13, z, cx + half, 17, z, furDark);
box(cx - Math.max(0, half - 1), 12, z,
cx + Math.max(0, half - 1), 15, z, fur);
}
box(cx, 11, 41, cx, 12, 43, "#a77976");
line(24 + side * 7, 16, 37, 24 + side * 9, 19, 32, 1, furLight);
}
// Eyes: dark sockets and heavy brows make the yellow pop.
for (const x of [20, 28]) {
box(x - 2, 8, 36, x + 1, 10, 39, furDark);
box(x - 1, 7, 37, x, 8, 38, "#ffdf55");
set(x, 6, 38, "#fff39a");
box(x - 2, 7, 40, x + 1, 9, 40, furDark);
}
// Long squared muzzle, black nose, friendly fang-filled grin.
box(21, 7, 33, 27, 11, 35, "#907b64");
box(22, 5, 33, 26, 8, 35, "#a58d70");
box(22, 4, 34, 26, 6, 35, "#25272a");
box(23, 4, 35, 25, 4, 35, "#383b3b");
box(21, 6, 31, 27, 7, 31, "#282626");
for (const x of [20, 28]) {
box(x, 6, 31, x, 7, 32, claw);
set(x, 6, 30, clawShade);
}
set(23, 6, 32, claw);
set(25, 6, 32, claw);
// Separate swinging legs, with ragged purple trouser cuffs.
function makeLeg(name, x, speed) {
part(name, [x, 25, 17]);
ellipsoid(x, 25, 13, 5, 5, 6, purpleDark);
ellipsoid(x, 24, 14, 5, 5, 5, purple);
box(x - 3, 20, 13, x + 2, 20, 16, purpleLight);
for (let dx = -4; dx <= 4; dx += 2) {
box(x + dx, 24 + (dx % 3), 8 + Math.abs(dx % 3),
x + dx + 1, 28, 11, dx % 4 ? purple : purpleDark);
}
ellipsoid(x, 25, 7, 4, 4, 4, fur);
ellipsoid(x, 22, 3, 5, 7, 3, furDark);
ellipsoid(x, 20, 2, 5, 5, 2, furLight);
for (const dx of [-3, 0, 3]) {
box(x + dx - 1, 16, 1, x + dx + 1, 19, 2, furLight);
line(x + dx, 17, 1, x + dx, 14, 0, 1, claw);
}
animate(name, { type: "swing", axis: "x", speed, amplitude: 0.3 });
}
makeLeg("leftLeg", 18, 4);
makeLeg("rightLeg", 30, -4);
// Massive swinging arms and big three-clawed hands.
function makeArm(name, side, speed) {
const shoulder = 24 + side * 12;
part(name, [shoulder, 22, 30]);
ellipsoid(shoulder, 22, 28, 5, 6, 6, furDark);
ellipsoid(shoulder + side, 21, 26, 5, 5, 6, fur);
line(shoulder + side * 2, 21, 25,
shoulder + side * 4, 19, 17, 4, fur);
ellipsoid(shoulder + side * 4, 18, 16, 4, 4, 5, furLight);
ellipsoid(shoulder + side * 4, 17, 12, 4, 4, 4, furDark);
box(shoulder + side * 2, 14, 11,
shoulder + side * 6, 17, 13, furLight);
for (let i = 0; i < 3; i++) {
const x = shoulder + side * (2 + i * 2);
line(x, 14, 11, x + side, 11, 8, 1, clawShade);
set(x + side, 11, 7, claw);
}
// A few pointed fur locks along the outside.
line(shoulder + side * 4, 24, 29,
shoulder + side * 7, 25, 25, 1, furLight);
line(shoulder + side * 6, 21, 21,
shoulder + side * 8, 23, 18, 1, furDark);
animate(name, { type: "swing", axis: "x", speed, amplitude: 0.4 });
}
makeArm("leftArm", -1, 4);
makeArm("rightArm", 1, -4);import { draw } from "./assets/voxel";
import { hombreLobo } from "./assets/hombre-lobo";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, hombreLobo, 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 hombre-lobo
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["hombre-lobo"] })
# It lands in client/assets/hombre-lobo.ts
# https://fogon.page/object/hombre-lobo