← Medieval3D assetfogon/herrero
Herrero
Drag to turn it// «Herrero» · gpt-6-sol (medium)
// A chunky cartoon blacksmith: a big strong body with a dark leather apron over a grey shirt with rolled sleeves, thick arms, a round head with a big black beard and bald top, black dot eyes, holding a heavy hammer raised in one hand.
const iron = "#24272b";
const ironLight = "#62686b";
const ironDark = "#171a1d";
const skin = "#c58a61";
const skinLight = "#dfa578";
const skinShadow = "#a96e4f";
const shirt = "#858581";
const shirtLight = "#a6a49d";
const shirtDark = "#62645f";
const leather = "#493023";
const leatherLight = "#684431";
const leatherDark = "#302019";
const brass = "#b99752";
part("body", [24, 24, 20]);
// Heavy boots and sturdy legs.
for (const x of [17, 29]) {
box(x - 4, 18, 0, x + 3, 29, 3, "#292826");
box(x - 4, 16, 0, x + 3, 20, 2, "#3d3933");
box(x - 3, 20, 3, x + 3, 28, 9, "#383633");
box(x - 3, 20, 7, x + 3, 27, 13, "#55514a");
box(x - 3, 17, 3, x + 3, 18, 3, "#625b50");
}
box(20, 20, 10, 26, 28, 16, "#514c45");
// Broad grey-shirted torso, with shaded sides and shoulders.
ellipsoid(23, 23, 21, 11, 8, 10, shirtDark);
ellipsoid(23, 21, 22, 10, 7, 9, shirt);
ellipsoid(22, 20, 27, 8, 6, 3, shirtLight);
box(15, 18, 12, 31, 27, 17, shirt);
box(16, 15, 15, 30, 17, 16, leatherDark);
box(16, 14, 16, 30, 15, 16, leatherLight);
// Left arm: rolled sleeve, bare forearm, and a large fist.
ellipsoid(13, 23, 26, 5, 5, 5, shirtDark);
ellipsoid(12, 21, 25, 4, 4, 5, shirt);
box(9, 18, 20, 15, 25, 22, shirtLight);
box(9, 17, 19, 15, 25, 20, shirtDark);
ellipsoid(11, 21, 16, 3, 3, 5, skinShadow);
ellipsoid(11, 19, 15, 3, 3, 4, skin);
box(9, 16, 12, 12, 17, 14, skinLight);
// Apron: a shaped bib over a broad, nearly black leather panel.
box(18, 14, 11, 29, 16, 24, leatherDark);
box(19, 13, 13, 28, 14, 25, leather);
box(20, 13, 24, 27, 15, 28, leather);
box(18, 13, 11, 29, 14, 13, leatherLight);
box(18, 13, 14, 19, 14, 23, leatherLight);
box(28, 13, 14, 29, 14, 23, "#3a251c");
box(21, 12, 25, 26, 13, 26, "#59402c");
box(17, 15, 17, 18, 17, 18, leather);
box(29, 15, 17, 31, 17, 18, leather);
for (const x of [19, 28]) {
set(x, 12, 22, brass);
set(x, 12, 14, brass);
}
box(21, 12, 12, 26, 12, 12, "#78523a");
// Thick neck and round, bald head.
box(20, 19, 28, 26, 25, 32, skinShadow);
ellipsoid(23, 21, 35, 8, 7, 7, skinShadow);
ellipsoid(23, 19, 36, 7, 6, 6, skin);
ellipsoid(21, 19, 39, 4, 4, 2, skinLight);
ellipsoid(15, 21, 34, 2, 2, 3, skin);
ellipsoid(31, 21, 34, 2, 2, 3, skin);
set(15, 18, 34, skinLight);
set(31, 18, 34, skinLight);
// Big black beard: bulky jaw, pointed lower edge, and a split moustache.
ellipsoid(23, 15, 30, 7, 4, 5, "#202020");
ellipsoid(23, 13, 28, 6, 3, 5, "#171819");
ellipsoid(20, 13, 31, 3, 3, 3, "#292929");
ellipsoid(26, 13, 31, 3, 3, 3, "#252525");
box(21, 11, 25, 25, 13, 28, "#1b1c1d");
box(19, 11, 33, 22, 13, 34, "#18191a");
box(24, 11, 33, 27, 13, 34, "#18191a");
set(19, 10, 29, "#383838");
set(27, 10, 30, "#333333");
set(23, 10, 26, "#303030");
// Nose, expressive brows, and tiny black eyes.
box(22, 12, 34, 24, 14, 36, skinLight);
set(22, 11, 35, skinLight);
set(19, 12, 37, "#111214");
set(27, 12, 37, "#111214");
box(18, 13, 39, 20, 14, 39, "#252525");
box(26, 13, 39, 28, 14, 39, "#252525");
// The raised hammer arm is one moving part, hinged at the shoulder.
part("hammerArm", [33, 22, 27]);
ellipsoid(33, 22, 27, 5, 5, 5, shirtDark);
ellipsoid(34, 19, 27, 4, 4, 5, shirt);
line(35, 19, 27, 37, 16, 28, 3, shirt);
box(34, 14, 26, 39, 18, 28, shirtLight);
box(34, 14, 26, 39, 18, 26, shirtDark);
line(37, 16, 29, 38, 12, 35, 2, skinShadow);
ellipsoid(38, 12, 34, 3, 3, 3, skin);
box(36, 9, 34, 40, 11, 36, skinLight);
// Wooden haft and iron collar.
box(37, 11, 35, 39, 13, 42, "#61432b");
box(37, 10, 36, 37, 10, 40, "#8a643d");
box(37, 11, 39, 39, 13, 40, ironDark);
set(37, 10, 39, brass);
// Oversized, square-faced smithing hammer.
box(32, 8, 40, 44, 15, 43, ironDark);
box(33, 9, 40, 43, 14, 43, iron);
box(33, 9, 43, 43, 14, 44, ironLight);
box(32, 8, 39, 34, 15, 44, "#44494c");
box(42, 8, 39, 44, 15, 44, "#44494c");
box(32, 9, 40, 32, 14, 43, "#737879");
box(44, 9, 40, 44, 14, 43, "#737879");
box(36, 8, 40, 40, 8, 40, "#363a3c");
for (const x of [34, 42]) {
set(x, 8, 41, "#9a9b94");
set(x, 8, 43, "#9a9b94");
}
animate("hammerArm", { type: "swing", axis: "x", speed: 5, amplitude: 0.5 });import { draw } from "./assets/voxel";
import { herrero } from "./assets/herrero";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, herrero, 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 herrero
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["herrero"] })
# It lands in client/assets/herrero.ts
# https://fogon.page/object/herrero