← Farm3D assetfogon/carretilla-con-heno
Carretilla con heno
Drag to turn it// «Carretilla con heno» · gpt-6-sol (medium)
// A wooden farm wheelbarrow loaded with hay: a single wooden spoked wheel at the front, a deep brown plank tray, two long wooden handles going back with two short legs, piled high with a golden heap of straw, and a pitchfork stuck into the hay.
// A sunny, straw-filled farm wheelbarrow.
const woodDark = "#63391f";
const woodMid = "#946033";
const woodLight = "#bb8044";
const woodSun = "#d19a59";
const red = "#ae4835";
const metal = "#aebcc0";
const metalDark = "#72858a";
// Single front wheel: a thick wooden rim, eight spokes, and a metal hub.
const wx = 24, wy = 9, wz = 8;
for (let x = wx - 7; x <= wx + 7; x++) {
for (let z = wz - 7; z <= wz + 7; z++) {
const d = Math.hypot(x - wx, z - wz);
if (d >= 5.2 && d <= 7.2) {
for (let y = 8; y <= 11; y++) {
set(x, y, z, y === 8 ? woodSun : d > 6.5 ? woodDark : woodMid);
}
}
}
}
for (let i = 0; i < 8; i++) {
const a = i * Math.PI / 4;
line(wx, 8, wz, wx + Math.cos(a) * 6, 8, wz + Math.sin(a) * 6, 0, woodLight);
line(wx, 9, wz, wx + Math.cos(a) * 6, 9, wz + Math.sin(a) * 6, 0, woodMid);
}
cylinder(wx, 7, wz, 2, 5, metalDark, "y");
cylinder(wx, 7, wz, 1, 2, "#dbe2dc", "y");
set(wx, 7, wz, metalDark);
// Wooden fork around the wheel and its crosspiece.
line(17, 15, 15, 20, 11, 8, 1, woodDark);
line(31, 15, 15, 28, 11, 8, 1, woodDark);
line(17, 11, 8, 31, 11, 8, 0, metalDark);
// Two long handles, rising slightly toward their rear grips.
for (const x of [13, 35]) {
line(x, 13, 14, x, 34, 15, 1, woodMid);
line(x, 34, 15, x, 44, 18, 1, woodMid);
line(x, 17, 16, x, 37, 17, 0, woodSun);
line(x, 39, 17, x, 44, 18, 1, woodDark);
set(x, 44, 18, woodLight);
}
// Short, splayed support legs, planted on the floor.
for (const [topX, footX] of [[16, 14], [32, 34]]) {
line(topX, 32, 15, footX, 37, 1, 1, woodDark);
line(topX, 32, 15, footX, 37, 2, 0, woodLight);
box(footX - 1, 36, 0, footX + 1, 38, 1, woodDark);
}
line(16, 34, 7, 32, 34, 7, 0, woodMid);
// Solid tray floor and deep, separate-looking plank walls.
box(12, 15, 15, 36, 35, 17, woodDark);
box(13, 16, 17, 35, 34, 18, woodMid);
for (let z = 18; z <= 24; z += 3) {
const shade = z === 18 ? "#85502b" : z === 21 ? woodMid : woodLight;
box(11, 15, z, 13, 35, z + 2, shade);
box(35, 15, z, 37, 35, z + 2, shade);
box(12, 14, z, 36, 16, z + 2, shade);
box(12, 34, z, 36, 36, z + 2, shade);
// Crisp shadow lines between planks.
line(12, 14, z, 36, 14, z, 0, woodDark);
line(11, 16, z, 11, 35, z, 0, woodDark);
}
line(11, 14, 25, 37, 14, 25, 0, woodSun);
line(11, 15, 25, 11, 35, 25, 0, woodSun);
line(37, 15, 25, 37, 35, 25, 0, woodSun);
line(12, 36, 25, 36, 36, 25, 0, woodSun);
// A small barn-red painted panel and pale galvanized fasteners.
box(19, 13, 19, 29, 13, 23, red);
line(19, 13, 24, 29, 13, 24, 0, "#e8dac0");
for (const x of [14, 34]) {
for (const z of [19, 23]) set(x, 13, z, metal);
}
// Heaped, chunky golden hay, spilling above the tray.
ellipsoid(24, 25, 25, 11, 10, 9, "#e6ab36");
ellipsoid(22, 26, 30, 8, 7, 6, "#f3c44e");
ellipsoid(29, 24, 29, 5, 6, 5, "#efb83e");
// Sunlit top, warmer sides, and light straw flecks.
const hayColors = new Set(["#e6ab36", "#f3c44e", "#efb83e"]);
forEach((x, y, z, color) => {
if (!hayColors.has(color)) return;
if (z >= 28 && rand() < 0.20) {
set(x, y, z, rand() < 0.65 ? "#f8d66a" : "#ffdf79");
} else if (z < 24 && rand() < 0.13) {
set(x, y, z, "#cf9029");
}
});
for (let i = 0; i < 110; i++) {
const x = 15 + Math.floor(rand() * 19);
const y = 17 + Math.floor(rand() * 18);
for (let z = 37; z >= 24; z--) {
if (hayColors.has(get(x, y, z)) ||
["#f8d66a", "#ffdf79", "#cf9029"].includes(get(x, y, z))) {
if (rand() < 0.58) {
line(x, y, z + 1, x + (rand() < 0.5 ? -1 : 1),
y + (rand() < 0.5 ? -1 : 1), z + 2, 0,
rand() < 0.55 ? "#ffdf79" : "#d9972c");
}
break;
}
}
}
// Loose straw poking out around the tray lip.
for (let i = 0; i < 30; i++) {
const x = 15 + Math.floor(rand() * 19);
const y = rand() < 0.7 ? 14 : 34;
const z = 23 + Math.floor(rand() * 5);
line(x, y, z, x + (rand() < 0.5 ? -2 : 2),
y + (y === 14 ? -2 : 2), z - 1, 0, "#ecc04b");
}
// Pitchfork tucked into the front of the hay: three visible steel tines.
line(25, 13, 32, 31, 13, 32, 0, metalDark);
line(26, 12, 33, 30, 12, 33, 0, "#d7dfdc");
for (const x of [25, 28, 31]) {
line(x, 12, 32, x, 12, 27, 0, metal);
set(x, 12, 26, "#d7dfdc");
}
line(28, 13, 33, 29, 13, 36, 1, metalDark);
line(29, 13, 36, 35, 14, 44, 1, woodDark);
line(30, 12, 37, 35, 13, 44, 0, woodSun);import { draw } from "./assets/voxel";
import { carretillaConHeno } from "./assets/carretilla-con-heno";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, carretillaConHeno, 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 carretilla-con-heno
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["carretilla-con-heno"] })
# It lands in client/assets/carretilla-con-heno.ts
# https://fogon.page/object/carretilla-con-heno