// === BUILD PLAN ===
// Subject: Mississippi stern-wheel paddle steamer at a timber levee
// Hull: length 43 (z8..z50), beam 15 (x18..x32, cx=25), flat-bottomed shallow-draft river hull,
// spoon bow tapering half-beam 2->7 over z8..z18, flat transom at z50.
// Waterline y10/11 (water top y10), keel y7, main deck y13 — deck OVERHANGS the hull by
// 1 block each side on brackets (the riverboat "guard"), so the hull is never a box.
// Decks (each = floor slab + walls + ceiling that is the next floor):
// main/boiler deck floor y13 walk 14 (fwd cargo deck open, mid SALOON, aft engine room)
// boiler-deck salon floor y18 walk 19 (grand saloon + passenger cabins port/starboard)
// texas deck floor y23 walk 24 (officers cabins)
// hurricane deck y27 -> glazed PILOT HOUSE y28..30, roof y31 + finial
// Stacks: twin 2x2 black columns x22-23 / x27-28 at z20..21, y18..36, crowned with a flared
// stair ring + iron bars (the classic "feathered" crown).
// Paddle: RED stern wheel, radius 6, centre (x25, y12, z55) -> two rims at x19/x31 in the YZ
// plane, 8 spokes, 8 paddle boards spanning the beam, inside a timber housing arch.
//
// SIDE ELEVATION (bow left):
// y36 || || stacks
// y31 ___ pilot house roof
// y27 ============== hurricane deck
// y23 ============== texas deck
// y18 ================ boiler deck (railings all round)
// y13 ================== (O) main deck + guards (O) = paddle wheel
// y10 ~~~~~~~~~~~~~~~~~~~~~~~ brown river water
//
// MATERIALS PLAN:
// hull below waterline : gradientPalette y7->y13 dark_oak/spruce -> black-brown tar
// — WHY: a dark, wet-looking boot-top under a white boat is what makes it read as a hull
// topsides/superstr. : noisePalette white_concrete 46 / white_terracotta 24 / quartz 18 /
// birch_planks 12 — WHY: painted white timber with just enough grain not to look plastic
// trim/gingerbread : birch_fence + birch trapdoors + spruce stairs brackets under each deck
// stacks : black_concrete + polished_blackstone crown
// wheel : red_concrete rims/boards + stripped_oak_log axle
// Rooms: main deck engine room (furnaces, boilers, barrels, anvil), SALOON (bar, tables, chairs,
// carpet, chandeliers), grand saloon (long red runner, dining tables, piano/jukebox, cabins
// with beds+chests), texas cabins (beds, lecterns), pilot house (ship's wheel, lantern, chart).
// STAIRS: staircase() companionways deck->deck at (x=21,z=30) alternating dir; gangplank from
// the levee (walk 12) up to the main deck (walk 14).
// === END PLAN ===
var cx = 25;
var waterTop = 10, keel = 7;
var D1 = 13, D2 = 18, D3 = 23, D4 = 27; // deck slab levels
var PH = 27; // pilot house floor
var bowZ = 8, sternZ = 50;
// ---------- 0. RIVER + WEST BANK ----------
fill(0, 0, 0, 55, 6, 63, 'gravel');
fill(0, 3, 0, 55, 6, 63, 'sand');
fill(13, 7, 0, 55, waterTop, 63, 'water');
var hb = hills({ base: 11, amp: 3, scale: 0.05, seed: 21 });
var bankPad = flatten(hb, { x0: 2, z0: 12, x1: 12, z1: 46 }, 11, 5);
var bankMask = function (x, z) { return x <= 12; };
var bankMat = patches([{ block: 'grass_block', w: 46 }, { block: 'coarse_dirt', w: 22 },
{ block: 'podzol', w: 14 }, { block: 'gravel', w: 18 }], 0.07, 4);
surface(bankMask, bankPad, bankMat, { sub: 'dirt', deep: 'stone', depth: 4, bounds: { x0: 0, z0: 0, x1: 12, z1: 63 } });
// ---------- 1. HULL ----------
function halfBeamAt(z) {
if (z < 18) return 2 + Math.round((z - bowZ) * 5 / 10);
if (z > 47) return 6;
return 7;
}
var hullMat = gradientPalette(keel, D1, [
{ block: 'black_concrete', from: 0 },
{ block: 'dark_oak_planks', from: 0.35 },
{ block: 'spruce_planks', from: 0.62 },
{ block: 'white_concrete', from: 0.84 }], { noise: 0.18, seed: 11 });
var z, y, hbm;
for (z = bowZ; z <= sternZ; z++) {
hbm = halfBeamAt(z);
fill(cx - hbm + 1, keel, z, cx + hbm - 1, keel, z, 'dark_oak_planks'); // flat bottom
ps(cx - hbm, keel, z, 'spruce_stairs[facing=east,half=bottom]'); // turn of bilge
ps(cx + hbm, keel, z, 'spruce_stairs[facing=west,half=bottom]');
fill(cx - hbm, keel + 1, z, cx - hbm, D1 - 1, z, hullMat); // topsides
fill(cx + hbm, keel + 1, z, cx + hbm, D1 - 1, z, hullMat);
fill(cx - hbm + 1, D1, z, cx + hbm - 1, D1, z, 'spruce_planks'); // inner deck
}
pb(cx, keel - 1, bowZ + 1, 'dark_oak_planks');
fill(cx - 6, keel + 1, sternZ, cx + 6, D1 - 1, sternZ, hullMat); // transom
fill(cx - 7, keel + 1, bowZ, cx + 7, keel + 1, bowZ, 'air');
// bow stem
for (y = keel + 1; y < D1; y++) ps(cx, y, bowZ - 1, 'dark_oak_stairs[facing=south,half=bottom]');
// ---------- 2. MAIN DECK + OVERHANGING GUARDS ----------
fill(cx - 8, D1, bowZ + 1, cx + 8, D1, sternZ, 'spruce_planks');
var gz;
for (gz = bowZ + 2; gz <= sternZ; gz += 2) { // guard brackets
ps(cx - 8, D1 - 1, gz, 'spruce_stairs[facing=east,half=top]');
ps(cx + 8, D1 - 1, gz, 'spruce_stairs[facing=west,half=top]');
}
// ---------- 3. SUPERSTRUCTURE (3 stacked decks) ----------
var white = noisePalette([{ block: 'white_concrete', weight: 46 }, { block: 'white_terracotta', weight: 24 },
{ block: 'quartz_block', weight: 18 }, { block: 'birch_planks', weight: 12 }], { seed: 7, freq: 0.15 });
function deckBox(x1, z1, x2, z2, fy, cy) {
fill(x1, fy + 1, z1, x2, cy - 1, z1, white);
fill(x1, fy + 1, z2, x2, cy - 1, z2, white);
fill(x1, fy + 1, z1, x1, cy - 1, z2, white);
fill(x2, fy + 1, z1, x2, cy - 1, z2, white);
fill(x1, cy, z1, x2, cy, z2, 'birch_planks');
}
// main-deck house (cargo forward stays open)
deckBox(cx - 6, 18, cx + 6, 46, D1, D2);
// boiler deck: wider platform, house inset -> promenade all around
fill(cx - 8, D2, bowZ + 3, cx + 8, D2, sternZ, 'birch_planks');
deckBox(cx - 6, 20, cx + 6, 44, D2, D3);
// texas deck
fill(cx - 7, D3, 16, cx + 7, D3, 46, 'birch_planks');
deckBox(cx - 4, 24, cx + 4, 40, D3, D4);
// hurricane deck
fill(cx - 5, D4, 22, cx + 5, D4, 42, 'birch_planks');
// ---------- 4. WINDOWS + DOORS ON EVERY DECK ----------
function rowWindows(x1, x2, z1, z2, wy) {
var q;
for (q = z1 + 2; q <= z2 - 2; q += 3) {
fill(x1, wy, q, x1, wy + 1, q, 'air'); fill(x2, wy, q, x2, wy + 1, q, 'air');
ps(x1, wy, q, 'glass_pane[north=true,south=true]'); ps(x1, wy + 1, q, 'glass_pane[north=true,south=true]');
ps(x2, wy, q, 'glass_pane[north=true,south=true]'); ps(x2, wy + 1, q, 'glass_pane[north=true,south=true]');
ps(x1, wy + 2, q, 'birch_trapdoor[facing=east,half=top,open=false]');
ps(x2, wy + 2, q, 'birch_trapdoor[facing=west,half=top,open=false]');
}
}
rowWindows(cx - 6, cx + 6, 18, 46, D1 + 2);
rowWindows(cx - 6, cx + 6, 20, 44, D2 + 2);
rowWindows(cx - 4, cx + 4, 24, 40, D3 + 2);
// doorways fore and aft on each house
fill(cx, D1 + 1, 18, cx, D1 + 2, 18, 'air'); fill(cx, D1 + 1, 46, cx, D1 + 2, 46, 'air');
fill(cx, D2 + 1, 20, cx, D2 + 2, 20, 'air'); fill(cx, D2 + 1, 44, cx, D2 + 2, 44, 'air');
fill(cx, D3 + 1, 24, cx, D3 + 2, 24, 'air'); fill(cx, D3 + 1, 40, cx, D3 + 2, 40, 'air');
var dd;
for (dd = 0; dd < 3; dd++) {
var dy = [D1, D2, D3][dd], dz = [18, 20, 24][dd];
ps(cx, dy + 1, dz, 'spruce_door[facing=north,half=lower,hinge=left]');
ps(cx, dy + 2, dz, 'spruce_door[facing=north,half=upper,hinge=left]');
}
// ---------- 5. GINGERBREAD RAILINGS + BRACKETS ----------
function railing(x1, z1, x2, z2, ry) {
var q;
for (q = x1; q <= x2; q++) { pb(q, ry, z1, 'birch_fence'); pb(q, ry, z2, 'birch_fence'); }
for (q = z1; q <= z2; q++) { pb(x1, ry, q, 'birch_fence'); pb(x2, ry, q, 'birch_fence'); }
for (q = x1 + 1; q < x2; q += 3) {
ps(q, ry + 1, z1, 'birch_trapdoor[facing=north,half=top,open=false]');
ps(q, ry + 1, z2, 'birch_trapdoor[facing=south,half=top,open=false]');
}
for (q = z1 + 1; q < z2; q += 3) {
ps(x1, ry + 1, q, 'birch_trapdoor[facing=west,half=top,open=false]');
ps(x2, ry + 1, q, 'birch_trapdoor[facing=east,half=top,open=false]');
}
}
railing(cx - 8, bowZ + 2, cx + 8, sternZ, D1 + 1);
railing(cx - 8, bowZ + 4, cx + 8, sternZ, D2 + 1);
railing(cx - 7, 16, cx + 7, 46, D3 + 1);
railing(cx - 5, 22, cx + 5, 42, D4 + 1);
// support columns between decks (the boat must not look like floating slabs)
var pz2, px2;
for (pz2 = 20; pz2 <= 46; pz2 += 4) {
for (px2 = -8; px2 <= 8; px2 += 16) {
fill(cx + px2, D1 + 1, pz2, cx + px2, D2 - 1, pz2, 'birch_fence');
}
if (pz2 <= 44) for (px2 = -7; px2 <= 7; px2 += 14) fill(cx + px2, D2 + 1, pz2, cx + px2, D3 - 1, pz2, 'birch_fence');
}
for (pz2 = 24; pz2 <= 40; pz2 += 4) for (px2 = -5; px2 <= 5; px2 += 10) fill(cx + px2, D3 + 1, pz2, cx + px2, D4 - 1, pz2, 'birch_fence');
// ---------- 6. PILOT HOUSE ----------
fill(cx - 3, PH + 1, 26, cx + 3, PH + 3, 26, white);
fill(cx - 3, PH + 1, 32, cx + 3, PH + 3, 32, white);
fill(cx - 3, PH + 1, 26, cx - 3, PH + 3, 32, white);
fill(cx + 3, PH + 1, 26, cx + 3, PH + 3, 32, white);
fill(cx - 2, PH + 1, 26, cx + 2, PH + 2, 26, 'glass_pane[east=true,west=true]');
fill(cx - 2, PH + 1, 32, cx + 2, PH + 2, 32, 'glass_pane[east=true,west=true]');
fill(cx - 3, PH + 1, 27, cx - 3, PH + 2, 31, 'glass_pane[north=true,south=true]');
fill(cx + 3, PH + 1, 27, cx + 3, PH + 2, 31, 'glass_pane[north=true,south=true]');
fill(cx, PH + 1, 32, cx, PH + 2, 32, 'air');
ps(cx, PH + 1, 32, 'birch_door[facing=south,half=lower,hinge=left]');
ps(cx, PH + 2, 32, 'birch_door[facing=south,half=upper,hinge=left]');
fill(cx - 4, PH + 4, 25, cx + 4, PH + 4, 33, 'birch_slab[type=bottom]'); // overhanging eave
var rz;
for (rz = 26; rz <= 32; rz++) {
roofStair(cx - 2, PH + 5, rz, 'spruce_stairs', 'west');
roofStair(cx + 2, PH + 5, rz, 'spruce_stairs', 'east');
pb(cx, PH + 5, rz, 'spruce_planks');
pb(cx - 1, PH + 5, rz, 'spruce_slab[type=bottom]'); pb(cx + 1, PH + 5, rz, 'spruce_slab[type=bottom]');
}
pb(cx, PH + 6, 29, 'birch_fence'); pb(cx, PH + 7, 29, 'birch_fence'); ps(cx, PH + 8, 29, 'lantern[hanging=false]');
// pilot house interior: ship's wheel, chart table, stool, bell
pb(cx, PH + 1, 27, 'stripped_oak_log[axis=x]');
ps(cx, PH + 2, 27, 'oak_trapdoor[facing=south,half=bottom,open=true]');
pb(cx - 1, PH + 1, 27, 'oak_fence'); pb(cx + 1, PH + 1, 27, 'oak_fence');
pb(cx + 2, PH + 1, 30, 'oak_fence'); ps(cx + 2, PH + 2, 30, 'oak_pressure_plate');
chairStair(cx - 2, PH + 1, 30, 'spruce_stairs', 'east');
ps(cx - 2, PH + 3, 28, 'lantern[hanging=true]');
pb(cx + 2, PH + 1, 28, 'bell[facing=north,attachment=floor]');
// ---------- 7. TWIN SMOKESTACKS ----------
function stack(sx, sz) {
fill(sx, D2, sz, sx + 1, 36, sz + 1, 'black_concrete');
fill(sx, D2 + 1, sz, sx + 1, D2 + 2, sz + 1, 'polished_blackstone');
var q;
for (q = 0; q < 2; q++) {
roofStair(sx + q, 37, sz - 1, 'polished_blackstone_stairs', 'north');
roofStair(sx + q, 37, sz + 2, 'polished_blackstone_stairs', 'south');
roofStair(sx - 1, 37, sz + q, 'polished_blackstone_stairs', 'west');
roofStair(sx + 2, 37, sz + q, 'polished_blackstone_stairs', 'east');
}
fill(sx, 37, sz, sx + 1, 37, sz + 1, 'iron_bars');
pb(sx - 1, 37, sz - 1, 'iron_bars'); pb(sx + 2, 37, sz + 2, 'iron_bars');
pb(sx - 1, 37, sz + 2, 'iron_bars'); pb(sx + 2, 37, sz - 1, 'iron_bars');
}
stack(cx - 4, 20); stack(cx + 2, 20);
// bracing between the stacks
fill(cx - 2, 30, 20, cx + 2, 30, 20, 'iron_bars');
fill(cx - 2, 34, 21, cx + 2, 34, 21, 'iron_bars');
// ---------- 8. STERN PADDLE WHEEL (red) + HOUSING ----------
var wheelCz = 55, wheelCy = 12, wheelR = 6;
function rimAt(rx) {
var a, ang, wy2, wz2;
for (a = 0; a < 180; a++) {
ang = a * Math.PI / 90;
wy2 = Math.round(wheelCy + wheelR * Math.sin(ang));
wz2 = Math.round(wheelCz + wheelR * Math.cos(ang));
pb(rx, wy2, wz2, 'red_concrete');
wy2 = Math.round(wheelCy + (wheelR - 2) * Math.sin(ang));
wz2 = Math.round(wheelCz + (wheelR - 2) * Math.cos(ang));
pb(rx, wy2, wz2, 'red_terracotta');
}
}
rimAt(cx - 6); rimAt(cx + 6);
fill(cx - 8, wheelCy, wheelCz, cx + 8, wheelCy, wheelCz, 'stripped_oak_log[axis=x]'); // axle
var sp, ang2, py2, pz3;
for (sp = 0; sp < 8; sp++) { // paddle boards + spokes
ang2 = sp * Math.PI / 4;
py2 = Math.round(wheelCy + wheelR * Math.sin(ang2));
pz3 = Math.round(wheelCz + wheelR * Math.cos(ang2));
fill(cx - 6, py2, pz3, cx + 6, py2, pz3, 'red_concrete');
var t;
for (t = 1; t < wheelR; t++) {
var iy = Math.round(wheelCy + t * Math.sin(ang2)), iz = Math.round(wheelCz + t * Math.cos(ang2));
pb(cx - 6, iy, iz, 'stripped_oak_log'); pb(cx + 6, iy, iz, 'stripped_oak_log');
}
}
// housing: side cheeks + arched hood over the wheel
// open housing: forward cheek + stern post + top rail only, so the wheel stays visible
fill(cx - 7, wheelCy - 2, 50, cx - 7, wheelCy + 6, 51, 'spruce_planks');
fill(cx + 7, wheelCy - 2, 50, cx + 7, wheelCy + 6, 51, 'spruce_planks');
fill(cx - 7, wheelCy + 5, 52, cx - 7, wheelCy + 6, 60, 'spruce_planks');
fill(cx + 7, wheelCy + 5, 52, cx + 7, wheelCy + 6, 60, 'spruce_planks');
fill(cx - 7, wheelCy - 2, 59, cx - 7, wheelCy + 4, 60, 'spruce_planks');
fill(cx + 7, wheelCy - 2, 59, cx + 7, wheelCy + 4, 60, 'spruce_planks');
var brz;
for (brz = 52; brz <= 58; brz += 3) {
fill(cx - 7, wheelCy - 2, brz, cx - 7, wheelCy + 4, brz, 'stripped_spruce_log');
fill(cx + 7, wheelCy - 2, brz, cx + 7, wheelCy + 4, brz, 'stripped_spruce_log');
}
fill(cx - 7, wheelCy + 2, 52, cx - 7, wheelCy + 2, 58, 'spruce_slab[type=top]');
fill(cx + 7, wheelCy + 2, 52, cx + 7, wheelCy + 2, 58, 'spruce_slab[type=top]');
fill(cx - 6, wheelCy + 7, 51, cx + 6, wheelCy + 7, 55, 'spruce_slab[type=bottom]');
var hx;
for (hx = cx - 6; hx <= cx + 6; hx++) roofStair(hx, wheelCy + 8, 55, 'spruce_stairs', 'north');
fill(cx - 5, wheelCy + 9, 54, cx + 5, wheelCy + 9, 56, 'white_concrete');
ps(cx - 2, wheelCy + 9, 53, 'oak_wall_sign[facing=north]');
ps(cx + 2, wheelCy + 9, 53, 'oak_wall_sign[facing=north]');
// connect the wheel housing to the transom
fill(cx - 7, D1, 50, cx + 7, D1, 53, 'spruce_planks');
railing(cx - 7, 50, cx + 7, 53, D1 + 1);
// ---------- 9. INTERIORS ----------
var w;
// main deck: engine room aft + saloon mid
w = D1 + 1;
ps(cx - 3, w, 42, 'furnace[facing=north,lit=true]'); ps(cx - 2, w, 42, 'furnace[facing=north,lit=true]');
ps(cx + 2, w, 42, 'blast_furnace[facing=north,lit=true]'); ps(cx + 3, w, 42, 'furnace[facing=north,lit=true]');
fill(cx - 3, w + 1, 42, cx + 3, w + 1, 42, 'iron_block');
fill(cx - 1, w, 43, cx + 1, w + 2, 43, 'iron_block');
pb(cx - 4, w, 40, 'barrel'); pb(cx + 4, w, 40, 'barrel'); pb(cx - 4, w + 1, 40, 'barrel');
ps(cx + 4, w, 44, 'anvil[facing=north]'); pb(cx - 4, w, 44, 'cauldron[level=0]');
rug(cx - 3, w, 22, 6, 8, 'red', 'orange');
var ti;
for (ti = 24; ti <= 28; ti += 4) {
pb(cx - 2, w, ti, 'spruce_fence'); ps(cx - 2, w + 1, ti, 'spruce_pressure_plate');
chairStair(cx - 3, w, ti, 'spruce_stairs', 'east'); chairStair(cx - 1, w, ti, 'spruce_stairs', 'west');
pb(cx + 2, w, ti, 'spruce_fence'); ps(cx + 2, w + 1, ti, 'spruce_pressure_plate');
chairStair(cx + 1, w, ti, 'spruce_stairs', 'east'); chairStair(cx + 3, w, ti, 'spruce_stairs', 'west');
}
pb(cx - 5, w, 20, 'barrel'); pb(cx + 5, w, 20, 'barrel'); pb(cx - 5, w, 21, 'chest');
ps(cx, D2 - 1, 24, 'lantern[hanging=true]'); ps(cx, D2 - 1, 32, 'lantern[hanging=true]');
ps(cx, D2 - 1, 40, 'lantern[hanging=true]');
// boiler deck: grand saloon + cabins
w = D2 + 1;
rug(cx - 1, w, 24, 3, 18, 'red', 'yellow');
for (ti = 25; ti <= 39; ti += 6) {
pb(cx - 3, w, ti, 'spruce_fence'); ps(cx - 3, w + 1, ti, 'spruce_pressure_plate');
chairStair(cx - 4, w, ti, 'spruce_stairs', 'east'); chairStair(cx - 2, w, ti, 'spruce_stairs', 'west');
pb(cx + 3, w, ti, 'spruce_fence'); ps(cx + 3, w + 1, ti, 'spruce_pressure_plate');
chairStair(cx + 2, w, ti, 'spruce_stairs', 'east'); chairStair(cx + 4, w, ti, 'spruce_stairs', 'west');
}
placeBed(cx - 5, w, 22, 'red', 'north'); placeBed(cx + 5, w, 22, 'blue', 'north');
placeBed(cx - 5, w, 42, 'green', 'south'); placeBed(cx + 5, w, 42, 'yellow', 'south');
pb(cx - 5, w, 25, 'chest'); pb(cx + 5, w, 25, 'chest');
pb(cx - 4, w, 43, 'jukebox'); shelfWall(cx + 4, w, 26, 'south', 4, 2);
ps(cx, D3 - 1, 26, 'lantern[hanging=true]'); ps(cx, D3 - 1, 32, 'lantern[hanging=true]');
ps(cx, D3 - 1, 38, 'lantern[hanging=true]'); ps(cx - 4, D3 - 1, 34, 'lantern[hanging=true]');
// texas deck: officers cabins
w = D3 + 1;
placeBed(cx - 3, w, 26, 'white', 'north'); placeBed(cx + 3, w, 26, 'white', 'north');
placeBed(cx - 3, w, 37, 'light_blue', 'south'); placeBed(cx + 3, w, 37, 'light_blue', 'south');
pb(cx - 3, w, 29, 'chest'); pb(cx + 3, w, 29, 'chest');
ps(cx, w, 32, 'lectern[facing=south]'); chairStair(cx, w, 33, 'spruce_stairs', 'north');
rug(cx - 1, w, 30, 3, 4, 'blue', 'white');
ps(cx, D4 - 1, 30, 'lantern[hanging=true]'); ps(cx, D4 - 1, 36, 'lantern[hanging=true]');
// ---------- 10. COMPANIONWAYS + GANGPLANK ----------
staircase(cx - 4, 30, D1 + 1, D2 + 1, 'south', { material: 'spruce_stairs', support: 'birch_planks' });
staircase(cx + 4, 36, D2 + 1, D3 + 1, 'north', { material: 'spruce_stairs', support: 'birch_planks' });
staircase(cx - 2, 34, D3 + 1, D4 + 1, 'south', { material: 'spruce_stairs', support: 'birch_planks' });
staircase(cx, 30, D4 + 1, PH + 1, 'north', { material: 'spruce_stairs', support: 'birch_planks' });
// ---------- 11. LEVEE / WHARF ----------
var lz;
for (lz = 16; lz <= 44; lz++) fill(13, 12, lz, 17, 12, lz, 'spruce_planks');
for (lz = 16; lz <= 44; lz += 4) {
fill(17, 8, lz, 17, 11, lz, 'stripped_spruce_log');
fill(13, 8, lz, 13, 11, lz, 'stripped_spruce_log');
pb(17, 13, lz, 'oak_fence'); pb(17, 14, lz, 'oak_fence');
}
staircase(16, 28, 13, D1 + 1, 'east', { material: 'spruce_stairs', support: 'spruce_planks', width: 2 });
pb(15, 13, 22, 'barrel'); pb(15, 14, 22, 'barrel'); pb(16, 13, 22, 'barrel');
pb(14, 13, 24, 'chest'); pb(15, 13, 25, 'hay_block'); pb(16, 13, 25, 'hay_block');
pb(15, 13, 38, 'barrel'); pb(16, 13, 39, 'chest'); pb(14, 13, 40, 'hay_block');
lampPost(14, 13, 20, 3, 'oak_fence');
lampPost(14, 13, 34, 3, 'oak_fence');
lampPost(16, 13, 43, 3, 'oak_fence');
// mooring: bollards + ropes to the boat
pb(17, 13, 30, 'oak_fence'); pb(17, 13, 31, 'oak_fence');
fill(17, 14, 30, 17, 14, 30, 'oak_fence');
// bank landscaping
placeTree(6, 12, 18, 'oak');
placeTree(4, 12, 30, 'oak');
placeTree(8, 12, 40, 'birch');
placeTree(3, 12, 44, 'oak');
var bz;
for (bz = 14; bz <= 46; bz += 1) { if (bz % 5 === 0) pb(11, 12, bz, 'sugar_cane'); }
noisyScatter(1, 12, 12, 12, 12, 46, 'short_grass', 0.22, 9);
noisyScatter(1, 12, 12, 12, 12, 46, 'dandelion', 0.03, 13);
// dirt road along the levee
for (lz = 14; lz <= 46; lz++) fill(9, 11, lz, 11, 11, lz, 'dirt_path');