<!-- SOLID-PLAYTIME · part 178 -->

var dark=new T.MeshStandardMaterial({color:0x222222,metalness:0.5,roughness:0.5});
var silver=new T.MeshStandardMaterial({color:0x888888,metalness:0.9,roughness:0.2});
var wood=new T.MeshStandardMaterial({color:0x8B4513,roughness:0.7});
var cyan=new T.MeshStandardMaterial({color:0x00ffff,emissive:0x00aaaa,emissiveIntensity:0.8});
var gunmetal=new T.MeshStandardMaterial({color:0x333344,metalness:0.9,roughness:0.3});
// Pistol
var pistol=mkWeapon([[1.4,0.22,0.22,gold,0,0,0],[0.2,0.7,0.2,dark,-0.5,-0.45,0]]);
// Rifle
var rifle=mkWeapon([[2.2,0.18,0.18,silver,0.3,0,0],[0.8,0.25,0.22,dark,-0.6,0,0],[0.2,0.7,0.2,dark,-0.7,-0.45,0]]);
rifle.visible=false;
// Shotgun
var shotgun=mkWeapon([[1.8,0.25,0.25,dark,0.2,0,0],[0.6,0.3,0.28,wood,-0.5,-0.05,0],[0.7,0.35,0.25,wood,-1.4,-0.15,0]]);
shotgun.visible=false;
// Laser
var laser=mkWeapon([[2.0,0.3,0.3,gunmetal,0.2,0,0],[0.5,0.2,0.2,cyan,-0.7,0,0],[0.15,0.1,0.1,cyan,1.45,0,0]]);
laser.visible=false;
Kt.hero.add(pistol);Kt.hero.add(rifle);Kt.hero.add(shotgun);Kt.hero.add(laser);
Kt.weapons={pistol:pistol,rifle:rifle,shotgun:shotgun,laser:laser};
Kt.equipWeapon=function(n){for(var k in Kt.weapons)Kt.weapons[k].visible=(k===n);};
window.equipWeapon=Kt.equipWeapon;
}catch(e){}})(),(function(){
try{
var T=window.THREE; if(!T) return;

/* ============ state ============ */
var cur='pistol';
function lightColor(n){ return n==='laser'?0x00ffff : n==='shotgun'?0xff8830 : n==='rifle'?0xfff2c0 : 0xffd700; }
var origEq=Kt.equipWeapon;
Kt.equipWeapon=function(n){ cur=n; try{origEq(n);}catch(e){} try{weaponLight.color.setHex(lightColor(n));}catch(e2){} };
window.equipWeapon=Kt.equipWeapon;

/* ============ weapon light (gold pops in dark scene) ============ */
var weaponLight=new T.PointLight(0xffd700,1.6,14,2);
weaponLight.position.set(0.8,0.6,-1.2);
Kt.hero.add(weaponLight);

/* ============ gradient sky dome (time-of-day driven) ============ */
var skyU={
  top:{value:new T.Color(0x7a5200)},
  mid:{value:new T.Color(0xffd700)},
  bot:{value:new T.Color(0x2e1e04)}
};
var skyMat=new T.ShaderMaterial({side:T.BackSide,depthWrite:false,fog:false,uniforms:skyU,
  vertexShader:'varying vec3 vP;void main(){vP=position;gl_Position=projectionMatrix*modelViewMatrix*vec4(position,1.0);}',
  fragmentShader:'varying vec3 vP;uniform vec3 top;uniform vec3 mid;uniform vec3 bot;void main(){float h=normalize(vP).y;vec3 c=h>0.0?mix(mid,top,pow(h,0.55)):mix(mid,bot,pow(-h,0.45));gl_FragColor=vec4(c,1.0);}'});
var skyDome=new T.Mesh(new T.SphereGeometry(640,24,16),skyMat);
skyDome.frustumCulled=false;
Kt.scene.add(skyDome);
try{ Kt.scene.background=null; }catch(e){}

/* ============ stars (800 gold pinpricks) ============ */
var starGeo=new T.BufferGeometry();
var sp=new Float32Array(800*3);
for(var si=0;si<800;si++){
  var th=Math.random()*Math.PI*2, ph=Math.random()*Math.PI*0.48, sr=600;
  sp[si*3]=sr*Math.sin(ph)*Math.cos(th);
  sp[si*3+1]=sr*Math.cos(ph)+20;
  sp[si*3+2]=sr*Math.sin(ph)*Math.sin(th);
}
starGeo.setAttribute('position',new T.BufferAttribute(sp,3));
var starMat=new T.PointsMaterial({color:0xffe9a8,size:2.2,sizeAttenuation:false,transparent:true,opacity:0,fog:false,depthWrite:false});
var stars=new T.Points(starGeo,starMat);
stars.frustumCulled=false;
Kt.scene.add(stars);

/* ============ sun & moon discs ============ */
function discTexture(inner,outer){
  var c=document.createElement('canvas'); c.width=c.height=128;
  var g=c.getContext('2d');
  var gr=g.createRadialGradient(64,64,8,64,64,64);
  gr.addColorStop(0,inner); gr.addColorStop(0.55,outer); gr.addColorStop(1,'rgba(0,0,0,0)');
  g.fillStyle=gr; g.fillRect(0,0,128,128);
  return new T.CanvasTexture(c);
}
var sun=new T.Sprite(new T.SpriteMaterial({map:discTexture('#fffbe8','#ffb700'),transparent:true,fog:false,depthWrite:false}));
sun.scale.set(95,95,1);
var moon=new T.Sprite(new T.SpriteMaterial({map:discTexture('#f4f0ff','#8f9fd8'),transparent:true,fog:false,depthWrite:false,opacity:0.92}));
moon.scale.set(58,58,1);
Kt.scene.add(sun); Kt.scene.add(moon);

/* ============ drifting gold clouds (120, shared materials) ============ */
function cloudTexture(){
  var c=document.createElement('canvas'); c.width=256; c.height=128;
  var g=c.getContext('2d');
  for(var i=0;i<26;i++){
    var x=40+Math.random()*176, y=40+Math.random()*48, r=18+Math.random()*30;
    var gr=g.createRadialGradient(x,y,2,x,y,r);
    gr.addColorStop(0,'rgba(255,244,214,0.5)'); gr.addColorStop(1,'rgba(255,244,214,0)');
    g.fillStyle=gr; g.beginPath(); g.arc(x,y,r,0,7); g.fill();
  }
  return new T.CanvasTexture(c);
}
var cloudTex=cloudTexture();
var cloudMats=[];
for(var cmi=0;cmi<6;cmi++){ cloudMats.push(new T.SpriteMaterial({map:cloudTex,transparent:true,opacity:0.45+cmi*0.07,fog:false,depthWrite:false})); }
var clouds=[];
for(var ci=0;ci<120;ci++){
  var cl=new T.Sprite(cloudMats[ci%6]);
  var cs=42+Math.random()*72;
  cl.scale.set(cs,cs*0.45,1);
  cl.position.set((Math.random()-0.5)*900,60+Math.random()*170,(Mat