<!-- SAGA2 · part 83 -->
s[i]);
  }
}
window.addEventListener('touchend',endTouch2);
window.addEventListener('touchcancel',endTouch2);
var clock=new THREE.Clock();

// ===== HUMAN CYBORG MASTERPIECE — smooth face, circuit intaglio =====
var avatarGrp = null;
var avatarVisor = null;
var avatarCannonL = null, avatarCannonR = null;
var avatarGrp = null;
var avatarCannonL = null, avatarCannonR = null;
var avatarVisor = null;
function buildAvatar(){
  if(avatarGrp) return;
  avatarGrp = new THREE.Group();

  // ===== INTAGLIO MATERIALS =====
  var lnCyan = new THREE.LineBasicMaterial({color:0x77eeff, transparent:true, opacity:0.6, blending:THREE.AdditiveBlending});
  var lnGold = new THREE.LineBasicMaterial({color:0xffd766, transparent:true, opacity:0.9, blending:THREE.AdditiveBlending});
  var lnDim = new THREE.LineBasicMaterial({color:0x3388aa, transparent:true, opacity:0.5, blending:THREE.AdditiveBlending});
  var lnWhite = new THREE.LineBasicMaterial({color:0xccf6ff, transparent:true, opacity:0.7, blending:THREE.AdditiveBlending});
  avatarGrp.userData.lineMats = [lnCyan, lnGold, lnDim, lnWhite];
  var lnSteel = new THREE.LineBasicMaterial({color:0xaaccdd, transparent:true, opacity:1.0});
  var lnChrome = new THREE.LineBasicMaterial({color:0xffffff, transparent:true, opacity:1.0});
  var lnBlack = new THREE.LineBasicMaterial({color:0x222233, transparent:true, opacity:1.0});
  function drawDark(pts, mat, parent){
    for(var w=0; w<16; w++){
      var ox=(Math.random()-0.5)*0.3, oy=(Math.random()-0.5)*0.3;
      var ptw = pts.map(function(p){ return new THREE.Vector3(p.x+ox, p.y+oy, p.z); });
      (parent||avatarGrp).add(new THREE.Line(new THREE.BufferGeometry().setFromPoints(ptw), mat));
    }
  }
  function draw(pts, mat, parent){
    // 20-WAY — twenty lines, micro-offsets, blended into pure light
    for(var w=0; w<8; w++){
      var ox = (Math.random()-0.5)*0.6, oy = (Math.random()-0.5)*0.6, oz = (Math.random()-0.5)*0.2;
      var ptw = pts.map(function(p){ return new THREE.Vector3(p.x+ox, p.y+oy, p.z+oz); });
      var gw = new THREE.BufferGeometry().setFromPoints(ptw);
      (parent||avatarGrp).add(new THREE.Line(gw, mat||lnCyan));
    }
  }

  // ===== HEAD — contour lines on ellipsoid (rx=5.7, ry=6.94, rz=6.08) =====
  var headGrp = new THREE.Group();
  function headPt(theta, phi, out){
    var r = 1.02+(out||0);
    return new THREE.Vector3(
      5.7*r*Math.sin(theta)*Math.cos(phi),
      6.94*r*Math.sin(phi),
      6.08*r*Math.cos(theta)*Math.cos(phi)
    );
  }
  // FACE SURFACE — carved: front 120° left void for the human face (King's order)
  for(var fs=0; fs<24; fs+=2){
    var fy = 6-fs*0.7;
    // back arc (skip face region)
    var fpts1=[], fpts2=[];
    for(var fi=0;fi<=24;fi++){ var fan=fi/24*Math.PI*2;
      var ffr = 4.5+Math.sin(fs*0.5)*0.25;
      var pt = new THREE.Vector3(Math.cos(fan)*ffr, fy, 2+Math.sin(fan)*ffr*0.85);
      // face is front (fan near PI/2); carve it out
      var dFan = Math.abs(fan - Math.PI/2);
      if(dFan > 1.05) fpts1.push(pt);
    }
    if(fpts1.length>1) draw(fpts1, fs%6===0?lnGold:lnCyan, headGrp);
  }
  // DOME — geometric meridians to match face (King: 100% fill to match)
  for(var m=0; m<12; m++){
    var ma = (m/12)*Math.PI*2, mpts=[];
    for(var mh=0.15; mh<=1.35; mh+=0.12){
      mpts.push(headPt(ma, mh, 0.015));
    }
    draw(mpts, m%3===0?lnGold:lnCyan, headGrp);
  }
  // DOME — clean latitudinal rings (6, not 22)
  for(var f2=0; f2<6; f2++){
    var fp2 = 0.25+f2*0.2, pts2=[];
    for(var a2=-Math.PI; a2<=Math.PI; a2+=0.2) pts2.push(headPt(a2, fp2, 0.015));
    draw(pts2, f2%2?lnGold:lnCyan, headGrp);
  }
  // dome meridians
  for(var dm=0; dm<12; dm++){
    var an = dm/12*Math.PI*2, pts=[];
    for(var dp=0.15; dp<=1.35; dp+=0.1) pts.push(headPt(an, dp, 0.015));
    draw(pts, dm%4===0?lnGold:lnDim, headGrp);
  }
  // ===== DOME ORNAMENT — engraved crown pattern =====
  for(var orn=0; orn<8; orn++){
    var oa = orn/8*Math.PI*2, pts=[];
    for(var oi=0; oi<=20; oi++){
      var t = oi/20, phi = 0.5+t*0.3;
      // wave pattern (decorative)
      var wob = Math.sin(t*Math.PI*4)*0.08;
      pts.push(headPt(oa+wob, phi, 0.02));
    }
    draw(pts, lnGold, headGrp);
  }
  // filigree band around dome base
  for(var fb=0; fb<3; fb++){
    var pts=[], fphi = 0.12+fb*0.04;
    for(var fa=-Math.PI; fa<=Math.PI; fa+=0.1){
      var wob = Math.sin(fa*8)*0.03;
      pts.push(headPt(fa, fphi+wob, 0.02));
    }
    draw(pts, fb===1?lnGold:lnCyan, headGrp);
  }
  // cheeks + jaw (both sides)
  [-1,1].forEach(function(sd){
    for(var c=0; c<10; c++){
      var pts=[];
      for(var i=0;i<=10;i++){ var t=i/10; pts.push(headPt(sd*(0.5+t*0.7), 0.1-t*0.5-c*0.03, 0.015)); }
      draw(pts, c%3===0?lnGold:lnCyan, headGrp);
    }
    for(var j=0;j<8;j++){
      var pts=[];
      for(var i=0;i<=10;i++){ var t=i/10; pts.push(headPt(sd*(0.3+t*0.9), -0.35-t*0.25-j*0.035, 0.015)); }
      draw(pts, lnCyan, headGrp);
    }
    // eye rings (3)
    for(var e=0;e<3;