<!-- SAGA2 · part 60 -->
et(x,150,z); scene.add(eye);
    var eLight=new THREE.PointLight(0xff2222,1.5,500);
    eLight.position.set(x,150,z); scene.add(eLight);
  });
})();

// --- golden paths spiraling out ---
(function(){
  var mat=new THREE.MeshStandardMaterial({color:0xd4a52e,roughness:0.4,metalness:0.5,
    emissive:0x664400,emissiveIntensity:0.6});
  for(var s=0;s<6;s++){
    var a0=(s/6)*Math.PI*2;
    for(var i=0;i<20;i++){
      var a=a0+i*0.08, r1=180+i*45, r2=180+(i+1)*45;
      var seg=new THREE.Mesh(new THREE.BoxGeometry(48,3,16),mat);
      var mx=500+Math.cos(a)*(r1+r2)/2, mz=500+Math.sin(a)*(r1+r2)/2;
      seg.position.set(mx,1.5,mz);
      seg.rotation.y=-a;
      seg.visible=false; // hidden — King: clear the yellow bricks
      scene.add(seg);
    }
  }
})();

// --- blimps: my learning of the sky ships ---
var blimps=[];
(function(){
  var goldM=new THREE.MeshStandardMaterial({color:0xd4a017,roughness:0.3,metalness:0.8,
    emissive:0x664400,emissiveIntensity:0.6});
  for(var i=0;i<8;i++){
    var grp=new THREE.Group();
    var body=new THREE.Mesh(new THREE.SphereGeometry(28,16,14),goldM);
    body.scale.set(2,1,1); grp.add(body);
    var a=(i/8)*Math.PI*2;
    grp.userData={a:a,r:600+Math.random()*600,h:350+Math.random()*200,s:0.02+Math.random()*0.02};
    scene.add(grp); blimps.push(grp);
  }
})();

// --- movement ---
var keys={};
window.addEventListener('keydown',function(e){keys[e.key.toLowerCase()]=true;});
window.addEventListener('keyup',function(e){keys[e.key.toLowerCase()]=false;});
var dragging=false,px=0,py=0,yaw=0,pitch=-0.062;
var _touchMode=false;
renderer.domElement.addEventListener('pointerdown',function(e){
  if(e.pointerType==='touch'){ _touchMode=true; return; }
  dragging=true;px=e.clientX;py=e.clientY;
});
window.addEventListener('pointerup',function(e){
  if(e.pointerType==='touch'){ _touchMode=false; return; }
  dragging=false;
});
window.addEventListener('pointermove',function(e){
  if(_touchMode||e.pointerType==='touch')return;
  if(!dragging)return;
  yaw-=(e.clientX-px)*0.0008; pitch-=(e.clientY-py)*0.0008; // 5x slower
  pitch=Math.max(-1.2,Math.min(1.2,pitch)); px=e.clientX; py=e.clientY;
});
/* ===== VISIBLE COLOR STICKS: anchors you can see, floating behavior, color = live ===== */
var stickL={active:false,id:null,ox:0,oy:0,dx:0,dy:0,base:null,knob:null};
var stickR={active:false,id:null,ox:0,oy:0,dx:0,dy:0,base:null,knob:null};
function buildStick(right, idleColor, liveColor){
  var base=document.createElement('div');
  // rest position: bottom-center, overlapping like infinity (∞)
  var cx = window.innerWidth/2 + (right?52:-52);
  base.style.cssText='position:fixed;left:'+(cx-48)+'px;bottom:70px;'+
    'width:96px;height:96px;border-radius:0%;transform:rotate(45deg);z-index:60;'+
    'border:3px solid '+idleColor+';background:rgba(0,0,0,0.25);'+
    'transition:border-color 0.15s, box-shadow 0.15s;touch-action:none;';
  var knob=document.createElement('div');
  knob.style.cssText='position:absolute;left:50%;top:50%;width:40px;height:40px;'+
    'margin:-20px 0 0 -20px;border-radius:0%;'+
    'background:'+idleColor+';opacity:0.55;transition:background 0.15s, opacity 0.15s;';
  base.appendChild(knob); document.body.appendChild(base);
  return {base:base,knob:knob,idle:idleColor,live:liveColor,
    setLive:function(on){
      this.base.style.borderColor = on ? this.live : this.idle;
      this.base.style.boxShadow = on ? ('0 0 18px '+this.live) : 'none';
      this.knob.style.background = on ? this.live : this.idle;
      this.knob.style.opacity = on ? '1' : '0.55';
    },
    setKnob:function(dx,dy){
      this.knob.style.transform='translate('+dx+'px,'+dy+'px)';
    }};
}
var visL=buildStick(false,'rgba(201,162,39,0.5)','#ffd766');   // gold = move
var visR=buildStick(true,'rgba(68,170,255,0.5)','#44ccff');    // cyan = look
visL.base.style.display='block'; visR.base.style.display='block';
visL.base.style.borderRadius='50%'; visR.base.style.borderRadius='50%';
visL.base.style.transform='none'; visR.base.style.transform='none';
visL.knob.style.borderRadius='50%'; visR.knob.style.borderRadius='50%'; // circles, not diamonds
function stickTouchStart(st, vis, t){
  st.active=true; st.id=t.identifier;
  st.ox=t.clientX; st.oy=t.clientY; st.dx=0; st.dy=0;
  // stick glides to thumb (floating) but stays visible
  vis.base.style.left=(t.clientX-48)+'px';
  vis.base.style.top=(t.clientY-48)+'px';
  vis.base.style.right='auto'; vis.base.style.bottom='auto';
  vis.setLive(true); vis.setKnob(0,0);
}
function stickTouchMove(st, vis, t, isLook){
  var dx=t.clientX-st.ox, dy=t.clientY-st.oy;
  var max=34, len=Math.sqrt(dx*dx+dy*dy);
  if(len>max){dx=dx/len*max; dy=dy/len*max;}
  st.dx=dx/max; st.dy=dy/max;
  vis.setKnob(dx,dy);
  if(isLook){
    yaw-=(t.clientX-st.px)*0.0014; pitch-=(t.clientY-st.py)*0.0014; // 5x slower
    pitch=Math.max(-1.2,Math.min(1.2,pitch));
    st.px=t.clientX; st.py=t.clientY;
  }
}
function stickTouchEnd(st, vis, t){
  if(t.identifier!=