<!-- SOLID-PLAYTIME · part 196 -->
e:11px;font-weight:bold;letter-spacing:1px;color:#ffd700;background:rgba(0,0,0,0.55);border:2px solid #ffd700;border-radius:8px;-webkit-tap-highlight-color:transparent;';
  bb.addEventListener('click',function(e){ e.stopPropagation(); window.pickupConsole(); });
  document.body.appendChild(bb);
  setInterval(function(){
    try{ bb.style.display=document.querySelector('button.attack')?'block':'none'; }catch(e){}
  },2000);

  var sv=[]; try{ sv=JSON.parse(localStorage.getItem('solid-consoles-v1')||'[]'); }catch(e){}
  sv.forEach(function(s){
    if(!isFinite(s.x)||!isFinite(s.z)) return;
    var g=buildConsoleGroup('THE CONSOLE',DEFS);
    g.position.set(s.x,groundY(s.x,s.z),s.z); g.rotation.y=s.r||0;
    Kt.scene.add(g);
    deployed.push({x:s.x,z:s.z,r:s.r||0,grp:g});
  });

  try{
    var h=window.invState&&window.invState.held;
    if(h&&h.indexOf('-')>0) curVariant=h.split('-')[0];
  }catch(e){}
  refreshBorders();
  refreshBuilders(); setInterval(refreshBuilders,60000);

  var rayc=new T.Raycaster(), ndc=new T.Vector2();
  document.addEventListener('click',function(e){
    try{ if(e.target&&e.target.closest&&e.target.closest('button')) return; }catch(ee){}
    var cx=(e.clientX!==undefined)?e.clientX:0;
    var cy=(e.clientY!==undefined)?e.clientY:0;
    ndc.x=(cx/window.innerWidth)*2-1; ndc.y=-(cy/window.innerHeight)*2+1;
    try{
      rayc.setFromCamera(ndc,Kt.camera);
      var hits=rayc.intersectObjects(hitMeshes,false);
      if(!hits.length) return;
      var b=hits[0].object.userData.btn;
      if(!b||!b.fn) return;
      pressFx(b); b.fn();
    }catch(err){}
  },true);

  setInterval(aimTick,120);
  try{
    var kcv=document.createElement('canvas'); kcv.width=512; kcv.height=128;
    var kc=kcv.getContext('2d');
    kc.font='bold 76px Georgia,serif'; kc.textAlign='center'; kc.textBaseline='middle';
    kc.shadowColor='#000'; kc.shadowBlur=12;
    kc.fillStyle='#ffd700'; kc.fillText('KING',256,66);
    var ktx=new T.CanvasTexture(kcv); ktx.anisotropy=4;
    var ktag=new T.Sprite(new T.SpriteMaterial({map:ktx,transparent:true,depthWrite:false}));
    ktag.scale.set(6,1.5,1);
    var kbb=new T.Box3().setFromObject(Kt.hero);
    Kt.hero.updateWorldMatrix(true,true);
    var kv=new T.Vector3((kbb.min.x+kbb.max.x)/2,kbb.max.y+1.1,(kbb.min.z+kbb.max.z)/2);
    Kt.hero.worldToLocal(kv);
    ktag.position.copy(kv);
    Kt.hero.add(ktag);
  }catch(e){}
  toast('TAP BOX TO HOLD THE GOLD BOX','#ffd700');
}
}catch(err){}
(function(){
try{
var T=window.THREE; if(!T) return;
if(window.cameraPackLoaded) return; window.cameraPackLoaded=true;

/* ============ CAMERA PACK — the ruby, the zoom, the free camera ============
   A red ruby the size of the King's eye (Minimum) floats near him, unlinked
   from his body. Tap it: the camera unlinks from the King — drag to look,
   pinch to zoom. Tap again: the camera links back and flies home.
   Pinch/wheel zoom works in both modes (0.2x–12x of the normal ride).      */
window.KtZoom=1;
window.camLinked=true;
var MINZ=0.2, MAXZ=12;
function clampZ(z){ return Math.max(MINZ,Math.min(MAXZ,z)); }
function toast(m,c){ try{ window.invToast(m,c); }catch(e){} }
function groundY(x,z){ try{ return Kt.ground(x,z); }catch(e){ return 0; } }

var tries=0;
var wt=setInterval(function(){
  tries++;
  var ok=false;
  try{ ok=!!(Kt.hero&&Kt.hero.position&&isFinite(Kt.hero.position.x)&&Kt.camera&&Kt.renderer&&Kt.renderer.domElement); }catch(e){ ok=false; }
  if(ok){ clearInterval(wt); boot(); }
  else if(tries>120) clearInterval(wt);
},500);

var ruby=null, rubyHit=null, rubyBaseY=0, rubyT=0;
var freeTgt=null, freeYaw=0, freePitch=0.35, freeDist=14;
var dragging=false, ldx=0, ldy=0, downX=0, downY=0;
var pA=null, pB=null, pinchD0=0, pinchV0=0;

function setZoom(z){ window.KtZoom=clampZ(z); }

function unlink(){
  window.camLinked=false;
  try{
    var dir=new T.Vector3(); Kt.camera.getWorldDirection(dir);
    freeTgt=Kt.camera.position.clone().addScaledVector(dir,14);
    var off=Kt.camera.position.clone().sub(freeTgt);
    freeDist=Math.max(2,off.length());
    freeYaw=Math.atan2(off.x,off.z);
    freePitch=Math.max(-1.2,Math.min(1.2,Math.asin(off.y/freeDist)));
  }catch(e){ freeTgt=new T.Vector3(); }
  toast('CAMERA FREE — DRAG TO LOOK · PINCH TO ZOOM','#ff5566');
}
function link(){
  window.camLinked=true;
  toast('CAMERA LINKED','#ffd700');
}
function toggle(){ if(window.camLinked===false) link(); else unlink(); }

function spawnRuby(){
  var hx=0,hz=0,hy=0;
  try{ hx=Kt.hero.position.x; hz=Kt.hero.position.z; }catch(e){}
  var sx=null,sz=null;
  try{
    var sv=JSON.parse(localStorage.getItem('solid-ruby-v1')||'null');
    if(sv&&isFinite(sv.x)&&isFinite(sv.z)){ sx=sv.x; sz=sv.z; }
  }catch(e){}
  if(sx===null){ sx=hx+4; sz=hz+4; }
  var gy=groundY(sx,sz);
  rubyBaseY=gy+2.2;
  var grp=new T.Group();
  var gem=new T.Mesh(
    new T.SphereGeometry(0.065,14,12),
    new T.MeshStandardMaterial({color:0xdd1122,emissive:0x770000,emissiveIntensity:1,