<!-- SOLID-PLAYTIME · part 183 -->
button stack) */
var invBtn=document.createElement('button');
invBtn.id='invBtn';
invBtn.textContent='ITEMS';
invBtn.style.cssText='position:fixed;top:76px;left:8px;z-index:9999;min-width:66px;min-height:40px;padding:8px 6px;font-size:11px;font-weight:bold;letter-spacing:1px;color:#ffd700;background:rgba(0,0,0,0.55);border:1px solid #ffd700;border-radius:8px;-webkit-tap-highlight-color:transparent;';
invBtn.addEventListener('click',function(e){
  e.stopPropagation();
  renderInv();
  panel.style.display='block';
});
document.body.appendChild(invBtn);
function visBtn(){
  var inWorld=!!document.querySelector('button.attack');
  invBtn.style.display=inWorld?'block':'none';
  if(!inWorld) panel.style.display='none';
}
visBtn(); setInterval(visBtn,2000);

/* restore equipped weapon from last session */
try{ if(window.equipWeapon&&inv.equipped) window.equipWeapon(inv.equipped); }catch(e){}

/* ============ harvest nodes ============ */
var NODEDEF={
  wood:{color:0x8B5A2B,glow:0xcc8830,css:'#8B5A2B'},
  stone:{color:0x8a8f98,glow:0x9aa0ab,css:'#8a8f98'},
  gold:{color:0xffd700,glow:0xffd700,css:'#ffd700'},
  marble:{color:0xe8e4da,glow:0xcfc9ba,css:'#e8e4da'}
};
var glowTex=(function(){
  var c=document.createElement('canvas'); c.width=c.height=64;
  var g=c.getContext('2d');
  var gr=g.createRadialGradient(32,32,4,32,32,32);
  gr.addColorStop(0,'rgba(255,255,255,0.9)'); gr.addColorStop(1,'rgba(255,255,255,0)');
  g.fillStyle=gr; g.fillRect(0,0,64,64);
  return new T.CanvasTexture(c);
})();
var NODES=[], NODE_CAP=36;
function groundY(x,z){ try{ return Kt.ground(x,z); }catch(e){ return 0; } }
function makeNodeMesh(variant){
  var def=NODEDEF[variant];
  var grp=new T.Group();
  var rockGeo=new T.IcosahedronGeometry(1.3,0);
  for(var i=0;i<3;i++){
    var m=new T.Mesh(rockGeo,new T.MeshStandardMaterial({color:def.color,roughness:0.75,metalness:variant==='gold'?0.75:0.15,emissive:def.glow,emissiveIntensity:0.4,flatShading:true}));
    m.position.set((Math.random()-0.5)*2.4,0.7+Math.random()*0.9,(Math.random()-0.5)*2.4);
    m.rotation.set(Math.random()*3,Math.random()*3,0);
    var s=0.55+Math.random()*0.75; m.scale.set(s,s*0.8,s);
    grp.add(m);
  }
  var spr=new T.Sprite(new T.SpriteMaterial({map:glowTex,color:def.glow,transparent:true,opacity:0.45,depthWrite:false}));
  spr.scale.set(7,7,1); spr.position.y=1.6;
  grp.add(spr);
  grp.userData.spr=spr;
  return grp;
}
function spawnNode(){
  if(NODES.length>=NODE_CAP) return;
  var types=Object.keys(NODEDEF);
  var t=types[Math.floor(Math.random()*types.length)];
  var hx=Kt.hero.position.x, hz=Kt.hero.position.z;
  var a=Math.random()*Math.PI*2, r=22+Math.random()*80;
  var x=hx+Math.cos(a)*r, z=hz+Math.sin(a)*r;
  var grp=makeNodeMesh(t);
  grp.position.set(x,groundY(x,z),z);
  grp.userData.variant=t;
  grp.userData.phase=Math.random()*6.28;
  Kt.scene.add(grp);
  NODES.push(grp);
}
for(var ni=0;ni<NODE_CAP;ni++) spawnNode();
setInterval(function(){
  if(NODES.length<NODE_CAP && document.querySelector('button.attack')){
    var n=1+Math.floor(Math.random()*3);
    for(var k=0;k<n;k++) spawnNode();
  }
},25000);

function harvest(grp){
  var variant=grp.userData.variant;
  var shape=SHAPES[Math.floor(Math.random()*SHAPES.length)];
  var key=variant+'-'+shape;
  var curN=inv.counts[key]||0;
  var label=(variant+' '+shape).toUpperCase();
  if(curN>=STACK_MAX){ toast('FULL: '+label+' ×2000','#ff5544'); return; }
  var n=5+Math.floor(Math.random()*8);
  inv.counts[key]=Math.min(STACK_MAX,curN+n);
  save();
  try{ Kt.burst(grp.position.x,grp.position.y+1.6,grp.position.z,VCOLOR[variant]); }catch(e){}
  toast('+'+n+' '+label,VCSS[variant]);
  Kt.scene.remove(grp);
  var ix=NODES.indexOf(grp); if(ix>=0) NODES.splice(ix,1);
  if(panel.style.display==='block') renderInv();
}
window.invHarvest=harvest;

/* proximity harvest + node idle animation (throttled) */
var hTick=0;
function invLoop(){
  requestAnimationFrame(invLoop);
  hTick++;
  var t=performance.now()*0.001;
  for(var i=0;i<NODES.length;i++){
    var nd=NODES[i];
    nd.position.y=groundY(nd.position.x,nd.position.z)+Math.sin(t*1.6+nd.userData.phase)*0.25;
    if(nd.userData.spr) nd.userData.spr.material.opacity=0.35+0.2*Math.sin(t*2.2+nd.userData.phase);
  }
  if(hTick%20!==0) return;
  var hx=Kt.hero.position.x, hz=Kt.hero.position.z;
  for(var j=NODES.length-1;j>=0;j--){
    var nd2=NODES[j];
    var dx=nd2.position.x-hx, dz=nd2.position.z-hz;
    if(dx*dx+dz*dz<16) harvest(nd2);
  }
}
invLoop();
window.invState=inv; window.invCatalog=catalog;
}catch(e){ if(window.console&&console.warn) console.warn('inv-pack:',e); }
})(),(function(){
try{
if(document.getElementById('intaglio-css')) return;

/* encode an SVG string into a CSS-safe data URI */
function svgURI(s){
  return "data:image/svg+xml,"+s.replace(/#/g,"%23").replace(/"/g,"%22").replace(/</g,"%3C").replace(/>/g,"%3E");
}

/* ultra-dense guilloche: violet cross-hatch under gold rosettes */
var GUILLOCHE="<svg xmlns=\"