// === BUILD PLAN ===
// Style: Alpine narrow-gauge station, T-plan with corner clock tower (cream plaster + half-timber + slate)
// Footprint: T — main 2-storey block 19x13 (x26..44,z22..34) + booking/waiting hall wing 11x10
// (x30..40,z34..44) + 5x5 clock tower (x44..48,z22..26) + detached goods shed (x8..18,z22..30)
// Track + platform + canopy run along the NORTH face (z4..21)
// Height: ground walls y10..14, upper y16..19, main ridge y27, tower spire y30
//
// GROUND FLOOR (top-down, Z down):
// ==== TRACK (z4..12) ====
// [======= PLATFORM z14..20, canopy y16 on iron posts =======]
// x26 x44 x48
// ####W###D####W#####|TOWER| z22 D = platform door
// # booking hall #park.# # z25
// # # STAIR# z29 (placeStairwell 5x5 at x38..42,z28..32)
// ####W####D#####W#### z34 junction sealed to wing
// # waiting # z36
// # hall+stove# z40
// ####W##D##W### z44 street entrance
//
// MATERIALS PLAN:
// base : gradientPalette cobbled_deepslate -> andesite -> stone_bricks (y9..11) — WHY plinth/shadow
// walls : white_terracotta(45)+calcite(30)+smooth_quartz(25) cream plaster — light fill
// frame : dark_oak_log half-timber GRID on the upper storey — WHY dark/light contrast = alpine
// roof : deepslate_tile_stairs(60)+cobbled_deepslate_stairs(40) grey slate + solid ridge beam
// accents: iron_bars canopy posts, lanterns, spruce trapdoor shutters, rails on gravel ballast
// Rooms: booking hall (counter, benches, lectern, rug), parcel office (crates, chest, table),
// waiting hall (stove, benches, table, rug, lanterns), upstairs bedroom + parlour (shelfWall)
// STAIR PLAN: placeStairwell(38,28, walkY10 -> floor2Y15, spruce_stairs) U-turn 5x5 inside the main block
// === END PLAN ===
var floorY = 9, walkY = 10, floor2Y = 15, walk2Y = 16, wallTopY = 20, roofBaseY = 21;
var MX1 = 26, MX2 = 44, MZ1 = 22, MZ2 = 34;
var GX1 = 30, GX2 = 40, GZ1 = 34, GZ2 = 44, gTopY = 15, gRoofY = 16;
var TX1 = 44, TX2 = 48, TZ1 = 22, TZ2 = 26, tTopY = 25;
var SX1 = 8, SX2 = 18, SZ1 = 22, SZ2 = 30;
// ============ TERRAIN ============
var gh = terrain({
cx: 34, cz: 24, radius: 34, baseY: 8, amp: 3, scale: 0.035, seed: 21, irregularity: 0.35,
surface: [{ block: "grass_block", w: 74 }, { block: "podzol", w: 16 }, { block: "coarse_dirt", w: 10 }],
sub: "dirt", deep: "stone", depth: 4,
pads: [{ cx: 34, cz: 16, r: 32, y: 8, falloff: 8 }, { cx: 35, cz: 36, r: 20, y: 8, falloff: 8 }]
});
fill(4, 9, 4, 66, 32, 48, "air"); // no ground inside the built envelope
// ============ PALETTES ============
var plaster = noisePalette([
{ block: "white_terracotta", weight: 45 }, { block: "calcite", weight: 30 }, { block: "smooth_quartz", weight: 25 }]);
var plinth = gradientPalette(floorY - 1, floorY + 2, [
{ block: "cobbled_deepslate", from: 0 }, { block: "andesite", from: 0.45 }, { block: "stone_bricks", from: 0.8 }], { noise: 0.25 });
var slate = noisePalette([{ block: "deepslate_tile_stairs", weight: 60 }, { block: "cobbled_deepslate_stairs", weight: 40 }]);
var deck = noisePalette([{ block: "stone_bricks", weight: 40 }, { block: "andesite", weight: 32 }, { block: "smooth_stone", weight: 28 }]);
// ============ TRACK ============
var i, x, z, y;
fill(0, floorY - 1, 4, 70, floorY, 12, "gravel");
for (x = 0; x <= 70; x++) {
if ((x % 2) === 0) fill(x, floorY, 7, x, floorY, 10, "stripped_spruce_wood[axis=x]");
ps(x, floorY + 1, 7, "rail[shape=east_west]");
ps(x, floorY + 1, 10, "rail[shape=east_west]");
}
// ============ PLATFORM ============
fill(6, floorY - 1, 13, 64, floorY, 20, deck);
fill(6, floorY, 13, 64, floorY, 13, "polished_andesite"); // painted edge line
for (x = 6; x <= 64; x++) ps(x, floorY + 1, 12, "stone_brick_slab[type=bottom]");
// ============ CANOPY ============
for (x = 12; x <= 58; x++) {
for (z = 13; z <= 21; z++) ps(x, walk2Y, z, "deepslate_tile_slab[type=top]");
roofStair(x, walk2Y, 12, slate(x, 0, 12), "north");
roofStair(x, walk2Y, 22, slate(x, 0, 22), "south");
}
for (x = 13; x <= 57; x += 6) {
fill(x, walkY, 14, x, walk2Y - 1, 14, "iron_bars");
fill(x, walkY, 20, x, walk2Y - 1, 20, "iron_bars");
ps(x, walk2Y - 1, 15, "dark_oak_stairs[facing=north,half=top]");
ps(x, walk2Y - 1, 19, "dark_oak_stairs[facing=south,half=top]");
pb(x, walk2Y - 1, 17, "chain[axis=y]"); ps(x, walk2Y - 2, 17, "lantern[hanging=true]");
}
// ============ MAIN_BLOCK ============
fill(MX1 - 1, floorY - 1, MZ1 - 1, MX2 + 1, floorY, MZ2 + 1, plinth);
fill(MX1 + 1, floorY, MZ1 + 1, MX2 - 1, floorY, MZ2 - 1, noisePalette([
{ block: "spruce_planks", weight: 60 }, { block: "dark_oak_planks", weight: 20 }, { block: "stripped_spruce_log", weight: 20 }]));
fill(MX1, walkY, MZ1, MX2, floor2Y - 1, MZ2, plaster);
fill(MX1 + 1, walkY, MZ1 + 1, MX2 - 1, floor2Y - 1, MZ2 - 1, "air");
// stone base course, proud by 1
fill(MX1 - 1, walkY, MZ1 - 1, MX2 + 1, walkY + 1, MZ2 + 1, noisePalette([
{ block: "stone_bricks", weight: 55 }, { block: "mossy_stone_bricks", weight: 20 }, { block: "andesite", weight: 25 }]));
fill(MX1, walkY, MZ1, MX2, walkY + 1, MZ2, "stone_bricks");
fill(MX1 + 1, walkY, MZ1 + 1, MX2 - 1, walkY + 1, MZ2 - 1, "air");
// corner quoins + pilasters
for (x = MX1; x <= MX2; x += 6) {
fill(x, walkY + 2, MZ1, x, floor2Y - 1, MZ1, "polished_andesite");
fill(x, walkY + 2, MZ2, x, floor2Y - 1, MZ2, "polished_andesite");
}
// first-floor deck + cornice band
fill(MX1, floor2Y, MZ1, MX2, floor2Y, MZ2, "spruce_planks");
fill(MX1 - 1, floor2Y - 1, MZ1 - 1, MX2 + 1, floor2Y - 1, MZ2 + 1, "spruce_slab[type=top]");
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");
// upper storey: plaster panels inside a HALF-TIMBER grid
fill(MX1, walk2Y, MZ1, MX2, wallTopY - 1, MZ2, plaster);
fill(MX1 + 1, walk2Y, MZ1 + 1, MX2 - 1, wallTopY - 1, MZ2 - 1, "air");
for (x = MX1; x <= MX2; x += 3) {
fill(x, walk2Y, MZ1, x, wallTopY - 1, MZ1, "dark_oak_log[axis=y]");
fill(x, walk2Y, MZ2, x, wallTopY - 1, MZ2, "dark_oak_log[axis=y]");
}
for (z = MZ1; z <= MZ2; z += 3) {
fill(MX1, walk2Y, z, MX1, wallTopY - 1, z, "dark_oak_log[axis=y]");
fill(MX2, walk2Y, z, MX2, wallTopY - 1, z, "dark_oak_log[axis=y]");
}
fill(MX1, walk2Y + 2, MZ1, MX2, walk2Y + 2, MZ1, "dark_oak_log[axis=x]");
fill(MX1, walk2Y + 2, MZ2, MX2, walk2Y + 2, MZ2, "dark_oak_log[axis=x]");
fill(MX1, walk2Y + 2, MZ1, MX1, walk2Y + 2, MZ2, "dark_oak_log[axis=z]");
fill(MX2, walk2Y + 2, MZ1, MX2, walk2Y + 2, MZ2, "dark_oak_log[axis=z]");
// ============ OPENINGS ============
function win2(x, y, z, axis) {
fill(x, y, z, x, y + 1, z, "air");
ps(x, y, z, "glass_pane"); ps(x, y + 1, z, "glass_pane");
pb(x, y - 1, z, "spruce_slab");
ps(x, y + 2, z, "dark_oak_slab[type=bottom]");
if (axis === "z") {
ps(x - 1, y + 1, z, "spruce_trapdoor[facing=west,half=upper,open=true]");
ps(x + 1, y + 1, z, "spruce_trapdoor[facing=east,half=upper,open=true]");
}
}
for (x = 28; x <= 42; x += 3) {
if (x !== 31 && x !== 37) { win2(x, walkY + 2, MZ1, "z"); }
if (x !== 34) { win2(x, walk2Y + 1, MZ1, "z"); win2(x, walk2Y + 1, MZ2, "z"); }
}
for (x = 28; x <= 42; x += 4) { if (x !== 32 && x !== 36) win2(x, walkY + 2, MZ2, "z"); }
win2(MX1, walkY + 2, 26, "x"); win2(MX1, walkY + 2, 30, "x");
// platform door (north) + street door through the wing
fill(31, walkY, MZ1, 31, walkY + 1, MZ1, "air");
ps(31, walkY, MZ1, "spruce_door[facing=north,half=lower,hinge=left]");
ps(31, walkY + 1, MZ1, "spruce_door[facing=north,half=upper,hinge=left]");
fill(37, walkY, MZ1, 37, walkY + 1, MZ1, "air");
ps(37, walkY, MZ1, "spruce_door[facing=north,half=lower,hinge=right]");
ps(37, walkY + 1, MZ1, "spruce_door[facing=north,half=upper,hinge=right]");
// ticket window
fill(34, walkY + 2, MZ1, 34, walkY + 3, MZ1, "air");
ps(34, walkY + 2, MZ1, "iron_bars"); ps(34, walkY + 3, MZ1, "iron_bars");
pb(34, walkY + 1, MZ1, "spruce_slab");
// opening main <-> waiting hall wing
fill(34, walkY, MZ2, 36, walkY + 2, MZ2, "air");
ps(34, walkY + 2, MZ2, "dark_oak_slab[type=top]"); ps(36, walkY + 2, MZ2, "dark_oak_slab[type=top]");
// ============ MAIN_ROOF ============
placeGableRoofNS(MX1, MX2, MZ1, MZ2, roofBaseY, "deepslate_tile_stairs", "deepslate_tile_slab", "white_terracotta");
var halfD = Math.ceil((MZ2 - MZ1 + 1) / 2), st;
for (x = MX1 - 1; x <= MX2 + 1; x++) {
for (st = 0; st < halfD; st++) {
if (((x * 5 + st * 11) % 3) === 0) {
roofStair(x, roofBaseY + st, MZ1 - 1 + st, "cobbled_deepslate_stairs", "north");
roofStair(x, roofBaseY + st, MZ2 + 1 - st, "cobbled_deepslate_stairs", "south");
}
}
}
fill(MX1 - 1, roofBaseY + halfD - 1, MZ1 + halfD - 1, MX2 + 1, roofBaseY + halfD - 1, MZ1 + halfD - 1, "polished_deepslate");
// half-timber beams on the two end gables + deep eave with brackets
for (st = 0; st < halfD; st++) {
pb(MX1, roofBaseY + st, MZ1 + st, "dark_oak_log[axis=y]");
pb(MX1, roofBaseY + st, MZ2 - st, "dark_oak_log[axis=y]");
pb(MX2, roofBaseY + st, MZ1 + st, "dark_oak_log[axis=y]");
pb(MX2, roofBaseY + st, MZ2 - st, "dark_oak_log[axis=y]");
}
for (x = MX1 - 2; x <= MX2 + 2; x++) {
ps(x, roofBaseY - 1, MZ1 - 2, "deepslate_tile_slab[type=top]");
ps(x, roofBaseY - 1, MZ2 + 2, "deepslate_tile_slab[type=top]");
roofStair(x, roofBaseY, MZ1 - 2, "deepslate_tile_stairs", "north");
roofStair(x, roofBaseY, MZ2 + 2, "deepslate_tile_stairs", "south");
}
for (x = MX1; x <= MX2; x += 3) {
ps(x, roofBaseY - 2, MZ1 - 1, "spruce_stairs[facing=south,half=top]");
ps(x, roofBaseY - 2, MZ2 + 1, "spruce_stairs[facing=north,half=top]");
}
// ============ CLOCK_TOWER ============
fill(TX1, floorY - 1, TZ1 - 1, TX2 + 1, floorY, TZ2 + 1, plinth);
fill(TX1, walkY, TZ1, TX2, tTopY, TZ2, plaster);
fill(TX1 + 1, walkY, TZ1 + 1, TX2 - 1, tTopY, TZ2 - 1, "air");
fill(TX1, walkY, TZ1, TX1, tTopY, TZ1, "dark_oak_log[axis=y]");
fill(TX2, walkY, TZ1, TX2, tTopY, TZ1, "dark_oak_log[axis=y]");
fill(TX1, walkY, TZ2, TX1, tTopY, TZ2, "dark_oak_log[axis=y]");
fill(TX2, walkY, TZ2, TX2, tTopY, TZ2, "dark_oak_log[axis=y]");
fill(TX1, walkY, TZ1, TX2, walkY + 1, TZ2, "stone_bricks");
fill(TX1 + 1, walkY, TZ1 + 1, TX2 - 1, walkY + 1, TZ2 - 1, "air");
// louvred belfry openings
for (y = 21; y <= 23; y++) {
fill(TX1 + 1, y, TZ1, TX2 - 1, y, TZ1, "dark_oak_trapdoor[facing=north,half=bottom,open=true]");
fill(TX1, y, TZ1 + 1, TX1, y, TZ2 - 1, "dark_oak_trapdoor[facing=west,half=bottom,open=true]");
fill(TX2, y, TZ1 + 1, TX2, y, TZ2 - 1, "dark_oak_trapdoor[facing=east,half=bottom,open=true]");
}
// clock faces (north + east)
function clock(cx, cy, cz, dx, dz) {
pb(cx, cy + 1, cz, "white_concrete");
pb(cx - dx, cy, cz - dz, "white_concrete");
pb(cx, cy, cz, "black_concrete");
pb(cx + dx, cy, cz + dz, "white_concrete");
pb(cx, cy - 1, cz, "white_concrete");
}
clock(46, 18, TZ1, 1, 0);
clock(TX2, 18, 24, 0, 1);
// tower doorway from the main block
fill(TX1, walkY, 24, TX1, walkY + 1, 24, "air");
// hip roof rings
for (x = TX1 - 1; x <= TX2 + 1; x++) { roofStair(x, 26, TZ1 - 1, slate(x, 0, 1), "north"); roofStair(x, 26, TZ2 + 1, slate(x, 0, 2), "south"); }
for (z = TZ1 - 1; z <= TZ2 + 1; z++) { roofStair(TX1 - 1, 26, z, slate(1, 0, z), "west"); roofStair(TX2 + 1, 26, z, slate(2, 0, z), "east"); }
for (x = TX1; x <= TX2; x++) { roofStair(x, 27, TZ1, "deepslate_tile_stairs", "north"); roofStair(x, 27, TZ2, "deepslate_tile_stairs", "south"); }
for (z = TZ1; z <= TZ2; z++) { roofStair(TX1, 27, z, "deepslate_tile_stairs", "west"); roofStair(TX2, 27, z, "deepslate_tile_stairs", "east"); }
for (x = TX1 + 1; x <= TX2 - 1; x++) { roofStair(x, 28, TZ1 + 1, "deepslate_tile_stairs", "north"); roofStair(x, 28, TZ2 - 1, "deepslate_tile_stairs", "south"); }
for (z = TZ1 + 1; z <= TZ2 - 1; z++) { roofStair(TX1 + 1, 28, z, "deepslate_tile_stairs", "west"); roofStair(TX2 - 1, 28, z, "deepslate_tile_stairs", "east"); }
fill(TX1 + 1, 27, TZ1 + 1, TX2 - 1, 27, TZ2 - 1, "polished_deepslate");
fill(TX1 + 2, 28, TZ1 + 2, TX2 - 2, 29, TZ2 - 2, "polished_deepslate");
pb(46, 30, 24, "dark_oak_fence"); pb(46, 31, 24, "lantern");
// ============ WING_HALL ============
fill(GX1 - 1, floorY - 1, GZ1, GX2 + 1, floorY, GZ2 + 1, plinth);
fill(GX1 + 1, floorY, GZ1 + 1, GX2 - 1, floorY, GZ2 - 1, noisePalette([
{ block: "polished_andesite", weight: 50 }, { block: "andesite", weight: 30 }, { block: "stone_bricks", weight: 20 }]));
fill(GX1, walkY, GZ1, GX2, gTopY - 1, GZ2, plaster);
fill(GX1 + 1, walkY, GZ1 + 1, GX2 - 1, gTopY - 1, GZ2 - 1, "air");
fill(GX1 - 1, walkY, GZ1, GX2 + 1, walkY + 1, GZ2 + 1, "stone_bricks");
fill(GX1, walkY, GZ1, GX2, walkY + 1, GZ2, "stone_bricks");
fill(GX1 + 1, walkY, GZ1 + 1, GX2 - 1, walkY + 1, GZ2 - 1, "air");
for (z = GZ1; z <= GZ2; z += 3) {
fill(GX1, walkY + 2, z, GX1, gTopY - 1, z, "dark_oak_log[axis=y]");
fill(GX2, walkY + 2, z, GX2, gTopY - 1, z, "dark_oak_log[axis=y]");
}
// tall hall windows
for (z = 37; z <= 42; z += 2) { win2(GX1, walkY + 2, z, "x"); win2(GX2, walkY + 2, z, "x"); }
win2(32, walkY + 2, GZ2, "z"); win2(38, walkY + 2, GZ2, "z");
// street door
fill(35, walkY, GZ2, 35, walkY + 1, GZ2, "air");
ps(35, walkY, GZ2, "spruce_door[facing=south,half=lower,hinge=left]");
ps(35, walkY + 1, GZ2, "spruce_door[facing=south,half=upper,hinge=right]");
// porch over the street door
for (x = 33; x <= 37; x++) roofStair(x, walkY + 3, GZ2 + 1, "spruce_stairs", "south");
fill(33, walkY + 3, GZ2, 37, walkY + 3, GZ2, "spruce_slab[type=top]");
pb(33, walkY, GZ2 + 1, "dark_oak_fence"); fill(33, walkY + 1, GZ2 + 1, 33, walkY + 2, GZ2 + 1, "dark_oak_fence");
pb(37, walkY, GZ2 + 1, "dark_oak_fence"); fill(37, walkY + 1, GZ2 + 1, 37, walkY + 2, GZ2 + 1, "dark_oak_fence");
// wing roof (built AFTER the taller block) + junction seal
placeGableRoof(GX1, GX2, GZ1, GZ2, gRoofY, "deepslate_tile_stairs", "deepslate_tile_slab", "white_terracotta");
fill(GX1 - 1, gRoofY + 5, 39, GX2 + 1, gRoofY + 5, 39, "polished_deepslate");
fill(GX1 - 1, gRoofY, GZ1, GX2 + 1, roofBaseY + 1, GZ1, plaster); // seal wing roof <-> main wall
// ============ STAIRS ============
placeStairwell(38, 28, walkY, floor2Y, "spruce_stairs", "dark_oak_fence", "spruce_planks", "south");
// ============ INTERIOR_GROUND ============
// booking hall (x27..36, z23..33)
pb(28, walkY, 24, "stripped_oak_log"); ps(28, walkY + 1, 24, "spruce_stairs[facing=south,half=top]");
pb(29, walkY, 24, "stripped_oak_log"); ps(29, walkY + 1, 24, "spruce_stairs[facing=south,half=top]");
pb(30, walkY, 24, "barrel[facing=up]");
ps(33, walkY, 24, "lectern[facing=south]");
pb(27, walkY, 24, "chest[facing=east]");
for (i = 0; i < 4; i++) chairStair(28 + i, walkY, 32, "spruce_stairs", "north");
for (i = 0; i < 3; i++) chairStair(27, walkY, 28 + i, "spruce_stairs", "east");
rug(29, walkY, 27, 5, 4, "red", "orange");
pb(31, walkY, 28, "spruce_fence"); pb(31, walkY + 1, 28, "oak_pressure_plate");
chairStair(30, walkY, 28, "dark_oak_stairs", "east");
chairStair(32, walkY, 28, "dark_oak_stairs", "west");
ps(29, walkY + 2, MZ1 + 1, "oak_wall_sign[facing=south]");
ps(30, walkY + 2, MZ1 + 1, "oak_wall_sign[facing=south]");
pb(31, floor2Y - 1, 26, "chain[axis=y]"); ps(31, floor2Y - 2, 26, "lantern[hanging=true]");
pb(29, floor2Y - 1, 31, "chain[axis=y]"); ps(29, floor2Y - 2, 31, "lantern[hanging=true]");
// parcel office (x38..43, z23..27)
pb(42, walkY, 24, "barrel[facing=up]"); pb(42, walkY + 1, 24, "barrel[facing=up]"); pb(43, walkY, 24, "barrel[facing=up]");
pb(41, walkY, 26, "chest[facing=west]"); pb(41, walkY, 25, "chest[facing=west]");
ps(39, walkY, 24, "cartography_table"); pb(40, walkY, 24, "crafting_table");
fill(42, walkY, 26, 43, walkY + 1, 27, "hay_block[axis=y]");
pb(41, floor2Y - 1, 25, "chain[axis=y]"); ps(41, floor2Y - 2, 25, "lantern[hanging=true]");
// waiting hall wing (x31..39, z35..43)
pb(31, walkY, 36, "furnace[facing=east,lit=true]");
fill(31, walkY + 1, 36, 31, gTopY + 4, 36, "bricks");
pb(32, walkY, 36, "cauldron");
for (i = 0; i < 6; i++) chairStair(32 + i, walkY, 43, "spruce_stairs", "north");
for (i = 0; i < 4; i++) chairStair(31, walkY, 39 + i, "spruce_stairs", "east");
for (i = 0; i < 4; i++) chairStair(39, walkY, 39 + i, "spruce_stairs", "west");
rug(33, walkY, 38, 5, 4, "brown", "yellow");
pb(35, walkY, 39, "spruce_fence"); pb(35, walkY + 1, 39, "oak_pressure_plate");
pb(35, gTopY - 1, 39, "chain[axis=y]"); ps(35, gTopY - 2, 39, "lantern[hanging=true]");
pb(33, gTopY - 1, 42, "chain[axis=y]"); ps(33, gTopY - 2, 42, "lantern[hanging=true]");
pb(37, gTopY - 1, 42, "chain[axis=y]"); ps(37, gTopY - 2, 42, "lantern[hanging=true]");
ps(34, walkY + 2, GZ2 - 1, "oak_wall_sign[facing=north]");
ps(36, walkY + 2, GZ2 - 1, "oak_wall_sign[facing=north]");
pb(38, walkY, 36, "flower_pot");
// ============ INTERIOR_UPPER ============
fill(35, walk2Y, MZ1 + 1, 35, wallTopY - 1, MZ2 - 1, "spruce_planks");
fill(35, walk2Y, 27, 35, walk2Y + 1, 28, "air");
// bedroom (west)
placeBed(29, walk2Y, 31, "red", "north");
pb(28, walk2Y, 31, "spruce_fence"); ps(28, walk2Y + 1, 31, "oak_pressure_plate"); pb(28, walk2Y + 2, 31, "lantern");
rug(30, walk2Y, 26, 4, 4, "light_blue", "white");
pb(27, walk2Y, 24, "barrel[facing=up]");
ps(32, walk2Y, MZ1 + 1, "spruce_door[facing=south,half=lower,hinge=left]");
ps(32, walk2Y + 1, MZ1 + 1, "spruce_door[facing=south,half=upper,hinge=left]");
pb(31, wallTopY - 1, 28, "chain[axis=y]"); ps(31, wallTopY - 2, 28, "lantern[hanging=true]");
// parlour / kitchen (east)
pb(37, walk2Y, 24, "stripped_spruce_log"); ps(37, walk2Y + 1, 24, "spruce_stairs[facing=south,half=top]");
ps(38, walk2Y, 24, "furnace[facing=south,lit=false]"); ps(38, walk2Y + 1, 24, "iron_trapdoor[facing=south,half=bottom]");
pb(39, walk2Y, 24, "stripped_spruce_log"); ps(39, walk2Y + 1, 24, "spruce_stairs[facing=south,half=top]");
ps(40, walk2Y + 1, 24, "water_cauldron[level=3]");
pb(41, walk2Y, 24, "barrel[facing=up]");
pb(38, walk2Y, 27, "dark_oak_fence"); pb(38, walk2Y + 1, 27, "spruce_slab[type=bottom]");
chairStair(37, walk2Y, 27, "spruce_stairs", "east");
chairStair(39, walk2Y, 27, "spruce_stairs", "west");
shelfWall(41, walk2Y, 29, "south", 4, 2);
rug(37, walk2Y, 30, 4, 3, "green", "lime");
pb(38, wallTopY - 1, 30, "chain[axis=y]"); ps(38, wallTopY - 2, 30, "lantern[hanging=true]");
pb(40, wallTopY - 1, 25, "chain[axis=y]"); ps(40, wallTopY - 2, 25, "lantern[hanging=true]");
// ============ GOODS_SHED ============
fill(SX1 - 1, floorY - 1, SZ1 - 1, SX2 + 1, floorY, SZ2 + 1, plinth);
fill(SX1, walkY, SZ1, SX2, walkY + 5, SZ2, noisePalette([
{ block: "spruce_planks", weight: 50 }, { block: "dark_oak_planks", weight: 30 }, { block: "stripped_spruce_log", weight: 20 }]));
fill(SX1 + 1, walkY, SZ1 + 1, SX2 - 1, walkY + 5, SZ2 - 1, "air");
for (z = SZ1; z <= SZ2; z += 3) {
fill(SX1, walkY, z, SX1, walkY + 5, z, "dark_oak_log[axis=y]");
fill(SX2, walkY, z, SX2, walkY + 5, z, "dark_oak_log[axis=y]");
}
fill(11, walkY, SZ1, 15, walkY + 3, SZ1, "air");
fill(11, walkY, SZ1, 15, walkY + 3, SZ1, "dark_oak_planks");
fill(12, walkY, SZ1, 14, walkY + 2, SZ1, "air");
placeGableRoofNS(SX1, SX2, SZ1, SZ2, walkY + 6, "deepslate_tile_stairs", "deepslate_tile_slab", "spruce_planks");
fill(SX1 - 1, walkY + 9, 26, SX2 + 1, walkY + 9, 26, "polished_deepslate");
pb(13, walkY, 27, "barrel[facing=up]"); pb(14, walkY, 27, "barrel[facing=up]"); pb(13, walkY + 1, 27, "barrel[facing=up]");
fill(16, walkY, 26, 17, walkY + 1, 28, "hay_block[axis=y]");
pb(12, walkY + 4, 26, "chain[axis=y]"); ps(12, walkY + 3, 26, "lantern[hanging=true]");
// ============ EXTERIOR ============
var pathMat = noisePalette([{ block: "gravel", weight: 40 }, { block: "cobblestone", weight: 32 }, { block: "andesite", weight: 28 }]);
fill(33, 8, GZ2 + 1, 37, 8, 52, pathMat); // forecourt approach from the south
fill(20, 8, 46, 52, 8, 48, pathMat);
fill(19, 8, 21, 25, 8, 21, pathMat); // platform ramp from the west
lampPost(28, 9, 46, 4, "dark_oak_fence");
lampPost(42, 9, 46, 4, "dark_oak_fence");
lampPost(22, 10, 17, 4, "dark_oak_fence");
lampPost(54, 10, 17, 4, "dark_oak_fence");
// platform furniture
for (i = 0; i < 3; i++) chairStair(20 + i * 12, walkY, 19, "spruce_stairs", "north");
pb(50, walkY, 16, "barrel[facing=up]"); pb(51, walkY, 16, "barrel[facing=up]"); pb(50, walkY + 1, 16, "barrel[facing=up]");
fill(56, walkY, 17, 57, walkY + 1, 18, "hay_block[axis=y]");
ps(30, walkY + 2, 15, "oak_wall_sign[facing=north]");
pb(30, walkY, 15, "spruce_fence"); pb(30, walkY + 1, 15, "spruce_fence");
// signal + water crane at the platform end
fill(62, floorY + 1, 13, 62, floorY + 7, 13, "dark_oak_fence");
pb(62, floorY + 7, 12, "red_concrete"); pb(62, floorY + 6, 12, "lime_concrete");
ps(62, floorY + 8, 13, "lantern");
// hedges, flowers and alpine spruces
var flowers = ["poppy", "oxeye_daisy", "cornflower", "dandelion", "short_grass"];
for (x = 14; x <= 60; x += 2) {
if (x < 30 || x > 40) { pb(x, 9, GZ2 + 2, "oak_leaves[persistent=true]"); }
}
for (x = 10; x <= 62; x++) {
for (z = 46; z <= 52; z++) {
if (((x * 11 + z * 17) % 9) === 0 && !(x >= 33 && x <= 37) && !(z >= 46 && z <= 48)) {
pb(x, Math.round(gh(x, z)) + 1, z, flowers[(x + z) % 5]);
}
}
}
function spruceTree(cx, cz, h) {
var gy = Math.round(gh(cx, cz)) + 1, ly, r;
fill(cx, gy, cz, cx, gy + h, cz, "spruce_log[axis=y]");
for (ly = 0; ly < h; ly++) {
r = (ly % 3 === 0) ? 2 : 1;
if (ly > h - 3) r = 1;
fill(cx - r, gy + 2 + ly, cz - r, cx + r, gy + 2 + ly, cz + r, "spruce_leaves[persistent=true]");
}
pb(cx, gy + h + 1, cz, "spruce_leaves[persistent=true]");
}
spruceTree(22, 40, 7); spruceTree(16, 44, 6); spruceTree(48, 40, 7); spruceTree(56, 44, 6);
spruceTree(10, 36, 6); spruceTree(60, 34, 7); spruceTree(26, 50, 6); spruceTree(46, 51, 7);
makeSphere(20, 9, 34, "mossy_cobblestone", 2, true);
makeSphere(52, 9, 32, "cobblestone", 3, true);
// ============ FIX_WALLHEAD ============
// Se veia CIELO desde dentro en la linea de coronacion: faltaba la hilada entre el
// remate del muro y el arranque del faldon en los tres volumenes.
fill(MX1, wallTopY, MZ1, MX2, wallTopY + 1, MZ2, plaster);
fill(MX1 + 1, wallTopY, MZ1 + 1, MX2 - 1, wallTopY + 1, MZ2 - 1, "air");
for (x = MX1; x <= MX2; x += 3) { pb(x, wallTopY, MZ1, "dark_oak_log[axis=y]"); pb(x, wallTopY, MZ2, "dark_oak_log[axis=y]"); }
fill(GX1, gTopY, GZ1, GX2, gRoofY, GZ2, plaster);
fill(GX1 + 1, gTopY, GZ1 + 1, GX2 - 1, gRoofY, GZ2 - 1, "air");
fill(SX1, walkY + 6, SZ1, SX2, walkY + 6, SZ2, "spruce_planks");
fill(SX1 + 1, walkY + 6, SZ1 + 1, SX2 - 1, walkY + 6, SZ2 - 1, "air");