// === BUILD PLAN ===
// Style: Art Nouveau corner apothecary (Brussels/Riga shopfront), 2 storeys + mansard
// Footprint: 19x17 rect (X22..40, Z20..36) with the SOUTH-WEST corner ROUNDED (r=6, centre 28,30)
// Height: floor Y11, ground walk Y12 (5 air), floor2 Y17, upper walk Y18 (4 air), wall top Y21,
// mansard Y22 cornice -> Y23..26 steep slope -> Y27 flat deck. Chimney to Y29.
//
// GROUND FLOOR (top-down, X right, Z down):
// #################### # wall
// # SHELF WALL (bottles) # S shelf wall of apothecary bottles (bookshelf+chiseled)
// # # C counter run
// # CCCCCCCCC # T tables + chairs by the glass
// # T T ST # ST staircase up (climbs north)
// ##W W #
// ##W (rounded bay) #
// ##DD##########W##### D door on the rounded corner
//
// FRONT (SW) ELEVATION:
// /^^^^^^^^^^^^\ mansard slate, dormers
// |=cornice====|
// | ww BALC ww| upper: pale stucco, glass panes, iron balcony over the canopy
// |=glass canopy=|
// | WW D WW | ground: deep-green glazed tile, tall glass + iron-bar fanlights
// |_plinth_____|
//
// MATERIALS PLAN:
// plinth : noisePalette polished_deepslate/deepslate_tiles/cobbled_deepslate - WHY: dark base grounds it, fakes AO
// ground : gradientPalette dark_prismarine->green_terracotta->green_concrete - WHY: glazed-tile green ramp, dark low = shadow
// string : dark_prismarine band at Y17 - WHY: reads the floor line, breaks the wall
// upper : gradientPalette white_terracotta->smooth_quartz->calcite - WHY: pale stucco CONTRASTS the dark green below
// pilaster: polished_deepslate columns PROTRUDING 1 block - WHY: facade relief, not a flat box
// roof : noisePalette deepslate_tile/brick stairs - WHY: slate shingle variation
// iron : iron_bars fanlights + balcony rail - WHY: the whiplash ironwork signature
// Rooms: shop (counter, bottle shelf wall, 2 tables, brewing stands, cauldron),
// flat above (bed, dining table, campfire hearth + chimney, shelves, balcony door)
// STAIR PLAN: walk 12 -> walk 18, D=6 -> staircase(37,33,12,18,"north"), 7 cells, lands flush at (37,18,27)
// === END PLAN ===
var X0 = 22, X1 = 40, Z0 = 20, Z1 = 36;
var R = 6, CX = X0 + R, CZ = Z1 - R;
var padY = 10;
var floorY = 11, walkY = 12;
var floor2Y = 17, walkY2 = 18;
var wallTopY = 21, roofBaseY = 22;
function inside(x, z) {
if (x < X0 || x > X1 || z < Z0 || z > Z1) return false;
if (x < CX && z > CZ) {
var dx = x - CX, dz = z - CZ;
return (dx * dx + dz * dz) <= (R * R + 0.6);
}
return true;
}
function insideK(x, z, k) {
var i, j;
for (i = -k; i <= k; i++) for (j = -k; j <= k; j++) if (!inside(x + i, z + j)) return false;
return true;
}
function ringK(x, z, k) {
if (!insideK(x, z, k)) return false;
return (!insideK(x + 1, z, k) || !insideK(x - 1, z, k) || !insideK(x, z + 1, k) || !insideK(x, z - 1, k));
}
function perim(x, z) { return ringK(x, z, 0); }
// palettes
var plinthPal = noisePalette([{block:'polished_deepslate',weight:45},{block:'deepslate_tiles',weight:35},{block:'cobbled_deepslate',weight:20}], {seed:3, freq:0.16});
var greenPal = gradientPalette(12, 16, [{block:'dark_prismarine',from:0},{block:'green_terracotta',from:0.35},{block:'green_concrete',from:0.75}], {noise:0.22, seed:4});
var creamPal = gradientPalette(18, 21, [{block:'white_terracotta',from:0},{block:'smooth_quartz',from:0.5},{block:'calcite',from:0.85}], {noise:0.18, seed:6});
var slatePal = noisePalette([{block:'deepslate_tiles',weight:50},{block:'polished_deepslate',weight:30},{block:'deepslate_bricks',weight:20}], {seed:8, freq:0.18});
var slateStair= noisePalette([{block:'deepslate_tile_stairs',weight:60},{block:'deepslate_brick_stairs',weight:40}], {seed:9, freq:0.2});
var floorPal = noisePalette([{block:'dark_oak_planks',weight:60},{block:'spruce_planks',weight:40}], {seed:11, freq:0.2});
function wallMat(x, y, z) {
if (y <= walkY) return plinthPal(x, y, z);
if (y <= 16) return greenPal(x, y, z);
if (y === floor2Y) return 'dark_prismarine';
return creamPal(x, y, z);
}
// === TERRAIN ===
var land = blob(31, 29, 33, {irregularity:0.38, seed:13});
var hbase = hills({base:8, amp:3, scale:0.035, seed:5});
var pad = flatten(hbase, {x0:X0-9, z0:Z0-7, x1:X1+7, z1:Z1+9}, padY, 8);
var grassPat = patches([{block:'grass_block',w:70},{block:'coarse_dirt',w:18},{block:'podzol',w:12}], 0.06, 3);
var streetPat = noisePalette([{block:'stone',weight:40},{block:'andesite',weight:30},{block:'cobblestone',weight:20},{block:'gravel',weight:10}], {seed:21, freq:0.2});
var groundMat = function (x, z) {
if (x <= X0 - 3 || z >= Z1 + 3) return streetPat(x, 0, z); // the two streets of the corner
if (x <= X0 - 1 || z >= Z1 + 1) return 'smooth_stone'; // pavement kerb
return grassPat(x, z);
};
surface(land, pad, groundMat, {sub:'dirt', deep:'stone', depth:4});
// === CLEAR + FLOOR ===
fill(X0 - 1, floorY, Z0 - 1, X1 + 1, roofBaseY + 8, Z1 + 1, b('air'));
var x, y, z, i, k;
for (x = X0; x <= X1; x++) for (z = Z0; z <= Z1; z++) {
if (!inside(x, z)) continue;
pb(x, floorY, z, ((x + z) % 2 === 0) ? 'polished_diorite' : 'polished_blackstone'); // shop tiles
}
// === STRUCTURE: WALLS ===
for (x = X0; x <= X1; x++) for (z = Z0; z <= Z1; z++) {
if (!perim(x, z)) continue;
for (y = floorY; y <= wallTopY; y++) pb(x, y, z, wallMat(x, y, z));
}
// pick the door cell on the rounded bay (closest to the SW diagonal)
var doorX = 24, doorZ = 34, best = 999;
for (x = X0; x < CX; x++) for (z = CZ + 1; z <= Z1; z++) {
if (!perim(x, z)) continue;
var d = Math.abs(x - 23.8) + Math.abs(z - 34.2);
if (d < best) { best = d; doorX = x; doorZ = z; }
}
// === WINDOWS (ground: glass + iron fanlight; upper: panes with stone sills) ===
function openGround(x, z) {
var yy;
for (yy = 13; yy <= 15; yy++) pb(x, yy, z, 'glass');
pb(x, 16, z, 'iron_bars'); // whiplash ironwork fanlight
pb(x, walkY, z, 'polished_deepslate'); // window breast wall
}
function openUpper(x, z) {
pb(x, walkY2, z, 'polished_deepslate'); // sill
pb(x, 19, z, 'glass_pane'); pb(x, 20, z, 'glass_pane');
pb(x, 21, z, 'iron_bars');
}
// bay: everything on the arc is shopfront glass except the door bay
for (x = X0; x < CX; x++) for (z = CZ + 1; z <= Z1; z++) {
if (!perim(x, z)) continue;
if (Math.abs(x - doorX) + Math.abs(z - doorZ) <= 1) continue;
openGround(x, z); openUpper(x, z);
}
// west facade (x=X0)
var wSpans = [[23,25],[27,29]];
for (i = 0; i < wSpans.length; i++) for (z = wSpans[i][0]; z <= wSpans[i][1]; z++) { openGround(X0, z); openUpper(X0, z); }
// south facade (z=Z1)
var sSpans = [[31,33],[36,38]];
for (i = 0; i < sSpans.length; i++) for (x = sSpans[i][0]; x <= sSpans[i][1]; x++) { openGround(x, Z1); openUpper(x, Z1); }
// east + north: upper windows only (side/back)
for (z = 25; z <= 27; z++) openUpper(X1, z);
for (z = 30; z <= 32; z++) openUpper(X1, z);
for (x = 27; x <= 29; x++) openUpper(x, Z0);
for (x = 34; x <= 36; x++) openUpper(x, Z0);
// door + transom
pb(doorX, walkY, doorZ, 'air'); pb(doorX, walkY + 1, doorZ, 'air');
ps(doorX, walkY, doorZ, 'dark_oak_door[facing=south,half=lower,hinge=left]');
ps(doorX, walkY + 1, doorZ, 'dark_oak_door[facing=south,half=upper,hinge=left]');
pb(doorX, 14, doorZ, 'iron_bars'); pb(doorX, 15, doorZ, 'glass'); pb(doorX, 16, doorZ, 'iron_bars');
ps(doorX, floorY, doorZ + 1, 'polished_deepslate_slab[type=bottom]'); // doorstep
ps(doorX - 1, floorY, doorZ + 1, 'polished_deepslate_slab[type=bottom]');
// === FACADE RELIEF: protruding pilasters + quoins ===
function pilaster(px, pz, dx, dz) {
var yy;
for (yy = floorY; yy <= wallTopY; yy++) {
pb(px + dx, yy, pz + dz, (yy <= walkY) ? 'polished_deepslate' : (yy <= 16 ? 'deepslate_tiles' : 'polished_deepslate'));
}
ps(px + dx, floor2Y, pz + dz, 'deepslate_tile_slab[type=top]');
ps(px + dx, wallTopY + 1, pz + dz, 'deepslate_tile_slab[type=bottom]');
}
pilaster(X0, 22, -1, 0); pilaster(X0, 26, -1, 0); pilaster(X0, 30, -1, 0);
pilaster(34, Z1, 0, 1); pilaster(39, Z1, 0, 1); pilaster(30, Z1, 0, 1);
pilaster(X1, 24, 1, 0); pilaster(X1, 33, 1, 0);
for (y = floorY; y <= wallTopY; y++) {
pb(X0 - 1, y, Z0, 'polished_deepslate'); pb(X0, y, Z0 - 1, 'polished_deepslate');
pb(X1 + 1, y, Z0, 'polished_deepslate'); pb(X1, y, Z0 - 1, 'polished_deepslate');
pb(X1 + 1, y, Z1, 'polished_deepslate'); pb(X1, y, Z1 + 1, 'polished_deepslate');
}
// === CURVED GLASS CANOPY + BALCONY ===
for (x = X0 - 2; x <= X1 + 2; x++) for (z = Z0 - 2; z <= Z1 + 2; z++) {
if (inside(x, z)) continue;
// one ring outside the shell, only on the two street facades + the bay
var touches = inside(x + 1, z) || inside(x - 1, z) || inside(x, z + 1) || inside(x, z - 1);
if (!touches) continue;
if (x > X1 || z < Z0) continue; // skip back/side alley
pb(x, floor2Y, z, 'glass'); // the canopy deck
ps(x, floor2Y - 1, z, 'chain[axis=y]'); // iron hanger under the glass
}
// balcony floor over the canopy on the bay + rail
for (x = X0 - 2; x <= CX; x++) for (z = CZ; z <= Z1 + 2; z++) {
if (inside(x, z)) continue;
var t2 = inside(x + 1, z) || inside(x - 1, z) || inside(x, z + 1) || inside(x, z - 1);
if (!t2) continue;
ps(x, walkY2, z, 'smooth_quartz_slab[type=bottom]');
pb(x, walkY2 + 1, z, 'iron_bars');
}
// balcony doors from the flat
pb(doorX, walkY2, doorZ, 'air'); pb(doorX, walkY2 + 1, doorZ, 'air');
ps(doorX, walkY2, doorZ, 'dark_oak_door[facing=south,half=lower,hinge=left]');
ps(doorX, walkY2 + 1, doorZ, 'dark_oak_door[facing=south,half=upper,hinge=left]');
pb(doorX, walkY2, doorZ + 1, 'air');
// === FLOOR 2 + CEILING BEAMS ===
for (x = X0 + 1; x <= X1 - 1; x++) for (z = Z0 + 1; z <= Z1 - 1; z++) {
if (!insideK(x, z, 1)) continue;
pb(x, floor2Y, z, floorPal(x, floor2Y, z));
}
for (z = Z0 + 1; z <= Z1 - 1; z++) { if (insideK(27, z, 1)) ps(27, floor2Y - 1, z, 'stripped_dark_oak_log[axis=z]'); if (insideK(34, z, 1)) ps(34, floor2Y - 1, z, 'stripped_dark_oak_log[axis=z]'); }
// attic floor (closes the top of the flat, no sky gap)
for (x = X0 + 1; x <= X1 - 1; x++) for (z = Z0 + 1; z <= Z1 - 1; z++) {
if (insideK(x, z, 1)) pb(x, roofBaseY, z, 'dark_oak_planks');
}
// === MANSARD SLATE ROOF ===
// cornice ring (1-block eave)
for (x = X0 - 1; x <= X1 + 1; x++) for (z = Z0 - 1; z <= Z1 + 1; z++) {
if (inside(x, z)) continue;
var tc = inside(x + 1, z) || inside(x - 1, z) || inside(x, z + 1) || inside(x, z - 1);
if (tc) { pb(x, roofBaseY, z, 'polished_deepslate'); ps(x, roofBaseY + 1, z, 'deepslate_tile_slab[type=bottom]'); }
}
for (x = X0; x <= X1; x++) for (z = Z0; z <= Z1; z++) if (perim(x, z)) pb(x, roofBaseY, z, 'polished_deepslate');
// steep mansard flanks: 4 stepped rings
for (k = 0; k <= 3; k++) {
var ry = roofBaseY + 1 + k;
for (x = X0; x <= X1; x++) for (z = Z0; z <= Z1; z++) {
if (!ringK(x, z, k)) continue;
var openN = !insideK(x, z - 1, k), openS = !insideK(x, z + 1, k);
var openW = !insideK(x - 1, z, k), openE = !insideK(x + 1, z, k);
var n = (openN ? 1 : 0) + (openS ? 1 : 0) + (openW ? 1 : 0) + (openE ? 1 : 0);
if (n > 1) { pb(x, ry, z, slatePal(x, ry, z)); continue; } // corner: solid, no broken stair
var edge = openN ? 'north' : (openS ? 'south' : (openW ? 'west' : 'east'));
roofStair(x, ry, z, slateStair(x, ry, z), edge);
}
}
// flat deck on top (mansard crown) + ridge crest
for (x = X0; x <= X1; x++) for (z = Z0; z <= Z1; z++) {
if (insideK(x, z, 4)) pb(x, roofBaseY + 5, z, slatePal(x, roofBaseY + 5, z));
}
for (x = X0; x <= X1; x++) for (z = Z0; z <= Z1; z++) {
if (insideK(x, z, 6)) ps(x, roofBaseY + 6, z, 'deepslate_tile_slab[type=bottom]');
}
pb(33, roofBaseY + 7, 28, 'lightning_rod');
// dormers on the mansard flanks
function dormer(dx, dz, side) {
var yy, o;
for (o = -1; o <= 1; o++) {
var wx = (side === 'west' || side === 'east') ? dx : dx + o;
var wz = (side === 'west' || side === 'east') ? dz + o : dz;
for (yy = roofBaseY + 1; yy <= roofBaseY + 3; yy++) pb(wx, yy, wz, (o === 0 && yy > roofBaseY + 1) ? 'glass_pane' : 'polished_deepslate');
roofStair(wx, roofBaseY + 4, wz, 'deepslate_tile_stairs', side === 'west' ? 'west' : (side === 'east' ? 'east' : (side === 'south' ? 'south' : 'north')));
var bx = (side === 'west') ? wx + 1 : ((side === 'east') ? wx - 1 : wx);
var bz = (side === 'south') ? wz - 1 : ((side === 'north') ? wz + 1 : wz);
for (yy = roofBaseY + 1; yy <= roofBaseY + 4; yy++) pb(bx, yy, bz, 'deepslate_tiles');
}
}
dormer(X0, 25, 'west');
dormer(35, Z1, 'south');
// chimney breast
fill(38, floor2Y, 21, 38, roofBaseY + 7, 21, noisePalette([{block:'bricks',weight:70},{block:'mud_bricks',weight:30}], {seed:31}));
ps(38, roofBaseY + 8, 21, 'brick_slab[type=bottom]');
pb(37, roofBaseY + 8, 21, 'air');
// === STAIRCASE (walk 12 -> walk 18) ===
var top = staircase(37, 33, walkY, walkY2, 'north', {width:1, material:'dark_oak_stairs', rail:true, support:'polished_deepslate'});
// === INTERIOR: SHOP (ground) ===
// bottle shelf wall along the back (north) wall
for (x = 26; x <= 36; x++) for (y = walkY; y <= walkY + 3; y++) {
pb(x, y, Z0 + 1, ((x + y) % 3 === 0) ? 'chiseled_bookshelf' : 'bookshelf');
}
for (x = 27; x <= 35; x += 2) ps(x, walkY + 4, Z0 + 1, 'dark_oak_slab[type=top]');
// counter run (base + overhanging top)
for (x = 27; x <= 35; x++) {
pb(x, walkY, 24, 'stripped_dark_oak_log[axis=x]');
ps(x, walkY + 1, 24, 'dark_oak_stairs[facing=south,half=top]');
}
pb(36, walkY, 24, 'stripped_dark_oak_log[axis=x]'); ps(36, walkY + 1, 24, 'dark_oak_stairs[facing=south,half=top]');
// apothecary kit behind the counter
ps(28, walkY, 22, 'brewing_stand'); ps(31, walkY, 22, 'brewing_stand'); ps(34, walkY, 22, 'cauldron[level=0]');
pb(29, walkY, 22, 'barrel'); pb(33, walkY, 22, 'barrel'); pb(35, walkY, 22, 'crafting_table');
ps(30, walkY, 22, 'composter'); ps(32, walkY + 1, 24, 'flower_pot'); ps(29, walkY + 1, 24, 'candle[candles=3]');
// shopper side: two small tables + chairs, carpet
for (x = 25; x <= 31; x++) for (z = 28; z <= 32; z++) if (inside(x, z) && insideK(x, z, 1)) pb(x, walkY, z, 'green_carpet');
pb(27, walkY, 30, 'dark_oak_fence'); ps(27, walkY + 1, 30, 'oak_pressure_plate');
chairStair(26, walkY, 30, 'dark_oak_stairs', 'east'); chairStair(28, walkY, 30, 'dark_oak_stairs', 'west');
pb(32, walkY, 31, 'dark_oak_fence'); ps(32, walkY + 1, 31, 'oak_pressure_plate');
chairStair(31, walkY, 31, 'dark_oak_stairs', 'east'); chairStair(33, walkY, 31, 'dark_oak_stairs', 'west');
// hanging lamps
var lampsG = [[27,28],[34,28],[30,23],[26,33]];
for (i = 0; i < lampsG.length; i++) {
ps(lampsG[i][0], floor2Y - 1, lampsG[i][1], 'chain[axis=y]');
ps(lampsG[i][0], floor2Y - 2, lampsG[i][1], 'lantern[hanging=true]');
}
// === INTERIOR: FLAT (upper) ===
placeBed(30, walkY2, 23, 'red', 'north');
pb(29, walkY2, 22, 'dark_oak_fence'); ps(29, walkY2 + 1, 22, 'oak_pressure_plate'); pb(29, walkY2 + 2, 22, 'lantern');
pb(26, walkY2, 31, 'dark_oak_fence'); ps(26, walkY2 + 1, 31, 'oak_pressure_plate');
chairStair(25, walkY2, 31, 'dark_oak_stairs', 'east'); chairStair(27, walkY2, 31, 'dark_oak_stairs', 'west');
for (x = 24; x <= 29; x++) for (z = 29; z <= 33; z++) if (insideK(x, z, 1)) pb(x, walkY2, z, 'light_gray_carpet');
// sofa facing the bay window
for (i = 0; i < 3; i++) chairStair(31 + i, walkY2, 32, 'spruce_stairs', 'south');
// hearth (campfire, no fire on solid blocks) under the chimney
ps(38, walkY2, 21, 'campfire[lit=true]');
pb(37, walkY2, 21, 'stone_bricks'); ps(37, walkY2 + 1, 21, 'stone_brick_slab[type=bottom]');
// study nook
for (x = 33; x <= 35; x++) for (y = walkY2; y <= walkY2 + 1; y++) pb(x, y, Z0 + 1, 'bookshelf');
pb(32, walkY2, 22, 'dark_oak_fence'); ps(32, walkY2 + 1, 22, 'dark_oak_slab[type=bottom]');
ps(32, walkY2, 23, 'dark_oak_trapdoor[facing=north,half=bottom,open=false]');
var lampsU = [[28,26],[33,29],[26,23]];
for (i = 0; i < lampsU.length; i++) {
ps(lampsU[i][0], roofBaseY - 1, lampsU[i][1], 'chain[axis=y]');
ps(lampsU[i][0], roofBaseY - 2, lampsU[i][1], 'lantern[hanging=true]');
}
// === EXTERIOR DETAIL ===
function streetLamp(lx, lz) {
var yy;
pb(lx, padY, lz, 'polished_deepslate');
for (yy = padY + 1; yy <= padY + 4; yy++) pb(lx, yy, lz, 'dark_oak_fence');
pb(lx, padY + 5, lz, 'polished_deepslate');
ps(lx - 1, padY + 5, lz, 'chain[axis=y]'); ps(lx - 1, padY + 4, lz, 'lantern[hanging=true]');
ps(lx + 1, padY + 5, lz, 'chain[axis=y]'); ps(lx + 1, padY + 4, lz, 'lantern[hanging=true]');
}
streetLamp(19, 33); streetLamp(31, 40);
function planter(px, pz) {
var dx2, dz2;
for (dx2 = 0; dx2 < 2; dx2++) for (dz2 = 0; dz2 < 2; dz2++) {
pb(px + dx2, padY, pz + dz2, 'polished_deepslate');
pb(px + dx2, padY + 1, pz + dz2, ((dx2 + dz2) % 2 === 0) ? 'flowering_azalea_leaves' : 'moss_block');
}
}
planter(19, 24); planter(19, 28); planter(37, 39); planter(41, 33);
// street trees
function streetTree(tx, tz) {
var yy, dx3, dz3;
for (yy = padY + 1; yy <= padY + 5; yy++) pb(tx, yy, tz, 'oak_log[axis=y]');
makeSphere(tx, padY + 6, tz, noisePalette([{block:'oak_leaves[persistent=true]',weight:70},{block:'azalea_leaves[persistent=true]',weight:30}], {seed:41}), 2.6, true);
for (dx3 = -1; dx3 <= 1; dx3++) for (dz3 = -1; dz3 <= 1; dz3++) pb(tx + dx3, padY, tz + dz3, 'coarse_dirt');
}
streetTree(18, 39); streetTree(43, 26);
// shop signs
ps(X0 - 1, 15, 27, 'dark_oak_wall_sign[facing=west]');
ps(34, 15, Z1 + 1, 'dark_oak_wall_sign[facing=south]');
// === FIX PASS: furnish the middle of the flat + crown the mansard ===
var fi, fx2, fz2;
// dining set in the middle of the living room (stairwell x36-38/z26-34 stays clear)
for (fx2 = 30; fx2 <= 33; fx2++) for (fz2 = 25; fz2 <= 27; fz2++) {
var cornerT = (fx2 === 30 || fx2 === 33) && (fz2 === 25 || fz2 === 27);
if (cornerT) pb(fx2, walkY2, fz2, 'dark_oak_fence');
else if (fz2 === 26 && fx2 > 30 && fx2 < 33) ps(fx2, walkY2 + 1, fz2, 'dark_oak_slab[type=bottom]');
if (!cornerT && fz2 === 26) ps(fx2, walkY2 + 1, fz2, 'dark_oak_slab[type=bottom]');
}
chairStair(29, walkY2, 26, 'dark_oak_stairs', 'east');
chairStair(34, walkY2, 26, 'dark_oak_stairs', 'west');
chairStair(31, walkY2, 24, 'dark_oak_stairs', 'south');
chairStair(32, walkY2, 28, 'dark_oak_stairs', 'north');
// wool rug under the table (carpet only in free cells)
for (fx2 = 28; fx2 <= 35; fx2++) for (fz2 = 23; fz2 <= 29; fz2++) {
if (fx2 >= 29 && fx2 <= 34 && fz2 >= 24 && fz2 <= 28) continue;
if (fx2 >= 36) continue;
if (insideK(fx2, fz2, 1)) pb(fx2, walkY2, fz2, 'brown_carpet');
}
// wardrobe + dresser + plants on the free wall
pb(34, walkY2, 21, 'dark_oak_planks'); pb(34, walkY2 + 1, 21, 'dark_oak_planks');
ps(34, walkY2, 22, 'dark_oak_door[facing=south,half=lower,hinge=left]');
ps(34, walkY2 + 1, 22, 'dark_oak_door[facing=south,half=upper,hinge=left]');
ps(33, walkY2, 21, 'barrel[facing=up]'); ps(32, walkY2, 21, 'barrel[facing=up]');
ps(33, walkY2 + 1, 21, 'red_carpet'); ps(32, walkY2 + 1, 21, 'red_carpet');
pb(26, walkY2, 26, 'dark_oak_fence'); ps(26, walkY2 + 1, 26, 'oak_pressure_plate'); ps(26, walkY2 + 2, 26, 'flower_pot');
pb(35, walkY2, 33, 'dark_oak_fence'); ps(35, walkY2 + 1, 33, 'flower_pot');
// chandelier over the table
ps(31, roofBaseY - 1, 26, 'chain[axis=y]');
pb(31, roofBaseY - 2, 26, 'dark_oak_fence');
ps(30, roofBaseY - 2, 26, 'lantern[hanging=true]'); ps(32, roofBaseY - 2, 26, 'lantern[hanging=true]');
ps(31, roofBaseY - 2, 25, 'lantern[hanging=true]'); ps(31, roofBaseY - 2, 27, 'lantern[hanging=true]');
// mansard CREST: copper cornice band + ridge cresting so the roof is not one dark mass
var copperPal = noisePalette([{block:'exposed_copper',weight:45},{block:'weathered_copper',weight:35},{block:'cut_copper',weight:20}], {seed:44, freq:0.2});
for (fx2 = X0 - 1; fx2 <= X1 + 1; fx2++) for (fz2 = Z0 - 1; fz2 <= Z1 + 1; fz2++) {
if (inside(fx2, fz2)) continue;
var tt = inside(fx2 + 1, fz2) || inside(fx2 - 1, fz2) || inside(fx2, fz2 + 1) || inside(fx2, fz2 - 1);
if (tt) pb(fx2, roofBaseY, fz2, copperPal(fx2, roofBaseY, fz2));
}
for (fx2 = X0; fx2 <= X1; fx2++) for (fz2 = Z0; fz2 <= Z1; fz2++) {
if (!insideK(fx2, fz2, 6)) continue;
ps(fx2, roofBaseY + 6, fz2, 'cut_copper_slab[type=bottom]');
if ((fx2 + fz2) % 2 === 0) pb(fx2, roofBaseY + 7, fz2, 'iron_bars');
}
pb(33, roofBaseY + 8, 28, 'lightning_rod');