<!-- RUBY-BACKUP · part 357 -->
);
    ship.add(nose);
    for(var ti=0; ti<2; ti++){
      var thr = new THREE.Mesh(new THREE.CylinderGeometry(0.7, 0.7, 1.5, 12), orangeMat);
      thr.name = 'thruster-' + (ti+1);
      thr.rotation.z = Math.PI/2;
      thr.position.set(-4.5, -0.3 + ti*0.6, ti===0 ? -0.8 : 0.8);
      ship.add(thr);
    }
    var dome = new THREE.Mesh(new THREE.SphereGeometry(1.2, 16, 12, 0, Math.PI*2, 0, Math.PI/2), tealMat);
    dome.name = 'dome';
    dome.position.set(1, 0.75, 0);
    ship.add(dome);
    var beacon = new THREE.Mesh(new THREE.SphereGeometry(0.3, 8, 8), redMat);
    beacon.name = 'beacon';
    beacon.position.set(0, -1, 0);
    ship.add(beacon);
    ship.position.set(0, 2, 12);
    g.add(ship);
    /* the little robot — black box, red eyes, red antennae */
    var bot = new THREE.Group();
    var body = new THREE.Mesh(new THREE.BoxGeometry(1.5, 1.5, 1.5), blackMat);
    bot.add(body);
    for(var ei=0; ei<2; ei++){
      var eye = new THREE.Mesh(new THREE.BoxGeometry(0.4, 0.3, 0.1), redMat);
      eye.position.set(-0.3 + ei*0.6, 0.2, 0.76);
      bot.add(eye);
    }
    for(var ai=0; ai<2; ai++){
      var ant = new THREE.Mesh(new THREE.CylinderGeometry(0.05, 0.05, 0.8, 6), blackMat);
      ant.position.set(-0.3 + ai*0.6, 1.1, 0);
      bot.add(ant);
      var tip = new THREE.Mesh(new THREE.SphereGeometry(0.12, 8, 8), redMat);
      tip.position.set(-0.3 + ai*0.6, 1.5, 0);
      bot.add(tip);
    }
    bot.position.set(-6, 0.75, 12);
    g.add(bot);
    /* the pavilion house — open sides, column roof, a house like a pavilion */
    var pav = new THREE.Group();
    var floorMat = new THREE.MeshStandardMaterial({color:0x2a2a2a, roughness:0.8});
    var colMat = new THREE.MeshStandardMaterial({color:0x1a1a1a, roughness:0.5, metalness:0.3});
    var roofMat = new THREE.MeshStandardMaterial({color:0x0a0a0a, roughness:0.4});
    var trimMat = new THREE.MeshStandardMaterial({color:0xffd700, emissive:0xffd700, emissiveIntensity:0.9});
    /* raised floor */
    var pfloor = new THREE.Mesh(new THREE.BoxGeometry(10, 0.5, 8), floorMat);
    pfloor.position.set(0, 0.25, 0);
    pav.add(pfloor);
    var pgold = new THREE.Mesh(new THREE.BoxGeometry(10.2, 0.15, 8.2), trimMat);
    pgold.position.set(0, 0.55, 0);
    pav.add(pgold);
    /* four corner columns + two mid columns, open sides */
    var colPos = [[-4.5,-3.5],[4.5,-3.5],[-4.5,3.5],[4.5,3.5],[0,-3.5],[0,3.5]];
    colPos.forEach(function(cp){
      var col = new THREE.Mesh(new THREE.CylinderGeometry(0.3, 0.35, 5, 10), colMat);
      col.position.set(cp[0], 3, cp[1]);
      pav.add(col);
      var cap = new THREE.Mesh(new THREE.BoxGeometry(0.9, 0.3, 0.9), trimMat);
      cap.position.set(cp[0], 5.6, cp[1]);
      pav.add(cap);
    });
    /* pitched roof — two slabs meeting at ridge */
    var roofL = new THREE.Mesh(new THREE.BoxGeometry(11, 0.3, 5), roofMat);
    roofL.position.set(0, 6.5, -2);
    roofL.rotation.x = 0.35;
    pav.add(roofL);
    var roofR = new THREE.Mesh(new THREE.BoxGeometry(11, 0.3, 5), roofMat);
    roofR.position.set(0, 6.5, 2);
    roofR.rotation.x = -0.35;
    pav.add(roofR);
    var ridge = new THREE.Mesh(new THREE.BoxGeometry(11.2, 0.25, 0.4), trimMat);
    ridge.position.set(0, 7.3, 0);
    pav.add(ridge);
    /* warm light inside */
    var lampMat = new THREE.MeshStandardMaterial({color:0xffaa00, emissive:0xffaa00, emissiveIntensity:1.5});
    var lamp = new THREE.Mesh(new THREE.SphereGeometry(0.4, 10, 10), lampMat);
    lamp.position.set(0, 4.5, 0);
    pav.add(lamp);
    pav.position.set(18, 0, 14);
    g.add(pav);
    if(typeof scene!=='undefined') scene.add(g);
    codeStatus('the outpost stands');
  }catch(e){ codeStatus('outpost failed'); }
}
/* THE CUTAWAY — square block, half cut out, layers black to white */
function buildCutaway(){
  try{
    var g = new THREE.Group();
    /* enable clipping */
    if(typeof renderer!=='undefined'){ renderer.localClippingEnabled = true; }
    var clipPlane = new THREE.Plane(new THREE.Vector3(-1, 0, 0), 0);
    var layers = [
      {s:2.0, c:0x0a0a0a},
      {s:1.6, c:0x333333},
      {s:1.2, c:0x666666},
      {s:0.8, c:0x999999},
      {s:0.4, c:0xffffff}
    ];
    layers.forEach(function(L){
      var mat = new THREE.MeshStandardMaterial({color:L.c, roughness:0.5, clippingPlanes:[clipPlane], side:THREE.DoubleSide});
      var box = new THREE.Mesh(new THREE.BoxGeometry(L.s, L.s, L.s), mat);
      box.position.y = L.s/2;
      g.add(box);
    });
    g.position.set(-18, 0, -8);
    if(typeof scene!=='undefined') scene.add(g);
    codeStatus('the cutaway stands');
  }catch(e){ codeStatus('cutaway failed'); }
}
/* SHAPE GARDEN — a good amount of each shape */
function buildShapes(){
  try{
    var g = new THREE.Group();
    var goldMat = new THREE.MeshStandardMaterial({color:0xffd700, emissive:0xffd700, emissiveIntensity:0.3, roughness:0.4});
    var blackMat = new THREE.MeshStandardMaterial({color:0x1a1a1a, roughness:0.6});
    var shapes = [];
    /*