<!-- SAGA2 · part 87 -->
10+Math.sin(an)*1.4, 21.5)); }
    draw(mpts, sd<0?lnGold:lnCyan);
    // hand — finger lines below cannon
    for(var fn=0; fn<4; fn++){
      var fpts=[];
      for(var fi=0; fi<=6; fi++){
        fpts.push(new THREE.Vector3(bx-1.2+fn*0.8, -13-fi*0.5, 4+Math.sin(fi)*0.3));
      }
      draw(fpts, lnDim);
    }
    // store tip for laser origin
    if(sd<0){ avatarCannonL = {userData:{tipPos:new THREE.Vector3(bx,-10,21.5)}}; }
    else { avatarCannonR = {userData:{tipPos:new THREE.Vector3(bx,-10,21.5)}}; }
  });

  // ===== LEGS — contour lines =====
  [-1,1].forEach(function(sd){
    var lx = sd*5;
    // LEG FILIGREE — decorative bands
    for(var lf=0; lf<4; lf++){
      var pts=[], ly=-4-lf*5;
      for(var i=0;i<=20;i++){ var an=i/20*Math.PI*2;
        var wob = Math.sin(an*8+lf)*0.2;
        pts.push(new THREE.Vector3(lx+Math.cos(an)*(3.8+wob), ly, Math.sin(an)*(3.8+wob)*0.8));
      }
      draw(pts, lf%2?lnGold:lnCyan);
    }
    for(var lr=0; lr<14; lr++){
      var ly = -2-lr*1.8;
      var lw = 3.6-lr*0.08;
      var pts=[];
      for(var i=0;i<=16;i++){ var an=i/16*Math.PI*2;
        pts.push(new THREE.Vector3(lx+Math.cos(an)*lw, ly, Math.sin(an)*lw*0.8));
      }
      draw(pts, lr%5===0?lnGold:lnCyan);
    }
  });

  // (halo removed at King order)


  // HUMAN FACE — pure linework, no shapes (King's order)
  (function(){
    function ellipse(cx,cy,cz,rx,ry,mat){
      var pts=[];
      for(var i=0;i<=24;i++){
        var a=(i/24)*Math.PI*2;
        pts.push(new THREE.Vector3(cx+Math.cos(a)*rx, cy+Math.sin(a)*ry, cz));
      }
      draw(pts, mat);
    }
    function curve(pts, mat){ draw(pts.map(function(p){return new THREE.Vector3(p[0],p[1],p[2]);}), mat); }
    // EYES — banknote intaglio (King's guide)
    function banknoteEye(cx, cy, cz){
      // outer almond — upper lid heavier
      var pts=[];
      for(var i=0;i<=30;i++){ var a=(i/30)*Math.PI*2;
        var rx=2.8, ry=1.5;
        // upper lid thicker (more lines)
        pts.push(new THREE.Vector3(cx+Math.cos(a)*rx, cy+Math.sin(a)*ry, cz));
      }
      draw(pts, lnCyan);
      // upper lid fold — parallel line above
      var fold=[];
      for(var f=0;f<=20;f++){ var fa=Math.PI*(f/20);
        fold.push(new THREE.Vector3(cx-Math.cos(fa)*2.6, cy+Math.sin(fa)*1.1+0.5, cz-0.1));
      }
      draw(fold, lnGold);
      // lower lid — fine single
      var low=[];
      for(var l=0;l<=20;l++){ var la=Math.PI*(l/20);
        low.push(new THREE.Vector3(cx+Math.cos(la)*2.5, cy-Math.sin(la)*1.2-0.15, cz-0.05));
      }
      draw(low, lnDim);
      // iris — concentric rings (5)
      for(var ir=0; ir<5; ir++){
        var irr = 1.1 - ir*0.18;
        var ipts=[];
        for(var ia=0; ia<=24; ia++){ var ang=(ia/24)*Math.PI*2;
          ipts.push(new THREE.Vector3(cx+Math.cos(ang)*irr, cy+Math.sin(ang)*irr, cz+0.15));
        }
        draw(ipts, ir%2?lnCyan:lnGold);
      }
      // pupil — dense dark center
      var ppts=[];
      for(var pa=0; pa<=16; pa++){ var pang=(pa/16)*Math.PI*2;
        ppts.push(new THREE.Vector3(cx+Math.cos(pang)*0.35, cy+Math.sin(pang)*0.35, cz+0.2));
      }
      draw(ppts, lnDim); draw(ppts, lnDim);
      // lash lines — upper lid
      for(var lh=0; lh<8; lh++){
        var lx = cx-2.2+lh*0.55;
        draw([new THREE.Vector3(lx, cy+1.2, cz), new THREE.Vector3(lx+0.1, cy+1.6, cz-0.1)], lnDim);
      }
      // skin lines — radiate from eye (follow form)
      for(var sl=0; sl<6; sl++){
        var sa = Math.PI*(0.15+sl*0.14);
        var spts=[];
        for(var st=0; st<=8; st++){ var t=st/8;
          spts.push(new THREE.Vector3(cx+Math.cos(sa)*(3.0+t*1.2), cy+Math.sin(sa)*(1.8+t*0.8), cz-0.2-t*0.3));
        }
        draw(spts, lnDim);
      }
    }
    // banknote eyes disabled — minimal only (King's order)
    // brows
    curve([[-3.6,23.8,8.8],[-2.2,24.1,9],[-0.8,23.8,8.8]], lnGold);
    curve([[0.8,23.8,8.8],[2.2,24.1,9],[3.6,23.8,8.8]], lnGold);
    // nose bridge
    curve([[0,22.5,9.2],[0.1,21,9.6],[0,19.2,10]], lnCyan);
    // nostrils
    ellipse(-0.7, 18.7, 9.9, 0.4, 0.25, lnCyan);
    ellipse(0.7, 18.7, 9.9, 0.4, 0.25, lnCyan);
    // mouth — upper and lower lip (2x)
    curve([[-3.2,17.5,9.3],[-1.6,17.2,9.6],[0,17.4,9.8],[1.6,17.2,9.6],[3.2,17.5,9.3]], lnGold);
    curve([[-2.8,17.5,9.3],[-1.4,16.7,9.6],[0,16.5,9.8],[1.4,16.7,9.6],[2.8,17.5,9.3]], lnCyan);
    // jawline
    curve([[-3.5,20,8],[-2.5,17.5,8.8],[-1.2,16.2,9.2],[0,15.8,9.4],[1.2,16.2,9.2],[2.5,17.5,8.8],[3.5,20,8]], lnCyan);
    // ears removed — floating circle (King's order)
  })();


  // HUMAN BODY DETAIL — pure linework, no shapes (King's order: push it totally)
  (function(){
    function curve(pts, mat){ draw(pts.map(function(p){return new THREE.Vector3(p[0],p[1],p[2]);}), mat); }
    function ellipse(cx,cy,cz,rx,ry,mat){
      var pts=[];
      for(var i=0;i<=20;i++){ var a=(i/20)*Math.PI*2;
        pts.push(new THREE.Vector3(cx+Math.cos(a)*rx, cy+Math.sin(a)*ry, cz)); }
      draw(pts,