← Back to Gallery

Loading 3D viewer…

Colossal garden snail on dry-stone wall (guided)

by Jorge Barbero

Dimensions
64×44×44
Blocks
31,334
Compute Time
3.0s
Generation Time
2m 55s
Edits
1
Model
claude-opus-5-5
Created
September 27, 2026
autoevalguidedcreatures_organic
Prompt

User Prompt

a colossal garden snail crawling over a mossy dry-stone wall after rain: a tall spiral-banded brown-and-cream shell, a long glistening grey-green body with a ridged foot, two tall eye-stalks and two short lower tentacles, a silvery slime trail across the stones, with ferns, toadstools and fallen autumn leaves around

Photos

Profile
Profileexterior
Overview
Overviewexterior
Head & eye-stalks
Head & eye-stalksexterior
Slime trail
Slime trailexterior
CraftScript Source
// === BUILD PLAN ===
// Subject: colossal garden snail crawling EAST (+x) along the top of a mossy dry-stone wall after rain
// TOP VIEW (x ->, z down):
//   . . , f  T  . , . f . . T . . .     , = fallen leaves, f = ferns, T = toadstools
//   ================================   z20-24 dry-stone wall (y6-11), mossy coping
//   ~~slime~~ <tail====BODY====head>oo   body on wall top, flanks droop over both faces
//              ( SHELL x13-41 )         spiral shell standing on the back, aperture low/forward
//   . f . ~ . , . T . . , ~ . f . .     ~ = rain puddles
// SIDE ELEVATION:
//                 _@@@_          eye-stalks
//               @@  @  @@           \ /
//              @@ (@)  @@            o o
//               @@@@@@@  ________/
//      ~~~~~====BODY=============/
//   ###########################wall######
// Materials: shell cream(white_terracotta/smooth_sandstone) + dark brown spiral bands (brown_concrete/brown_terracotta),
//   growth lines terracotta, pale lip; body green_terracotta/tuff/gray_terracotta + slime glints, ridged foot light/dark grey;
//   wall cobble/mossy/stone/andesite/tuff, moss coping; ground grass+podzol+coarse patches, carpets as fallen leaves
// === END PLAN ===

var zc = 22, padY = 5, g0 = 6;

// === TERRAIN ===
var hh = hills({ base: 5, amp: 2, scale: 0.06, seed: 17 });
var land = blob(32, 22, 30, { irregularity: 0.3, seed: 4 });
var ground = flatten(hh, { x0: 0, z0: 10, x1: 63, z1: 34 }, padY, 6);
surface(land, ground, patches([{ block: 'grass_block', w: 55 }, { block: 'podzol', w: 25 }, { block: 'coarse_dirt', w: 10 }, { block: 'moss_block', w: 10 }], 0.08, 6));

// === DRY-STONE WALL ===
function stoneB() {
  var r = Math.random();
  if (r < 0.33) return 'cobblestone'; if (r < 0.58) return 'mossy_cobblestone'; if (r < 0.72) return 'stone';
  if (r < 0.84) return 'andesite'; if (r < 0.94) return 'tuff'; return 'mossy_stone_bricks';
}
var x, y, z;
for (x = 0; x <= 63; x++) {
  var top = 11;
  if (x < 6 || x > 54) top = 11 + Math.round(Math.sin(x * 0.7) * 0.8);
  for (y = g0; y <= top; y++) {
    var z1 = 20, z2 = 24;
    if (y <= g0 + 1) { z1 = 19; z2 = 25; }       // batter: wider footing
    if (y === top) { z1 = 21; z2 = 23; }          // rounded coping
    for (z = z1; z <= z2; z++) pb(x, y, z, (y === top && Math.random() < 0.55) ? 'moss_block' : stoneB());
  }
  if (top === 11) { pb(x, 11, 20, stoneB()); pb(x, 11, 24, stoneB()); pb(x, 12, 20, 'air'); }
  for (y = 2; y < g0; y++) for (z = 19; z <= 25; z++) pb(x, y, z, 'stone');   // footing below grade
}

// === BODY ===
function prof(x) {
  var a, b;
  if (x < 20) { var t = (x - 8) / 12; a = 1 + t * 3.6; b = 1 + t * 3.0; }
  else if (x <= 40) { a = 4.6; b = 4.0; }
  else { a = 4.6 - (x - 40) * 0.1; b = 4.0 - (x - 40) * 0.08; }
  if (x > 48) { var f = Math.sqrt(Math.max(0, 1 - Math.pow((x - 48) / 4.5, 2))); a *= f; b *= Math.max(f, 0.3); }
  var yo = x > 38 ? (x - 38) * 0.32 : 0;
  return { a: a, b: b, yo: yo };
}
function bodyB(x, y, yt, dz, a, isFoot) {
  if (isFoot) return (x % 2 === 0) ? 'gray_terracotta' : 'light_gray_terracotta';
  if (y >= yt - 0.6) { var r = Math.random(); return r < 0.07 ? 'slime_block' : (r < 0.55 ? 'tuff' : 'green_terracotta'); }
  if ((x + y + Math.round(Math.abs(dz))) % 4 === 0) return 'tuff';
  var rq = Math.random(); return rq < 0.55 ? 'green_terracotta' : (rq < 0.8 ? 'andesite' : 'moss_block');
}
for (x = 8; x <= 52; x++) {
  var p = prof(x);
  if (p.a < 0.5) continue;
  var za = Math.ceil(p.a);
  for (var dz = -za; dz <= za; dz++) {
    if (Math.abs(dz) > p.a + 0.2) continue;
    var ad = Math.abs(dz);
    var yb = 12 - (ad > 2.5 ? Math.round((ad - 2.5) * 1.4) : 0);
    var yt = 12 + p.yo + p.b * Math.sqrt(Math.max(0, 1 - Math.pow(dz / (p.a + 0.2), 2)));
    for (y = yb; y <= Math.round(yt); y++) {
      var foot = (y <= yb + 1 && ad >= p.a - 1.3) || y === yb && ad > 2.5;
      pb(x, y, zc + dz, bodyB(x, y, yt, dz, p.a, foot));
    }
  }
}
// mouth / underside of head
pb(52, 13, zc, 'gray_terracotta'); pb(52, 12, zc, 'gray_terracotta');

// === SHELL (planispiral, 2.5D raster in XY, thickness in Z) ===
var sx = 27, sy = 28, Rmax = 8.6, gr = 2.0, kr = 0.62, shift = 2.2;
// mantle collar: shell grows out of a thick fleshy mantle instead of balancing on a stalk
for (x = 22; x <= 35; x++) for (y = 15; y <= 20; y++) for (z = zc - 4; z <= zc + 4; z++) {
  var ex = (x - 28.5) / 7, ey = (y - 15) / 5.5, ez = (z - zc) / 4.4;
  if (ex * ex + ey * ey + ez * ez <= 1) pb(x, y, z, Math.random() < 0.6 ? 'light_gray_terracotta' : 'tuff');
}
var TWO = Math.PI * 2;
var phiMax = -70 * Math.PI / 180 + TWO * 3, phiMin = phiMax - TWO * 3.1;
function Rf(ph) { return Rmax * Math.pow(gr, (ph - phiMax) / TWO); }
for (x = sx - 16; x <= sx + 16; x++) for (y = sy - 15; y <= sy + 13; y++) {
  var dx = x - sx, dy = y - sy, rho = Math.sqrt(dx * dx + dy * dy), th = Math.atan2(dy, dx);
  var kmin = Math.ceil((phiMin - th) / TWO), kmax = Math.floor((phiMax - th) / TWO);
  var best = -1e9, bestD = 0, bestR = 0, second = false;
  for (var k = kmax; k >= kmin; k--) {
    var ph = th + TWO * k, R = Rf(ph), r = kr * R, d = rho - R;
    if (Math.abs(d) <= r + 0.35) { if (best < -1e8) { best = ph; bestD = d; bestR = R; } else { second = true; break; } }
  }
  var apexR = Rf(phiMin) * (1 + kr);
  if (best < -1e8 && rho <= apexR) { best = phiMin; bestR = Rf(phiMin); bestD = 0; }
  if (best < -1e8) continue;
  var rr = kr * bestR, hz = Math.sqrt(Math.max(0.25, rr * rr - bestD * bestD));
  var zm = zc + shift * (1 - bestR / Rmax);
  var suture = second && bestD < -rr + 1.2;
  var growth = ((best * 10 / TWO) % 1 + 1) % 1 < 0.13;
  var lip = best > phiMax - 0.3;
  for (z = Math.round(zm - hz); z <= Math.round(zm + hz); z++) {
    var t = (z - zm) / Math.max(rr, 1), at = Math.abs(t), blk;
    if (suture) blk = 'brown_concrete';
    else if (lip) blk = Math.random() < 0.6 ? 'smooth_sandstone' : 'white_terracotta';
    else if (at > 0.18 && at < 0.36) blk = Math.random() < 0.6 ? 'brown_terracotta' : 'terracotta';
    else if (at > 0.82) blk = 'brown_terracotta';
    else if (growth) blk = 'terracotta';
    else blk = (bestR < 3.2) ? 'white_terracotta' : (Math.random() < 0.55 ? 'white_terracotta' : 'smooth_sandstone');
    pb(x, y, z, blk);
  }
}

// === EYE-STALKS + TENTACLES ===
function limb(x1, y1, z1, x2, y2, z2, blk, thick) {
  var n = Math.ceil(Math.max(Math.abs(x2 - x1), Math.abs(y2 - y1), Math.abs(z2 - z1)) * 2);
  for (var i = 0; i <= n; i++) {
    var t = i / n, px = Math.round(x1 + (x2 - x1) * t), py = Math.round(y1 + (y2 - y1) * t), pz = Math.round(z1 + (z2 - z1) * t);
    pb(px, py, pz, blk);
    if (thick && t < 0.4) { pb(px, py, pz + 1, blk); pb(px - 1, py, pz, blk); }
  }
}
limb(46, 17, zc - 1, 51, 26, zc - 3, 'tuff', true);
limb(46, 17, zc + 1, 51, 26, zc + 3, 'tuff', true);
function bulb(x, y, z) {
  pb(x, y, z, 'gray_terracotta'); pb(x, y + 1, z, 'gray_terracotta'); pb(x - 1, y, z, 'gray_terracotta');
  pb(x, y, z - 1, 'gray_terracotta'); pb(x, y, z + 1, 'gray_terracotta');
  pb(x + 1, y, z, 'black_concrete');
}
bulb(51, 26, zc - 3); bulb(51, 26, zc + 3);
limb(51, 14, zc - 1, 55, 13, zc - 3, 'tuff', false);
limb(51, 14, zc + 1, 55, 13, zc + 3, 'tuff', false);
pb(55, 13, zc - 3, 'gray_terracotta'); pb(55, 13, zc + 3, 'gray_terracotta');

// === SLIME TRAIL ===
for (x = 0; x <= 9; x++) {
  var tz = zc + Math.round(Math.sin(x / 2.5));
  pb(x, 12, tz, (x % 3 === 0) ? 'light_gray_carpet' : 'white_carpet');
  if (x > 2) pb(x, 12, tz + 1, 'white_carpet');
}
// drips down the wall face near the tail
pb(6, 10, 19, 'white_stained_glass'); pb(6, 9, 19, 'white_stained_glass');
pb(9, 11, 25, 'white_stained_glass');

// moss carpet on remaining wall top
for (x = 0; x <= 63; x++) { if (x >= 7 && x <= 53) continue; if (Math.random() < 0.5) pb(x, 12 + ((x < 6 || x > 54) ? Math.round(Math.sin(x * 0.7) * 0.8) : 0), zc, 'moss_carpet'); }

// === GROUND DRESSING (pad is flat at y=5 -> dressing at y=6) ===
var i;
function toadstool(x, z, h) {
  for (var yy = 6; yy < 6 + h; yy++) pb(x, yy, z, 'mushroom_stem');
  for (var ax = -1; ax <= 1; ax++) for (var az = -1; az <= 1; az++) pb(x + ax, 6 + h, z + az, 'red_mushroom_block');
  pb(x, 7 + h, z, 'red_mushroom_block');
  pb(x - 1, 7 + h, z, 'mushroom_stem');
}
toadstool(13, 30, 3); toadstool(15, 31, 2); toadstool(44, 13, 3); toadstool(58, 30, 2); toadstool(34, 14, 2);
var small = ['red_mushroom', 'brown_mushroom'];
for (i = 0; i < 18; i++) { var mx = 2 + Math.floor(Math.random() * 60), mz = 10 + Math.floor(Math.random() * 25); if (mz >= 18 && mz <= 26) continue; pb(mx, 6, mz, small[i % 2]); }
// ferns hugging the wall foot
for (x = 0; x <= 63; x++) {
  if (Math.random() < 0.45) pb(x, 6, 18, 'fern');
  if (Math.random() < 0.45) pb(x, 6, 26, 'fern');
  if (Math.random() < 0.12) { ps(x, 6, 17, 'large_fern[half=lower]'); ps(x, 7, 17, 'large_fern[half=upper]'); }
  if (Math.random() < 0.12) { ps(x, 6, 27, 'large_fern[half=lower]'); ps(x, 7, 27, 'large_fern[half=upper]'); }
}
// fallen autumn leaves
var lv = ['orange_carpet', 'brown_carpet', 'red_carpet', 'yellow_carpet', 'orange_carpet'];
for (i = 0; i < 160; i++) {
  var lx = Math.floor(Math.random() * 64), lz = 10 + Math.floor(Math.random() * 25);
  if (lz >= 17 && lz <= 27) continue;
  pb(lx, 6, lz, lv[i % lv.length]);
}
// rain puddles
function puddle(cx, cz) { for (var ax = -2; ax <= 2; ax++) for (var az = -1; az <= 1; az++) if (Math.abs(ax) + Math.abs(az) < 3) { pb(cx + ax, 5, cz + az, 'water'); pb(cx + ax, 6, cz + az, 'air'); } }
puddle(24, 31); puddle(50, 12); puddle(6, 13);

Static Renders

Colossal garden snail on dry-stone wall (guided) isometric viewisometric
Colossal garden snail on dry-stone wall (guided) front viewfront
Colossal garden snail on dry-stone wall (guided) side viewside
Colossal garden snail on dry-stone wall (guided) back viewback
Colossal garden snail on dry-stone wall (guided) top viewtop