← Medieval3D assetfogon/campesino
Campesino
Drag to turn it// «Campesino» · gpt-6-sol (medium)
// A chunky cartoon medieval peasant man: a brown tunic tied with a rope belt, beige trousers, simple dark shoes, a round head with a short brown beard, a straw hat, black dot eyes, carrying a small sack over one shoulder.
// Chunky peasant, facing -y.
const tunic = "#79502f", tunicLight = "#916039", tunicDark = "#604027";
const skin = "#e8b985", skinShade = "#cf986b";
const straw = "#dfbd68", strawLight = "#f1d584", strawDark = "#ae8742";
const rope = "#e2c48b", ropeDark = "#aa8450";
// Walking legs, each hinged at its hip.
function leg(name, x, speed) {
part(name, [x, 24, 17]);
box(x - 2, 21, 6, x + 2, 28, 18, "#b9a887");
box(x - 2, 20, 6, x + 2, 22, 10, "#c9b99a");
box(x - 2, 21, 5, x + 2, 28, 6, "#a29177");
box(x - 3, 20, 1, x + 3, 29, 5, "#49362b");
box(x - 3, 17, 0, x + 3, 27, 2, "#392b25");
box(x - 2, 17, 3, x + 2, 20, 4, "#594032");
box(x - 3, 17, 0, x + 3, 27, 0, "#2e2724");
animate(name, { type: "swing", axis: "x", speed, amplitude: 0.3 });
}
leg("leftLeg", 20, 5);
leg("rightLeg", 28, -5);
// Tunic and broad, slightly uneven hem.
part("body");
ellipsoid(24, 24, 24, 9, 7, 9, tunic);
box(17, 18, 19, 31, 29, 29, tunic);
box(16, 17, 16, 32, 30, 20, tunic);
box(15, 18, 15, 18, 29, 18, tunicDark);
box(30, 18, 15, 33, 29, 18, tunicDark);
box(18, 17, 16, 30, 17, 18, tunicLight);
box(19, 18, 29, 29, 29, 31, tunicLight);
// Small woven flecks on the cloth.
forEach((x, y, z, color) => {
if (color === tunic && rand() < 0.045)
set(x, y, z, rand() < 0.55 ? tunicLight : tunicDark);
});
// Neck opening and collar.
box(20, 17, 29, 28, 20, 30, tunicDark);
box(22, 19, 29, 26, 26, 32, skinShade);
box(22, 17, 30, 26, 19, 31, skin);
// Rope belt wrapping the waist, with a prominent front knot.
box(17, 17, 20, 31, 17, 21, ropeDark);
box(19, 16, 20, 29, 16, 21, rope);
box(16, 19, 20, 17, 28, 21, rope);
box(31, 19, 20, 32, 28, 21, rope);
box(23, 15, 20, 25, 16, 22, strawLight);
set(24, 14, 21, ropeDark);
line(24, 15, 19, 23, 15, 15, 0, rope);
line(25, 15, 19, 26, 15, 17, 0, ropeDark);
// Sack slung over his right shoulder, behind the arm.
ellipsoid(38, 28, 25, 4, 5, 7, "#937047");
ellipsoid(39, 29, 22, 3, 4, 3, "#795b3d");
box(35, 25, 31, 38, 29, 33, "#aa8251");
box(35, 25, 33, 37, 28, 34, ropeDark);
line(33, 23, 31, 36, 26, 33, 1, rope);
line(32, 17, 30, 19, 16, 21, 0, ropeDark);
line(32, 16, 30, 20, 15, 22, 0, rope);
for (let i = 0; i < 15; i++) {
const x = 36 + Math.floor(rand() * 6);
const z = 20 + Math.floor(rand() * 10);
set(x, 23, z, rand() < 0.5 ? "#ad895a" : "#735638");
}
// Head, ears, beard and friendly little face.
ellipsoid(24, 23, 35, 7, 7, 6, skin);
box(16, 21, 34, 17, 24, 36, skinShade);
box(31, 21, 34, 32, 24, 36, skinShade);
ellipsoid(24, 17, 32, 5, 3, 3, "#684328");
box(20, 15, 32, 28, 16, 33, "#71482b");
box(19, 17, 32, 20, 19, 35, "#71482b");
box(28, 17, 32, 29, 19, 35, "#71482b");
box(21, 15, 34, 23, 16, 34, "#604027");
box(25, 15, 34, 27, 16, 34, "#604027");
box(23, 14, 33, 25, 15, 34, skinShade);
set(24, 13, 34, skin);
set(24, 14, 31, "#382a25");
set(21, 16, 36, "#211c1a");
set(27, 16, 36, "#211c1a");
set(18, 17, 34, "#d89a75");
set(30, 17, 34, "#d89a75");
// Wide straw brim, dark hatband, and rounded crown.
ellipsoid(24, 22, 40, 12, 10, 1, strawDark);
ellipsoid(24, 22, 41, 12, 10, 1, straw);
box(16, 16, 41, 32, 28, 41, strawLight);
ellipsoid(24, 22, 43, 8, 7, 2, straw);
box(17, 16, 42, 31, 28, 42, strawDark);
box(18, 16, 42, 30, 16, 42, "#785634");
box(19, 16, 45, 29, 27, 45, strawLight);
for (let i = 0; i < 35; i++) {
const x = 17 + Math.floor(rand() * 15);
const y = 16 + Math.floor(rand() * 13);
if (get(x, y, 43) === straw)
set(x, y, 43, rand() < 0.5 ? strawLight : strawDark);
}
// Arms swing opposite the leg on the same side.
function arm(name, x, speed) {
part(name, [x, 24, 29]);
ellipsoid(x, 24, 27, 4, 5, 4, tunic);
box(x - 2, 20, 23, x + 2, 28, 27, tunicLight);
box(x - 2, 19, 22, x + 2, 27, 23, tunicDark);
box(x - 2, 21, 17, x + 2, 26, 21, skin);
box(x - 2, 20, 15, x + 2, 26, 18, skinShade);
box(x - 1, 19, 16, x + 1, 20, 18, skin);
animate(name, { type: "swing", axis: "x", speed, amplitude: 0.25 });
}
arm("leftArm", 13, -5);
arm("rightArm", 35, 5);import { draw } from "./assets/voxel";
import { campesino } from "./assets/campesino";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, campesino, 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 campesino
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["campesino"] })
# It lands in client/assets/campesino.ts
# https://fogon.page/object/campesino