<!-- RUBY-BACKUP · part 508 -->
ath.sin(hd)*70;
          for(var bi2=0; bi2<16; bi2++){
            bp.setXYZ(bi2, bxx, hy + (Math.random()-0.5)*7, bzz);
            bxx += Math.cos(hd)*10; bzz += Math.sin(hd)*10;
          }
        }else{
          /* down to the ground — taller */
          for(var bi2=0; bi2<16; bi2++){
            bp.setXYZ(bi2, bxx, 46 - bi2*3.1, bzz);
            bxx += (Math.random()-0.5)*10; bzz += (Math.random()-0.5)*10;
          }
        }
        bp.needsUpdate = true;
        /* blue glow sleeve around the white core */
        var gpts = [];
        for(var gpi=0; gpi<16; gpi++){ gpts.push(new T.Vector3(bp.getX(gpi), bp.getY(gpi), bp.getZ(gpi))); }
        var gcurve = new T.CatmullRomCurve3(gpts);
        var ng = new T.TubeGeometry(gcurve, 48, 0.35, 6, false);
        boltGlow.geometry.dispose();
        boltGlow.geometry = ng;
        /* a fork off the middle */
        var brp = boltBranch.geometry.attributes.position;
        var fx = bp.getX(8), fy = bp.getY(8), fz = bp.getZ(8);
        var fd = Math.random()*Math.PI*2;
        for(var bi3=0; bi3<10; bi3++){
          brp.setXYZ(bi3, fx, fy - bi3*2.5, fz);
          fx += Math.cos(fd)*6; fz += Math.sin(fd)*6;
        }
        brp.needsUpdate = true;
        boltLine.visible = true; boltBranch.visible = true; boltGlow.visible = true;
        boltLight.position.set(bx0, 22, bz0);
        boltLight.intensity = 16;
        if(twin){
          /* the earth remembers — a ruby-sized gray stone where the twins landed */
          var gx = across ? bp.getX(8) : bp.getX(15), gz = across ? bp.getZ(8) : bp.getZ(15);
          if(!twinGrp){ twinGrp = new T.Group(); scene.add(twinGrp); }
          var tstone = new T.Mesh(new T.OctahedronGeometry(0.065), new T.MeshStandardMaterial({color:0x8a8a8a, roughness:0.55, metalness:0.25, emissive:0x222222}));
          tstone.position.set(gx, 0.33, gz);
          twinGrp.add(tstone); twinMarks.push(tstone);
          if(twinMarks.length > 60){ var old = twinMarks.shift(); twinGrp.remove(old); }
        }
        setTimeout(function(){ boltLine.visible = false; boltBranch.visible = false; boltGlow.visible = false; }, 220);
      }, 140);
}
var RAIN_ON = false, CLOUDS_ON = false, DAWN_ON = false, EMBER_ON = false, AURORA_ON = false;
var SKY_N_CLUSTERS = 6, SKY_PUFFS = 3, SKY_DROPS = 150, SKY_STARS = 220, SKY_EMBERS = 150;
function skyBuild(){
  if(skyGrp) return;
  skyGrp = new T.Group(); scene.add(skyGrp);
  var puffGeo = new T.SphereGeometry(1, 8, 6);
  var puffMat = new T.MeshBasicMaterial({color:0xc9962e, transparent:true, opacity:0.42, fog:false});
  var i, j;
  for(i=0;i<SKY_N_CLUSTERS;i++){
    var cx = -55 + i*(110/SKY_N_CLUSTERS) + (Math.random()*8-4);
    var cy = 26 + Math.random()*8, cz = -20 + Math.random()*40;
    for(j=0;j<SKY_PUFFS;j++){
      var m = new T.Mesh(puffGeo, puffMat);
      var sc = 3.5 + Math.random()*3;
      m.scale.set(sc*1.6, sc*0.7, sc);
      m.position.set(cx + (Math.random()*10-5), cy + (Math.random()*3-1.5), cz + (Math.random()*8-4));
      skyGrp.add(m); cloudPuffs.push(m);
    }
  }
  var rgeo = new T.BufferGeometry();
  var pos = new Float32Array(SKY_DROPS*3);
  rainVel = new Float32Array(SKY_DROPS);
  for(i=0;i<SKY_DROPS;i++){
    pos[i*3] = Math.random()*110-55; pos[i*3+1] = Math.random()*40; pos[i*3+2] = Math.random()*110-55;
    rainVel[i] = 18 + Math.random()*10;
  }
  rgeo.setAttribute('position', new T.BufferAttribute(pos, 3));
  rainPts = new T.Points(rgeo, new T.PointsMaterial({color:0x9db8d4, size:0.16, transparent:true, opacity:0.55, fog:false}));
  rainPts.visible = false; skyGrp.add(rainPts);
  var sgeo = new T.BufferGeometry();
  var spos = new Float32Array(SKY_STARS*3), i2;
  for(i2=0;i2<SKY_STARS;i2++){
    spos[i2*3] = Math.random()*160-80; spos[i2*3+1] = 30+Math.random()*40; spos[i2*3+2] = Math.random()*160-80;
  }
  sgeo.setAttribute('position', new T.BufferAttribute(spos, 3));
  starPts = new T.Points(sgeo, new T.PointsMaterial({color:0xfff6d8, size:0.22, transparent:true, opacity:0.85, fog:false}));
  starPts.visible = false; skyGrp.add(starPts);
  var egeo = new T.BufferGeometry();
  var epos = new Float32Array(SKY_EMBERS*3), ev = new Float32Array(SKY_EMBERS), ei;
  for(ei=0; ei<SKY_EMBERS; ei++){
    epos[ei*3] = Math.random()*110-55; epos[ei*3+1] = Math.random()*30; epos[ei*3+2] = Math.random()*110-55;
    ev[ei] = 1.5+Math.random()*3;
  }
  egeo.setAttribute('position', new T.BufferAttribute(epos, 3));
  emberPts = new T.Points(egeo, new T.PointsMaterial({color:0xffaa33, size:0.16, transparent:true, opacity:0.9, fog:false}));
  emberVel = ev;
  emberPts.visible = false; skyGrp.add(emberPts);
  /* aurora — ribbons of light waving in the night */
  var acol = [0x33ffcc, 0x8844ff, 0x44ff88], ai;
  for(ai=0; ai<3; ai++){
    var ag = new T.PlaneGeometry(130, 20, 64, 6);
    var am = new T.Mesh(ag, new T.MeshBasicMaterial({color:acol[ai], transparent:true, opacity:0.30, blending:T.AdditiveBlending, depthWrite:false, side:T.Double