// === BUILD PLAN ===
// Style: modern polar research icebreaker (Aurora Australis / Polarstern family)
// Orientation: keel along X, BOW at +X (rule 15 — the iso/front cameras see +X/+Z, so the
// whole profile faces the camera). Centreline Z=43. Length 75, beam 15 -> ~5:1.
//
// TOP VIEW (waterline, bow to the right):
// stern bow
// ..####################################################.....
// .######################################################...
// ..####################################################.....
//
// SIDE PROFILE (Y):
// 48 |mast
// 37 _______|BRIDGE|_______ <- bridge + wings (Z35..51)
// 32 _| L2 |_
// 27 _____ | L1 |_____
// 26 |HELIDECK| ==FUNNEL== cargo deck ____/ <- raked stem rides ONTO ice
// 22 =============== MAIN DECK ==============____/
// 18 ~~~~ waterline (ice sheet top = 18) ~~~~
// 08 \____________ hull bottom ___________/
//
// Hull cross-section (midship, half-beam 7): bottom flat 9 wide, bilge rises 1 per column
// ....DDDDDDDDDDDDDDD.... D = deck plate Y22
// ...O###############O... O = orange topside Y18..21
// ....B#############B.... B = black boot-top Y17
// .....R###########R..... R = red antifouling
// .......RRRRRRR......... flat-ish bottom
//
// MATERIALS PLAN (part -> palette -> WHY):
// below WL : red_concrete/red_terracotta — WHY: antifouling red, the real 3-band livery
// boot top : black_concrete — WHY: a hard dark line MAKES the waterline read
// topsides : orange_concrete/orange_terracotta— WHY: polar orange = instant "icebreaker"
// house : white_concrete/smooth_quartz — WHY: max value contrast against the orange
// funnel : red + white band + black cap — WHY: the one saturated accent up high
// decks : gray/light_gray/andesite noise — WHY: steel plate, keeps the deck from reading flat
// ice : patches packed_ice/snow/ice/blue_ice — WHY: BIG floe blotches, not per-block confetti
// Rooms: BRIDGE (helm, console bank, chart table, chairs) + CREW MESS on L1 (tables, galley)
// STAIR PLAN: exterior accommodation ladders on the starboard side deck (z=36):
// staircase(45,36,23,28,'east') then staircase(52,36,28,33,'east') -> flush onto each deck.
// === END PLAN ===
var CK = [];
function ck(m) { CK.push(m); }
ck('PLAN');
var seaTop = 17, iceY = 18;
var CZ = 43;
var deckY = 22;
// ---------- palettes ----------
var hullLow = noisePalette([
{ block: 'red_concrete', weight: 58 },
{ block: 'red_terracotta', weight: 26 },
{ block: 'brown_terracotta', weight: 16 }
], { seed: 4, freq: 0.12 });
var hullTop = noisePalette([
{ block: 'orange_concrete', weight: 60 },
{ block: 'orange_terracotta', weight: 24 },
{ block: 'red_concrete', weight: 16 }
], { seed: 9, freq: 0.11 });
var whitePal = noisePalette([
{ block: 'white_concrete', weight: 62 },
{ block: 'smooth_quartz', weight: 22 },
{ block: 'light_gray_concrete', weight: 16 }
], { seed: 14, freq: 0.13 });
var deckPal = noisePalette([
{ block: 'gray_concrete', weight: 44 },
{ block: 'light_gray_concrete', weight: 30 },
{ block: 'andesite', weight: 16 },
{ block: 'polished_andesite', weight: 10 }
], { seed: 19, freq: 0.14 });
var iceMat = patches([
{ block: 'packed_ice', w: 40 },
{ block: 'snow_block', w: 30 },
{ block: 'ice', w: 18 },
{ block: 'blue_ice', w: 12 }
], 0.045, 3);
// ---------- SEA + PACK ICE ----------
fill(0, 1, 0, 111, 3, 95, 'gravel');
fill(0, 4, 0, 111, seaTop, 95, 'water');
var ridge = hills({ base: iceY, amp: 2.2, scale: 0.085, seed: 5 });
var iceH = function (x, z) {
var v = Math.round(ridge(x, z));
if (v < iceY) { v = iceY; }
return v;
};
var iceMask = function (x, z) { return true; };
surface(iceMask, iceH, iceMat, { sub: 'packed_ice', deep: 'water', depth: 2, bounds: { x0: 0, z0: 0, x1: 111, z1: 95 } });
ck('ICE');
// ---------- BROKEN CHANNEL behind the stern (meander = irregular, never a straight cut) ----------
var lead = meander(0, 44, 30, 42, { amplitude: 7, bends: 2, seed: 3 });
var cx3, cz3, dRaw, halfW3;
for (cx3 = 0; cx3 <= 34; cx3++) {
for (cz3 = 26; cz3 <= 62; cz3++) {
dRaw = lead(cx3, cz3);
halfW3 = 9 - (cx3 * 0.10);
if (dRaw < halfW3) {
fill(cx3, iceY, cz3, cx3, iceY + 3, cz3, 'air');
pb(cx3, seaTop, cz3, 'water');
}
}
}
// broken floes drifting in the lead
var fi3, fx, fz;
for (fi3 = 0; fi3 < 46; fi3++) {
fx = 1 + (fi3 * 13) % 30;
fz = 30 + (fi3 * 7) % 28;
if (lead(fx, fz) < 8 - fx * 0.08) {
ps(fx, iceY, fz, (fi3 % 3 === 0) ? 'ice' : 'packed_ice');
if (fi3 % 4 === 0) { ps(fx + 1, iceY, fz, 'packed_ice'); ps(fx, iceY, fz + 1, 'ice'); }
if (fi3 % 5 === 0) { ps(fx, iceY + 1, fz, 'packed_ice_slab'); }
}
}
ck('CHANNEL');
// ---------- HULL (parametric cross-sections -> symmetric BY CONSTRUCTION) ----------
function halfBeam(x) {
if (x < 22 || x > 96) { return -1; }
if (x < 26) { return 3 + (x - 22); }
if (x <= 76) { return 7; }
if (x <= 86) { return 7 - Math.round((x - 76) * 3 / 10); }
if (x <= 93) { return 4 - Math.round((x - 86) * 3 / 7); }
return 1;
}
function botY(x) {
var y = 8;
if (x > 72) { y = 8 + Math.round((x - 72) * 12 / 24); }
if (x < 28) { y = 8 + Math.round((28 - x) * 0.6); }
return y;
}
function topY(x) {
if (x <= 78) { return 21; }
return 21 + Math.round((x - 78) * 4 / 18);
}
var hx, hdz, hz, hb0, hby, hty, colBot;
for (hx = 22; hx <= 96; hx++) {
hb0 = halfBeam(hx);
if (hb0 < 0) { continue; }
hby = botY(hx);
hty = topY(hx);
for (hdz = -hb0; hdz <= hb0; hdz++) {
hz = CZ + hdz;
// bilge rise: outer 3 columns lift off the flat bottom -> rounded section, not a brick
colBot = hby + Math.max(0, Math.abs(hdz) - (hb0 - 3));
if (colBot > seaTop - 1) {
fill(hx, colBot, hz, hx, hty, hz, hullTop);
} else {
fill(hx, colBot, hz, hx, seaTop - 1, hz, hullLow);
pb(hx, seaTop, hz, 'black_concrete');
fill(hx, seaTop + 1, hz, hx, hty, hz, hullTop);
}
}
// deck plate
fill(hx, hty + 1, CZ - hb0, hx, hty + 1, CZ + hb0, deckPal);
// bulwark + railing (both sides, identical by construction)
if (hb0 >= 2) {
pb(hx, hty + 2, CZ - hb0, hullTop(hx, hty + 2, CZ - hb0));
pb(hx, hty + 2, CZ + hb0, hullTop(hx, hty + 2, CZ + hb0));
if (hx % 2 === 1) {
ps(hx, hty + 3, CZ - hb0, 'iron_bars');
ps(hx, hty + 3, CZ + hb0, 'iron_bars');
} else {
ps(hx, hty + 3, CZ - hb0, 'light_gray_stained_glass_pane');
ps(hx, hty + 3, CZ + hb0, 'light_gray_stained_glass_pane');
}
}
// hull-curve trim: upside-down stairs at the bilge (half=top follows the convex curve)
if (hb0 >= 4 && hby + 1 <= seaTop) {
ps(hx, hby + Math.max(0, hb0 - (hb0 - 3)) - 1, CZ - hb0 - 1, 'red_sandstone_stairs[facing=west,half=top]');
}
}
// stem bar (the reinforced raked bow) + ice knife
var si3;
for (si3 = 0; si3 <= 10; si3++) {
fill(88 + si3 * 0, 0, 0, 88, 0, 0, 'air');
}
for (si3 = 0; si3 <= 8; si3++) {
pb(89 + si3, 15 + si3, CZ, 'black_concrete');
pb(89 + si3, 16 + si3, CZ, 'orange_concrete');
if (si3 < 6) { pb(89 + si3, 15 + si3, CZ - 1, 'black_concrete'); pb(89 + si3, 15 + si3, CZ + 1, 'black_concrete'); }
}
// anchor pockets + hawse
ps(93, 21, CZ - 3, 'iron_trapdoor[facing=north,half=bottom,open=false]');
ps(93, 21, CZ + 3, 'iron_trapdoor[facing=south,half=bottom,open=false]');
fill(91, 20, CZ - 4, 91, 21, CZ - 4, 'iron_bars');
// draft marks + name on the bow
ps(90, 20, CZ - 5, 'white_concrete'); ps(88, 19, CZ - 5, 'white_concrete');
ps(86, 20, CZ + 5, 'white_concrete'); ps(84, 19, CZ + 5, 'white_concrete');
ck('HULL');
// ---------- CRACKED FLOE UNDER THE BOW (the ship is riding onto it) ----------
var kx, kz;
for (kx = 84; kx <= 104; kx++) {
for (kz = 32; kz <= 54; kz++) {
if ((kx + kz * 3) % 17 === 0) { ps(kx, iceY + 1, kz, 'packed_ice_slab'); }
if ((kx * 2 + kz) % 23 === 0) { pb(kx, iceY, kz, 'blue_ice'); }
}
}
for (kx = 88; kx <= 102; kx++) {
kz = 43 + Math.round(Math.sin(kx * 0.5) * 4);
pb(kx, iceY, kz, 'water');
pb(kx, iceY, kz + 1, 'ice');
}
// pressure ridge shoved up by the bow
for (kx = 96; kx <= 101; kx++) {
for (kz = 36; kz <= 50; kz++) {
if ((kx * 3 + kz * 5) % 7 < 3) { pb(kx, iceY + 1, kz, 'packed_ice'); }
if ((kx * 5 + kz * 3) % 11 < 2) { pb(kx, iceY + 2, kz, 'snow_block'); }
}
}
ck('FLOE');
// ---------- SUPERSTRUCTURE ----------
// L1 accommodation block
fill(46, 23, 37, 64, 26, 49, whitePal);
fill(47, 23, 38, 63, 26, 48, 'air');
fill(46, 27, 36, 64, 27, 50, deckPal); // L1 roof = walkway deck (extends for the stair)
// L1 windows (crew mess forward, cabins aft)
var wx3;
for (wx3 = 48; wx3 <= 62; wx3 += 2) {
fill(wx3, 24, 37, wx3, 25, 37, 'light_blue_stained_glass');
fill(wx3, 24, 49, wx3, 25, 49, 'light_blue_stained_glass');
}
fill(64, 24, 40, 64, 25, 46, 'light_blue_stained_glass');
// L1 doors to the side decks
fill(46, 23, 40, 46, 24, 40, 'air');
ps(46, 23, 40, 'iron_door[facing=west,half=lower,hinge=left]');
ps(46, 24, 40, 'iron_door[facing=west,half=upper,hinge=left]');
fill(64, 23, 43, 64, 24, 43, 'air');
// L2
fill(48, 28, 38, 62, 31, 48, whitePal);
fill(49, 28, 39, 61, 31, 47, 'air');
fill(48, 32, 36, 62, 32, 50, deckPal);
for (wx3 = 50; wx3 <= 60; wx3 += 2) {
fill(wx3, 29, 38, wx3, 30, 38, 'light_blue_stained_glass');
fill(wx3, 29, 48, wx3, 30, 48, 'light_blue_stained_glass');
}
fill(48, 28, 42, 48, 29, 42, 'air');
// BRIDGE + wings
fill(50, 33, 37, 60, 36, 49, whitePal);
fill(51, 33, 38, 59, 36, 48, 'air');
fill(50, 37, 36, 60, 37, 50, whitePal); // bridge roof with a small overhang
// wraparound bridge glass
fill(60, 34, 38, 60, 35, 48, 'light_blue_stained_glass');
fill(50, 34, 39, 50, 35, 47, 'light_blue_stained_glass');
fill(51, 34, 37, 59, 35, 37, 'light_blue_stained_glass');
fill(51, 34, 49, 59, 35, 49, 'light_blue_stained_glass');
// bridge WINGS (port + starboard), supported from below (never floating)
fill(53, 32, 33, 57, 32, 36, deckPal);
fill(53, 32, 50, 57, 32, 53, deckPal);
var wgz;
for (wgz = 33; wgz <= 35; wgz++) {
ps(53, 33, wgz, 'iron_bars'); ps(57, 33, wgz, 'iron_bars');
ps(53, 33, 96 - wgz - 43 + 43, 'air');
}
for (wgz = 51; wgz <= 53; wgz++) { ps(53, 33, wgz, 'iron_bars'); ps(57, 33, wgz, 'iron_bars'); }
fill(53, 33, 33, 57, 33, 33, 'iron_bars');
fill(53, 33, 53, 57, 33, 53, 'iron_bars');
ps(55, 31, 34, 'white_concrete'); ps(55, 30, 34, 'white_concrete'); // wing support column
ps(55, 31, 52, 'white_concrete'); ps(55, 30, 52, 'white_concrete');
ps(55, 29, 34, 'iron_bars'); ps(55, 29, 52, 'iron_bars');
// mast + radar + navigation lights
fill(55, 38, CZ, 55, 48, CZ, 'iron_block');
fill(53, 44, CZ, 57, 44, CZ, 'iron_bars');
fill(55, 44, 41, 55, 44, 45, 'iron_bars');
makeSphere(55, 47, CZ, 'white_concrete', 2, false);
ps(55, 49, CZ, 'lightning_rod[facing=up]');
ps(53, 43, CZ, 'redstone_lamp'); ps(57, 43, CZ, 'redstone_lamp');
ps(55, 40, 41, 'sea_lantern'); ps(55, 40, 45, 'sea_lantern');
// floodlight masts on the bridge roof
ps(51, 38, 38, 'sea_lantern'); ps(59, 38, 38, 'sea_lantern');
ps(51, 38, 48, 'sea_lantern'); ps(59, 38, 48, 'sea_lantern');
ck('HOUSE');
// ---------- FUNNEL (red with a white band, black cap) ----------
makeCylinder(41, 28, CZ, 'red_concrete', 4, 10, true);
makeCylinder(41, 33, CZ, 'white_concrete', 4, 2, true);
makeCylinder(41, 38, CZ, 'black_concrete', 4, 1, true);
makeCylinder(41, 39, CZ, 'gray_concrete', 3, 1, true);
fill(41, 39, CZ, 41, 39, CZ, 'campfire[lit=true]');
ps(38, 34, CZ, 'white_concrete'); ps(44, 34, CZ, 'white_concrete');
// funnel exhaust pipes
fill(39, 39, CZ - 2, 39, 41, CZ - 2, 'iron_bars');
fill(43, 39, CZ + 2, 43, 41, CZ + 2, 'iron_bars');
ck('FUNNEL');
// ---------- HELIDECK + HELICOPTER (aft) ----------
fill(23, 26, 36, 37, 26, 50, deckPal);
var hpx, hpz;
for (hpx = 24; hpx <= 36; hpx += 4) {
for (hpz = 37; hpz <= 49; hpz += 4) {
fill(hpx, 23, hpz, hpx, 25, hpz, 'iron_block');
}
}
// deck circle + H marking
for (hpx = 25; hpx <= 35; hpx++) {
for (hpz = 38; hpz <= 48; hpz++) {
var ddx = hpx - 30, ddz = hpz - 43;
var rr = ddx * ddx + ddz * ddz;
if (rr <= 30 && rr >= 21) { pb(hpx, 26, hpz, 'yellow_concrete'); }
}
}
fill(28, 26, 41, 28, 26, 45, 'white_concrete');
fill(32, 26, 41, 32, 26, 45, 'white_concrete');
fill(29, 26, 43, 31, 26, 43, 'white_concrete');
// safety net railing round the helideck
var hrz;
for (hrz = 36; hrz <= 50; hrz++) {
if (hrz % 2 === 0) { ps(23, 27, hrz, 'iron_bars'); ps(37, 27, hrz, 'iron_bars'); }
}
for (hpx = 23; hpx <= 37; hpx++) {
if (hpx % 2 === 1) { ps(hpx, 27, 36, 'iron_bars'); ps(hpx, 27, 50, 'iron_bars'); }
}
// the helicopter itself
fill(27, 28, 42, 33, 29, 44, 'white_concrete');
fill(31, 28, 42, 33, 29, 44, 'red_concrete');
fill(33, 28, 42, 33, 29, 44, 'light_blue_stained_glass');
fill(24, 29, 43, 27, 29, 43, 'white_concrete'); // tail boom
fill(23, 29, 43, 23, 31, 43, 'red_concrete'); // tail fin
ps(23, 30, 42, 'iron_bars'); ps(23, 30, 44, 'iron_bars'); // tail rotor
fill(29, 30, 43, 31, 30, 43, 'gray_concrete'); // rotor head
pb(30, 31, 43, 'iron_block');
var rb;
for (rb = 1; rb <= 6; rb++) {
ps(30 + rb, 31, 43, 'light_gray_stained_glass_pane');
ps(30 - rb, 31, 43, 'light_gray_stained_glass_pane');
ps(30, 31, 43 + rb, 'light_gray_stained_glass_pane');
ps(30, 31, 43 - rb, 'light_gray_stained_glass_pane');
}
ps(28, 27, 42, 'iron_bars'); ps(28, 27, 44, 'iron_bars'); // skids
ps(32, 27, 42, 'iron_bars'); ps(32, 27, 44, 'iron_bars');
ck('HELI');
// ---------- WORKING DECKS: cranes, containers, hatches ----------
function container(x, z, col, len) {
fill(x, deckY + 1, z, x + len, deckY + 3, z + 2, col);
var cxx;
for (cxx = x; cxx <= x + len; cxx++) {
if (cxx % 2 === 0) {
ps(cxx, deckY + 2, z - 1, 'iron_bars');
}
}
ps(x, deckY + 2, z, 'iron_trapdoor[facing=west,half=bottom,open=false]');
fill(x, deckY + 4, z, x + len, deckY + 4, z + 2, 'gray_concrete');
}
container(66, 38, 'blue_concrete', 5);
container(66, 45, 'lime_concrete', 5);
container(73, 41, 'orange_concrete', 4);
container(38, 38, 'cyan_concrete', 4);
container(38, 45, 'red_concrete', 4);
// deck crane (A-frame + jib), forward
fill(80, deckY + 1, 40, 80, deckY + 12, 40, 'gray_concrete');
fill(80, deckY + 1, 46, 80, deckY + 12, 46, 'gray_concrete');
fill(80, deckY + 13, 40, 80, deckY + 13, 46, 'gray_concrete');
fill(80, deckY + 13, CZ, 74, deckY + 13, CZ, 'iron_block');
fill(74, deckY + 9, CZ, 74, deckY + 12, CZ, 'iron_bars');
pb(74, deckY + 8, CZ, 'barrel[facing=up]');
ps(78, deckY + 12, CZ, 'gray_concrete');
// aft crane / A-frame over the stern
fill(36, deckY + 1, 38, 36, deckY + 9, 38, 'yellow_concrete');
fill(36, deckY + 1, 48, 36, deckY + 9, 48, 'yellow_concrete');
fill(36, deckY + 10, 38, 36, deckY + 10, 48, 'yellow_concrete');
fill(36, deckY + 10, CZ, 32, deckY + 10, CZ, 'iron_block');
fill(32, deckY + 6, CZ, 32, deckY + 9, CZ, 'iron_bars');
pb(32, deckY + 5, CZ, 'chest[facing=south]');
// winches, bollards, deck fittings
var dfx;
for (dfx = 26; dfx <= 92; dfx += 8) {
pb(dfx, deckY + 1, 37, 'anvil[facing=north]');
pb(dfx, deckY + 1, 49, 'anvil[facing=north]');
}
for (dfx = 30; dfx <= 88; dfx += 12) {
ps(dfx, deckY + 1, 39, 'cauldron');
ps(dfx, deckY + 1, 47, 'cauldron');
}
fill(84, deckY + 1, 41, 86, deckY + 2, 45, 'gray_concrete'); // windlass housing
ps(85, deckY + 3, CZ, 'lantern[hanging=false]');
// lifeboats in davits, both sides
fill(66, 28, 36, 70, 29, 36, 'orange_concrete');
fill(66, 28, 50, 70, 29, 50, 'orange_concrete');
ps(66, 30, 36, 'iron_bars'); ps(70, 30, 36, 'iron_bars');
ps(66, 30, 50, 'iron_bars'); ps(70, 30, 50, 'iron_bars');
fill(66, 31, 36, 70, 31, 36, 'gray_concrete');
fill(66, 31, 50, 70, 31, 50, 'gray_concrete');
ck('DECKGEAR');
// ---------- STAIRS (accommodation ladders, starboard side deck) ----------
staircase(45, 36, 23, 28, 'east', { width: 1, material: 'iron_block', rail: 'iron_bars' });
staircase(52, 36, 28, 33, 'east', { width: 1, material: 'iron_block', rail: 'iron_bars' });
// doors off each landing into the house
fill(51, 33, 38, 51, 34, 38, 'air');
ck('STAIRS');
// ---------- INTERIORS ----------
// BRIDGE (floor 32, walk 33, ceiling 37)
fill(51, 32, 38, 59, 32, 48, 'polished_andesite');
rug(53, 33, 41, 5, 4, 'blue', 'gray');
var bcx;
for (bcx = 52; bcx <= 58; bcx++) {
pb(bcx, 33, 47, 'gray_concrete');
ps(bcx, 34, 47, 'light_gray_stained_glass_pane');
}
ps(54, 33, 46, 'lectern[facing=south]'); // helm console
ps(56, 33, 46, 'daylight_detector');
pb(55, 33, 46, 'observer[facing=south]');
chairStair(54, 33, 45, 'dark_oak_stairs', 'south');
chairStair(56, 33, 45, 'dark_oak_stairs', 'south');
pb(52, 33, 40, 'dark_oak_fence'); pb(52, 34, 40, 'light_gray_carpet'); // chart table
pb(53, 33, 40, 'dark_oak_fence'); pb(53, 34, 40, 'light_gray_carpet');
ps(52, 33, 41, 'cartography_table');
pb(58, 33, 40, 'barrel[facing=up]'); pb(58, 33, 41, 'chest[facing=east]');
ps(58, 33, 44, 'bell[facing=west,attachment=single_wall]');
ps(53, 36, 43, 'lantern[hanging=true]'); ps(57, 36, 43, 'lantern[hanging=true]');
ps(55, 36, 39, 'lantern[hanging=true]');
// CREW MESS on L1 (floor = deck 22, walk 23, ceiling 27)
fill(47, 22, 38, 63, 22, 48, 'spruce_planks');
rug(50, 23, 40, 6, 5, 'red', 'white');
fill(51, 23, 41, 54, 23, 41, 'spruce_fence');
fill(51, 24, 41, 54, 24, 41, 'white_carpet');
chairStair(51, 23, 40, 'spruce_stairs', 'south');
chairStair(53, 23, 40, 'spruce_stairs', 'south');
chairStair(51, 23, 42, 'spruce_stairs', 'north');
chairStair(53, 23, 42, 'spruce_stairs', 'north');
fill(58, 23, 45, 61, 23, 45, 'spruce_fence');
fill(58, 24, 45, 61, 24, 45, 'white_carpet');
chairStair(58, 23, 44, 'spruce_stairs', 'south');
chairStair(60, 23, 44, 'spruce_stairs', 'south');
// galley run
ps(48, 23, 47, 'furnace[facing=north,lit=true]');
pb(49, 23, 47, 'stripped_spruce_log'); ps(49, 24, 47, 'spruce_slab[type=bottom]');
ps(50, 23, 47, 'smoker[facing=north,lit=false]');
ps(51, 23, 47, 'water_cauldron[level=3]');
pb(52, 23, 47, 'barrel[facing=up]'); pb(53, 23, 47, 'barrel[facing=up]');
shelfWall(60, 23, 39, 'east', 4, 2);
ps(62, 23, 41, 'lectern[facing=west]');
pb(62, 23, 46, 'chest[facing=west]');
ps(50, 26, 43, 'lantern[hanging=true]'); ps(56, 26, 43, 'lantern[hanging=true]');
ps(60, 26, 43, 'lantern[hanging=true]');
ps(48, 23, 39, 'potted_fern');
ck('INTERIOR');
// ---------- FINAL SNOW DUSTING + SCENE DETAIL ----------
var sx3, sz3, si4;
for (si4 = 0; si4 < 120; si4++) {
sx3 = (si4 * 17) % 112;
sz3 = (si4 * 29) % 96;
if (sx3 > 22 && sx3 < 97 && sz3 > 33 && sz3 < 53) { continue; }
ps(sx3, iceH(sx3, sz3) + 1, sz3, 'snow');
}
// meltwater pools on the floe
for (si4 = 0; si4 < 26; si4++) {
sx3 = 40 + (si4 * 19) % 66;
sz3 = 4 + (si4 * 11) % 26;
pb(sx3, iceY, sz3, 'water'); pb(sx3 + 1, iceY, sz3, 'water');
}
for (si4 = 0; si4 < 22; si4++) {
sx3 = 44 + (si4 * 23) % 60;
sz3 = 62 + (si4 * 13) % 30;
pb(sx3, iceY, sz3, 'water'); pb(sx3, iceY, sz3 + 1, 'water');
}
// depot on the floe alongside: sledges, fuel drums, a marker flag line
fill(70, iceY + 1, 60, 74, iceY + 1, 61, 'spruce_slab[type=bottom]');
pb(70, iceY + 2, 60, 'barrel[facing=up]'); pb(71, iceY + 2, 60, 'barrel[facing=up]');
pb(72, iceY + 2, 61, 'barrel[facing=up]');
pb(76, iceY + 1, 58, 'red_concrete'); pb(76, iceY + 2, 58, 'red_concrete');
var fgi;
for (fgi = 0; fgi < 7; fgi++) {
pb(60 + fgi * 4, iceY + 1, 66, 'oak_fence');
pb(60 + fgi * 4, iceY + 2, 66, 'oak_fence');
ps(60 + fgi * 4, iceY + 2, 67, 'red_wall_banner[facing=south]');
}
ck('SCENE');
ck('DONE');