// === BUILD PLAN ===
// Subject: red axial-flow combine harvester, mid-harvest, facing NORTH (-Z)
// Footprint: header 27 wide (x14..40) x 5 deep (z5..9) | body 11 wide (x22..32) x 22 deep (z14..36)
// total length z2..z40, total height Y13..Y31
//
// SIDE SILHOUETTE (Z ->, Y up): FRONT SILHOUETTE (X ->, Y up):
// ___tank___ .....[=cab=]......
// [cab]| |__engine__ ...[==tank==].....
// __| | | <====[===body====]====> auger out to the left
// /reel | | .OO..........oo... big front / small rear
// |head|=====body===========| header spans much wider than the body
// (O) (O) (o)
//
// PROPORTIONS: header ~2.5x body width (that is the recognisable thing) | front wheel r4,
// rear wheel r2 | cab set high and forward over the feeder house | tank flares 1 block
// proud of the body on each side | unloading auger swung out 10 blocks to the LEFT
// MATERIALS PLAN:
// body/header : red_concrete(78) + red_terracotta(22) noise — WHY: flat single red reads as
// plastic; a faint terracotta blotch gives painted-steel panel variation
// trim/frame : black/gray/polished_blackstone — WHY: dark value break under the red = the
// machine reads as a machine, not a red box
// metal parts : light_gray_concrete + iron_block (auger, cutter bar, ladders, screens)
// tyres : black_concrete(70)+polished_blackstone(20)+blackstone(10), lug tread every 2
// field : uncut = farmland + wheat[age=7] (z<10) | stubble = dirt_path/coarse_dirt +
// wheat[age=0] stubs | straw windrow of hay_block trailing behind the machine
// Cab interior: seat (chairStair), steering column, monitor, controls, floor, roof lights
// === END PLAN ===
var padY = 12, groundY = padY + 1; // wheels rest on groundY
var cxm = 27; // machine centre line
var x, y, z, i, t, dz, dy;
var redMain = noisePalette([{block:'red_concrete',weight:78},{block:'red_terracotta',weight:22}], {seed:5, freq:0.22});
var darkTrim = noisePalette([{block:'black_concrete',weight:60},{block:'gray_concrete',weight:25},{block:'polished_blackstone',weight:15}], {seed:8, freq:0.25});
var metal = noisePalette([{block:'light_gray_concrete',weight:55},{block:'iron_block',weight:25},{block:'gray_concrete',weight:20}], {seed:3, freq:0.25});
var tyre = noisePalette([{block:'black_concrete',weight:70},{block:'polished_blackstone',weight:20},{block:'blackstone',weight:10}], {seed:11, freq:0.3});
var stubble = noisePalette([{block:'dirt_path',weight:50},{block:'coarse_dirt',weight:30},{block:'podzol',weight:20}], {seed:14, freq:0.1});
// ================= FIELD =================
var land = blob(30, 30, 34, {irregularity:0.35, seed:6});
var hfn = hills({base: padY, amp: 2, scale: 0.035, seed: 12});
var pad = flatten(hfn, {x0:0, z0:0, x1:60, z1:60}, padY, 6);
surface(land, pad, function (gx, gz) {
if (gz < 10) return 'farmland';
return stubble(gx, 0, gz);
}, {sub:'dirt', deep:'stone', depth:4});
// standing crop ahead of the header
for (x = 0; x <= 60; x++) for (z = 0; z <= 9; z++) {
if ((x * 7 + z * 5) % 17 === 0) ps(x, groundY, z, 'wheat[age=6]'); else ps(x, groundY, z, 'wheat[age=7]');
}
// cut stubble behind, plus the wheel tramlines and the straw windrow
for (x = 0; x <= 60; x++) for (z = 10; z <= 60; z++) {
if ((x * 3 + z * 11) % 5 === 0) ps(x, groundY, z, 'wheat[age=0]');
}
for (z = 40; z <= 60; z++) {
for (x = 20; x <= 22; x++) pb(x, padY, z, 'coarse_dirt');
for (x = 32; x <= 34; x++) pb(x, padY, z, 'coarse_dirt');
}
for (z = 41; z <= 60; z++) {
var wob = ((z * 5) % 3) - 1;
for (x = cxm - 3 + wob; x <= cxm + 3 + wob; x++) {
if ((x + z) % 4 !== 0) pb(x, groundY, z, 'hay_block[axis=x]');
}
if (z % 3 === 0) ps(cxm + 4 + wob, groundY, z, 'hay_block[axis=z]');
}
// ================= WHEELS (built as discs, lugged tread, hub + rim) =================
function wheel(x0, cy, cz, r, thick, hubId) {
for (dz = -r - 1; dz <= r + 1; dz++) {
for (dy = -r - 1; dy <= r + 1; dy++) {
var d = Math.sqrt(dz * dz + dy * dy);
if (d > r + 0.45) continue;
var mat;
if (d > r - 1.25) mat = tyre;
else if (d < r * 0.42) mat = hubId;
else mat = tyre;
for (t = 0; t < thick; t++) pb(x0 + t, cy + dy, cz + dz, mat);
// lug tread on the outer ring only
if (d > r - 0.55 && ((dz + dy + cz) % 2 === 0)) {
pb(x0, cy + dy, cz + dz, 'blackstone');
pb(x0 + thick - 1, cy + dy, cz + dz, 'blackstone');
}
}
}
}
wheel(19, 17, 20, 4, 3, 'light_gray_concrete'); // front left
wheel(33, 17, 20, 4, 3, 'light_gray_concrete'); // front right
wheel(21, 15, 34, 2, 2, 'gray_concrete'); // rear left (narrower track, steered)
wheel(32, 15, 34, 2, 2, 'gray_concrete'); // rear right
// axles
fill(22, 17, 20, 32, 17, 20, darkTrim);
fill(23, 15, 34, 31, 15, 34, darkTrim);
// ================= BODY =================
fill(22, 18, 14, 32, 26, 36, redMain);
fill(23, 19, 15, 31, 25, 35, 'air'); // hollow shell, keeps the block count honest
fill(22, 18, 14, 32, 18, 36, darkTrim); // dark underframe
// side panel relief: recessed service doors + a dark stripe
for (z = 17; z <= 34; z += 5) {
fill(22, 20, z, 22, 24, z + 2, 'red_terracotta');
fill(32, 20, z, 32, 24, z + 2, 'red_terracotta');
ps(21, 22, z + 1, 'iron_trapdoor[facing=east,half=bottom,open=false]');
ps(33, 22, z + 1, 'iron_trapdoor[facing=west,half=bottom,open=false]');
}
for (z = 14; z <= 36; z++) { pb(22, 25, z, darkTrim); pb(32, 25, z, darkTrim); pb(22, 19, z, darkTrim); pb(32, 19, z, darkTrim); }
// rounded shoulder with stairs (never leave a stepped edge)
for (z = 14; z <= 36; z++) {
ps(22, 26, z, 'red_concrete_stairs' === '' ? 'stone' : 'polished_blackstone_slab[type=bottom]');
ps(32, 26, z, 'polished_blackstone_slab[type=bottom]');
}
// mudguards over the front wheels
for (z = 15; z <= 25; z++) { ps(21, 22, z, 'red_concrete'); ps(33, 22, z, 'red_concrete'); }
for (z = 15; z <= 25; z++) { ps(20, 22, z, 'polished_blackstone_slab[type=top]'); ps(34, 22, z, 'polished_blackstone_slab[type=top]'); }
// ================= FEEDER HOUSE (header -> body throat, sloped) =================
for (i = 0; i <= 5; i++) {
fill(24, 17 + i, 14 - i, 30, 21 + i, 14 - i, redMain);
}
fill(25, 18, 9, 29, 21, 13, 'air');
for (i = 0; i <= 5; i++) { ps(23, 21 + i, 14 - i, 'polished_blackstone_slab[type=bottom]'); ps(31, 21 + i, 14 - i, 'polished_blackstone_slab[type=bottom]'); }
// lift rams
fill(23, 19, 12, 23, 19, 15, metal); fill(31, 19, 12, 31, 19, 15, metal);
// ================= HEADER (the wide one - this is the recognisable feature) =================
fill(14, 13, 5, 40, 13, 9, redMain); // header pan
fill(14, 14, 9, 40, 16, 9, redMain); // back wall
fill(14, 13, 5, 14, 16, 9, redMain); // end walls
fill(40, 13, 5, 40, 16, 9, redMain);
for (x = 14; x <= 40; x++) ps(x, 14, 9, 'polished_blackstone_slab[type=bottom]');
// sickle cutter bar + knife guards pointing forward
for (x = 14; x <= 40; x++) {
ps(x, 13, 5, 'polished_andesite_slab[type=bottom]');
ps(x, 13, 4, 'iron_trapdoor[facing=north,half=bottom,open=false]');
}
// cross auger inside the header, with flighting
for (x = 15; x <= 39; x++) {
pb(x, 15, 8, metal);
if (x % 2 === 0) ps(x, 15, 7, 'iron_trapdoor[facing=north,half=bottom,open=true]');
else ps(x, 16, 8, 'light_gray_concrete_slab[type=bottom]');
}
// reel: tube + four bats with tines
for (x = 15; x <= 39; x++) {
ps(x, 17, 6, 'stripped_oak_log[axis=x]');
ps(x, 19, 6, 'oak_slab[type=bottom]'); // top bat
ps(x, 17, 4, 'oak_slab[type=bottom]'); // front bat
ps(x, 15, 6, 'oak_slab[type=top]'); // bottom bat
ps(x, 17, 8, 'oak_slab[type=bottom]'); // rear bat
if (x % 2 === 0) { ps(x, 18, 4, 'iron_bars'); ps(x, 16, 4, 'iron_bars'); }
}
// reel support arms from the header back wall
var armX = [16, 27, 38];
for (i = 0; i < armX.length; i++) {
ps(armX[i], 18, 9, metal); ps(armX[i], 18, 8, metal); ps(armX[i], 18, 7, metal); ps(armX[i], 17, 7, metal);
}
// pointed crop dividers at both ends
function divider(dx) {
ps(dx, 14, 4, 'white_concrete'); ps(dx, 14, 3, 'white_concrete');
ps(dx, 13, 3, 'white_concrete'); ps(dx, 13, 2, 'red_concrete');
ps(dx, 15, 5, 'white_concrete_slab[type=bottom]');
ps(dx, 14, 2, 'red_concrete_slab' === '' ? 'stone' : 'polished_andesite_slab[type=bottom]');
}
divider(14); divider(40);
// ================= CAB (real cockpit: glass, seat, controls) =================
fill(24, 22, 13, 30, 28, 18, darkTrim);
fill(25, 23, 14, 29, 27, 17, 'air');
fill(24, 22, 13, 30, 22, 18, metal); // cab floor
fill(24, 28, 13, 30, 28, 18, 'white_concrete'); // roof
for (y = 23; y <= 27; y++) {
for (x = 25; x <= 29; x++) ps(x, y, 13, 'light_blue_stained_glass_pane'); // windscreen
for (z = 14; z <= 17; z++) { ps(24, y, z, 'light_blue_stained_glass_pane'); ps(30, y, z, 'light_blue_stained_glass_pane'); }
ps(26, y, 18, 'light_blue_stained_glass_pane'); ps(28, y, 18, 'light_blue_stained_glass_pane');
}
fill(24, 23, 18, 24, 27, 18, darkTrim); fill(30, 23, 18, 30, 27, 18, darkTrim);
chairStair(27, 23, 16, 'spruce_stairs', 'north'); // operator seat
ps(27, 23, 15, 'lever[face=floor,facing=north]'); // steering column base
ps(27, 24, 15, 'iron_trapdoor[facing=north,half=top,open=false]'); // wheel
ps(28, 23, 14, 'stone_button[face=wall,facing=north]');
ps(29, 24, 15, 'black_stained_glass_pane'); // yield monitor
ps(26, 23, 14, 'gray_carpet'); ps(28, 23, 16, 'gray_carpet');
pb(27, 27, 16, 'sea_lantern'); // dome light
// roof work lights + beacon
pb(25, 29, 13, 'sea_lantern'); pb(29, 29, 13, 'sea_lantern');
ps(27, 29, 18, 'shroomlight');
// access ladder + platform on the left
for (i = 0; i <= 5; i++) ps(23, 17 + i, 17 - i, 'iron_trapdoor[facing=south,half=bottom,open=false]');
fill(23, 22, 14, 23, 22, 16, metal);
for (z = 14; z <= 17; z++) ps(22, 23, z, 'iron_bars');
ps(23, 23, 17, 'iron_bars'); ps(23, 24, 17, 'iron_bars');
// ================= GRAIN TANK (bulges proud of the body) =================
fill(22, 27, 20, 32, 27, 31, redMain);
fill(21, 28, 20, 33, 30, 31, redMain);
fill(22, 28, 21, 32, 30, 30, 'air');
fill(22, 28, 21, 32, 28, 30, 'hay_block[axis=y]'); // grain inside
for (z = 20; z <= 31; z++) { ps(20, 28, z, 'red_concrete_slab' === '' ? 'stone' : 'polished_blackstone_slab[type=bottom]'); ps(34, 28, z, 'polished_blackstone_slab[type=bottom]'); }
for (z = 20; z <= 31; z += 2) { ps(21, 31, z, 'iron_bars'); ps(33, 31, z, 'iron_bars'); }
for (x = 21; x <= 33; x += 3) { ps(x, 31, 20, 'iron_bars'); ps(x, 31, 31, 'iron_bars'); }
// ================= UNLOADING AUGER, SWUNG OUT LEFT =================
for (x = 11; x <= 21; x++) ps(x, 29, 24, 'light_gray_concrete');
for (x = 11; x <= 21; x++) ps(x, 30, 24, 'light_gray_concrete_slab[type=bottom]');
for (x = 12; x <= 20; x += 2) ps(x, 28, 24, 'iron_trapdoor[facing=north,half=bottom,open=true]');
fill(11, 27, 24, 11, 29, 24, metal); // spout elbow
ps(11, 26, 24, 'gray_concrete');
ps(11, 25, 24, 'hopper[facing=down]');
fill(21, 28, 24, 21, 29, 24, metal); // pivot column
ps(20, 30, 23, 'iron_bars'); ps(20, 30, 25, 'iron_bars');
// ================= ENGINE, EXHAUST, STRAW CHOPPER =================
fill(23, 27, 32, 31, 29, 36, darkTrim);
for (x = 24; x <= 30; x++) ps(x, 30, 34, 'iron_bars'); // rotary air screen
fill(31, 30, 33, 31, 33, 33, 'polished_blackstone_wall'); // exhaust stack
ps(31, 34, 33, 'polished_blackstone_slab[type=bottom]');
fill(23, 19, 37, 31, 24, 38, darkTrim); // chopper hood
for (x = 23; x <= 31; x++) ps(x, 19, 39, 'iron_bars'); // straw outlet
for (x = 22; x <= 32; x++) ps(x, 24, 38, 'polished_blackstone_slab[type=top]');
// rear lights + steps
pb(23, 26, 38, 'redstone_lamp[lit=true]'); pb(31, 26, 38, 'redstone_lamp[lit=true]');
// ================= FIELD DRESSING =================
// dust kicked up around the drive wheels
for (z = 16; z <= 26; z++) for (x = 17; x <= 37; x++) {
if ((x * 5 + z * 3) % 9 === 0) pb(x, padY, z, 'coarse_dirt');
}
// a few loose straw tufts around the header and along the crop edge
for (x = 12; x <= 42; x++) { if ((x * 7) % 5 < 2) ps(x, groundY, 10, 'hay_block[axis=x]'); }
for (x = 8; x <= 46; x += 6) ps(x, groundY, 11, 'hay_block[axis=z]');
// fence line + a lone tree at the field edge, for scale
for (x = 0; x <= 60; x += 1) { if (x % 2 === 0) ps(x, groundY, 58, 'oak_fence'); }
fill(52, groundY, 50, 52, groundY + 5, 50, 'oak_log[axis=y]');
makeSphere(52, groundY + 7, 50, noisePalette([{block:'oak_leaves[persistent=true]',weight:85},{block:'birch_leaves[persistent=true]',weight:15}], {seed:4, freq:0.3}), 4, true);