// === BUILD PLAN ===
// Style: Hadhrami / Shibam mud-brick tower house (vernacular desert high-rise)
// Footprint: composite — tower 15x13 (x18..32, z20..32) + projecting entrance porch 5x3
// (x24..28, z33..35) + single-storey west annex 4x7 (x14..17, z24..30)
// Height: plinth y7-8, five storeys of 5 (walk 9/14/19/24/29), terrace floor y33,
// crenellated parapet y34-36. Tapers: S1-2 15x13, S3-4 13x11, S5 11x9.
//
// GROUND FLOOR (top-down, 1 char = 1 block, z increases downward):
// x18 x32
// z20 ###W#####W#####
// # storage #
// z24 A . . . S # A = annex doorway (west), S = stair shaft (x26,z24..29)
// # hall S#
// z28 # rug S#
// # #
// z32 #####D#####W### D = dark oak door -> porch
// z33 [porch]
//
// FRONT (south) ELEVATION:
// 36 ^^^^^^^^ crenellated white parapet
// 33 ================= terrace slab + white cornice
// 29 | [] [] [] | storey 5 (upper sitting room)
// 24 | [] [] [] | storey 4 (bedrooms)
// 19 | [] [] [] | storey 3 (majlis)
// 14 | [] [] [] | storey 2 (kitchen)
// 9 | [] D [] | storey 1 (storage + hall)
// 7 ################# stone plinth on desert pad (padY=6)
//
// MATERIALS PLAN:
// walls : gradientPalette y8->y33 brown_terracotta -> packed_mud -> mud_bricks ->
// smooth_sandstone {noise .22} — WHY: dark base / light crown = fake AO on a
// tall flat wall, and it is literally sun-bleached mud brick (palette by volume)
// trim : white_terracotta + smooth_quartz, PROUD by 1 block around every window and as a
// cornice ring at each floor slab — WHY: the gypsum whitewash IS the Shibam look,
// and proud rings give real facade relief instead of a smooth box
// shutter: dark_oak_trapdoor (open) low floors, brown/white glass panes high floors
// plinth : cut_sandstone + chiselled band, stone_bricks core
// parapet: smooth_quartz + white_terracotta crenellations
// Rooms: S1 hall+storage (barrels, hay, cauldron, rug), S2 kitchen/dining (counter, furnace,
// table, chairs), S3 majlis (perimeter seating, 2 rugs, low table, banners, plants),
// S4 bedrooms (2 beds, chests, bookshelves, rug), S5 sitting room (seats, lectern, loom)
// STAIR PLAN: 5 straight flights in the x=26 shaft, alternating S/N, each Δ=5 -> 6 cells:
// 9->14 south(z24..29), 14->19 north, 19->24 south, 24->29 north, 29->34 south (terrace)
// === END PLAN ===
var padY = 6;
var baseY = padY + 1; // 7 : plinth bottom
var f1 = 8; // storey floor slabs
var f2 = 13, f3 = 18, f4 = 23, f5 = 28, ter = 33;
var w1x1 = 18, w1x2 = 32, w1z1 = 20, w1z2 = 32; // storeys 1-2
var w3x1 = 19, w3x2 = 31, w3z1 = 21, w3z2 = 31; // storeys 3-4
var w5x1 = 20, w5x2 = 30, w5z1 = 22, w5z2 = 30; // storey 5 + terrace
// ---------- helpers ----------
function shell(x1, z1, x2, z2, y1, y2, mat) {
fill(x1, y1, z1, x2, y2, z1, mat);
fill(x1, y1, z2, x2, y2, z2, mat);
fill(x1, y1, z1, x1, y2, z2, mat);
fill(x2, y1, z1, x2, y2, z2, mat);
}
function ringOut(x1, z1, x2, z2, y, mat) { // proud cornice one block outside the wall
fill(x1 - 1, y, z1 - 1, x2 + 1, y, z1 - 1, mat);
fill(x1 - 1, y, z2 + 1, x2 + 1, y, z2 + 1, mat);
fill(x1 - 1, y, z1 - 1, x1 - 1, y, z2 + 1, mat);
fill(x2 + 1, y, z1 - 1, x2 + 1, y, z2 + 1, mat);
}
// deep-set window: carve the opening, fill it with shutter/pane, then a PROUD white gypsum ring
function windowOn(face, ax, ay, az, w, h, fillId) {
var i, j;
if (face === 'south' || face === 'north') {
var oz = (face === 'south') ? az + 1 : az - 1;
fill(ax, ay, az, ax + w - 1, ay + h - 1, az, 'air');
for (i = 0; i < w; i++) for (j = 0; j < h; j++) ps(ax + i, ay + j, az, fillId);
fill(ax - 1, ay - 1, oz, ax + w, ay - 1, oz, 'white_terracotta');
fill(ax - 1, ay + h, oz, ax + w, ay + h, oz, 'smooth_quartz');
fill(ax - 1, ay, oz, ax - 1, ay + h - 1, oz, 'white_terracotta');
fill(ax + w, ay, oz, ax + w, ay + h - 1, oz, 'white_terracotta');
} else {
var ox = (face === 'east') ? ax + 1 : ax - 1;
fill(ax, ay, az, ax, ay + h - 1, az + w - 1, 'air');
for (i = 0; i < w; i++) for (j = 0; j < h; j++) ps(ax, ay + j, az + i, fillId);
fill(ox, ay - 1, az - 1, ox, ay - 1, az + w, 'white_terracotta');
fill(ox, ay + h, az - 1, ox, ay + h, az + w, 'smooth_quartz');
fill(ox, ay, az - 1, ox, ay + h - 1, az - 1, 'white_terracotta');
fill(ox, ay, az + w, ox, ay + h - 1, az + w, 'white_terracotta');
}
}
function palm(x, y, z, h) {
var i;
for (i = 0; i < h; i++) pb(x, y + i, z, i % 3 === 1 ? 'stripped_jungle_log' : 'jungle_log');
pb(x, y + h, z, 'jungle_leaves');
var d = [[1, 0], [-1, 0], [0, 1], [0, -1], [1, 1], [-1, -1], [1, -1], [-1, 1]];
for (i = 0; i < d.length; i++) {
pb(x + d[i][0], y + h, z + d[i][1], 'jungle_leaves');
pb(x + d[i][0] * 2, y + h - 1, z + d[i][1] * 2, 'jungle_leaves');
}
}
// ---------- 0. DESERT GROUND (superpowers, flat pad at padY) ----------
var land = blob(26, 27, 34, { irregularity: 0.34, seed: 12 });
var h0 = hills({ base: padY - 1, amp: 3, scale: 0.045, seed: 12 });
var pad = flatten(h0, { cx: 25, cz: 27, r: 17, }, padY, 8);
var sandMat = patches([{ block: 'sand', w: 55 }, { block: 'smooth_sandstone', w: 12 },
{ block: 'sandstone', w: 18 }, { block: 'coarse_dirt', w: 15 }], 0.06, 9);
surface(land, pad, sandMat, { sub: 'sandstone', deep: 'stone', depth: 4 });
// guarantee no ground intrudes into the building volume
fill(w1x1 - 2, baseY, w1z1 - 2, w1x2 + 2, 45, w1z2 + 4, 'air');
fill(13, baseY, 23, 18, 20, 31, 'air');
// ---------- 1. PLINTH ----------
var plinth = noisePalette([{ block: 'cut_sandstone', weight: 45 }, { block: 'sandstone', weight: 30 },
{ block: 'smooth_sandstone', weight: 15 }, { block: 'chiseled_sandstone', weight: 10 }], { seed: 3 });
fill(w1x1 - 1, baseY, w1z1 - 1, w1x2 + 1, f1, w1z2 + 1, plinth);
fill(24, baseY, 33, 28, f1, 35, plinth); // porch plinth
fill(13, baseY, 23, 17, f1, 31, plinth); // annex plinth
ringOut(w1x1 - 1, w1z1 - 1, w1x2 + 1, w1z2 + 1, f1, 'smooth_quartz');
// ---------- 2. TOWER SHELL (5 tapering storeys) ----------
var wallMat = gradientPalette(f1, ter, [
{ block: 'brown_terracotta', from: 0 },
{ block: 'packed_mud', from: 0.22 },
{ block: 'mud_bricks', from: 0.52 },
{ block: 'smooth_sandstone', from: 0.86 }], { noise: 0.22, seed: 4 });
var storeys = [
{ x1: w1x1, x2: w1x2, z1: w1z1, z2: w1z2, fy: f1, cy: f2 },
{ x1: w1x1, x2: w1x2, z1: w1z1, z2: w1z2, fy: f2, cy: f3 },
{ x1: w3x1, x2: w3x2, z1: w3z1, z2: w3z2, fy: f3, cy: f4 },
{ x1: w3x1, x2: w3x2, z1: w3z1, z2: w3z2, fy: f4, cy: f5 },
{ x1: w5x1, x2: w5x2, z1: w5z1, z2: w5z2, fy: f5, cy: ter }
];
var si;
for (si = 0; si < storeys.length; si++) {
var S = storeys[si];
fill(S.x1, S.fy, S.z1, S.x2, S.fy, S.z2, si === 0 ? 'packed_mud' : 'spruce_planks'); // floor slab
shell(S.x1, S.z1, S.x2, S.z2, S.fy + 1, S.cy - 1, wallMat); // walls
fill(S.x1, S.cy, S.z1, S.x2, S.cy, S.z2, 'packed_mud'); // ceiling slab
ringOut(S.x1, S.z1, S.x2, S.z2, S.cy, 'white_terracotta'); // white cornice band
}
// pilaster strips (proud) on the two long faces of the base block
var px;
for (px = w1x1 + 3; px <= w1x2 - 3; px += 4) {
fill(px, f1 + 1, w1z2 + 1, px, f3 - 1, w1z2 + 1, 'mud_bricks');
fill(px, f1 + 1, w1z1 - 1, px, f3 - 1, w1z1 - 1, 'mud_bricks');
}
// corner pilasters full height of the base block
fill(w1x1 - 1, f1 + 1, w1z1 - 1, w1x1 - 1, f3 - 1, w1z1 - 1, 'mud_bricks');
fill(w1x2 + 1, f1 + 1, w1z1 - 1, w1x2 + 1, f3 - 1, w1z1 - 1, 'mud_bricks');
fill(w1x1 - 1, f1 + 1, w1z2 + 1, w1x1 - 1, f3 - 1, w1z2 + 1, 'mud_bricks');
fill(w1x2 + 1, f1 + 1, w1z2 + 1, w1x2 + 1, f3 - 1, w1z2 + 1, 'mud_bricks');
// ---------- 3. WINDOWS ----------
var shutS = 'dark_oak_trapdoor[facing=north,half=bottom,open=true]';
var shutN = 'dark_oak_trapdoor[facing=south,half=bottom,open=true]';
var shutE = 'dark_oak_trapdoor[facing=west,half=bottom,open=true]';
var shutW = 'dark_oak_trapdoor[facing=east,half=bottom,open=true]';
var paneS = 'brown_stained_glass_pane[north=true,south=true]';
var paneE = 'brown_stained_glass_pane[east=true,west=true]';
var lvl, wy, sx, sz;
for (lvl = 0; lvl < storeys.length; lvl++) {
var T = storeys[lvl];
wy = T.fy + 2; // sill one above walk level
var useGlass = lvl >= 3;
// south + north faces: three windows
for (sx = T.x1 + 2; sx <= T.x2 - 2; sx += 4) {
if (lvl === 0 && sx >= 25 && sx <= 27) continue; // leave room for the door
windowOn('south', sx, wy, T.z2, 1, 2, useGlass ? paneS : shutS);
windowOn('north', sx, wy, T.z1, 1, 2, useGlass ? paneS : shutN);
}
// east + west faces: two windows
for (sz = T.z1 + 3; sz <= T.z2 - 3; sz += 5) {
windowOn('east', T.x2, wy, sz, 1, 2, useGlass ? paneE : shutE);
if (!(lvl === 0 && sz >= 26 && sz <= 28))
windowOn('west', T.x1, wy, sz, 1, 2, useGlass ? paneE : shutW);
}
}
// ---------- 4. ENTRANCE PORCH + DOOR ----------
fill(24, f1 + 1, 33, 28, f2 - 1, 33, 'air');
fill(24, f1, 33, 28, f1, 35, 'smooth_sandstone');
fill(24, f1 + 1, 35, 28, f2 - 1, 35, wallMat); // porch front
fill(24, f1 + 1, 33, 24, f2 - 1, 35, wallMat); // porch sides
fill(28, f1 + 1, 33, 28, f2 - 1, 35, wallMat);
fill(25, f1 + 1, 35, 27, f1 + 3, 35, 'air'); // porch archway
ps(25, f1 + 4, 35, 'smooth_sandstone_stairs[facing=east,half=top]');
ps(27, f1 + 4, 35, 'smooth_sandstone_stairs[facing=west,half=top]');
pb(26, f1 + 4, 35, 'smooth_quartz');
fill(24, f2, 33, 28, f2, 35, 'smooth_sandstone'); // porch roof slab
ringOut(24, 33, 28, 35, f2, 'white_terracotta');
var cx2;
for (cx2 = 23; cx2 <= 29; cx2 += 2) pb(cx2, f2 + 1, 36, 'smooth_quartz'); // porch crenellation
pb(23, f2 + 1, 34, 'smooth_quartz'); pb(29, f2 + 1, 34, 'smooth_quartz');
// carved dark-wood door into the tower
fill(26, f1 + 1, w1z2, 26, f1 + 2, w1z2, 'air');
ps(26, f1 + 1, w1z2, 'dark_oak_door[facing=south,half=lower,hinge=left]');
ps(26, f1 + 2, w1z2, 'dark_oak_door[facing=south,half=upper,hinge=left]');
pb(25, f1 + 1, w1z2 + 1, 'dark_oak_log'); pb(27, f1 + 1, w1z2 + 1, 'dark_oak_log');
pb(25, f1 + 2, w1z2 + 1, 'dark_oak_log'); pb(27, f1 + 2, w1z2 + 1, 'dark_oak_log');
fill(25, f1 + 3, w1z2 + 1, 27, f1 + 3, w1z2 + 1, 'smooth_quartz');
ps(25, f1 + 3, 34, 'lantern[hanging=false]'); ps(27, f1 + 3, 34, 'lantern[hanging=false]');
// entry steps up from the desert to the porch
staircase(26, 38, baseY, f1 + 1, 'north', { material: 'smooth_sandstone_stairs', support: 'sandstone', width: 2 });
// ---------- 5. WEST ANNEX (kitchen court) ----------
fill(14, f1, 24, 17, f1, 30, 'packed_mud');
shell(14, 24, 17, 30, f1 + 1, f2 - 1, wallMat);
fill(14, f2, 24, 17, f2, 30, 'packed_mud');
ringOut(14, 24, 17, 30, f2, 'white_terracotta');
var ax2;
for (ax2 = 13; ax2 <= 18; ax2 += 2) { pb(ax2, f2 + 1, 23, 'smooth_quartz'); pb(ax2, f2 + 1, 31, 'smooth_quartz'); }
windowOn('west', 14, f1 + 2, 26, 1, 2, shutW);
windowOn('south', 16, f1 + 2, 30, 1, 2, shutS);
// doorway annex -> tower
fill(17, f1 + 1, 27, w1x1, f1 + 2, 27, 'air');
ps(17, f1 + 1, 27, 'dark_oak_door[facing=east,half=lower,hinge=left]');
ps(17, f1 + 2, 27, 'dark_oak_door[facing=east,half=upper,hinge=left]');
// ---------- 6. STAIR SHAFT (5 flights, alternating, x=26) ----------
var stOpt = { material: 'dark_oak_stairs', support: 'mud_bricks', rail: false };
staircase(26, 24, f1 + 1, f2 + 1, 'south', stOpt);
staircase(26, 29, f2 + 1, f3 + 1, 'north', stOpt);
staircase(26, 24, f3 + 1, f4 + 1, 'south', stOpt);
staircase(26, 29, f4 + 1, f5 + 1, 'north', stOpt);
staircase(26, 24, f5 + 1, ter + 1, 'south', stOpt);
// ---------- 7. INTERIORS ----------
// --- S1 : entrance hall + storage (walk f1+1 = 9) ---
var w = f1 + 1, c = f2;
rug(21, w, 28, 4, 3, 'red', 'orange');
pb(20, w, 22, 'barrel'); pb(21, w, 22, 'barrel'); pb(22, w, 22, 'barrel');
pb(20, w + 1, 22, 'barrel'); pb(21, w + 1, 22, 'barrel');
pb(23, w, 22, 'hay_block'); pb(24, w, 22, 'hay_block'); pb(23, w + 1, 22, 'hay_block');
pb(30, w, 22, 'chest'); pb(29, w, 22, 'chest');
ps(30, w, 30, 'water_cauldron[level=3]');
pb(21, w, 25, 'dark_oak_fence'); ps(21, w + 1, 25, 'dark_oak_pressure_plate');
chairStair(20, w, 25, 'dark_oak_stairs', 'east');
chairStair(22, w, 25, 'dark_oak_stairs', 'west');
pb(29, w, 26, 'crafting_table'); pb(29, w, 27, 'barrel');
ps(22, c - 1, 26, 'lantern[hanging=true]'); ps(29, c - 1, 24, 'lantern[hanging=true]');
ps(24, c - 1, 30, 'lantern[hanging=true]');
pb(19, w, 31, 'flower_pot'); pb(31, w, 31, 'flower_pot');
// --- S2 : kitchen / dining (walk f2+1 = 14) ---
w = f2 + 1; c = f3;
var kx = 20, kz = 22;
pb(kx, w, kz, 'stripped_spruce_log'); ps(kx, w + 1, kz, 'spruce_stairs[facing=south,half=top]');
ps(kx + 1, w, kz, 'furnace[facing=south,lit=true]'); ps(kx + 1, w + 1, kz, 'iron_trapdoor[facing=south,half=bottom]');
pb(kx + 2, w, kz, 'stripped_spruce_log'); ps(kx + 2, w + 1, kz, 'spruce_stairs[facing=south,half=top]');
ps(kx + 3, w, kz, 'water_cauldron[level=3]');
pb(kx + 4, w, kz, 'barrel'); pb(kx + 5, w, kz, 'smoker[facing=south]');
pb(22, w, 26, 'dark_oak_fence'); pb(23, w, 26, 'dark_oak_fence');
ps(22, w + 1, 26, 'spruce_pressure_plate'); ps(23, w + 1, 26, 'spruce_pressure_plate');
chairStair(22, w, 25, 'spruce_stairs', 'south'); chairStair(23, w, 25, 'spruce_stairs', 'south');
chairStair(22, w, 27, 'spruce_stairs', 'north'); chairStair(23, w, 27, 'spruce_stairs', 'north');
rug(21, w, 29, 4, 2, 'yellow', 'brown');
pb(30, w, 23, 'barrel'); pb(30, w + 1, 23, 'barrel'); pb(30, w, 24, 'cauldron[level=0]');
pb(29, w, 30, 'composter'); pb(30, w, 30, 'barrel');
ps(23, c - 1, 26, 'lantern[hanging=true]'); ps(29, c - 1, 27, 'lantern[hanging=true]');
ps(21, c - 1, 22, 'lantern[hanging=true]');
// --- S3 : MAJLIS (walk f3+1 = 19) — perimeter seating, rugs, low table ---
w = f3 + 1; c = f4;
var mi;
for (mi = 21; mi <= 29; mi++) { // low seating along north + south walls
if (mi >= 25 && mi <= 27) continue;
chairStair(mi, w, 22, 'dark_oak_stairs', 'south');
chairStair(mi, w, 30, 'dark_oak_stairs', 'north');
}
for (mi = 24; mi <= 28; mi++) chairStair(20, w, mi, 'dark_oak_stairs', 'east');
rug(22, w, 24, 7, 5, 'red', 'orange');
pb(25, w, 26, 'dark_oak_fence'); pb(26, w, 26, 'dark_oak_fence');
ps(25, w + 1, 26, 'dark_oak_pressure_plate'); ps(26, w + 1, 26, 'dark_oak_pressure_plate');
pb(25, w + 1, 27, 'flower_pot');
ps(21, w + 2, 21, 'red_wall_banner[facing=south]'); ps(29, w + 2, 21, 'red_wall_banner[facing=south]');
ps(30, w, 29, 'lectern[facing=west]');
pb(30, w, 23, 'flower_pot'); pb(21, w, 29, 'flower_pot');
ps(24, c - 1, 26, 'lantern[hanging=true]'); ps(28, c - 1, 26, 'lantern[hanging=true]');
ps(24, c - 1, 23, 'lantern[hanging=true]'); ps(28, c - 1, 29, 'lantern[hanging=true]');
// --- S4 : bedrooms (walk f4+1 = 24) ---
w = f4 + 1; c = f5;
placeBed(21, w, 24, 'red', 'north');
placeBed(23, w, 24, 'blue', 'north');
pb(20, w, 24, 'dark_oak_fence'); ps(20, w + 1, 24, 'dark_oak_pressure_plate'); ps(20, w + 2, 24, 'lantern[hanging=false]');
pb(25, w, 24, 'chest'); pb(25, w, 25, 'chest');
shelfWall(28, w, 22, 'south', 5, 2);
placeBed(29, w, 29, 'green', 'west');
rug(22, w, 28, 5, 3, 'brown', 'orange');
ps(29, w, 23, 'lectern[facing=west]');
pb(21, w, 30, 'flower_pot'); pb(24, w, 30, 'barrel');
ps(23, c - 1, 27, 'lantern[hanging=true]'); ps(28, c - 1, 27, 'lantern[hanging=true]');
// --- S5 : upper sitting room (walk f5+1 = 29) ---
w = f5 + 1; c = ter;
rug(22, w, 25, 5, 4, 'orange', 'red');
for (mi = 22; mi <= 28; mi++) {
if (mi >= 25 && mi <= 27) continue;
chairStair(mi, w, 23, 'dark_oak_stairs', 'south');
}
chairStair(21, w, 26, 'dark_oak_stairs', 'east'); chairStair(21, w, 27, 'dark_oak_stairs', 'east');
pb(24, w, 26, 'dark_oak_fence'); ps(24, w + 1, 26, 'dark_oak_pressure_plate');
pb(29, w, 24, 'loom[facing=west]'); pb(29, w, 26, 'barrel'); pb(29, w, 28, 'chest');
ps(28, w, 29, 'lectern[facing=north]');
ps(24, c - 1, 26, 'lantern[hanging=true]'); ps(27, c - 1, 27, 'lantern[hanging=true]');
pb(22, w, 29, 'flower_pot');
// ---------- 8. ROOF TERRACE + CRENELLATED PARAPET ----------
fill(w5x1, ter, w5z1, w5x2, ter, w5z2, 'smooth_sandstone');
// re-open the stair hole through the terrace slab (flight 5 arrives here)
fill(26, ter, 24, 26, ter, 26, 'air');
var pz, pxx;
// solid parapet base ring y=ter+1, crenellations to ter+2 alternating
shell(w5x1, w5z1, w5x2, w5z2, ter + 1, ter + 1, 'smooth_quartz');
for (pxx = w5x1; pxx <= w5x2; pxx += 2) {
pb(pxx, ter + 2, w5z1, 'white_terracotta');
pb(pxx, ter + 2, w5z2, 'white_terracotta');
}
for (pz = w5z1; pz <= w5z2; pz += 2) {
pb(w5x1, ter + 2, pz, 'white_terracotta');
pb(w5x2, ter + 2, pz, 'white_terracotta');
}
// stair hood over the terrace opening (a real sloped cap)
fill(25, ter + 1, 23, 27, ter + 3, 23, 'mud_bricks');
fill(25, ter + 1, 27, 27, ter + 3, 27, 'mud_bricks');
fill(25, ter + 1, 24, 25, ter + 3, 26, 'mud_bricks');
fill(27, ter + 1, 24, 27, ter + 3, 26, 'air');
var hz;
for (hz = 23; hz <= 27; hz++) {
roofStair(25, ter + 4, hz, 'smooth_sandstone_stairs', 'west');
roofStair(27, ter + 4, hz, 'smooth_sandstone_stairs', 'east');
pb(26, ter + 4, hz, 'smooth_sandstone');
}
// shaded pergola corner on the terrace
pb(21, ter + 1, 29, 'dark_oak_fence'); pb(21, ter + 2, 29, 'dark_oak_fence');
pb(23, ter + 1, 29, 'dark_oak_fence'); pb(23, ter + 2, 29, 'dark_oak_fence');
pb(21, ter + 1, 27, 'dark_oak_fence'); pb(21, ter + 2, 27, 'dark_oak_fence');
pb(23, ter + 1, 27, 'dark_oak_fence'); pb(23, ter + 2, 27, 'dark_oak_fence');
fill(21, ter + 3, 27, 23, ter + 3, 29, 'jungle_leaves');
rug(21, ter + 1, 27, 3, 3, 'red', 'orange');
ps(22, ter + 2, 28, 'lantern[hanging=true]');
pb(29, ter + 1, 23, 'flower_pot'); pb(21, ter + 1, 23, 'flower_pot');
// ---------- 9. EXTERIOR: path, walls, palms, lighting ----------
var i2;
for (i2 = 36; i2 <= 46; i2++) {
fill(25, padY, i2, 27, padY, i2, i2 % 3 === 0 ? 'smooth_sandstone' : 'sandstone');
}
for (i2 = 14; i2 <= 34; i2++) pb(i2, padY, 36, 'sandstone');
lampPost(23, padY + 1, 37, 3, 'dark_oak_fence');
lampPost(30, padY + 1, 37, 3, 'dark_oak_fence');
lampPost(12, padY + 1, 27, 3, 'dark_oak_fence');
// low mud courtyard wall on the west side
fill(11, padY + 1, 22, 11, padY + 2, 33, 'mud_bricks');
fill(11, padY + 1, 33, 22, padY + 2, 33, 'mud_bricks');
fill(11, padY + 3, 22, 11, padY + 3, 33, 'mud_brick_slab[type=bottom]');
fill(12, padY + 3, 33, 22, padY + 3, 33, 'mud_brick_slab[type=bottom]');
fill(16, padY + 1, 33, 18, padY + 3, 33, 'air'); // gate gap
palm(14, padY + 1, 20, 6);
palm(35, padY + 1, 24, 7);
palm(37, padY + 1, 33, 5);
palm(19, padY + 1, 40, 6);
// well + goods by the entrance
fill(33, padY + 1, 38, 35, padY + 1, 40, 'cobblestone');
fill(34, padY + 1, 39, 34, padY + 1, 39, 'water');
pb(33, padY + 2, 38, 'cobblestone_wall'); pb(35, padY + 2, 38, 'cobblestone_wall');
pb(33, padY + 2, 40, 'cobblestone_wall'); pb(35, padY + 2, 40, 'cobblestone_wall');
fill(33, padY + 3, 38, 35, padY + 3, 40, 'oak_slab[type=bottom]');
pb(30, padY + 1, 39, 'hay_block'); pb(31, padY + 1, 39, 'hay_block'); pb(30, padY + 2, 39, 'hay_block');
pb(29, padY + 1, 40, 'barrel');
noisyScatter(10, padY + 1, 16, 44, padY + 1, 46, ['dead_bush', 'cactus'], 0.012, 21);