<!-- SOLID-PLAYTIME · part 180 -->
ath.max(0,Math.min(1,(-elev-0.06)/0.3));
  var duskF=(1-nightF)*Math.exp(-Math.pow(elev/0.24,2));

  /* sky + fog follow the phase */
  try{
    if(Kt.scene.background!==null) Kt.scene.background=null;
    mix3(cNoonT,cDuskT,cNightT,duskF,nightF,skyU.top.value);
    mix3(cNoonM,cDuskM,cNightM,duskF,nightF,skyU.mid.value);
    mix3(cNoonB,cDuskB,cNightB,duskF,nightF,skyU.bot.value);
    if(Kt.scene.fog&&Kt.scene.fog.color){ mix3(fogNoon,fogDusk,fogNight,duskF,nightF,Kt.scene.fog.color); }
  }catch(e){}
  skyDome.position.set(hx,0,hz);
  stars.position.set(hx,0,hz);
  starMat.opacity=nightF*0.95;
  embers.position.set(hx,0,hz);

  /* sun & moon orbit */
  var sa=Math.cos(ang)*560, sy=Math.sin(ang)*560;
  sun.position.set(hx+sa,sy,hz+130);
  sun.material.opacity=elev>-0.12?1:0;
  var ma=-sa, my=-sy;
  moon.position.set(hx+ma,my,hz-130);
  moon.material.opacity=elev<0.12?0.92:0;

  /* clouds drift + wrap + tint */
  mix3(cloudDay,cloudDay,cloudNight,0,nightF,_b);
  for(var i=0;i<cloudMats.length;i++){ cloudMats[i].color.copy(_b); }
  for(var ci2=0;ci2<clouds.length;ci2++){
    var c=clouds[ci2];
    c.position.x+=c.userData.vx*dt;
    if(c.position.x<hx-460) c.position.x=hx+460;
    if(c.position.x>hx+460) c.position.x=hx-460;
    if(c.position.z<hz-460) c.position.z=hz+460;
    if(c.position.z>hz+460) c.position.z=hz-460;
  }

  /* embers rise */
  var ep=embGeo.attributes.position.array;
  for(var ei2=0;ei2<embN;ei2++){
    ep[ei2*3+1]+=embVel[ei2]*dt;
    ep[ei2*3]+=Math.sin(now*0.001+ei2)*dt*0.7;
    if(ep[ei2*3+1]>24){ ep[ei2*3+1]=0; ep[ei2*3]=(Math.random()-0.5)*70; ep[ei2*3+2]=(Math.random()-0.5)*70; }
  }
  embGeo.attributes.position.needsUpdate=true;

  /* lightning at night */
  if(nightF>0.5){
    nextBolt-=dt;
    if(nextBolt<=0){ strike(hx,hz,nightF); nextBolt=8+Math.random()*14; }
  }
  if(boltT>0){
    boltT-=dt;
    var bo=boltT>0?Math.min(1,boltT*6):0;
    boltMat.opacity=bo;
    flashLight.intensity*=Math.max(0,1-dt*9);
    if(boltT<=0){ bolt.visible=false; flashLight.intensity=0; }
  }

  /* shockwave rings expand + fade */
  for(var ri=rings.length-1;ri>=0;ri--){
    var r=rings[ri]; r.t+=dt;
    var k=r.t/r.dur;
    if(k>=1){ Kt.scene.remove(r.m); r.m.geometry.dispose(); r.m.material.dispose(); rings.splice(ri,1); continue; }
    var s2=1+k*(r.maxR);
    r.m.scale.set(s2,s2,1);
    r.m.material.opacity=0.9*(1-k);
  }
}
tick();
}catch(e){ if(window.console&&console.warn) console.warn('fx-pack:',e); }
})(),(function(){
try{
if(document.getElementById('wswitch')) return;
var weapons=['pistol','rifle','shotgun','laser'];
var labels={pistol:'PISTOL',rifle:'RIFLE',shotgun:'SHOTGUN',laser:'LASER'};
var colors={pistol:'#ffd700',rifle:'#fff2c0',shotgun:'#ff8830',laser:'#00ffff'};
var bar=document.createElement('div');
bar.id='wswitch';
bar.style.cssText='position:fixed;top:76px;left:8px;z-index:9999;display:flex;flex-direction:column;gap:6px;';
var btns={};
function setActive(w){
  weapons.forEach(function(x){
    if(!btns[x]) return;
    btns[x].style.opacity=x===w?'1':'0.5';
    btns[x].style.boxShadow=x===w?('0 0 10px '+colors[x]):'none';
  });
}
weapons.forEach(function(w){
  var b=document.createElement('button');
  b.textContent=labels[w];
  b.setAttribute('aria-label','Equip '+labels[w]);
  b.style.cssText='min-width:66px;min-height:40px;padding:8px 6px;font-size:11px;font-weight:bold;letter-spacing:1px;color:'+colors[w]+';background:rgba(0,0,0,0.55);border:1px solid '+colors[w]+';border-radius:8px;-webkit-tap-highlight-color:transparent;';
  b.addEventListener('click',function(e){
    e.stopPropagation();
    try{ if(window.equipWeapon) window.equipWeapon(w); }catch(err){}
    setActive(w);
  });
  bar.appendChild(b);
  btns[w]=b;
});
setActive('pistol');
document.body.appendChild(bar);
window.setActiveWeapon=setActive;
function vis(){
  var inWorld=!!document.querySelector('button.attack');
  bar.style.display=inWorld?'flex':'none';
}
vis();
setInterval(vis,2000);
}catch(e){ if(window.console&&console.warn) console.warn('wswitch:',e); }
})(),(function(){
try{
var T=window.THREE; if(!T) return;

/* retire the 4-button switcher; the inventory replaces it */
var oldSw=document.getElementById('wswitch'); if(oldSw) oldSw.remove();
var oldBtn=document.getElementById('invBtn'); if(oldBtn) oldBtn.remove();
var oldPanel=document.getElementById('invPanel'); if(oldPanel) oldPanel.remove();

/* ============ catalog ============ */
var SHAPES=['pillar','wall','step','roof','foundation','beam','arch','stairs','platform','fence','column','slab'];
var VARIANTS=['wood','stone','gold','marble'];
var VCOLOR={wood:0x8B5A2B, stone:0x8a8f98, gold:0xffd700, marble:0xe8e4da};
var VCSS={wood:'#8B5A2B', stone:'#8a8f98', gold:'#ffd700', marble:'#e8e4da'};
var VDARK={wood:'#5a3a1a', stone:'#555a63', gold:'#aa8800', marble:'#999588'};
var catalog=[];
var WDEF=[['pistol','PISTOL','#ffd700'],['rifle','RIFLE','#fff2c0'],['shotgun','SHOTGUN','#ff8830'],['laser','LASER','#00ffff']];
WDEF