← Back to Gallery

Loading 3D viewer…

Art Nouveau Corner Apothecary (guided)

by Jorge Barbero

Dimensions
64×48×64
Blocks
60,932
Compute Time
10.6s
Generation Time
6m 18s
Edits
1
Model
claude-opus-5
Created
August 30, 2026
autoevalguidedart_nouveaushopinterior
Prompt

User Prompt

an Art Nouveau corner apothecary shop: two-storey townhouse with a rounded corner bay, glazed deep-green tile facade with whiplash floral ironwork, tall arched shop windows with a curved glass canopy, upper floor with balcony, mansard slate roof; interior with a wooden counter, apothecary shelf wall of bottles, and a stair up to the flat above

Enhanced Prompt

guided condition: prepare_build + docs (build-rules Essential Build Rules, interior-design Furniture Catalog, block-palettes Gradient&Volume, small-builds, worldedit-api terrain superpowers + position palettes). Design written from scratch.

Photos

Exterior
Exteriorexterior
Botica
Boticainterior
Vivienda
Viviendainterior
Escalera
Escalerainterior
CraftScript Source
// === 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');

Static Renders

Art Nouveau Corner Apothecary (guided) isometric viewisometric
Art Nouveau Corner Apothecary (guided) front viewfront
Art Nouveau Corner Apothecary (guided) side viewside
Art Nouveau Corner Apothecary (guided) back viewback
Art Nouveau Corner Apothecary (guided) top viewtop