// === BUILD PLAN ===
// Style: Japanese gassho-zukuri (snow-country minka), Shirakawa-go type
// Footprint: 19x25 rectangular core (x10..28, z12..36) + 1-wide engawa veranda east
// + huge roof spilling to x8..30 / z11..37 (eaves nearly to the ground)
// Height: ground floor walls Y13..18 | loft floor Y19 | eaves Y15 | RIDGE Y38 (roof rise 23 over
// half-span 11 = 2:1 = ~63 deg, the gassho "praying hands" pitch)
//
// CROSS SECTION (X, ridge along Z):
// /\ <- Y38 solid ridge beam (no ridge gap)
// / \
// / TR \ truss tie-beams + king post
// /LOFT \ <- silkworm loft, floor Y19 walk Y20
// /========\
// | IRORI | <- ground floor, walk Y14, exposed joists Y18
// eave Y15 /___________\ eave Y15 (roof passes OUTSIDE the walls, 2 blocks proud)
// Y12 ground pad
//
// GROUND FLOOR (top-down, z increases downward, 1 char = 1 block):
// #########G######### G = gable plane z=11 (huge timber+plaster triangle)
// #.....S...........# S = staircase to loft (x13, z20->14, dir north)
// D..DOMA (earth floor, kitchen, woodwork)....# D = main door west, x10 z17
// #.................#
// #.....IRORI hearth (sunken campfire + pot chain)...# E = engawa door east
// #.......tatami....E
// #..fusuma screen..#
// #..sleeping / storage: futons, chests, shelfwall..#
// #########G#########
//
// MATERIALS PLAN:
// thatch roof : noisePalette hay_block(45)+rooted_dirt(20)+packed_mud(20)+dirt(15)
// WHY: only golden/brown fibrous blocks read as thick straw; noise = weathering
// roof stairs : bamboo_mosaic / bamboo / spruce picked per column (facing preserved via roofStair)
// roof snow : snow[layers=2] on the exposed tread of each step -> snow-country reading
// rafters : spruce_planks one row under the thatch -> 3-thick roof, solid underside
// plaster : white_terracotta(55)+calcite(20)+smooth_quartz(15)+bone_block(10)
// WHY: light infill CONTRASTS the near-black timber; that contrast IS the style
// timber : dark_oak_log posts every 3 + nuki rails + knee braces proud of the wall (relief)
// plinth : gradient mossy_cobblestone -> cobblestone -> andesite, grounds the build
// tatami : green/lime carpet ; doma floor = packed_mud/coarse_dirt
// Rooms: DOMA (furnace, smoker, cauldron, barrels, woodpile, crafting) | IRORI (sunken hearth,
// pot on chain, zabuton, chabudai, tokonoma alcove) | SLEEPING (2 futons, chests, shelfwall)
// | LOFT (silkworm trays, hay, barrels, lanterns, gable window bands)
// STAIR PLAN: walk 14 -> walk 20, delta 6 -> staircase(13,20,14,20,'north'), 7 cells, auto floor hole
// === END PLAN ===
// ---------- Y / X / Z CONTRACT ----------
var padY = 12; // top ground block (flat pad, known Y)
var floorY = padY + 1; // 13 - floor blocks
var walkY = floorY + 1; // 14 - furniture + doors here
var wallTopY = 18; // last wall row (5 blocks of interior air 14..18)
var loftFloorY = 19;
var loftWalkY = 20;
var wx1 = 10, wx2 = 28, wz1 = 12, wz2 = 36;
var cx = 19;
var ex1 = 8, ex2 = 30; // eave X (roof 2 blocks proud of the walls)
var rz1 = wz1 - 1, rz2 = wz2 + 1;
var eaveY = 15;
var ridgeY = eaveY + 23; // 38
function roofBottom(x) { // lowest roof block at column x
var s = Math.min(x - ex1, ex2 - x);
if (s < 0) return 0;
return eaveY + 2 * s;
}
function triLeft(y) { return ex1 + (Math.floor((y - eaveY) / 2) + 1); }
function triRight(y) { return ex2 - (Math.floor((y - eaveY) / 2) + 1); }
var plaster = noisePalette([{block:'white_terracotta',weight:55},{block:'calcite',weight:20},{block:'smooth_quartz',weight:15},{block:'bone_block',weight:10}], {seed:31, freq:0.17});
var thatch = noisePalette([{block:'hay_block',weight:45},{block:'rooted_dirt',weight:20},{block:'packed_mud',weight:20},{block:'dirt',weight:15}], {seed:11, freq:0.15});
var stoneMix = noisePalette([{block:'cobblestone',weight:40},{block:'mossy_cobblestone',weight:25},{block:'andesite',weight:20},{block:'stone',weight:15}], {seed:5, freq:0.2});
var deckMix = noisePalette([{block:'spruce_planks',weight:60},{block:'dark_oak_planks',weight:25},{block:'stripped_spruce_log',weight:15}], {seed:9, freq:0.2});
var tatami = noisePalette([{block:'green_carpet',weight:70},{block:'lime_carpet',weight:30}], {seed:3, freq:0.25});
function roofStairId(x, z) {
var n = (x * 13 + z * 29) % 10;
if (n < 5) return 'bamboo_mosaic_stairs';
if (n < 8) return 'bamboo_stairs';
return 'spruce_stairs';
}
var x, y, z, i, s;
// ================= TERRAIN (superpowers, flat pad at a KNOWN Y) =================
var land = blob(28, 26, 32, {irregularity:0.42, seed:9});
var hf = hills({base: padY, amp: 3, scale: 0.045, seed: 21});
var pad = flatten(hf, {x0:2, z0:4, x1:48, z1:48}, padY, 10);
var groundPat = patches([['snow_block',7],['grass_block',3],['podzol',2],['coarse_dirt',1]], 0.07, 5);
surface(land, pad, function (gx, gz) { return groundPat(gx, gz); }, {sub:'dirt', deep:'stone', depth:5});
// stone-lined water channel running north-south, west of the house
fill(4, padY - 1, 6, 5, padY - 1, 44, 'stone');
fill(4, padY, 6, 5, padY, 44, 'water');
fill(3, padY, 6, 3, padY, 44, stoneMix);
fill(6, padY, 6, 6, padY, 44, stoneMix);
for (z = 6; z <= 44; z += 3) { ps(3, padY + 1, z, 'cobblestone_slab[type=bottom]'); ps(6, padY + 1, z + 1, 'mossy_cobblestone_slab[type=bottom]'); }
// little stone bridge on the entrance axis
fill(3, padY + 1, 16, 6, padY + 1, 18, 'stone_brick_slab[type=top]');
// approach path
fill(7, padY, 16, 9, padY, 18, stoneMix);
pb(9, floorY, 17, 'stone_bricks'); // door step (outside walk becomes 14)
// ================= PLINTH + FLOOR =================
fill(wx1 - 1, floorY - 1, wz1 - 1, wx2 + 1, floorY - 1, wz2 + 1, stoneMix);
fill(wx1 - 1, floorY, wz1 - 1, wx2 + 1, floorY, wz2 + 1, gradientPalette(floorY - 1, floorY, [{block:'mossy_cobblestone',from:0},{block:'cobblestone',from:0.4},{block:'andesite',from:0.8}], {noise:0.3, seed:4}));
// doma = beaten earth, rest = plank sub-floor
fill(wx1 + 1, floorY, wz1 + 1, wx2 - 1, floorY, 19, noisePalette([{block:'packed_mud',weight:55},{block:'coarse_dirt',weight:30},{block:'dirt_path',weight:15}], {seed:7, freq:0.2}));
fill(wx1 + 1, floorY, 20, wx2 - 1, floorY, wz2 - 1, deckMix);
// ================= WALLS: plaster infill =================
fill(wx1, walkY, wz1, wx2, wallTopY, wz1, plaster);
fill(wx1, walkY, wz2, wx2, wallTopY, wz2, plaster);
fill(wx1, walkY, wz1, wx1, wallTopY, wz2, plaster);
fill(wx1 + 18, walkY, wz1, wx2, wallTopY, wz2, plaster);
// timber post-and-beam frame + knee braces PROUD of the wall (facade relief)
function postCol(px, pz, topY, outX, outZ) {
for (y = floorY; y <= topY; y++) ps(px, y, pz, 'dark_oak_log[axis=y]');
// knee brace sticking out 1 block -> wall depth
if (outX !== 0) ps(px + outX, topY - 1, pz, 'dark_oak_fence');
if (outZ !== 0) ps(px, topY - 1, pz + outZ, 'dark_oak_fence');
}
for (z = wz1; z <= wz2; z += 3) { postCol(wx1, z, wallTopY, -1, 0); postCol(wx2, z, wallTopY, 1, 0); }
for (x = wx1; x <= wx2; x += 3) { postCol(x, wz1, wallTopY, 0, -1); postCol(x, wz2, wallTopY, 0, 1); }
// nuki rails (horizontal) + top plate
for (x = wx1; x <= wx2; x++) { ps(x, wallTopY, wz1, 'dark_oak_log[axis=x]'); ps(x, wallTopY, wz2, 'dark_oak_log[axis=x]'); ps(x, 15, wz1, 'dark_oak_log[axis=x]'); ps(x, 15, wz2, 'dark_oak_log[axis=x]'); }
for (z = wz1; z <= wz2; z++) { ps(wx1, wallTopY, z, 'dark_oak_log[axis=z]'); ps(wx2, wallTopY, z, 'dark_oak_log[axis=z]'); ps(wx1, 15, z, 'dark_oak_log[axis=z]'); ps(wx2, 15, z, 'dark_oak_log[axis=z]'); }
// stone splash course at the wall foot
for (x = wx1; x <= wx2; x++) { pb(x, walkY, wz1, stoneMix); pb(x, walkY, wz2, stoneMix); }
for (z = wz1; z <= wz2; z++) { pb(wx1, walkY, z, stoneMix); pb(wx2, walkY, z, stoneMix); }
// shoji windows on the long walls (recessed pane between the posts)
function shoji(px, pz, dirAxis) {
for (y = 16; y <= 17; y++) {
ps(px, y, pz, 'white_stained_glass_pane');
if (dirAxis === 'z') ps(px, y, pz + 1, 'white_stained_glass_pane'); else ps(px + 1, y, pz, 'white_stained_glass_pane');
}
// sill
if (dirAxis === 'z') { ps(px, 15, pz, 'spruce_slab[type=top]'); ps(px, 15, pz + 1, 'spruce_slab[type=top]'); }
}
var wzList = [16, 22, 25, 31, 34];
for (i = 0; i < wzList.length; i++) { shoji(wx1, wzList[i], 'z'); shoji(wx2, wzList[i], 'z'); }
shoji(wx1, 13, 'z');
// doors: main entrance west (doma), garden door east (engawa)
fill(wx1, walkY, 17, wx1, walkY + 1, 17, 'air');
ps(wx1, walkY, 17, 'dark_oak_door[facing=east,half=lower,hinge=left]');
ps(wx1, walkY + 1, 17, 'dark_oak_door[facing=east,half=upper,hinge=left]');
fill(wx2, walkY, 24, wx2, walkY + 1, 24, 'air');
ps(wx2, walkY, 24, 'dark_oak_door[facing=west,half=lower,hinge=right]');
ps(wx2, walkY + 1, 24, 'dark_oak_door[facing=west,half=upper,hinge=right]');
// engawa (veranda) under the east eave
fill(29, floorY, 16, 29, floorY, 32, deckMix);
for (z = 16; z <= 32; z += 4) ps(29, floorY + 1, z, 'spruce_fence');
// ================= LOFT FLOOR =================
fill(wx1 + 1, loftFloorY, wz1, wx2 - 1, loftFloorY, wz2, deckMix);
// ================= ROOF: 2:1 gassho pitch, solid ridge =================
for (z = rz1; z <= rz2; z++) {
for (s = 0; s <= 10; s++) {
var xw = ex1 + s, xe = ex2 - s, y0 = eaveY + 2 * s;
pb(xw, y0, z, thatch); roofStair(xw, y0 + 1, z, roofStairId(xw, z), 'west');
pb(xe, y0, z, thatch); roofStair(xe, y0 + 1, z, roofStairId(xe, z), 'east');
if (s >= 1) { pb(xw, y0 - 1, z, 'spruce_planks'); pb(xe, y0 - 1, z, 'spruce_planks'); }
if (((xw * 7 + z * 5) % 10) < 4) ps(xw, y0 + 2, z, 'snow[layers=2]');
if (((xe * 7 + z * 5) % 10) < 4) ps(xe, y0 + 2, z, 'snow[layers=2]');
}
pb(cx, ridgeY - 2, z, 'spruce_planks');
pb(cx, ridgeY - 1, z, thatch);
ps(cx, ridgeY, z, 'stripped_spruce_log[axis=z]'); // SOLID ridge beam - no ridge gap
}
// barge boards on the two gable edges
for (s = 0; s <= 10; s++) {
ps(ex1 + s, eaveY + 2 * s + 2, rz1, 'dark_oak_slab[type=bottom]');
ps(ex2 - s, eaveY + 2 * s + 2, rz1, 'dark_oak_slab[type=bottom]');
ps(ex1 + s, eaveY + 2 * s + 2, rz2, 'dark_oak_slab[type=bottom]');
ps(ex2 - s, eaveY + 2 * s + 2, rz2, 'dark_oak_slab[type=bottom]');
}
// ================= GABLE ENDS (the iconic timber+plaster triangles) =================
var gz = [rz1, rz2];
for (i = 0; i < 2; i++) {
var gzz = gz[i];
for (x = ex1; x <= ex2; x++) {
var yTop = roofBottom(x) - 1;
if (yTop >= floorY) fill(x, floorY, gzz, x, yTop, gzz, plaster);
}
// vertical timber posts
var pxs = [10, 13, 16, 19, 22, 25, 28];
for (var pi = 0; pi < pxs.length; pi++) {
for (y = floorY; y <= roofBottom(pxs[pi]) - 1; y++) ps(pxs[pi], y, gzz, 'dark_oak_log[axis=y]');
}
// horizontal beams + window bands
var beamYs = [19, 24, 29, 33];
for (var bi = 0; bi < beamYs.length; bi++) {
var by = beamYs[bi];
for (x = triLeft(by); x <= triRight(by); x++) ps(x, by, gzz, 'dark_oak_log[axis=x]');
}
var winYs = [20, 21, 25, 26, 30, 31];
for (var wi = 0; wi < winYs.length; wi++) {
var wy = winYs[wi];
for (x = triLeft(wy); x <= triRight(wy); x++) {
if (x === 10 || x === 13 || x === 16 || x === 19 || x === 22 || x === 25 || x === 28) continue;
ps(x, wy, gzz, 'white_stained_glass_pane');
}
}
}
// ================= CLEAR INTERIOR (roof/terrain must never intrude) =================
fill(wx1 + 1, walkY, wz1 + 1, wx2 - 1, wallTopY, wz2 - 1, 'air');
for (x = wx1 + 1; x <= wx2 - 1; x++) {
var topFree = roofBottom(x) - 2;
if (topFree >= loftWalkY) fill(x, loftWalkY, wz1, x, topFree, wz2, 'air');
}
// exposed ceiling joists over the ground floor
for (z = 16; z <= 34; z += 4) for (x = wx1 + 1; x <= wx2 - 1; x++) ps(x, wallTopY, z, 'dark_oak_log[axis=x]');
// roof trusses in the upper void
for (z = 15; z <= 34; z += 5) {
for (x = 15; x <= 23; x++) ps(x, 27, z, 'dark_oak_log[axis=x]');
for (y = 28; y <= 34; y++) ps(cx, y, z, 'dark_oak_log[axis=y]');
for (x = 16; x <= 22; x++) ps(x, 31, z, 'dark_oak_log[axis=x]');
}
// ================= STAIR TO THE LOFT =================
staircase(13, 20, walkY, loftWalkY, 'north', {material: 'dark_oak_stairs', width: 1});
// railing around the loft opening
for (z = 14; z <= 20; z++) { ps(12, loftWalkY, z, 'dark_oak_fence'); ps(14, loftWalkY, z, 'dark_oak_fence'); }
ps(13, loftWalkY, 21, 'dark_oak_fence');
// ================= GROUND FLOOR INTERIOR =================
// -- tatami in the living half
fill(wx1 + 1, walkY, 21, wx2 - 1, walkY, wz2 - 1, tatami);
// -- DOMA: kitchen run along the east wall
ps(26, walkY, 14, 'furnace[facing=west,lit=true]');
ps(26, walkY, 15, 'smoker[facing=west,lit=true]');
pb(26, walkY, 16, 'stripped_spruce_log');
ps(26, walkY + 1, 16, 'spruce_stairs[facing=west,half=top]');
ps(26, walkY, 17, 'water_cauldron[level=3]');
pb(26, walkY, 18, 'barrel');
pb(25, walkY, 14, 'crafting_table');
pb(25, walkY, 18, 'chest');
ps(24, walkY, 16, 'cartography_table');
// woodpile + tools in the doma
fill(11, walkY, 14, 12, walkY + 1, 16, 'stripped_spruce_log[axis=z]');
ps(11, walkY, 18, 'composter');
ps(16, walkY, 15, 'cauldron[level=0]');
ps(24, walkY, 19, 'lectern[facing=west]');
// hanging lanterns in the doma
pb(20, wallTopY - 1, 16, 'chain[axis=y]'); ps(20, wallTopY - 2, 16, 'lantern[hanging=true]');
pb(17, wallTopY - 1, 19, 'chain[axis=y]'); ps(17, wallTopY - 2, 19, 'lantern[hanging=true]');
// -- IRORI hearth room (z 22..28)
fill(18, floorY, 24, 20, floorY, 26, 'polished_andesite');
fill(18, walkY, 24, 20, walkY, 26, 'air');
ps(19, floorY, 25, 'campfire[lit=true]');
for (y = 15; y <= 17; y++) ps(19, y, 25, 'chain[axis=y]');
ps(19, walkY, 25, 'air');
ps(19, 15, 25, 'chain[axis=y]');
ps(19, 14, 25, 'air');
ps(18, walkY, 25, 'brown_carpet'); ps(20, walkY, 25, 'brown_carpet');
ps(19, walkY, 24, 'brown_carpet'); ps(19, walkY, 26, 'brown_carpet');
// chabudai low table + cushions
ps(23, walkY, 25, 'spruce_slab[type=bottom]'); ps(23, walkY, 26, 'spruce_slab[type=bottom]');
ps(24, walkY, 25, 'red_carpet'); ps(22, walkY, 26, 'red_carpet');
// tokonoma alcove on the west wall
ps(12, walkY, 24, 'spruce_slab[type=top]');
ps(12, walkY + 1, 24, 'flower_pot');
ps(11, walkY + 2, 25, 'white_wall_banner[facing=east]');
ps(12, walkY, 26, 'potted_bamboo');
// hearth room lighting
pb(22, wallTopY - 1, 23, 'chain[axis=y]'); ps(22, wallTopY - 2, 23, 'lantern[hanging=true]');
pb(16, wallTopY - 1, 27, 'chain[axis=y]'); ps(16, wallTopY - 2, 27, 'lantern[hanging=true]');
// -- fusuma screen (partial, never blocks the walking route)
for (x = 21; x <= 27; x++) for (y = walkY; y <= walkY + 2; y++) ps(x, y, 29, 'white_stained_glass_pane');
for (y = walkY; y <= walkY + 2; y++) ps(20, y, 29, 'dark_oak_log[axis=y]');
// -- SLEEPING / STORAGE (z 30..35)
placeBed(13, walkY, 33, 'white', 'north');
placeBed(16, walkY, 33, 'white', 'north');
pb(12, walkY, 31, 'chest'); pb(12, walkY, 32, 'chest');
shelfWall(22, walkY, 35, 26, walkY + 2, 35, 'bookshelf');
ps(24, walkY, 33, 'lectern[facing=north]');
ps(21, walkY, 31, 'barrel[facing=up]');
pb(19, wallTopY - 1, 33, 'chain[axis=y]'); ps(19, wallTopY - 2, 33, 'lantern[hanging=true]');
ps(18, walkY, 30, 'potted_fern');
rug(14, walkY, 30, 17, walkY, 31, 'red_carpet');
// ================= LOFT (silkworm floor) =================
// silkworm rearing trays: stacked trapdoor shelves along both slopes
for (z = 15; z <= 34; z += 2) {
ps(15, loftWalkY, z, 'spruce_trapdoor[facing=north,half=bottom,open=false]');
ps(23, loftWalkY, z, 'spruce_trapdoor[facing=north,half=bottom,open=false]');
ps(15, loftWalkY + 1, z, 'spruce_trapdoor[facing=north,half=bottom,open=false]');
ps(23, loftWalkY + 1, z, 'spruce_trapdoor[facing=north,half=bottom,open=false]');
}
for (z = 16; z <= 33; z += 3) { pb(16, loftWalkY, z, 'hay_block[axis=y]'); pb(22, loftWalkY, z, 'hay_block[axis=y]'); }
pb(19, loftWalkY, 17, 'barrel'); pb(20, loftWalkY, 17, 'barrel'); pb(19, loftWalkY, 18, 'chest');
pb(18, loftWalkY, 31, 'barrel'); pb(20, loftWalkY, 32, 'chest');
ps(19, loftWalkY, 28, 'loom[facing=south]');
ps(20, loftWalkY, 28, 'crafting_table');
rug(17, loftWalkY, 23, 21, loftWalkY, 26, 'brown_carpet');
for (z = 18; z <= 33; z += 5) { pb(19, 26, z, 'chain[axis=y]'); ps(19, 25, z, 'lantern[hanging=true]'); }
// ================= EXTERIOR: garden, crops, lanterns, boundary =================
// vegetable patch east of the house
fill(34, padY, 16, 44, padY, 30, 'farmland[moisture=7]');
fill(39, padY, 16, 39, padY, 30, 'water');
for (x = 34; x <= 44; x++) {
if (x === 39) continue;
for (z = 16; z <= 30; z++) {
var cm = (x + z) % 4;
if (cm === 0) ps(x, padY + 1, z, 'wheat[age=7]');
else if (cm === 1) ps(x, padY + 1, z, 'carrots[age=7]');
else if (cm === 2) ps(x, padY + 1, z, 'potatoes[age=7]');
else ps(x, padY + 1, z, 'beetroots[age=3]');
}
}
// stone-edged plot boundary
for (x = 2; x <= 46; x++) { ps(x, padY + 1, 6, 'mossy_cobblestone_wall'); ps(x, padY + 1, 44, 'mossy_cobblestone_wall'); }
for (z = 6; z <= 44; z++) { ps(46, padY + 1, z, 'mossy_cobblestone_wall'); }
fill(20, padY + 1, 6, 22, padY + 1, 6, 'air'); // gate gap
ps(19, padY + 1, 6, 'dark_oak_fence'); ps(23, padY + 1, 6, 'dark_oak_fence');
// stone lanterns (toro) - solid support under every light, never floating
function toro(tx, tz) {
pb(tx, padY + 1, tz, 'stone_bricks');
ps(tx, padY + 2, tz, 'cobblestone_wall');
ps(tx, padY + 3, tz, 'stone_brick_slab[type=bottom]');
ps(tx, padY + 4, tz, 'lantern');
ps(tx, padY + 5, tz, 'stone_brick_slab[type=top]');
}
toro(33, 20); toro(33, 34); toro(7, 22);
// trees + shrubs
makeSphere(35, padY + 7, 38, noisePalette([{block:'spruce_leaves[persistent=true]',weight:80},{block:'snow_block',weight:20}], {seed:2, freq:0.3}), 4, true);
fill(35, padY + 1, 38, 35, padY + 6, 38, 'spruce_log[axis=y]');
makeSphere(14, padY + 6, 41, noisePalette([{block:'oak_leaves[persistent=true]',weight:70},{block:'snow_block',weight:30}], {seed:6, freq:0.3}), 3, true);
fill(14, padY + 1, 41, 14, padY + 5, 41, 'oak_log[axis=y]');
for (z = 10; z <= 42; z += 6) { ps(32, padY + 1, z, 'bamboo[age=1,leaves=large]'); ps(32, padY + 2, z, 'bamboo[age=1,leaves=large]'); }
// drying racks + snow drifts against the north gable
fill(12, padY + 1, 40, 24, padY + 1, 40, 'spruce_fence');
for (x = 12; x <= 24; x += 2) ps(x, padY + 2, 40, 'hay_block[axis=x]');
for (x = 6; x <= 33; x++) { if ((x * 3 + 7) % 5 < 2) { ps(x, padY + 1, 9, 'snow[layers=3]'); ps(x, padY + 1, 40, 'snow[layers=2]'); } }
// ===== FIX PASS: snow-country dressing + a yard that is actually used =====
var fx, fz;
for (fz = 6; fz <= 45; fz++) { ps(2, padY + 1, fz, 'snow[layers=3]'); ps(45, padY + 1, fz, 'snow[layers=3]'); }
for (fx = 2; fx <= 45; fx++) { ps(fx, padY + 1, 5, 'snow[layers=3]'); ps(fx, padY + 1, 45, 'snow[layers=3]'); }
// drifts banked against the eaves and the two gable ends
for (fx = 7; fx <= 31; fx++) { ps(fx, padY + 1, 9, 'snow[layers=4]'); ps(fx, padY + 1, 39, 'snow[layers=4]'); }
for (fz = 10; fz <= 38; fz++) { ps(7, padY + 1, fz, 'snow[layers=4]'); ps(32, padY + 1, fz, 'snow[layers=3]'); }
// swept stone forecourt in front of the door
fill(7, padY, 15, 9, padY, 19, 'stone_bricks');
for (fz = 15; fz <= 19; fz += 2) ps(7, padY + 1, fz, 'stone_brick_slab[type=bottom]');
// woodshed lean-to against the north gable
fill(12, floorY, 42, 20, floorY, 44, 'spruce_planks');
for (fx = 12; fx <= 20; fx += 4) fill(fx, floorY + 1, 42, fx, floorY + 3, 44, 'spruce_fence');
for (fx = 12; fx <= 20; fx++) { ps(fx, floorY + 4, 42, 'spruce_stairs[facing=north,half=top]'); ps(fx, floorY + 4, 43, 'spruce_slab[type=top]'); ps(fx, floorY + 4, 44, 'spruce_stairs[facing=south,half=top]'); }
fill(13, floorY + 1, 43, 19, floorY + 2, 44, 'stripped_spruce_log[axis=x]');
for (fx = 13; fx <= 19; fx += 3) ps(fx, floorY + 3, 43, 'snow[layers=2]');
// straw stacks, a cart load and a couple more trees in the yard
fill(37, padY + 1, 10, 39, padY + 3, 12, 'hay_block[axis=y]');
for (fx = 37; fx <= 39; fx++) ps(fx, padY + 4, 11, 'snow[layers=3]');
ps(36, padY + 1, 13, 'hay_block[axis=x]'); ps(40, padY + 1, 13, 'hay_block[axis=z]');
fill(24, padY + 1, 42, 27, padY + 1, 42, 'spruce_fence');
ps(25, padY + 2, 42, 'hay_block[axis=x]'); ps(26, padY + 2, 42, 'hay_block[axis=x]');
fill(41, padY + 1, 36, 41, padY + 6, 36, 'spruce_log[axis=y]');
makeSphere(41, padY + 8, 36, noisePalette([{block:'spruce_leaves[persistent=true]',weight:60},{block:'snow_block',weight:40}], {seed:12, freq:0.3}), 4, true);
fill(10, padY + 1, 12, 10, padY + 5, 12, 'oak_log[axis=y]');
makeSphere(10, padY + 7, 12, noisePalette([{block:'oak_leaves[persistent=true]',weight:55},{block:'snow_block',weight:45}], {seed:15, freq:0.3}), 3, true);
toro(35, 26); toro(11, 41);