← Back to Gallery

Loading 3D viewer…

Mississippi paddle steamer (guided)

by Jorge Barbero

Dimensions
56×48×64
Blocks
46,357
Compute Time
2.1s
Generation Time
2m 58s
Edits
1
Model
claude-opus-5
Created
September 6, 2026
autoevalguidedvehiclesshipriver
Prompt

User Prompt

a Mississippi stern-wheel paddle steamer moored at a wooden levee: long white timber hull, three stacked decks with ornate gingerbread railings, a glazed pilot house on top, twin tall black smokestacks with crown tops, and a large red stern paddle wheel in its housing, over shallow brown river water

Photos

Vapor de ruedas
Vapor de ruedasexterior
Rueda de popa
Rueda de popaexterior
Gran salon
Gran saloninterior
Cubierta principal
Cubierta principalinterior
Timonera
Timonerainterior
CraftScript Source
// === 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');

Static Renders

Mississippi paddle steamer (guided) isometric viewisometric
Mississippi paddle steamer (guided) front viewfront
Mississippi paddle steamer (guided) side viewside
Mississippi paddle steamer (guided) back viewback
Mississippi paddle steamer (guided) top viewtop