// === BUILD PLAN ===
// Style: Art Deco / Streamline Moderne seaside lido pavilion
// Footprint: CAPSULE (stadium) 57x19 = rect x26..64 z24..42 + two round ends r9 at (26,33) and (64,33)
// + stepped ziggurat entrance TOWER projecting +Z at x39..51 z42..47 -> composite, non-rectangular
// Height: floor 13 | ground walk 14 (air 14-18) | mid floor 19 | upper walk 20 (air 20-24)
// | terrace deck 25 | parapet 26 + chrome rail 27 | tower to y34
//
// GROUND FLOOR (top-down, z increases toward the sea/front):
// ( ( ############################### ) ) round end | hall | round end
// ( ( lounge cafe tables kiosk ) )
// ############### DD ################## DD = lobby doorway into tower
// [TOWER]
// |path| -> promenade -> pebble beach
//
// FRONT ELEVATION (streamline banding):
// y27 ==== chrome rail ==== [ziggurat tier3]
// y26 ---- white parapet ---- [tier2 + CLOCK]
// y24 ==== JADE GREEN BAND ====
// y22-23 ribbon windows (glass)
// y20-21 white
// y19 floor line
// y18 ==== JADE GREEN BAND ==== (projecting cornice, 1 block proud)
// y16-17 ribbon windows (glass)
// y14-15 white
// y13 black plinth
//
// MATERIALS PLAN:
// walls : gradientPalette white_concrete(low) -> smooth_quartz(high), noise 0.2 - WHY: volume/shadow on a big smooth wall
// bands : green_concrete solid, PROJECTING 1 block - WHY: crisp deco line + real shadow (wall depth)
// plinth : polished_blackstone - WHY: grounds the white mass
// glass : light_blue_stained_glass ribbon + quartz mullions - WHY: streamline ribbon window
// tower : smooth_quartz + quartz_pillar fluting + gold_block chevrons/sunburst
// floors : polished_blackstone/smooth_quartz checker (deco lobby floor)
// ground : hills()+flatten() pad at Y12, patches paving, beach gravel/sand, sea
// Rooms: ground = cafe hall (tables/chairs/bar counter/rugs/lanterns), W rotunda lounge, E rotunda kiosk
// upper = upper lounge + bar; terrace = deck chairs, parasols, planters
// STAIR PLAN: ground walk14 -> upper walk20 (D=6) staircase(52,30,14,20,'east') width2
// upper walk20 -> terrace walk26 (D=6) staircase(30,33,20,26,'east') width2
// === END PLAN ===
// === Y LEVELS ===
var floorY = 13;
var walkY = 14;
var midY = 19; // mid floor block
var walk2Y = 20;
var deckY = 25; // terrace deck block
var walk3Y = 26;
// === CAPSULE PREDICATES ===
var CX1 = 26, CX2 = 64, CZ = 33, R = 9;
function inCap(x, z) {
if (x >= CX1 && x <= CX2 && z >= 24 && z <= 42) return true;
var dx = x - CX1, dz = z - CZ;
if (dx * dx + dz * dz <= R * R) return true;
dx = x - CX2;
if (dx * dx + dz * dz <= R * R) return true;
return false;
}
function inInt(x, z) {
if (x >= CX1 && x <= CX2 && z >= 25 && z <= 41) return true;
var dx = x - CX1, dz = z - CZ;
if (dx * dx + dz * dz <= 64) return true;
dx = x - CX2;
if (dx * dx + dz * dz <= 64) return true;
return false;
}
// === TERRAIN (superpowers, never a flat square fill) ===
var hb = hills({ base: 0, amp: 2, scale: 0.05, seed: 4 });
var baseH = function (x, z) {
var b0 = 12;
if (z > 50) { b0 = 12 - (z - 50) * 0.42; if (b0 < 2) b0 = 2; }
return b0 + hb(x, z);
};
var pad = flatten(baseH, { x0: 8, z0: 4, x1: 88, z1: 50 }, 12, 6);
var land = zoneRect(0, 0, 95, 79);
var beachPat = patches([{ block: 'gravel', w: 45 }, { block: 'cobblestone', w: 12 }, { block: 'sand', w: 28 }, { block: 'andesite', w: 15 }], 0.09, 5);
var grassPat = patches([{ block: 'grass_block', w: 58 }, { block: 'coarse_dirt', w: 14 }, { block: 'stone', w: 14 }, { block: 'gravel', w: 14 }], 0.07, 9);
var matFn = function (x, z) {
var hh = pad(x, z);
if (hh <= 8.5) return beachPat(x, z);
return grassPat(x, z);
};
surface(land, pad, matFn, { sub: 'dirt', deep: 'stone', depth: 4 });
fillMasked(0, 2, 52, 95, 6, 79, 'water', onlyAir());
// promenade paving + sea wall
var pavePat = patches([{ block: 'smooth_stone', w: 38 }, { block: 'light_gray_concrete', w: 30 }, { block: 'polished_diorite', w: 22 }, { block: 'stone_bricks', w: 10 }], 0.08, 3);
fill(14, 12, 16, 80, 12, 50, pavePat);
fill(12, 10, 51, 84, 12, 51, 'stone_bricks');
fill(12, 12, 51, 84, 12, 51, 'polished_blackstone');
var sx;
for (sx = 40; sx <= 50; sx++) { pb(sx, 12, 52, 'smooth_stone'); pb(sx, 11, 53, 'smooth_stone'); pb(sx, 10, 54, 'smooth_stone'); pb(sx, 9, 55, 'smooth_stone'); }
// === STRUCTURE: solid capsule then carve (form first) ===
var x, y, z;
for (x = 16; x <= 74; x++) {
for (z = 22; z <= 44; z++) {
if (inCap(x, z)) fill(x, floorY, z, x, deckY, z, 'white_wool');
}
}
for (x = 16; x <= 74; x++) {
for (z = 22; z <= 44; z++) {
if (inInt(x, z)) {
fill(x, walkY, z, x, midY - 1, z, 'air');
fill(x, walk2Y, z, x, deckY - 1, z, 'air');
}
}
}
// floors: deco checker
var checker = function (px, py, pz) { return ((px + pz) % 2 === 0) ? 'polished_blackstone' : 'smooth_quartz'; };
var deckPat = noisePalette([{ block: 'smooth_quartz', weight: 60 }, { block: 'quartz_block', weight: 25 }, { block: 'light_gray_concrete', weight: 15 }], { seed: 6 });
for (x = 16; x <= 74; x++) {
for (z = 22; z <= 44; z++) {
if (inInt(x, z)) {
pb(x, floorY, z, checker(x, floorY, z));
pb(x, midY, z, checker(x, midY, z));
pb(x, deckY, z, deckPat(x, deckY, z));
}
}
}
// === BANDS / WINDOWS (mask by placeholder, texture last) ===
var BB = [16, 13, 22, 74, 27, 44];
replaceMasked(BB[0], 13, BB[2], BB[3], 13, BB[5], 'polished_blackstone', onlyMaterial('white_wool'));
replaceMasked(BB[0], 16, BB[2], BB[3], 17, BB[5], 'light_blue_stained_glass', onlyMaterial('white_wool'));
replaceMasked(BB[0], 18, BB[2], BB[3], 18, BB[5], 'green_concrete', onlyMaterial('white_wool'));
replaceMasked(BB[0], 22, BB[2], BB[3], 23, BB[5], 'light_blue_stained_glass', onlyMaterial('white_wool'));
replaceMasked(BB[0], 24, BB[2], BB[3], 24, BB[5], 'green_concrete', onlyMaterial('white_wool'));
// mullions on the ribbon windows (straight runs + a few on the round ends)
var mull = 'smooth_quartz';
for (x = 28; x <= 62; x += 5) {
fill(x, 16, 24, x, 17, 24, mull); fill(x, 22, 24, x, 23, 24, mull);
fill(x, 16, 42, x, 17, 42, mull); fill(x, 22, 42, x, 23, 42, mull);
}
var ang, mx, mz;
for (ang = 0; ang < 360; ang += 45) {
var rad = ang * Math.PI / 180;
mx = Math.round(CX1 - Math.cos(rad) * 9); mz = Math.round(CZ + Math.sin(rad) * 9);
if (inCap(mx, mz)) { fill(mx, 16, mz, mx, 17, mz, mull); fill(mx, 22, mz, mx, 23, mz, mull); }
mx = Math.round(CX2 + Math.cos(rad) * 9);
if (inCap(mx, mz)) { fill(mx, 16, mz, mx, 17, mz, mull); fill(mx, 22, mz, mx, 23, mz, mull); }
}
// remaining placeholder -> white gradient wall (volume, not flat white)
replaceMasked(BB[0], 13, BB[2], BB[3], 27, BB[5],
gradientPalette(14, 25, [{ block: 'white_concrete', from: 0 }, { block: 'smooth_quartz', from: 0.45 }], { noise: 0.22 }),
onlyMaterial('white_wool'));
// === PROJECTING CORNICE BANDS (wall depth: 1 block proud, real shadow) ===
function projBand(by) {
var px, pz, dx, dz, d2;
for (px = 26; px <= 64; px++) { pb(px, by, 23, 'green_concrete'); pb(px, by, 43, 'green_concrete'); }
for (px = 15; px <= 75; px++) {
for (pz = 22; pz <= 44; pz++) {
if (inCap(px, pz)) continue;
dx = px - CX1; dz = pz - CZ; d2 = dx * dx + dz * dz;
if (px <= CX1 && d2 > 81 && d2 <= 100) pb(px, by, pz, 'green_concrete');
dx = px - CX2; d2 = dx * dx + dz * dz;
if (px >= CX2 && d2 > 81 && d2 <= 100) pb(px, by, pz, 'green_concrete');
}
}
}
projBand(18);
projBand(24);
// === TERRACE PARAPET + CHROME RAIL ===
for (x = 16; x <= 74; x++) {
for (z = 22; z <= 44; z++) {
if (inCap(x, z) && !inInt(x, z)) {
pb(x, 26, z, 'smooth_quartz');
pb(x, 27, z, 'iron_bars');
}
}
}
// === ENTRANCE TOWER (stepped ziggurat, gold accents) ===
var qpal = noisePalette([{ block: 'smooth_quartz', weight: 55 }, { block: 'white_concrete', weight: 30 }, { block: 'quartz_block', weight: 15 }], { seed: 11 });
fill(39, floorY, 42, 51, 27, 47, qpal); // tier 1
fill(41, 28, 43, 49, 33, 46, qpal); // tier 2 (taller setback)
fill(43, 34, 44, 47, 39, 46, qpal); // tier 3 (taller setback)
fill(39, 28, 42, 51, 28, 47, 'gold_block'); // gold line tier1->2
fill(41, 34, 43, 49, 34, 46, 'gold_block'); // thin gold line tier2->3
fill(43, 40, 44, 47, 40, 46, 'gold_block'); // thin crown line
fill(45, 41, 45, 45, 43, 45, 'quartz_pillar[axis=y]'); pb(45, 44, 45, 'gold_block'); pb(45, 45, 45, 'lightning_rod');
// fluted pilasters on the tower face
for (x = 40; x <= 50; x += 2) fill(x, walkY, 48, x, 27, 48, 'quartz_pillar[axis=y]');
fill(39, floorY, 48, 51, floorY, 48, 'polished_blackstone');
fill(39, 13, 42, 51, 13, 47, 'polished_blackstone');
// hollow the lobby + doorway into the hall
fill(41, walkY, 43, 49, 18, 46, 'air');
fill(41, midY, 43, 49, midY, 46, checker);
fill(42, walkY, 42, 48, 17, 42, 'air'); // wide opening lobby -> hall
// entrance: 5-wide opening with gold trim, glass doors either side
fill(43, walkY, 47, 47, 16, 47, 'air');
fill(43, walkY, 48, 47, 16, 48, 'air');
fill(42, walkY, 47, 42, 16, 47, 'gold_block');
fill(48, walkY, 47, 48, 16, 47, 'gold_block');
fill(43, 17, 47, 47, 17, 47, 'gold_block');
// sunburst over the entrance (radiating gold)
var k;
for (k = 0; k <= 4; k++) {
pb(45, 18 + k, 47, 'gold_block');
pb(45 - k, 18 + Math.round(k * 0.6), 47, 'gold_block');
pb(45 + k, 18 + Math.round(k * 0.6), 47, 'gold_block');
}
// clock on tier 2 front face (z=46 is behind tier1 top, visible above y27)
fill(43, 28, 46, 47, 32, 46, 'white_concrete');
fill(43, 29, 46, 43, 31, 46, 'black_concrete');
fill(47, 29, 46, 47, 31, 46, 'black_concrete');
fill(44, 28, 46, 46, 28, 46, 'black_concrete');
fill(44, 32, 46, 46, 32, 46, 'black_concrete');
pb(45, 30, 46, 'gold_block'); pb(45, 31, 46, 'black_concrete'); pb(46, 30, 46, 'black_concrete');
// canopy over the entrance (projecting slab on pillars = depth)
fill(41, 18, 49, 49, 18, 51, 'smooth_quartz_slab[type=top]');
fill(41, walkY, 51, 41, 17, 51, 'quartz_pillar[axis=y]');
fill(49, walkY, 51, 49, 17, 51, 'quartz_pillar[axis=y]');
fill(41, 19, 49, 49, 19, 49, 'green_concrete');
// === STAIRS ===
var topA = staircase(52, 30, walkY, walk2Y, 'east', { width: 2, material: 'quartz_stairs', support: 'smooth_quartz' });
var topB = staircase(30, 33, walk2Y, walk3Y, 'east', { width: 2, material: 'quartz_stairs', support: 'smooth_quartz' });
// === INTERIOR: GROUND CAFE HALL ===
function cafeTable(tx, tz, chairDirs) {
pb(tx, walkY, tz, 'dark_oak_fence');
pb(tx, walkY + 1, tz, 'white_carpet');
var i;
for (i = 0; i < chairDirs.length; i++) {
var d = chairDirs[i];
if (d === 'south') chairStair(tx, walkY, tz - 1, 'dark_oak_stairs', 'south');
if (d === 'north') chairStair(tx, walkY, tz + 1, 'dark_oak_stairs', 'north');
if (d === 'east') chairStair(tx - 1, walkY, tz, 'dark_oak_stairs', 'east');
if (d === 'west') chairStair(tx + 1, walkY, tz, 'dark_oak_stairs', 'west');
}
}
rug(31, walkY, 28, 9, 7, 'green', 'lime');
cafeTable(33, 30, ['south', 'north']);
cafeTable(38, 30, ['south', 'north']);
cafeTable(33, 37, ['east', 'west']);
cafeTable(38, 37, ['east', 'west']);
cafeTable(56, 30, ['south', 'north']);
cafeTable(58, 37, ['east', 'west']);
// bar counter along the back wall (z=26)
for (x = 44; x <= 52; x++) {
pb(x, walkY, 26, 'smooth_quartz');
ps(x, walkY + 1, 26, 'quartz_stairs[facing=south,half=top]');
}
pb(43, walkY, 26, 'barrel'); pb(53, walkY, 26, 'barrel');
for (x = 45; x <= 51; x += 2) { ps(x, 17, 26, 'green_glazed_terracotta'); }
chairStair(46, walkY, 27, 'dark_oak_stairs', 'south');
chairStair(48, walkY, 27, 'dark_oak_stairs', 'south');
chairStair(50, walkY, 27, 'dark_oak_stairs', 'south');
// hanging lanterns (ceiling block at midY above)
var lz;
for (x = 30; x <= 62; x += 8) { for (lz = 29; lz <= 38; lz += 9) { ps(x, 18, lz, 'lantern[hanging=true]'); } }
// west rotunda = lounge
rug(21, walkY, 30, 7, 6, 'light_gray', 'green');
for (z = 30; z <= 34; z++) chairStair(19, walkY, z, 'spruce_stairs', 'west');
pb(23, walkY, 32, 'dark_oak_fence'); pb(23, walkY + 1, 32, 'green_carpet');
chairStair(25, walkY, 32, 'spruce_stairs', 'east');
ps(21, walkY, 28, 'potted_fern'); ps(21, walkY, 37, 'potted_bamboo');
ps(24, 18, 33, 'lantern[hanging=true]');
// east rotunda = ticket kiosk
for (z = 30; z <= 36; z++) { pb(67, walkY, z, 'smooth_quartz'); ps(67, walkY + 1, z, 'quartz_stairs[facing=west,half=top]'); }
pb(69, walkY, 31, 'barrel'); pb(69, walkY, 33, 'chest'); ps(69, walkY, 35, 'lectern[facing=west]');
rug(62, walkY, 30, 4, 6, 'white', 'green');
ps(66, 18, 33, 'lantern[hanging=true]');
ps(62, walkY, 29, 'potted_fern'); ps(62, walkY, 37, 'potted_fern');
// === INTERIOR: UPPER LOUNGE ===
rug(40, walk2Y, 29, 12, 9, 'light_gray', 'green');
cafeTableU = function (tx, tz) {
pb(tx, walk2Y, tz, 'dark_oak_fence'); pb(tx, walk2Y + 1, tz, 'white_carpet');
chairStair(tx, walk2Y, tz - 1, 'dark_oak_stairs', 'south');
chairStair(tx, walk2Y, tz + 1, 'dark_oak_stairs', 'north');
};
cafeTableU(36, 30); cafeTableU(42, 30); cafeTableU(48, 30);
cafeTableU(38, 38); cafeTableU(44, 38); cafeTableU(50, 38);
for (x = 58; x <= 64; x++) { pb(x, walk2Y, 27, 'smooth_quartz'); ps(x, walk2Y + 1, 27, 'quartz_stairs[facing=south,half=top]'); }
pb(57, walk2Y, 27, 'barrel');
chairStair(59, walk2Y, 28, 'dark_oak_stairs', 'south');
chairStair(61, walk2Y, 28, 'dark_oak_stairs', 'south');
for (z = 31; z <= 35; z++) chairStair(22, walk2Y, z, 'spruce_stairs', 'west');
pb(25, walk2Y, 33, 'dark_oak_fence'); pb(25, walk2Y + 1, 33, 'green_carpet');
for (x = 30; x <= 62; x += 8) { for (lz = 29; lz <= 38; lz += 9) { ps(x, 24, lz, 'lantern[hanging=true]'); } }
ps(28, walk2Y, 29, 'potted_bamboo'); ps(60, walk2Y, 39, 'potted_fern');
// === TERRACE ===
function deckChair(dx, dz) {
chairStair(dx, walk3Y, dz, 'quartz_stairs', 'north');
pb(dx, walk3Y, dz + 1, 'smooth_quartz_slab[type=bottom]');
}
for (x = 34; x <= 44; x += 3) deckChair(x, 39);
for (x = 50; x <= 60; x += 3) deckChair(x, 39);
function parasol(px, pz, col) {
fill(px, walk3Y, pz, px, walk3Y + 2, pz, 'oak_fence');
fill(px - 1, walk3Y + 3, pz - 1, px + 1, walk3Y + 3, pz + 1, col);
pb(px, walk3Y + 4, pz, col);
}
parasol(38, 31, 'green_concrete');
parasol(52, 31, 'white_concrete');
pb(40, walk3Y, 34, 'dark_oak_fence'); pb(40, walk3Y + 1, 34, 'white_carpet');
pb(50, walk3Y, 34, 'dark_oak_fence'); pb(50, walk3Y + 1, 34, 'white_carpet');
var planterX;
for (planterX = 22; planterX <= 68; planterX += 8) {
pb(planterX, walk3Y, 28, 'smooth_quartz');
pb(planterX, walk3Y + 1, 28, 'flowering_azalea_leaves');
}
fill(44, walk3Y, 41, 46, walk3Y, 41, 'green_concrete');
// === EXTERIOR: promenade furniture, lights, planting ===
var pathPat = patches([{ block: 'polished_blackstone', w: 40 }, { block: 'smooth_quartz', w: 40 }, { block: 'light_gray_concrete', w: 20 }], 0.1, 8);
fill(42, 12, 49, 48, 12, 51, pathPat);
var px2;
for (px2 = 20; px2 <= 76; px2 += 14) {
lampPost(px2, 12, 49, 4, 'iron_bars');
lampPost(px2 + 4, 12, 20, 4, 'iron_bars');
}
for (px2 = 26; px2 <= 62; px2 += 12) {
chairStair(px2, 13, 49, 'spruce_stairs', 'north');
chairStair(px2 + 1, 13, 49, 'spruce_stairs', 'north');
pb(px2 - 1, 13, 49, 'smooth_quartz'); pb(px2 + 2, 13, 49, 'smooth_quartz');
}
for (px2 = 18; px2 <= 74; px2 += 6) {
pb(px2, 13, 46, 'white_concrete');
pb(px2, 14, 46, 'flowering_azalea_leaves');
pb(px2, 13, 18, 'white_concrete');
pb(px2, 14, 18, 'azalea_leaves');
}
placeTree(16, 13, 20, 'oak');
placeTree(78, 13, 24, 'oak');
placeTree(84, 13, 44, 'oak');
// flag poles on the promenade edge
fill(20, 13, 50, 20, 19, 50, 'iron_bars'); ps(20, 19, 51, 'green_wall_banner[facing=south]');
fill(76, 13, 50, 76, 19, 50, 'iron_bars'); ps(76, 19, 51, 'white_wall_banner[facing=south]');
// beached detail: a few pebble clusters + two rowboats hinted
noisyScatter(10, 60, 86, 78, 'cobblestone', 0.04, pad);