// === BUILD PLAN ===
// Subject: COLOSSAL SECRETARY BIRD in the MANTLING / snake-hunting pose (wings half-raised,
// head lowered and thrust forward, one foot raised mid-stomp on a rearing snake).
// Proportion rule (shape-techniques/Statue Proportions): LEGS = 1/2 of total height.
// total ~52 -> tarsus+shank 19 (Y11..Y30), body Y30..Y42, head Y36..Y43, wings up to Y53.
// Sculpting (organic-builds/Sculpting Curves, r>=9 -> makeSphere/makeCylinder base + hand detail)
//
// SIDE SILHOUETTE (Y up, Z -> tail left, head right):
// Y52 \\\ /// raised wings, black primaries fanned
// Y44 \\\ ##### ///
// Y38 ___ ######### (OO)==> lowered head + hooked beak thrust forward
// Y32 \\\ #######
// Y28 ## ## black "trousers"
// Y20 || \\ planted leg / raised leg
// Y11 ~~~~~~||~~~~~S~~~~~~ pad at Y10, snake rearing under the raised foot
//
// FRONT SILHOUETTE (X ->):
// \\\\.......//// wings mantled, black tips
// ..\ ##### /..
// ....#######....
// .....##.##..... trousers
// ......|.|...... bare legs
//
// MATERIALS PLAN (organic-builds/Statue Block Palettes, adapted):
// plumage: polished_andesite(32)+light_gray_concrete(24)+andesite(20)+smooth_stone(14)+diorite(10)
// - WHY: cool neutral grey ramp; VALUE contrast carries the silhouette, not hue
// primaries/trousers/quills: black_concrete(46)+blackstone(28)+polished_blackstone(26)
// legs: pink_terracotta banded with light_gray_terracotta - WHY: bare pinkish tarsus
// face: orange_concrete rim + red_concrete core, black eye - the ONE saturated accent
// ground: blob + hills + flatten pad + surface (dry savanna patches)
// === END PLAN ===
var padY = 10;
var footY = padY + 1;
var plume = noisePalette([
{ block: 'polished_andesite', weight: 32 },
{ block: 'light_gray_concrete', weight: 24 },
{ block: 'andesite', weight: 20 },
{ block: 'smooth_stone', weight: 14 },
{ block: 'diorite', weight: 10 }
], { seed: 12, freq: 0.15 });
var jet = noisePalette([
{ block: 'black_concrete', weight: 46 },
{ block: 'blackstone', weight: 28 },
{ block: 'polished_blackstone', weight: 26 }
], { seed: 18, freq: 0.17 });
var tarsus = noisePalette([
{ block: 'pink_terracotta', weight: 42 },
{ block: 'light_gray_terracotta', weight: 33 },
{ block: 'clay', weight: 25 }
], { seed: 27, freq: 0.22 });
// bone(): sculpt a tapered limb out of overlapping makeSphere balls (docs: r>=medium -> sphere base)
function bone(x1, y1, z1, x2, y2, z2, r1, r2, mat) {
var n = Math.round(Math.max(Math.abs(x2 - x1), Math.max(Math.abs(y2 - y1), Math.abs(z2 - z1))) * 1.6);
var i, t;
if (n < 1) n = 1;
for (i = 0; i <= n; i++) {
t = i / n;
makeSphere(Math.round(x1 + (x2 - x1) * t), Math.round(y1 + (y2 - y1) * t), Math.round(z1 + (z2 - z1) * t),
mat, r1 + (r2 - r1) * t, true);
}
}
// ===================== 1. DRY SAVANNA GROUND =====================
var land = blob(40, 48, 40, { irregularity: 0.3, seed: 6 });
var hh = hills({ base: padY, amp: 3, scale: 0.04, seed: 4, octaves: 2 });
var gpad = flatten(hh, { cx: 40, cz: 48, r: 20 }, padY, 10);
surface(land, gpad, patches([
{ block: 'grass_block', w: 26 },
{ block: 'coarse_dirt', w: 26 },
{ block: 'sand', w: 20 },
{ block: 'dirt_path', w: 16 },
{ block: 'red_sand', w: 12 }
], 0.05, 13), { sub: 'dirt', deep: 'stone', depth: 4 });
// ===================== 2. LEGS — half the total height =====================
// planted leg (x34): toes Y11 z40 -> ankle -> backward-bent hock -> hip Y30
bone(34, footY, 40, 34, footY + 10, 43, 1.7, 1.4, tarsus);
bone(34, footY + 10, 43, 35, footY + 19, 46, 1.5, 2.4, tarsus);
bone(34, footY, 40, 34, footY, 45, 1.5, 0.9, 'light_gray_terracotta');
bone(34, footY, 40, 31, footY, 37, 1.4, 0.8, 'light_gray_terracotta');
bone(34, footY, 40, 37, footY, 37, 1.4, 0.8, 'light_gray_terracotta');
// raised leg (x46): foot up at Y20 pinning the snake, knee driven forward
bone(46, footY + 9, 58, 46, footY + 15, 53, 1.6, 1.4, tarsus);
bone(46, footY + 15, 53, 45, footY + 19, 49, 1.5, 2.4, tarsus);
bone(46, footY + 9, 58, 46, footY + 7, 62, 1.4, 0.8, 'light_gray_terracotta');
bone(46, footY + 9, 58, 43, footY + 8, 61, 1.3, 0.8, 'light_gray_terracotta');
bone(46, footY + 9, 58, 49, footY + 8, 61, 1.3, 0.8, 'light_gray_terracotta');
// black trousers over both thighs
makeSphere(35, 31, 45, jet, 5, true);
makeSphere(45, 31, 48, jet, 5, true);
makeSphere(35, 28, 44, jet, 4, true);
makeSphere(45, 28, 47, jet, 4, true);
// ===================== 3. BODY — slice stack, crouched forward =====================
var z, rr, cy, ry;
for (z = 32; z <= 58; z++) {
var u = (z - 45) / 13.0;
rr = 8.4 * Math.sqrt(Math.max(0.05, 1 - u * u * 0.92));
cy = 37 - Math.round((z - 45) * 0.20); // body tips forward-down (hunting crouch)
ry = rr * 0.86;
var dx, dy;
for (dx = -Math.ceil(rr); dx <= Math.ceil(rr); dx++) {
for (dy = -Math.ceil(ry); dy <= Math.ceil(ry); dy++) {
if ((dx * dx) / (rr * rr) + (dy * dy) / (ry * ry) > 1) continue;
if (dy < -ry * 0.45) pb(40 + dx, cy + dy, z, 'white_concrete');
else pb(40 + dx, cy + dy, z, plume(40 + dx, cy + dy, z));
}
}
}
// ===================== 4. MANTLED WINGS (raised, black primaries) =====================
var side, sg, w, t2, wx, wy2, wz2;
for (side = 0; side < 2; side++) {
sg = side === 0 ? -1 : 1;
for (w = 0; w <= 15; w++) {
t2 = w / 15.0;
// leading edge sweeps up and out from the shoulder
wx = 40 + sg * Math.round(6 + t2 * 13);
wy2 = 39 + Math.round(t2 * 13);
wz2 = 48 - Math.round(t2 * 12);
var span, sblk;
for (span = 0; span <= 7 + Math.round(t2 * 4); span++) {
var fz = wz2 - span;
var fy = wy2 - Math.round(span * 0.55);
sblk = (span > 4 + t2 * 3 || t2 > 0.72) ? jet : plume;
pb(wx, fy, fz, sblk(wx, fy, fz));
pb(wx - sg, fy, fz, sblk(wx, fy, fz));
if (span % 3 === 0) ps(wx + sg, fy, fz, 'polished_blackstone_slab[type=bottom]');
}
}
// shoulder fairing into the body
bone(40 + sg * 6, 39, 48, 40 + sg * 8, 42, 44, 4.0, 2.6, plume);
}
// ===================== 5. TAIL — long central streamers =====================
bone(39, 36, 33, 39, 18, 10, 2.4, 1.0, jet);
bone(41, 36, 33, 41, 16, 13, 2.4, 1.0, jet);
bone(37, 36, 33, 34, 27, 22, 2.0, 0.9, plume);
bone(43, 36, 33, 46, 27, 22, 2.0, 0.9, plume);
bone(40, 36, 33, 40, 30, 24, 3.2, 1.5, plume);
// ===================== 6. NECK LOWERED + HEAD THRUST FORWARD =====================
bone(40, 40, 55, 40, 40, 60, 3.2, 2.6, plume);
makeSphere(40, 39, 63, plume, 4, true);
// hooked beak
bone(40, 39, 66, 40, 39, 69, 2.0, 1.3, 'light_gray_concrete');
bone(40, 39, 69, 40, 37, 71, 1.3, 0.9, 'gray_concrete');
pb(40, 36, 71, 'black_concrete');
pb(40, 36, 70, 'black_concrete');
pb(41, 37, 71, 'black_concrete');
pb(39, 37, 71, 'black_concrete');
// bare orange-red face patch + eye
var fx, fy3;
for (fx = 37; fx <= 43; fx++) {
for (fy3 = 37; fy3 <= 41; fy3++) {
if ((fx - 40) * (fx - 40) / 9.5 + (fy3 - 39) * (fy3 - 39) / 4.5 <= 1) {
pb(fx, fy3, 66, 'orange_concrete');
pb(fx, fy3, 67, 'red_concrete');
}
}
}
pb(37, 40, 66, 'white_concrete'); pb(37, 40, 67, 'black_concrete');
pb(43, 40, 66, 'white_concrete'); pb(43, 40, 67, 'black_concrete');
// ===================== 7. CREST — fan of quills sweeping BACK =====================
var q, qs, qlen, qx2;
for (q = -3; q <= 3; q++) {
qs = Math.abs(q);
qlen = 13 - qs * 2;
qx2 = 40 + q * 2;
bone(40 + q, 42, 60, qx2, 42 + Math.round(qlen * 0.55), 60 - qlen, 1.4, 0.6, jet);
}
bone(38, 42, 60, 33, 48, 52, 1.1, 0.5, jet);
bone(42, 42, 60, 47, 47, 53, 1.1, 0.5, jet);
// ===================== 8. THE SNAKE, REARING UNDER THE RAISED FOOT =====================
var snakePal = noisePalette([
{ block: 'moss_block', weight: 36 },
{ block: 'green_concrete', weight: 28 },
{ block: 'green_terracotta', weight: 20 },
{ block: 'yellow_terracotta', weight: 16 }
], { seed: 51, freq: 0.28 });
var si, ang, sx3, sz3, sr;
for (si = 0; si <= 40; si++) {
ang = si * 0.33;
sr = 9 - si * 0.16;
sx3 = 46 + Math.round(sr * Math.cos(ang));
sz3 = 60 + Math.round(sr * Math.sin(ang) * 0.85);
makeSphere(sx3, footY, sz3, snakePal, si > 30 ? 1 : 2, true);
}
// the head rears up toward the bird
bone(46, footY, 68, 44, footY + 7, 66, 1.8, 1.4, snakePal);
pb(44, footY + 8, 66, 'green_concrete');
pb(43, footY + 8, 65, 'black_concrete');
pb(45, footY + 8, 65, 'black_concrete');
ps(44, footY + 7, 64, 'red_carpet');
// ===================== 9. SAVANNA DRESSING =====================
var trees = [[16, 74], [20, 22], [62, 78], [66, 24], [10, 48], [70, 52]];
var tr, tyv;
for (tr = 0; tr < trees.length; tr++) {
if (!land(trees[tr][0], trees[tr][1])) continue;
tyv = Math.round(gpad(trees[tr][0], trees[tr][1])) + 1;
try { placeTree(trees[tr][0], tyv, trees[tr][1], 'acacia'); } catch (err) { }
}
var gx, gz, gy, nn;
for (gx = 2; gx < 78; gx += 2) {
for (gz = 4; gz < 92; gz += 2) {
if (gx > 26 && gx < 54 && gz > 30 && gz < 70) continue;
if (!land(gx, gz)) continue;
nn = noise2d('perlin', gx, gz, { freq: 0.12, seed: 63 });
if (nn > 0.1) {
gy = Math.round(gpad(gx, gz)) + 1;
if (nn > 0.5) pb(gx, gy, gz, 'tall_grass');
else if (nn > 0.3) pb(gx, gy, gz, 'short_grass');
else if ((gx + gz) % 9 === 0) pb(gx, gy, gz, 'dead_bush');
}
}
}
makeSphere(22, padY + 1, 62, 'cobblestone', 3, true);
makeSphere(60, padY + 1, 34, 'andesite', 3, true);
ps(56, padY + 1, 66, 'bone_block[axis=x]');
ps(57, padY + 1, 66, 'bone_block[axis=x]');
ps(58, padY + 1, 67, 'bone_block[axis=z]');