← Back to Gallery

Loading 3D viewer…

Alpine narrow-gauge station (guided)

by Jorge Barbero

Dimensions
80×44×56
Blocks
70,985
Compute Time
27.6s
Generation Time
7m 23s
Edits
4
Model
claude-opus-5
Created
August 28, 2026
autoevalguidedarchitecturestation
Prompt

User Prompt

a narrow-gauge alpine railway station: two-storey dark-timber and cream stucco station building with a deep overhanging eave and a clock gable, a long platform canopy on cast-iron posts alongside the track, a ground-floor waiting room with benches and a stove, and a stationmaster's apartment upstairs reached by an internal staircase

Photos

Anden y marquesina
Anden y marquesinaexterior
Conjunto
Conjuntoexterior
Sala de espera
Sala de esperainterior
Taquilla y escalera
Taquilla y escalerainterior
Vivienda del jefe de estacion
Vivienda del jefe de estacioninterior
CraftScript Source
// === BUILD PLAN ===
// Style: Alpine narrow-gauge railway station (Swiss/Tyrolean chalet-station)
// Footprint: L-shape — main block 19x13 (x14..32, z12..24) + freight wing 13x9 (x32..44, z16..24)
//            + platform 43x9 + canopy on cast-iron posts + single narrow-gauge track
// Height: ground walls y10..14, upper walls y16..19, roof base y21, ridge y27
//
// GROUND FLOOR (top-down, Z down):
//   x14        x24      x32      x44
//   ####W##D###|###W#D##########       z12  (street side, N)
//   #  waiting #  ticket #freight#     z14
//   #  stove   #  desk  S#  crates#    z18   S = staircase up
//   #  benches #  bench  #  barrel#    z22
//   ###W##D##W#####W#####W########     z24  (platform side, S)
//   [======== PLATFORM (y9) ========]  z25..33
//   [====== TRACK / ballast ========]  z34..41
//
// SOUTH ELEVATION:
//         /\        <- ridge y27
//        /  \  /\   <- clock wall-dormer
//       / WW \/CL\
//      |=timber====|  <- upper storey dark boarding, y16..19
//      |__canopy___|  <- platform canopy y16 on iron posts
//      |#W##D##W##|   <- stucco + stone base, y10..14
//
// MATERIALS PLAN:
//   base   : gradientPalette deepslate_bricks -> cobblestone -> stone_bricks (y9..11) — grounds the build, patina
//   walls  : white_terracotta(50)+smooth_quartz(28)+polished_diorite(22) cream stucco — WHY light fill vs dark frame
//   frame  : dark_oak_log pilasters every 4 + sill band — WHY the CONTRAST that makes it read alpine
//   upper  : dark_oak_planks(55)+spruce_planks(25)+stripped_dark_oak_wood(20) boarding
//   roof   : dark_oak_stairs base + scattered spruce_stairs shingles, solid log ridge beam (no ridge gap)
//   accents: iron_bars posts, lanterns, trapdoor shutters, flower boxes, rails+gravel ballast
// Rooms: Waiting room (stove, benches, table, notice board, lantern), Ticket office (counter, barrel,
//        chest, desk), Freight wing (crates, hay, workbench), Upstairs bedroom + kitchen/living
// STAIR PLAN: walkY 10 -> walk2Y 16, delta 6 -> staircase(26,14,10,16,"south") = 7 cells inside office
// === END PLAN ===

var floorY = 9, walkY = 10, floor2Y = 15, walk2Y = 16, wallTopY = 20, roofBaseY = 21;
var MX1 = 14, MX2 = 32, MZ1 = 12, MZ2 = 24;
var WX1 = 32, WX2 = 44, WZ1 = 16, WZ2 = 24;
var wingTopY = 15, wingRoofY = 16;

// ============ TERRAIN ============
var land = blob(34, 24, 30, { irregularity: 0.35, seed: 12 });
var baseH = hills({ base: 8, amp: 3 });
var alpine = function (x, z) {
    var h = baseH(x, z);
    if (z < 10) h += (10 - z) * 0.30;          // gentle meadow slope behind the station (must NOT hide the facade)
    if (z > 44) h -= (z - 44) * 0.9;           // ground falls away into the valley beyond the track
    return h;
};
var pad = flatten(alpine, { x0: 4, z0: 8, x1: 56, z1: 44 }, 8, 7);
var grassMat = patches([{ block: "grass_block", w: 78 }, { block: "podzol", w: 14 }, { block: "coarse_dirt", w: 8 }], 0.05, 5);
var mat = function (x, z) {
    var h = pad(x, z);
    if (h > 14) return "stone";
    if (h > 12) return (((x * 3 + z * 5) % 7) === 0) ? "stone" : grassMat(x, z);
    return grassMat(x, z);
};
surface(land, pad, mat, { sub: "dirt", deep: "stone", depth: 4 });

// ============ CLEAR ============
fill(6, 9, 10, 52, 30, 42, "air");            // guarantee no ground intrudes on the pad

// ============ PLINTH ============
var baseGrad = gradientPalette(floorY - 1, floorY + 2, [
    { block: "deepslate_bricks", from: 0 },
    { block: "cobblestone", from: 0.4 },
    { block: "stone_bricks", from: 0.75 }
], { noise: 0.25 });
fill(MX1 - 1, floorY - 1, MZ1 - 1, MX2 + 1, floorY, MZ2 + 1, baseGrad);
fill(WX1, floorY - 1, WZ1 - 1, WX2 + 1, floorY, WZ2 + 1, baseGrad);
// decorative floors
fill(MX1 + 1, floorY, MZ1 + 1, MX2 - 1, floorY, MZ2 - 1, noisePalette([
    { block: "spruce_planks", weight: 60 }, { block: "dark_oak_planks", weight: 25 }, { block: "stripped_spruce_log", weight: 15 }]));
fill(WX1 + 1, floorY, WZ1 + 1, WX2 - 1, floorY, WZ2 - 1, noisePalette([
    { block: "stone_bricks", weight: 55 }, { block: "andesite", weight: 25 }, { block: "cobblestone", weight: 20 }]));

// ============ GROUND WALLS ============
var stucco = noisePalette([
    { block: "white_terracotta", weight: 50 }, { block: "smooth_quartz", weight: 28 }, { block: "polished_diorite", weight: 22 }]);
var stoneMix = noisePalette([
    { block: "stone_bricks", weight: 50 }, { block: "mossy_stone_bricks", weight: 25 }, { block: "cobblestone", weight: 25 }]);

// shell
fill(MX1, walkY, MZ1, MX2, wallTopY - 6, MZ2, stucco);          // solid box, hollowed next
fill(MX1, walkY, MZ1, MX2, floor2Y - 1, MZ2, stucco);
fill(MX1 + 1, walkY, MZ1 + 1, MX2 - 1, floor2Y - 1, MZ2 - 1, "air");
// stone base rows (2 rows, 1 block PROUD for depth)
fill(MX1 - 1, walkY, MZ1 - 1, MX2 + 1, walkY + 1, MZ2 + 1, stoneMix);
fill(MX1, walkY, MZ1, MX2, walkY + 1, MZ2, stoneMix);
fill(MX1 + 1, walkY, MZ1 + 1, MX2 - 1, walkY + 1, MZ2 - 1, "air");
// timber pilasters every 4 + corner posts
var px, pz;
for (px = MX1; px <= MX2; px += 4) {
    fill(px, walkY + 2, MZ1, px, floor2Y - 1, MZ1, "dark_oak_log[axis=y]");
    fill(px, walkY + 2, MZ2, px, floor2Y - 1, MZ2, "dark_oak_log[axis=y]");
}
for (pz = MZ1; pz <= MZ2; pz += 4) {
    fill(MX1, walkY + 2, pz, MX1, floor2Y - 1, pz, "dark_oak_log[axis=y]");
    fill(MX2, walkY + 2, pz, MX2, floor2Y - 1, pz, "dark_oak_log[axis=y]");
}
// sill band under the first floor (cornice, proud by 1)
fill(MX1 - 1, floor2Y - 1, MZ1 - 1, MX2 + 1, floor2Y - 1, MZ2 + 1, "stripped_dark_oak_wood");
fill(MX1, floor2Y - 1, MZ1, MX2, floor2Y - 1, MZ2, "dark_oak_log[axis=x]");
fill(MX1 + 1, floor2Y - 1, MZ1 + 1, MX2 - 1, floor2Y - 1, MZ2 - 1, "air");

// ============ WINDOWS_DOORS ============
function tallWindow(x, y, z, facing) {
    // recessed 1 block + glass + shutters + sill
    fill(x, y, z, x, y + 1, z, "air");
    ps(x, y, z, "glass_pane");
    ps(x, y + 1, z, "glass_pane");
    ps(x, y + 2, z, "dark_oak_slab[type=bottom]");
    pb(x, y - 1, z, "spruce_slab");
    ps(x - 1, y + 1, z, "dark_oak_trapdoor[facing=" + facing + ",half=upper,open=true]");
    ps(x + 1, y + 1, z, "dark_oak_trapdoor[facing=" + facing + ",half=upper,open=true]");
}
var wx;
for (wx = 16; wx <= 30; wx += 3) {
    if (wx !== 19 && wx !== 28 && wx !== 22) { tallWindow(wx, walkY + 2, MZ2, "south"); tallWindow(wx, walkY + 2, MZ1, "north"); }
}
tallWindow(MX1, walkY + 2, 15, "west"); tallWindow(MX1, walkY + 2, 21, "west");
// platform door
fill(19, walkY, MZ2, 19, walkY + 1, MZ2, "air");
ps(19, walkY, MZ2, "dark_oak_door[facing=south,half=lower,hinge=left]");
ps(19, walkY + 1, MZ2, "dark_oak_door[facing=south,half=upper,hinge=left]");
// street door (north)
fill(28, walkY, MZ1, 28, walkY + 1, MZ1, "air");
ps(28, walkY, MZ1, "dark_oak_door[facing=north,half=lower,hinge=right]");
ps(28, walkY + 1, MZ1, "dark_oak_door[facing=north,half=upper,hinge=right]");
// ticket window on the platform side
fill(22, walkY + 2, MZ2, 22, walkY + 3, MZ2, "air");
ps(22, walkY + 2, MZ2, "iron_bars"); ps(22, walkY + 3, MZ2, "iron_bars");
pb(22, walkY + 1, MZ2, "spruce_slab");

// ============ UPPER_FLOOR ============
var boarding = noisePalette([
    { block: "dark_oak_planks", weight: 55 }, { block: "spruce_planks", weight: 25 }, { block: "stripped_dark_oak_wood", weight: 20 }]);
fill(MX1, floor2Y, MZ1, MX2, floor2Y, MZ2, "spruce_planks");                 // first-floor deck
fill(MX1, walk2Y, MZ1, MX2, wallTopY - 1, MZ2, boarding);
fill(MX1 + 1, walk2Y, MZ1 + 1, MX2 - 1, wallTopY - 1, MZ2 - 1, "air");
// vertical boarding rhythm: log studs every 3
for (px = MX1 + 1; px < MX2; px += 3) {
    fill(px, walk2Y, MZ1, px, wallTopY - 1, MZ1, "dark_oak_log[axis=y]");
    fill(px, walk2Y, MZ2, px, wallTopY - 1, MZ2, "dark_oak_log[axis=y]");
}
// upper windows + flower boxes
for (wx = 17; wx <= 30; wx += 3) {
    fill(wx, walk2Y + 1, MZ2, wx, walk2Y + 2, MZ2, "air");
    ps(wx, walk2Y + 1, MZ2, "glass_pane"); ps(wx, walk2Y + 2, MZ2, "glass_pane");
    pb(wx, walk2Y, MZ2, "spruce_slab");
    fill(wx, walk2Y + 1, MZ1, wx, walk2Y + 2, MZ1, "air");
    ps(wx, walk2Y + 1, MZ1, "glass_pane"); ps(wx, walk2Y + 2, MZ1, "glass_pane");
}
// south balcony on brackets (wall depth + charm)
fill(MX1 + 2, walk2Y - 1, MZ2 + 1, MX2 - 2, walk2Y - 1, MZ2 + 1, "spruce_slab[type=top]");
for (px = MX1 + 2; px <= MX2 - 2; px += 3) roofStair(px, walk2Y - 2, MZ2 + 1, "spruce_stairs", "south", "top");
for (px = MX1 + 2; px <= MX2 - 2; px++) pb(px, walk2Y, MZ2 + 1, "spruce_fence");
fill(MX1 + 2, walk2Y + 1, MZ2 + 1, MX2 - 2, walk2Y + 1, MZ2 + 1, "dark_oak_slab[type=bottom]");

// ============ ROOF ============
placeGableRoofNS(MX1, MX2, MZ1, MZ2, roofBaseY, "dark_oak_stairs", "dark_oak_slab", "dark_oak_planks");
// shingle variation (same helper, facing preserved)
var halfD = Math.ceil((MZ2 - MZ1 + 1) / 2), st;
for (px = MX1 - 1; px <= MX2 + 1; px++) {
    for (st = 0; st < halfD; st++) {
        if (((px * 7 + st * 13) % 3) === 0) {
            roofStair(px, roofBaseY + st, MZ1 - 1 + st, "spruce_stairs", "north");
            roofStair(px, roofBaseY + st, MZ2 + 1 - st, "spruce_stairs", "south");
        }
    }
}
// SOLID ridge beam (never a top-slab -> no ridge gap)
fill(MX1 - 1, roofBaseY + halfD - 1, MZ1 + halfD - 1, MX2 + 1, roofBaseY + halfD - 1, MZ1 + halfD - 1, "stripped_dark_oak_wood");
// deep alpine eave: extra course + brackets
for (px = MX1 - 2; px <= MX2 + 2; px++) {
    ps(px, roofBaseY - 1, MZ1 - 2, "dark_oak_slab[type=top]");
    ps(px, roofBaseY - 1, MZ2 + 2, "dark_oak_slab[type=top]");
    ps(px, roofBaseY, MZ1 - 2, "dark_oak_stairs[facing=south,half=bottom]");
    ps(px, roofBaseY, MZ2 + 2, "dark_oak_stairs[facing=north,half=bottom]");
}
for (px = MX1; px <= MX2; px += 3) {
    ps(px, roofBaseY - 2, MZ2 + 1, "spruce_stairs[facing=north,half=top]");
    ps(px, roofBaseY - 2, MZ1 - 1, "spruce_stairs[facing=south,half=top]");
}

// ============ CLOCK_DORMER ============
fill(21, walk2Y, MZ2, 25, roofBaseY, MZ2, boarding);          // dormer face carried up the wall plane
placeGableRoof(21, 25, 19, MZ2, roofBaseY, "dark_oak_stairs", "dark_oak_slab", "dark_oak_planks");
fill(20, roofBaseY + 2, MZ2, 26, roofBaseY + 2, MZ2, "stripped_dark_oak_wood");
// clock face
pb(23, roofBaseY, MZ2 + 1, "white_concrete");
pb(22, roofBaseY + 1, MZ2 + 1, "white_concrete");
pb(23, roofBaseY + 1, MZ2 + 1, "black_concrete");
pb(24, roofBaseY + 1, MZ2 + 1, "white_concrete");
pb(23, roofBaseY + 2, MZ2 + 1, "white_concrete");
// dormer window under the clock
fill(22, walk2Y + 1, MZ2, 24, walk2Y + 2, MZ2, "air");
fill(22, walk2Y + 1, MZ2, 24, walk2Y + 2, MZ2, "glass_pane");
pb(23, walk2Y, MZ2, "spruce_slab");

// ============ WING ============
fill(WX1, walkY, WZ1, WX2, wingTopY - 1, WZ2, stoneMix);
fill(WX1 + 1, walkY, WZ1 + 1, WX2 - 1, wingTopY - 1, WZ2 - 1, "air");
for (pz = WZ1; pz <= WZ2; pz += 4) {
    fill(WX2, walkY, pz, WX2, wingTopY - 1, pz, "dark_oak_log[axis=y]");
}
for (px = WX1 + 4; px <= WX2; px += 4) {
    fill(px, walkY, WZ1, px, wingTopY - 1, WZ1, "dark_oak_log[axis=y]");
    fill(px, walkY, WZ2, px, wingTopY - 1, WZ2, "dark_oak_log[axis=y]");
}
// big freight doors on the platform side
fill(36, walkY, WZ2, 39, walkY + 3, WZ2, "air");
fill(36, walkY, WZ2, 39, walkY + 3, WZ2, "dark_oak_planks");
fill(36, walkY, WZ2, 39, walkY + 2, WZ2, "air");
ps(36, walkY + 2, WZ2, "dark_oak_slab[type=top]"); ps(39, walkY + 2, WZ2, "dark_oak_slab[type=top]");
fill(37, walkY, WZ2, 38, walkY + 2, WZ2, "air");
// wing windows
tallWindow(34, walkY + 1, WZ1, "north"); tallWindow(42, walkY + 1, WZ1, "north");
tallWindow(WX2, walkY + 1, 20, "east");
// interior door main<->wing
fill(WX1, walkY, 20, WX1, walkY + 1, 21, "air");
// wing roof
placeGableRoofNS(WX1, WX2, WZ1, WZ2, wingRoofY, "dark_oak_stairs", "dark_oak_slab", "dark_oak_planks");
fill(WX1 - 1, wingRoofY + 4, WZ1 + 4, WX2 + 1, wingRoofY + 4, WZ1 + 4, "stripped_dark_oak_wood");

// ============ STAIRS ============
var top = staircase(26, 14, walkY, walk2Y, "south", { width: 1, material: "spruce_stairs", support: "spruce_planks", rail: true });

// ============ INTERIOR_GROUND ============
// partition waiting room / office
fill(24, walkY, MZ1 + 1, 24, floor2Y - 1, MZ2 - 1, noisePalette([{ block: "spruce_planks", weight: 70 }, { block: "dark_oak_planks", weight: 30 }]));
fill(24, walkY, 21, 24, walkY + 1, 22, "air");
// -- waiting room (x15..23, z13..23)
fill(16, walkY, 14, 22, walkY, 22, "air");
// stove + flue
pb(16, walkY, 14, "furnace[facing=east,lit=true]");
fill(16, walkY + 1, 14, 16, floor2Y + 4, 14, "bricks");
pb(17, walkY, 14, "cauldron");
// benches along the walls
var i;
for (i = 0; i < 5; i++) chairStair(16 + i, walkY, 22, "spruce_stairs", "north");
for (i = 0; i < 4; i++) chairStair(15, walkY, 17 + i, "spruce_stairs", "east");
// table + chairs
pb(20, walkY, 18, "spruce_fence"); pb(20, walkY + 1, 18, "oak_pressure_plate");
chairStair(19, walkY, 18, "dark_oak_stairs", "east");
chairStair(21, walkY, 18, "dark_oak_stairs", "west");
// rug
fill(18, walkY, 17, 22, walkY, 19, "red_carpet");
pb(20, walkY, 18, "spruce_fence"); pb(20, walkY + 1, 18, "oak_pressure_plate");
// notice board + timetable
ps(18, walkY + 2, MZ1 + 1, "oak_wall_sign[facing=south]");
ps(19, walkY + 2, MZ1 + 1, "oak_wall_sign[facing=south]");
ps(20, walkY + 2, MZ1 + 1, "oak_wall_sign[facing=south]");
// lighting
pb(19, floor2Y - 1, 18, "chain[axis=y]"); ps(19, floor2Y - 2, 18, "lantern[hanging=true]");
pb(17, floor2Y - 1, 20, "chain[axis=y]"); ps(17, floor2Y - 2, 20, "lantern[hanging=true]");
// -- ticket office (x25..31, z13..23)
pb(29, walkY, 22, "stripped_oak_log"); ps(29, walkY + 1, 22, "spruce_stairs[facing=north,half=top]");
pb(30, walkY, 22, "stripped_oak_log"); ps(30, walkY + 1, 22, "spruce_stairs[facing=north,half=top]");
pb(31, walkY, 22, "barrel[facing=up]");
pb(30, walkY, 21, "chest[facing=west]");
ps(29, walkY, 20, "lectern[facing=east]");
chairStair(28, walkY, 20, "dark_oak_stairs", "east");
pb(31, walkY, 14, "bookshelf"); pb(31, walkY + 1, 14, "bookshelf");
pb(30, walkY, 14, "crafting_table");
fill(28, walkY, 15, 31, walkY, 16, "brown_carpet");
pb(29, floor2Y - 1, 18, "chain[axis=y]"); ps(29, floor2Y - 2, 18, "lantern[hanging=true]");
// -- freight wing
pb(34, walkY, 18, "barrel[facing=up]"); pb(34, walkY + 1, 18, "barrel[facing=up]");
pb(35, walkY, 18, "barrel[facing=up]");
fill(41, walkY, 18, 42, walkY + 1, 19, "hay_block[axis=y]");
pb(40, walkY, 22, "chest[facing=north]"); pb(41, walkY, 22, "chest[facing=north]");
ps(36, walkY, 18, "smithing_table");
pb(37, walkY, 18, "crafting_table");
pb(38, wingTopY - 1, 20, "chain[axis=y]"); ps(38, wingTopY - 2, 20, "lantern[hanging=true]");
pb(34, walkY, 21, "cartography_table");

// ============ INTERIOR_UPPER ============
fill(22, walk2Y, MZ1 + 1, 22, wallTopY - 1, MZ2 - 1, "spruce_planks");
fill(22, walk2Y, 17, 22, walk2Y + 1, 18, "air");
// bedroom (west)
placeBed(17, walk2Y, 20, "red", "north");
pb(16, walk2Y, 20, "spruce_fence"); ps(16, walk2Y + 1, 20, "oak_pressure_plate"); pb(16, walk2Y + 2, 20, "lantern");
fill(18, walk2Y, 16, 21, walk2Y, 18, "light_gray_carpet");
ps(20, walk2Y, MZ1 + 1, "oak_door[facing=south,half=lower,hinge=left]");
ps(20, walk2Y + 1, MZ1 + 1, "oak_door[facing=south,half=upper,hinge=left]");   // wardrobe front
pb(20, walk2Y, MZ1 + 2, "spruce_planks");
pb(15, walk2Y, 14, "barrel[facing=up]");
pb(19, wallTopY - 1, 19, "chain[axis=y]"); ps(19, wallTopY - 2, 19, "lantern[hanging=true]");
// living / kitchen (east)
pb(25, walk2Y, 14, "stripped_spruce_log"); ps(25, walk2Y + 1, 14, "spruce_stairs[facing=south,half=top]");
ps(26, walk2Y, 14, "furnace[facing=south,lit=false]"); ps(26, walk2Y + 1, 14, "iron_trapdoor[facing=south,half=bottom]");
pb(27, walk2Y, 14, "stripped_spruce_log"); ps(27, walk2Y + 1, 14, "spruce_stairs[facing=south,half=top]");
ps(28, walk2Y + 1, 14, "water_cauldron[level=3]");
pb(29, walk2Y, 14, "barrel[facing=up]");
pb(27, walk2Y, 17, "dark_oak_fence"); pb(27, walk2Y + 1, 17, "spruce_slab[type=bottom]");
chairStair(26, walk2Y, 17, "spruce_stairs", "east");
chairStair(28, walk2Y, 17, "spruce_stairs", "west");
for (i = 0; i < 3; i++) chairStair(28 + i, walk2Y, 22, "dark_oak_stairs", "north");
fill(25, walk2Y, 19, 30, walk2Y, 21, "brown_carpet");
for (i = 0; i < 4; i++) { pb(31, walk2Y, 17 + i, "bookshelf"); pb(31, walk2Y + 1, 17 + i, "bookshelf"); }
pb(28, wallTopY - 1, 19, "chain[axis=y]"); ps(28, wallTopY - 2, 19, "lantern[hanging=true]");
pb(25, wallTopY - 1, 21, "chain[axis=y]"); ps(25, wallTopY - 2, 21, "lantern[hanging=true]");

// ============ PLATFORM_CANOPY ============
var slabMix = noisePalette([{ block: "stone_bricks", weight: 45 }, { block: "andesite", weight: 30 }, { block: "smooth_stone", weight: 25 }]);
fill(8, floorY - 1, 25, 50, floorY, 33, slabMix);
fill(8, floorY, 33, 50, floorY, 33, "polished_andesite");     // platform edge line
for (px = 8; px <= 50; px++) ps(px, floorY + 1, 34, "stone_brick_slab[type=bottom]");
// canopy deck at y=16 on iron posts
for (px = 10; px <= 48; px++) {
    for (pz = 26; pz <= 33; pz++) {
        if (px < 33 || pz >= 26) ps(px, walk2Y, pz, "dark_oak_slab[type=top]");
    }
    ps(px, walk2Y, 25, "dark_oak_slab[type=top]");
    roofStair(px, walk2Y, 34, "spruce_stairs", "south");
}
for (px = 11; px <= 47; px += 6) {
    fill(px, walkY, 32, px, walk2Y - 1, 32, "iron_bars");
    ps(px, walk2Y - 1, 31, "dark_oak_stairs[facing=north,half=top]");
    pb(px, walk2Y - 1, 33, "dark_oak_fence");
    if (px < 14 || px > 32) { fill(px, walkY, 26, px, walk2Y - 1, 26, "iron_bars"); }
    ps(px, walk2Y - 1, 30, "lantern[hanging=true]");
    pb(px, walk2Y - 2, 30, "air");
}
for (px = 11; px <= 47; px += 6) { pb(px, walk2Y - 1, 30, "chain[axis=y]"); ps(px, walk2Y - 2, 30, "lantern[hanging=true]"); }
// station name board + platform clutter
ps(24, walkY + 2, 30, "oak_wall_sign[facing=south]");
pb(24, walkY, 30, "spruce_fence"); pb(24, walkY + 1, 30, "spruce_fence");
pb(33, walkY, 29, "barrel[facing=up]"); pb(33, walkY + 1, 29, "barrel[facing=up]"); pb(34, walkY, 29, "barrel[facing=up]");
pb(43, walkY, 28, "hay_block[axis=y]"); pb(44, walkY, 28, "hay_block[axis=y]"); pb(43, walkY + 1, 28, "hay_block[axis=y]");
for (i = 0; i < 3; i++) chairStair(14 + i * 6, walkY, 28, "spruce_stairs", "north");

// ============ TRACK ============
fill(4, floorY - 1, 35, 56, floorY - 1, 41, "gravel");
fill(4, floorY, 35, 56, floorY, 41, "gravel");
for (px = 4; px <= 56; px++) {
    if ((px % 2) === 0) fill(px, floorY, 36, px, floorY, 39, "stripped_spruce_wood[axis=x]");
    ps(px, floorY + 1, 36, "rail[shape=east_west]");
    ps(px, floorY + 1, 39, "rail[shape=east_west]");
}
// signal post at the end of the platform
fill(52, floorY + 1, 33, 52, floorY + 6, 33, "dark_oak_fence");
pb(52, floorY + 6, 34, "red_concrete"); pb(52, floorY + 5, 34, "lime_concrete");
ps(52, floorY + 7, 33, "lantern");

// ============ EXTERIOR ============
// forecourt path on the street side
var pathMat = noisePalette([{ block: "gravel", weight: 45 }, { block: "cobblestone", weight: 30 }, { block: "andesite", weight: 25 }]);
fill(26, 8, 4, 30, 8, MZ1 - 1, pathMat);
fill(14, 8, 9, 46, 8, 11, pathMat);
// lamp posts (post + lantern, never floating)
function lamp(x, z) {
    fill(x, 9, z, x, 12, z, "dark_oak_fence");
    pb(x, 13, z, "lantern");
    pb(x, 9, z, "cobblestone_wall");
}
lamp(12, 10); lamp(34, 10); lamp(24, 6);
// fence + flower beds along the forecourt
for (px = 10; px <= 48; px += 2) { if (px < 26 || px > 30) { pb(px, 9, 8, "spruce_fence"); } }
for (px = 15; px <= 45; px += 5) {
    pb(px, 9, 9, "flower_pot");
    pb(px + 1, 9, 9, "potted_red_tulip");
}
var fx, fz, fpick, flowers = ["short_grass", "poppy", "oxeye_daisy", "dandelion", "cornflower"];
for (fx = 6; fx <= 62; fx++) {
    for (fz = 2; fz <= 8; fz++) {
        if (((fx * 13 + fz * 29) % 7) === 0) {
            fpick = flowers[(fx + fz) % 5];
            pb(fx, Math.round(pad(fx, fz)) + 1, fz, fpick);
        }
    }
}
for (fx = 6; fx <= 62; fx += 3) {
    for (fz = 42; fz <= 50; fz += 2) {
        if (((fx + fz) % 4) === 0) pb(fx, Math.round(pad(fx, fz)) + 1, fz, flowers[(fx + fz) % 5]);
    }
}
// alpine spruces on the slope behind
function spruce(x, z, h) {
    var gy = Math.round(pad(x, z)) + 1;
    fill(x, gy, z, x, gy + h, z, "spruce_log[axis=y]");
    var r, ly;
    for (ly = 0; ly < h; ly++) {
        r = (ly % 3 === 0) ? 2 : 1;
        if (ly > h - 3) r = 1;
        fill(x - r, gy + 2 + ly, z - r, x + r, gy + 2 + ly, z + r, "spruce_leaves[persistent=true]");
    }
    pb(x, gy + h + 1, z, "spruce_leaves[persistent=true]");
}
spruce(9, 5, 6); spruce(17, 3, 7); spruce(30, 2, 6); spruce(44, 4, 7); spruce(52, 8, 6);
spruce(58, 16, 7); spruce(60, 30, 6); spruce(6, 20, 6); spruce(4, 34, 7);
// a couple of boulders for texture
makeSphere(62, 9, 22, "cobblestone", 3, true);
makeSphere(3, 9, 12, "mossy_cobblestone", 2, true);


// ============ FIX_WALLHEAD ============
// Desde dentro se colaba el cielo: faltaba la hilada de coronacion entre el remate
// del muro (y19) y el arranque del faldon (y21/y22 sobre el plano de fachada).
fill(MX1, wallTopY, MZ1, MX2, wallTopY + 1, MZ2, boarding);
fill(MX1 + 1, wallTopY, MZ1 + 1, MX2 - 1, wallTopY + 1, MZ2 - 1, "air");
for (px = MX1 + 1; px < MX2; px += 3) {
    pb(px, wallTopY, MZ1, "dark_oak_log[axis=y]");
    pb(px, wallTopY, MZ2, "dark_oak_log[axis=y]");
}
fill(WX1, wingTopY, WZ1, WX2, wingTopY + 1, WZ2, stoneMix);
fill(WX1 + 1, wingTopY, WZ1 + 1, WX2 - 1, wingTopY + 1, WZ2 - 1, "air");

Static Renders

Alpine narrow-gauge station (guided) isometric viewisometric
Alpine narrow-gauge station (guided) front viewfront
Alpine narrow-gauge station (guided) side viewside
Alpine narrow-gauge station (guided) back viewback
Alpine narrow-gauge station (guided) top viewtop