← Back to Gallery

Loading 3D viewer…

Shibam tower house (guided)

by Jorge Barbero

Dimensions
72×52×64
Blocks
53,629
Compute Time
6.9s
Generation Time
5m 7s
Model
claude-opus-5
Created
September 6, 2026
autoevalguidedhousesdeserttower
Prompt

User Prompt

a Yemeni Hadhrami mud-brick tower house in the Shibam style: a tall narrow five-storey block of ochre rammed-earth walls tapering slightly upward, small deep-set windows framed with bright white gypsum trim, carved dark-wood shutters, a projecting wooden entrance door, a crenellated whitewashed parapet around a flat roof terrace, standing on a raised stone plinth above dusty desert ground; inside, stacked living floors with a furnished majlis and a stair shaft linking all levels

Photos

Exterior
Exteriorexterior
Majlis
Majlisinterior
Escalera
Escalerainterior
Zaguan
Zaguaninterior
CraftScript Source
// === 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);

Static Renders

Shibam tower house (guided) isometric viewisometric
Shibam tower house (guided) front viewfront
Shibam tower house (guided) side viewside
Shibam tower house (guided) back viewback
Shibam tower house (guided) top viewtop