@minicode-dev/chat 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +25 -0
  2. package/dist/chunks/{BattleshipGameCard-CAWHxqJE.js → BattleshipGameCard-BFqA0cjT.js} +247 -246
  3. package/dist/chunks/{BattleshipGameCard-CAWHxqJE.js.map → BattleshipGameCard-BFqA0cjT.js.map} +1 -1
  4. package/dist/chunks/{ChatContext-CUiEAMKK.js → ChatContext-dty_KPDX.js} +2 -2
  5. package/dist/chunks/{ChatContext-CUiEAMKK.js.map → ChatContext-dty_KPDX.js.map} +1 -1
  6. package/dist/chunks/TanksGameCard-D0n-lzTs.js +1535 -0
  7. package/dist/chunks/TanksGameCard-D0n-lzTs.js.map +1 -0
  8. package/dist/chunks/TanksLiveGameCard-BmNRXP66.js +849 -0
  9. package/dist/chunks/TanksLiveGameCard-BmNRXP66.js.map +1 -0
  10. package/dist/chunks/WebRtcLab-B7xBlJy1.js +510 -0
  11. package/dist/chunks/WebRtcLab-B7xBlJy1.js.map +1 -0
  12. package/dist/chunks/{connect4Sounds-BDXQAvU1.js → connect4Sounds-BN7d_TM2.js} +654 -618
  13. package/dist/chunks/connect4Sounds-BN7d_TM2.js.map +1 -0
  14. package/dist/chunks/createLiveScene-CtYPcOPo.js +364 -0
  15. package/dist/chunks/createLiveScene-CtYPcOPo.js.map +1 -0
  16. package/dist/chunks/createPeerLink-qei05vpV.js +478 -0
  17. package/dist/chunks/createPeerLink-qei05vpV.js.map +1 -0
  18. package/dist/chunks/createTankScene-CV7Brxmt.js +685 -0
  19. package/dist/chunks/createTankScene-CV7Brxmt.js.map +1 -0
  20. package/dist/chunks/fx-BHsl4S_J.js +1470 -0
  21. package/dist/chunks/fx-BHsl4S_J.js.map +1 -0
  22. package/dist/chunks/gameStatus-Cu1Z8un9.js +69 -0
  23. package/dist/chunks/gameStatus-Cu1Z8un9.js.map +1 -0
  24. package/dist/chunks/signalFaults-Dv2YjjKy.js +36 -0
  25. package/dist/chunks/signalFaults-Dv2YjjKy.js.map +1 -0
  26. package/dist/chunks/tanksSounds-C99OD2xD.js +177 -0
  27. package/dist/chunks/tanksSounds-C99OD2xD.js.map +1 -0
  28. package/dist/index.js +1861 -1829
  29. package/dist/index.js.map +1 -1
  30. package/dist/styles.css +1 -1
  31. package/index.d.ts +61 -0
  32. package/package.json +1 -1
  33. package/dist/chunks/TanksGameCard-BEnXTz_J.js +0 -1705
  34. package/dist/chunks/TanksGameCard-BEnXTz_J.js.map +0 -1
  35. package/dist/chunks/connect4Sounds-BDXQAvU1.js.map +0 -1
  36. package/dist/chunks/createTankScene-BuliAxwR.js +0 -2150
  37. package/dist/chunks/createTankScene-BuliAxwR.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"createTankScene-BuliAxwR.js","names":["GeoBuilder","lin","Color","hex","clamp","v","a","b","clamp01","smooth","t","x","e0","e1","DEG","dampK","rate","dt","wrapPi","hash2","s","y","rng","seed","canvas","c","w","h","tex","CanvasTexture","LinearFilter","repeat","RepeatWrapping","glowTexture","size","g","grd","smokeTexture","rand","i","d","rr","ringTexture","blobTexture","trackTexture","C","SKIRT_LAYERS","tmpC","tmpD","createTerrain","geo","BufferGeometry","material","MeshLambertMaterial","mesh","Mesh","N","cell","heights","scorch","minH","maxH","baseY","pos","nor","col","srcRef","hAt","iz","ix","allocate","n","count","BufferAttribute","DynamicDrawUsage","topColor","out","slope","ny","de","z","j","writeTri","e1x","bx","ax","e1y","by","ay","e1z","bz","az","e2x","cx","e2y","cy","e2z","cz","nx","nz","len","o","k","color","topTri","ix0","i0","iz0","ix1","i1","iz1","ix2","i2","iz2","skirtLevels","lvA","lvB","LAYER_COLORS","writeAll","x0","z0","x1","z1","h0","h1","ox","oz","l","heightAt","fx","fz","tx","tz","hA","hB","hC","hD","normalAt","hl","span","hr","hd","hu","setHeights","src","world","newSize","rebuilt","changed","lo","hi","crater","radius","r","j0","j1","dx","dz","depth","SKY_VERT","SKY_FRAG","SKY","createSky","SphereGeometry","mat","ShaderMaterial","sunDir","BackSide","createHills","p","haze","sd","pushTri","B","A","Cc","lit","m","topY","ring","tops","seg","peak","phase","hMin","hMax","center","T0","T1","B0","base","B1","MeshBasicMaterial","MAX_TREES","WHITE","BURNT","treeGeometry","greens","a0","a1","rockGeometry","DodecahedronGeometry","grey","dark","moss","wallGeometry","stone","off","createDecor","geoTree","geoRock","geoWall","matTree","matRock","matWall","trees","rocks","walls","dummy","Object3D","treeData","signature","quality","shadows","lastTerrain","lastWorld","makeMesh","InstancedMesh","disposeMeshes","sigOf","build","sig","reground","terrain","decor","obstacles","max","treeList","rockList","rockObs","wallObs","minGround","writeTrees","parent","tint","blast","any","q","on","TANK_SCALE","TEAM","W","W2","G","D","M","K","TRACK_Z","TRACK_W","WHEEL_R","WHEEL_X","SPROCKET","IDLER","TRACK_TILE","TURRET_PIVOT","Vector3","GUN_PIVOT","MUZZLE","sec","yb","zb","yt","loft","rings","ins","k1","b0","b1","isTop","glow","p0","p1","cylX","r0","r1","cylZ","buildHull","buildHullAccent","buildLamps","buildTurret","buildTurretAccent","buildGun","buildWheel","L","zz","buildTrack","pts","arc","lens","P","Nn","UV","side","y0","y1","u0","u1","quad","WHEELS","list","createTankGeometries","CHAR","CHAR_ACCENT","createTank","team","root","Group","body","turret","gun","accentMat","trackTex","shared","bodyMat","trackMat","hull","geos","hullAccent","lamps","track","turretMesh","turretAccent","gunMesh","casters","makeMaterials","DoubleSide","MeshStandardMaterial","state","applyCharred","up","nrm","qTilt","Quaternion","qYaw","tiltTarget","tiltInit","place","setCharred","setFlash","setShadows","tmpM","Matrix4","tmpQ","tmpP","tmpS","zAxis","writeWheels","offset","createTankShared","CAPS","STRIDE","PX","PY","PZ","VX","VY","VZ","AGE","LIFE","S0","S1","R0","G0","R1","G1","A0","DRAG","GRAV","HOT","MAX_PROJ","MAX_RINGS","MAX_DEBRIS","PREVIEW_MAX","COL","VERT","FRAG_ADD","FRAG_ALPHA","createBatch","data","cap","scaleUniform","map","additive","AdditiveBlending","NormalBlending","points","Points","cursor","capacity","wind","vx","vy","vz","life","s0","s1","c0","c1","drag","grav","hot","wx","wz","age","dr","ct","p3","p4","fin","fout","createFx","texGlow","texSmoke","texRing","scaleU","capTotal","add","alpha","qf","light","PointLight","lightLevel","lightDecay","shellGeo","OctahedronGeometry","shellMat","projs","glowMat","SpriteMaterial","Sprite","scene","flashes","flashCursor","ringGeo","PlaneGeometry","ringCursor","debrisGeo","IcosahedronGeometry","debrisMat","debris","bodies","debrisCursor","debrisAlive","pvPos","pvCol","pvSize","pvMax","pvGeo","pvMat","preview","markerMat","marker","pvCount","pvSrc","pvTime","pvColor","tmp","setQuality","rnd","rs","flash","f","dur","lightFlash","distance","level","decay","spawnDebris","idx","speed","smoke","muzzle","sp","trail","big","explosion","nf","th","ph","ns","nk","kind","nd","dc","pop","outPuff","hitSparks","bigExplosion","emitDamage","accObj","exhaust","dust","strength","firework","projShow","projMove","projHide","setPreview","step","travelled","next","ex","ey","ez","writePreview","wave","update","renderer","camera","busy","e","gy","fade","animatePreview","clear","MAX_DT","MAX_TANKS","SAMPLE_DT","PIXEL_RATIO","SHADOW_SIZE","SUN_DIR","detectQuality","coarse","small","cores","pixelRatioFor","normQ","createTankScene","container","emit","onEvent","err","autoQuality","currentQuality","disposed","WebGLRenderer","sRGBEncoding","ACESFilmicToneMapping","PCFSoftShadowMap","width","height","Scene","Fog","PerspectiveCamera","hemi","HemisphereLight","sun","DirectionalLight","sc","sky","hills","tankGeos","tankShared","tanks","tankOrder","wheels","makeWheelMaterial","makeWheels","blobTex","blobGeo","blobMat","blobs","activeTex","activeMat","activeRing","activeId","mapSize","hasWorld","shadowDirty","wheelsDirty","aimDirty","wakeTime","elapsed","timeScale","realDt","turnQueue","currentTurn","celebrateState","mapCenter","v1","v2","v3","mtx","scl","cam","portrait","updateFov","aspect","setCam","mode","opts","reducedMotion","frameOverview","id","fovV","ux","uz","act","sx","sz","H","S","px","pz","pl","el","halfH","frameBehind","yaw","useHull","rx","rz","back","pitchLift","frameFollow","hx","hz","frameOrbit","updateCamera","moving","dist","tankColorFor","wt","index","ensureTank","removeTank","restoreTurret","placeWreckTurret","blowTurret","updateBlown","syncTankStatics","bi","at","damageLevel","applyWorld","res","sunTarget","seen","fromTurn","alive","wait","waitReal","samplePos","samples","u","turnScript","tank","turn","speedK","path","total","dustAcc","fwdX","fwdZ","prevX","prevZ","acc","mx","mz","dot","head","turnD","ty","tp","dy","dp","shots","craters","damage","flashed","recs","sh","fired","lastImpact","carrier","remaining","firstStart","fx0","fy0","fz0","active","lt","impactShot","destroyed","imp","best","bd","startNextTurn","rec","running","finishTurn","wake","flushTurns","resize","ro","docVisible","onScreen","io","entries","updateRunning","onVisibility","contextLost","onContextLost","clock","Clock","rafId","slowTimer","perfAcc","perfFrames","lastStats","schedule","frame","raw","animating","lvl","info","applyQuality","hasAmbient","should","first","pitch","power","resolve","est","winnerId"],"sources":["../../src/games/tanks/scene/util.js","../../src/games/tanks/scene/terrain.js","../../src/games/tanks/scene/decor.js","../../src/games/tanks/scene/tank.js","../../src/games/tanks/scene/fx.js","../../src/games/tanks/scene/createTankScene.js"],"sourcesContent":["// Shared helpers for the tanks scene (pure, no per-frame allocations).\nimport { CanvasTexture, Color, LinearFilter, RepeatWrapping } from 'three'\n\nexport const lin = (hex) => new Color(hex).convertSRGBToLinear()\nexport const clamp = (v, a, b) => (v < a ? a : v > b ? b : v)\nexport const clamp01 = (v) => (v < 0 ? 0 : v > 1 ? 1 : v)\nexport const lerp = (a, b, t) => a + (b - a) * t\nexport const smooth = (e0, e1, x) => {\n const t = clamp01((x - e0) / (e1 - e0))\n return t * t * (3 - 2 * t)\n}\nexport const DEG = Math.PI / 180\n// exponential damping factor for frame-rate independent smoothing\nexport const dampK = (rate, dt) => 1 - Math.exp(-rate * dt)\nexport const wrapPi = (a) => {\n while (a > Math.PI) a -= Math.PI * 2\n while (a < -Math.PI) a += Math.PI * 2\n return a\n}\n// deterministic hash in [0,1)\nexport const hash2 = (x, y) => {\n const s = Math.sin(x * 127.1 + y * 311.7) * 43758.5453\n return s - Math.floor(s)\n}\n\n// Tiny seeded PRNG for decor jitter (stable across rebuilds).\nexport function rng(seed) {\n let s = seed >>> 0 || 1\n return () => {\n s ^= s << 13\n s ^= s >>> 17\n s ^= s << 5\n return (s >>> 0) / 4294967296\n }\n}\n\nfunction canvas(w, h) {\n const c = document.createElement('canvas')\n c.width = w\n c.height = h\n return c\n}\n\nfunction tex(c, repeat = false) {\n const t = new CanvasTexture(c)\n t.minFilter = LinearFilter\n t.magFilter = LinearFilter\n t.generateMipmaps = false\n if (repeat) {\n t.wrapS = RepeatWrapping\n t.wrapT = RepeatWrapping\n }\n return t\n}\n\n// Soft radial glow (white, alpha falloff) for additive sprites/points.\nexport function glowTexture(size = 64) {\n const c = canvas(size, size)\n const g = c.getContext('2d')\n const r = size / 2\n const grd = g.createRadialGradient(r, r, 0, r, r, r)\n grd.addColorStop(0, 'rgba(255,255,255,1)')\n grd.addColorStop(0.18, 'rgba(255,255,255,0.85)')\n grd.addColorStop(0.45, 'rgba(255,255,255,0.32)')\n grd.addColorStop(1, 'rgba(255,255,255,0)')\n g.fillStyle = grd\n g.fillRect(0, 0, size, size)\n return tex(c)\n}\n\n// Puffy smoke blob: several overlapping soft circles (alpha only).\nexport function smokeTexture(size = 64) {\n const c = canvas(size, size)\n const g = c.getContext('2d')\n const r = size / 2\n const rand = rng(7)\n for (let i = 0; i < 7; i++) {\n const a = rand() * Math.PI * 2\n const d = rand() * r * 0.32\n const x = r + Math.cos(a) * d\n const y = r + Math.sin(a) * d\n const rr = r * (0.45 + rand() * 0.25)\n const grd = g.createRadialGradient(x, y, 0, x, y, rr)\n grd.addColorStop(0, 'rgba(255,255,255,0.55)')\n grd.addColorStop(0.6, 'rgba(255,255,255,0.25)')\n grd.addColorStop(1, 'rgba(255,255,255,0)')\n g.fillStyle = grd\n g.fillRect(0, 0, size, size)\n }\n return tex(c)\n}\n\n// Thin bright ring for shockwaves / target markers.\nexport function ringTexture(size = 128) {\n const c = canvas(size, size)\n const g = c.getContext('2d')\n const r = size / 2\n const grd = g.createRadialGradient(r, r, 0, r, r, r)\n grd.addColorStop(0, 'rgba(255,255,255,0)')\n grd.addColorStop(0.62, 'rgba(255,255,255,0)')\n grd.addColorStop(0.8, 'rgba(255,255,255,0.55)')\n grd.addColorStop(0.9, 'rgba(255,255,255,1)')\n grd.addColorStop(1, 'rgba(255,255,255,0)')\n g.fillStyle = grd\n g.fillRect(0, 0, size, size)\n return tex(c)\n}\n\n// Blob shadow (dark center, soft edge).\nexport function blobTexture(size = 64) {\n const c = canvas(size, size)\n const g = c.getContext('2d')\n const r = size / 2\n const grd = g.createRadialGradient(r, r, 0, r, r, r)\n grd.addColorStop(0, 'rgba(0,0,0,0.6)')\n grd.addColorStop(0.55, 'rgba(0,0,0,0.38)')\n grd.addColorStop(1, 'rgba(0,0,0,0)')\n g.fillStyle = grd\n g.fillRect(0, 0, size, size)\n return tex(c)\n}\n\n// Track tread strip: u runs along the track loop, v across its width.\nexport function trackTexture() {\n const c = canvas(64, 32)\n const g = c.getContext('2d')\n g.fillStyle = '#3b3b3e'\n g.fillRect(0, 0, 64, 32)\n for (let i = 0; i < 4; i++) {\n const x = i * 16\n g.fillStyle = '#1b1b1d'\n g.fillRect(x, 0, 6, 32)\n g.fillStyle = '#5a5a5f'\n g.fillRect(x + 6, 0, 2, 32)\n g.fillStyle = '#2a2a2d'\n g.fillRect(x + 8, 13, 8, 6)\n }\n g.fillStyle = 'rgba(0,0,0,0.35)'\n g.fillRect(0, 0, 64, 3)\n g.fillRect(0, 29, 64, 3)\n return tex(c, true)\n}\n","// Low-poly terrain \"diorama\": flat-shaded, non-indexed, vertex colored, with stratified\n// earth skirts on the four edges. Heights are meters (row-major heights[iz*grid+ix]).\n// Crater deformation rewrites the existing buffers in place (no reallocation).\nimport {\n BackSide,\n BufferAttribute,\n BufferGeometry,\n Color,\n DynamicDrawUsage,\n Mesh,\n MeshBasicMaterial,\n MeshLambertMaterial,\n ShaderMaterial,\n SphereGeometry,\n} from 'three'\nimport { hash2, lin, smooth, clamp01 } from './util.js'\n\nconst C = {\n grassLo: lin('#2f6a37'),\n grassMid: lin('#4c8a3d'),\n grassHi: lin('#6e9a46'),\n dry: lin('#98915a'),\n dirt: lin('#76603f'),\n rock: lin('#7d7670'),\n rockHi: lin('#a39d94'),\n scorch: lin('#2b221d'),\n scorchRim: lin('#5b4129'),\n lip: lin('#355f2b'),\n soil1: lin('#5c3e27'),\n soil2: lin('#73502f'),\n soil3: lin('#5e3f27'),\n bedrock: lin('#38312e'),\n}\nconst SKIRT_LAYERS = 4\nconst tmpC = new Color()\nconst tmpD = new Color()\n\nexport function createTerrain() {\n const geo = new BufferGeometry()\n const material = new MeshLambertMaterial({ vertexColors: true })\n const mesh = new Mesh(geo, material)\n mesh.receiveShadow = true\n mesh.matrixAutoUpdate = false\n mesh.frustumCulled = false\n\n let N = 0\n let size = 160\n let cell = 2\n let heights = null // own copy\n let scorch = null\n let minH = 0\n let maxH = 1\n let baseY = -16\n let pos = null\n let nor = null\n let col = null\n let srcRef = null\n\n const hAt = (ix, iz) => heights[iz * N + ix]\n\n function allocate(n) {\n N = n\n const top = (N - 1) * (N - 1) * 6\n const skirt = 4 * (N - 1) * SKIRT_LAYERS * 6\n const count = top + skirt\n pos = new Float32Array(count * 3)\n nor = new Float32Array(count * 3)\n col = new Float32Array(count * 3)\n geo.setAttribute('position', new BufferAttribute(pos, 3).setUsage(DynamicDrawUsage))\n geo.setAttribute('normal', new BufferAttribute(nor, 3).setUsage(DynamicDrawUsage))\n geo.setAttribute('color', new BufferAttribute(col, 3).setUsage(DynamicDrawUsage))\n heights = new Float32Array(N * N)\n scorch = new Float32Array(N * N)\n }\n\n // Color of a top triangle from mean height, slope (ny) and scorch amount.\n function topColor(h, ny, s, x, z, seed, out) {\n const t = clamp01((h - minH) / Math.max(1, maxH - minH))\n out.copy(C.grassLo).lerp(C.grassMid, smooth(0.0, 0.45, t))\n out.lerp(C.grassHi, smooth(0.45, 0.8, t))\n const slope = 1 - ny\n out.lerp(C.dry, smooth(0.12, 0.22, slope) * 0.45)\n out.lerp(C.dirt, smooth(0.16, 0.3, slope))\n out.lerp(t > 0.7 ? C.rockHi : C.rock, smooth(0.3, 0.45, slope))\n // border lip: slightly darker grass right at the diorama edge\n const de = Math.min(x, z, size - x, size - z)\n out.lerp(C.lip, (1 - smooth(0, 3.5, de)) * 0.55)\n if (s > 0.01) {\n tmpD.copy(C.scorchRim).lerp(C.scorch, smooth(0.35, 0.8, s))\n out.lerp(tmpD, smooth(0, 0.45, s) * 0.92)\n }\n const j = 0.93 + hash2(seed, x * 0.37 + z * 0.11) * 0.14\n out.multiplyScalar(j)\n }\n\n function writeTri(o, ax, ay, az, bx, by, bz, cx, cy, cz, color) {\n let e1x = bx - ax, e1y = by - ay, e1z = bz - az\n let e2x = cx - ax, e2y = cy - ay, e2z = cz - az\n let nx = e1y * e2z - e1z * e2y\n let ny = e1z * e2x - e1x * e2z\n let nz = e1x * e2y - e1y * e2x\n const len = Math.hypot(nx, ny, nz) || 1\n nx /= len\n ny /= len\n nz /= len\n pos[o] = ax; pos[o + 1] = ay; pos[o + 2] = az\n pos[o + 3] = bx; pos[o + 4] = by; pos[o + 5] = bz\n pos[o + 6] = cx; pos[o + 7] = cy; pos[o + 8] = cz\n for (let k = 0; k < 9; k += 3) {\n nor[o + k] = nx; nor[o + k + 1] = ny; nor[o + k + 2] = nz\n col[o + k] = color.r; col[o + k + 1] = color.g; col[o + k + 2] = color.b\n }\n return o + 9\n }\n\n // Top triangle with upward-facing winding (CCW seen from +y).\n function topTri(o, i0, i1, i2, seed) {\n const ix0 = i0 % N, iz0 = (i0 / N) | 0\n const ix1 = i1 % N, iz1 = (i1 / N) | 0\n const ix2 = i2 % N, iz2 = (i2 / N) | 0\n const ax = ix0 * cell, az = iz0 * cell, ay = heights[i0]\n const bx = ix1 * cell, bz = iz1 * cell, by = heights[i1]\n const cx = ix2 * cell, cz = iz2 * cell, cy = heights[i2]\n // normal y for color (winding chosen so ny>0)\n const e1x = bx - ax, e1y = by - ay, e1z = bz - az\n const e2x = cx - ax, e2y = cy - ay, e2z = cz - az\n const nx = e1y * e2z - e1z * e2y\n const ny = e1z * e2x - e1x * e2z\n const nz = e1x * e2y - e1y * e2x\n const len = Math.hypot(nx, ny, nz) || 1\n const h = (ay + by + cy) / 3\n const s = (scorch[i0] + scorch[i1] + scorch[i2]) / 3\n topColor(h, Math.abs(ny) / len, s, (ax + bx + cx) / 3, (az + bz + cz) / 3, seed, tmpC)\n if (ny >= 0) return writeTri(o, ax, ay, az, bx, by, bz, cx, cy, cz, tmpC)\n return writeTri(o, ax, ay, az, cx, cy, cz, bx, by, bz, tmpC)\n }\n\n function skirtLevels(h, out) {\n out[0] = h\n out[1] = Math.min(h - 0.9, minH - 0.4)\n out[2] = Math.min(out[1] - 0.5, minH - 5)\n out[3] = Math.min(out[2] - 0.5, minH - 10)\n out[4] = baseY\n }\n const lvA = new Float32Array(5)\n const lvB = new Float32Array(5)\n const LAYER_COLORS = [C.lip, C.soil1, C.soil2, C.bedrock]\n\n function writeAll() {\n let o = 0\n for (let iz = 0; iz < N - 1; iz++) {\n for (let ix = 0; ix < N - 1; ix++) {\n const a = iz * N + ix\n const b = a + 1\n const c = a + N + 1\n const d = a + N\n // split along a-c to match heightAt()\n o = topTri(o, a, b, c, ix * 2 + iz * 7.3)\n o = topTri(o, a, c, d, ix * 2 + 1 + iz * 7.3)\n }\n }\n // skirts: 4 edges, outward horizontal normals\n for (let e = 0; e < 4; e++) {\n for (let i = 0; i < N - 1; i++) {\n let x0, z0, x1, z1, h0, h1, ox, oz\n if (e === 0) { x0 = i; z0 = 0; x1 = i + 1; z1 = 0; ox = 0; oz = -1 }\n else if (e === 1) { x0 = N - 1; z0 = i; x1 = N - 1; z1 = i + 1; ox = 1; oz = 0 }\n else if (e === 2) { x0 = i; z0 = N - 1; x1 = i + 1; z1 = N - 1; ox = 0; oz = 1 }\n else { x0 = 0; z0 = i; x1 = 0; z1 = i + 1; ox = -1; oz = 0 }\n h0 = hAt(x0, z0)\n h1 = hAt(x1, z1)\n skirtLevels(h0, lvA)\n skirtLevels(h1, lvB)\n const ax = x0 * cell, az = z0 * cell, bx = x1 * cell, bz = z1 * cell\n for (let l = 0; l < SKIRT_LAYERS; l++) {\n tmpC.copy(LAYER_COLORS[l]).multiplyScalar(0.9 + hash2(i * 3.1 + e, l * 5.7) * 0.18)\n // two triangles; choose winding so the normal faces outward (ox,oz)\n const flip = e === 2 || e === 3\n if (!flip) {\n o = writeTri(o, ax, lvA[l], az, bx, lvB[l], bz, bx, lvB[l + 1], bz, tmpC)\n o = writeTri(o, ax, lvA[l], az, bx, lvB[l + 1], bz, ax, lvA[l + 1], az, tmpC)\n } else {\n o = writeTri(o, ax, lvA[l], az, bx, lvB[l + 1], bz, bx, lvB[l], bz, tmpC)\n o = writeTri(o, ax, lvA[l], az, ax, lvA[l + 1], az, bx, lvB[l + 1], bz, tmpC)\n }\n // force exact outward normals (skirt quads are vertical)\n for (let k = o - 18; k < o; k += 3) {\n nor[k] = ox\n nor[k + 1] = 0\n nor[k + 2] = oz\n }\n }\n }\n }\n geo.attributes.position.needsUpdate = true\n geo.attributes.normal.needsUpdate = true\n geo.attributes.color.needsUpdate = true\n }\n\n function heightAt(x, z) {\n if (!heights) return 0\n const fx = Math.min(Math.max(x / cell, 0), N - 1.0001)\n const fz = Math.min(Math.max(z / cell, 0), N - 1.0001)\n const ix = Math.floor(fx)\n const iz = Math.floor(fz)\n const tx = fx - ix\n const tz = fz - iz\n const hA = hAt(ix, iz)\n const hB = hAt(ix + 1, iz)\n const hC = hAt(ix + 1, iz + 1)\n const hD = hAt(ix, iz + 1)\n if (tx >= tz) return hA + (hB - hA) * tx + (hC - hB) * tz\n return hA + (hD - hA) * tz + (hC - hD) * tx\n }\n\n function normalAt(x, z, out, span = 2) {\n const hl = heightAt(x - span, z)\n const hr = heightAt(x + span, z)\n const hd = heightAt(x, z - span)\n const hu = heightAt(x, z + span)\n out.set(hl - hr, 2 * span, hd - hu).normalize()\n return out\n }\n\n /** Returns 'same' | 'updated' | 'rebuilt'. */\n function setHeights(world) {\n const src = world && world.heights\n const n = (world && world.grid) | 0\n if (!src || n < 2 || src.length < n * n) return 'same'\n const newSize = world.size || 160\n if (src === srcRef && n === N && newSize === size) return 'same'\n srcRef = src\n let rebuilt = false\n if (n !== N || !pos) {\n allocate(n)\n rebuilt = true\n }\n size = newSize\n cell = size / (N - 1)\n let changed = 0\n for (let i = 0; i < N * N; i++) {\n const v = src[i]\n if (Math.abs(v - heights[i]) > 1e-4) changed++\n }\n if (!rebuilt && changed === 0) return 'same'\n // a new map (most of the grid differs) resets scorch and color range\n if (rebuilt || changed > N * N * 0.25) {\n rebuilt = true\n scorch.fill(0)\n let lo = Infinity\n let hi = -Infinity\n for (let i = 0; i < N * N; i++) {\n if (src[i] < lo) lo = src[i]\n if (src[i] > hi) hi = src[i]\n }\n minH = lo\n maxH = Math.max(hi, lo + 4)\n baseY = minH - 16\n }\n heights.set(src.subarray ? src.subarray(0, N * N) : Array.prototype.slice.call(src, 0, N * N))\n writeAll()\n geo.computeBoundingSphere()\n return rebuilt ? 'rebuilt' : 'updated'\n }\n\n /** Local deformation (visual prediction; authoritative heights arrive with the world). */\n function crater(x, z, radius, depth) {\n if (!heights || !(radius > 0)) return\n const r = radius\n const rr = r * 1.25\n const i0 = Math.max(0, Math.floor((x - rr) / cell))\n const i1 = Math.min(N - 1, Math.ceil((x + rr) / cell))\n const j0 = Math.max(0, Math.floor((z - rr) / cell))\n const j1 = Math.min(N - 1, Math.ceil((z + rr) / cell))\n for (let iz = j0; iz <= j1; iz++) {\n for (let ix = i0; ix <= i1; ix++) {\n const dx = ix * cell - x\n const dz = iz * cell - z\n const d = Math.sqrt(dx * dx + dz * dz)\n const i = iz * N + ix\n if (d < r && depth > 0) {\n const k = 1 - (d * d) / (r * r)\n heights[i] = Math.max(0, heights[i] - depth * k)\n }\n const s = 1 - d / rr\n if (s > scorch[i]) scorch[i] = Math.min(1, s * 1.25)\n }\n }\n writeAll()\n }\n\n return {\n mesh,\n material,\n heightAt,\n normalAt,\n setHeights,\n crater,\n get size() {\n return size\n },\n get minH() {\n return minH\n },\n get maxH() {\n return maxH\n },\n get ready() {\n return N > 0\n },\n dispose() {\n geo.dispose()\n material.dispose()\n },\n }\n}\n\n// ---------------------------------------------------------------- sky + distant hills\n\nconst SKY_VERT = /* glsl */ `\nvarying vec3 vDir;\nvoid main() {\n vDir = normalize(position);\n vec4 p = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n gl_Position = p.xyww;\n}\n`\nconst SKY_FRAG = /* glsl */ `\nuniform vec3 uTop;\nuniform vec3 uMid;\nuniform vec3 uHorizon;\nuniform vec3 uBottom;\nuniform vec3 uSunDir;\nuniform vec3 uSunColor;\nvarying vec3 vDir;\nvoid main() {\n vec3 d = normalize(vDir);\n float h = d.y;\n vec3 col = mix(uHorizon, uMid, smoothstep(0.0, 0.22, h));\n col = mix(col, uTop, smoothstep(0.18, 0.75, h));\n col = mix(col, uBottom, smoothstep(0.0, -0.25, h));\n float s = max(dot(d, normalize(uSunDir)), 0.0);\n col += uSunColor * (pow(s, 900.0) * 3.0 + pow(s, 24.0) * 0.45 + pow(s, 4.0) * 0.12);\n gl_FragColor = vec4(col, 1.0);\n #include <encodings_fragment>\n}\n`\n\nexport const SKY = {\n top: lin('#41538f'),\n mid: lin('#c98f98'),\n horizon: lin('#f7b27f'),\n bottom: lin('#d9a091'),\n sun: lin('#ffcf8a'),\n fog: lin('#d9a68c'),\n}\n\nexport function createSky(sunDir) {\n const geo = new SphereGeometry(600, 32, 16)\n const mat = new ShaderMaterial({\n uniforms: {\n uTop: { value: SKY.top },\n uMid: { value: SKY.mid },\n uHorizon: { value: SKY.horizon },\n uBottom: { value: SKY.bottom },\n uSunDir: { value: sunDir.clone() },\n uSunColor: { value: SKY.sun },\n },\n vertexShader: SKY_VERT,\n fragmentShader: SKY_FRAG,\n side: BackSide,\n depthWrite: false,\n depthTest: false,\n fog: false,\n })\n const mesh = new Mesh(geo, mat)\n mesh.renderOrder = -10\n mesh.frustumCulled = false\n return {\n mesh,\n dispose() {\n geo.dispose()\n mat.dispose()\n },\n }\n}\n\n// Two jagged rings of hazy low-poly mountains around the map (one draw call, unlit, no fog).\nexport function createHills(center, sunDir) {\n const p = []\n const c = []\n const haze = SKY.horizon\n const sd = sunDir || { x: 0.6, y: 0.4, z: 0.6 }\n const pushTri = (A, B, Cc, color, baseY, topY) => {\n const e1x = B[0] - A[0], e1y = B[1] - A[1], e1z = B[2] - A[2]\n const e2x = Cc[0] - A[0], e2y = Cc[1] - A[1], e2z = Cc[2] - A[2]\n let nx = e1y * e2z - e1z * e2y\n let ny = e1z * e2x - e1x * e2z\n let nz = e1x * e2y - e1y * e2x\n const l = Math.hypot(nx, ny, nz) || 1\n const lit = 0.78 + 0.32 * Math.max(0, (nx * sd.x + ny * sd.y + nz * sd.z) / l)\n for (const v of [A, B, Cc]) {\n p.push(v[0], v[1], v[2])\n const m = clamp01((v[1] - baseY) / (topY - baseY)) * 0.75 + 0.25\n c.push(\n (haze.r + (color.r * lit - haze.r) * m),\n (haze.g + (color.g * lit - haze.g) * m),\n (haze.b + (color.b * lit - haze.b) * m),\n )\n }\n }\n const ring = (radius, hMin, hMax, color, seg, base, phase) => {\n const tops = []\n for (let i = 0; i < seg; i++) {\n const a = (i / seg) * Math.PI * 2\n const peak = i % 2 === 1\n const n =\n 0.45 +\n 0.25 * Math.sin(a * 3 + phase) +\n 0.15 * Math.sin(a * 7 + phase * 2) +\n (peak ? 0.18 + 0.2 * hash2(i * 1.7, phase) : -0.12)\n const h = hMin + (hMax - hMin) * clamp01(n)\n const r = radius - (peak ? 0.6 : 0.2) * h\n tops.push([center.x + Math.cos(a) * r, h, center.z + Math.sin(a) * r, a])\n }\n for (let i = 0; i < seg; i++) {\n const T0 = tops[i]\n const T1 = tops[(i + 1) % seg]\n const B0 = [center.x + Math.cos(T0[3]) * radius, base, center.z + Math.sin(T0[3]) * radius]\n const B1 = [center.x + Math.cos(T1[3]) * radius, base, center.z + Math.sin(T1[3]) * radius]\n pushTri(B0, B1, T1, color, base, hMax)\n pushTri(B0, T1, T0, color, base, hMax)\n }\n }\n ring(560, 25, 90, lin('#c99a98'), 90, -30, 1.3)\n ring(470, 8, 46, lin('#94738a'), 120, -30, 4.1)\n const geo = new BufferGeometry()\n geo.setAttribute('position', new BufferAttribute(new Float32Array(p), 3))\n geo.setAttribute('color', new BufferAttribute(new Float32Array(c), 3))\n const mat = new MeshBasicMaterial({ vertexColors: true, fog: false, side: 2, toneMapped: false })\n const mesh = new Mesh(geo, mat)\n mesh.renderOrder = -9\n mesh.frustumCulled = false\n return {\n mesh,\n dispose() {\n geo.dispose()\n mat.dispose()\n },\n }\n}\n","// Instanced decor: low-poly trees, rocks (decor + rock obstacles) and stone walls.\n// Three draw calls total regardless of counts.\nimport {\n BufferAttribute,\n BufferGeometry,\n Color,\n DodecahedronGeometry,\n DynamicDrawUsage,\n InstancedMesh,\n MeshLambertMaterial,\n Object3D,\n} from 'three'\nimport { GeoBuilder } from '../../battleship/scene/core-geo.js'\nimport { hash2, lin, rng } from './util.js'\n\nconst MAX_TREES = { low: 70, medium: 170, high: 320 }\nconst WHITE = new Color(1, 1, 1)\nconst BURNT = lin('#3b332e')\n\nfunction treeGeometry() {\n const b = new GeoBuilder()\n b.prism(0, 0, 0, 0.32, 0.32, 1.6, 5, lin('#6b4a2f'), 0, 0.7)\n const greens = [lin('#2f6b34'), lin('#3d8240'), lin('#57a04c')]\n const tiers = [\n [1.1, 2.0, 2.6],\n [2.4, 1.55, 2.3],\n [3.6, 1.05, 2.0],\n ]\n tiers.forEach(([y, r, h], i) => {\n // cone: prism with top scaled to 0 (top cap degenerates and is skipped)\n b.prism(0, y, 0, r, r, h, 7, greens[i], 0, 0.02)\n // underside\n for (let k = 0; k < 7; k++) {\n const a0 = (k / 7) * Math.PI * 2\n const a1 = ((k + 1) / 7) * Math.PI * 2\n b.tri([0, y, 0], [Math.cos(a0) * r, y, Math.sin(a0) * r], [Math.cos(a1) * r, y, Math.sin(a1) * r], [0, y + 1, 0], greens[0])\n }\n })\n return b.build()\n}\n\nfunction rockGeometry() {\n const src = new DodecahedronGeometry(1, 0)\n const p = src.attributes.position\n // jitter by original position so shared corners move together (no cracks)\n for (let i = 0; i < p.count; i++) {\n const x = p.getX(i), y = p.getY(i), z = p.getZ(i)\n const k = 0.78 + hash2(x * 3.1 + z * 1.7, y * 2.3) * 0.42\n p.setXYZ(i, x * k, Math.max(-0.35, y * k * 0.8), z * k)\n }\n src.computeVertexNormals() // non-indexed → flat normals\n const n = src.attributes.normal\n const col = new Float32Array(p.count * 3)\n const grey = lin('#7f7d7a')\n const dark = lin('#5f5d5b')\n const moss = lin('#6f8f45')\n const c = new Color()\n for (let i = 0; i < p.count; i += 3) {\n const ny = n.getY(i)\n c.copy(hash2(i, 3) > 0.5 ? grey : dark)\n if (ny > 0.75) c.lerp(moss, 0.55)\n for (let k = 0; k < 3; k++) {\n col[(i + k) * 3] = c.r\n col[(i + k) * 3 + 1] = c.g\n col[(i + k) * 3 + 2] = c.b\n }\n }\n const g = new BufferGeometry()\n g.setAttribute('position', p)\n g.setAttribute('normal', n)\n g.setAttribute('color', new BufferAttribute(col, 3))\n g.translate(0, 0.35, 0)\n src.dispose()\n return g\n}\n\n// Unit wall (1×1×1, base at y=0): stacked offset stone courses with a cap.\nfunction wallGeometry() {\n const b = new GeoBuilder()\n const stone = [lin('#8f8c88'), lin('#7b7874'), lin('#a29e98')]\n const rows = 3\n for (let r = 0; r < rows; r++) {\n const y = (r + 0.5) / (rows + 0.4)\n const h = 1 / (rows + 0.4) - 0.02\n const n = 3\n const off = r % 2 ? 0.5 / n : 0\n for (let i = -1; i <= n; i++) {\n let x0 = -0.5 + i / n + off\n let x1 = x0 + 1 / n - 0.015\n x0 = Math.max(-0.5, x0)\n x1 = Math.min(0.5, x1)\n if (x1 - x0 < 0.02) continue\n b.box((x0 + x1) / 2, y, 0, x1 - x0, h, 0.92 + (hash2(r, i) - 0.5) * 0.06, stone[(r + i + 3) % 3])\n }\n }\n b.box(0, 1 - 0.06, 0, 1.02, 0.12, 1.0, lin('#b3afa8'))\n return b.build()\n}\n\nexport function createDecor() {\n const geoTree = treeGeometry()\n const geoRock = rockGeometry()\n const geoWall = wallGeometry()\n const matTree = new MeshLambertMaterial({ vertexColors: true })\n const matRock = new MeshLambertMaterial({ vertexColors: true })\n const matWall = new MeshLambertMaterial({ vertexColors: true })\n let trees = null\n let rocks = null\n let walls = null\n const dummy = new Object3D()\n let treeData = [] // {x,z,s,rot,burnt,lean}\n let signature = ''\n let quality = 'high'\n let shadows = false\n let group = null\n let lastTerrain = null\n let lastWorld = null\n\n function makeMesh(geo, mat, n) {\n const m = new InstancedMesh(geo, mat, Math.max(1, n))\n m.count = n\n m.frustumCulled = false\n m.instanceMatrix.setUsage(DynamicDrawUsage)\n return m\n }\n\n function disposeMeshes() {\n for (const m of [trees, rocks, walls]) {\n if (!m) continue\n m.removeFromParent()\n m.dispose()\n }\n trees = rocks = walls = null\n }\n\n function sigOf(world) {\n const d = world.decor || []\n const o = world.obstacles || []\n let s = 0\n for (const e of d) s += e.x * 3.1 + e.z * 7.7 + (e.scale || 1)\n for (const e of o) s += e.x * 1.3 + e.z * 5.1 + e.h\n return `${d.length}|${o.length}|${s.toFixed(3)}|${quality}`\n }\n\n function build(parent, world, terrain) {\n const sig = sigOf(world)\n if (sig === signature && trees) {\n reground(terrain)\n return false\n }\n signature = sig\n lastTerrain = terrain\n lastWorld = world\n disposeMeshes()\n group = parent\n const decor = world.decor || []\n const obstacles = world.obstacles || []\n const rand = rng(decor.length * 131 + obstacles.length * 7 + 1)\n const max = MAX_TREES[quality] || 170\n const treeList = decor.filter((d) => d.kind === 'tree').slice(0, max)\n const rockList = decor.filter((d) => d.kind !== 'tree')\n const rockObs = obstacles.filter((o) => o.kind !== 'wall')\n const wallObs = obstacles.filter((o) => o.kind === 'wall')\n\n treeData = treeList.map((t) => ({\n x: t.x,\n z: t.z,\n s: (t.scale || 1) * 1.15,\n rot: rand() * Math.PI * 2,\n tint: 0.85 + rand() * 0.3,\n burnt: false,\n lean: 0,\n leanDir: rand() * Math.PI * 2,\n }))\n trees = makeMesh(geoTree, matTree, treeData.length)\n trees.castShadow = shadows\n for (let i = 0; i < treeData.length; i++) trees.setColorAt(i, WHITE)\n if (trees.instanceColor) trees.instanceColor.setUsage(DynamicDrawUsage)\n\n rocks = makeMesh(geoRock, matRock, rockList.length + rockObs.length)\n rocks.castShadow = shadows\n rocks.receiveShadow = shadows\n let k = 0\n for (const r of rockList) {\n const s = (r.scale || 1) * 1.2\n dummy.position.set(r.x, terrain.heightAt(r.x, r.z) - 0.15 * s, r.z)\n dummy.rotation.set(0, rand() * 6.28, 0)\n dummy.scale.set(s * (0.8 + rand() * 0.5), s * (0.6 + rand() * 0.4), s * (0.8 + rand() * 0.5))\n dummy.updateMatrix()\n rocks.setMatrixAt(k++, dummy.matrix)\n }\n for (const o of rockObs) {\n const base = minGround(terrain, o)\n dummy.position.set(o.x, base - 0.3, o.z)\n dummy.rotation.set(0, hash2(o.x, o.z) * 6.28, 0)\n dummy.scale.set(o.w * 0.62, (o.h + 0.3) / 1.15, o.d * 0.62)\n dummy.updateMatrix()\n rocks.setMatrixAt(k++, dummy.matrix)\n }\n rocks.instanceMatrix.needsUpdate = true\n\n walls = makeMesh(geoWall, matWall, wallObs.length)\n walls.castShadow = shadows\n walls.receiveShadow = shadows\n wallObs.forEach((o, i) => {\n const base = minGround(terrain, o)\n dummy.position.set(o.x, base - 0.4, o.z)\n dummy.rotation.set(0, 0, 0)\n dummy.scale.set(o.w, o.h + 0.4, o.d)\n dummy.updateMatrix()\n walls.setMatrixAt(i, dummy.matrix)\n })\n walls.instanceMatrix.needsUpdate = true\n writeTrees(terrain)\n parent.add(trees, rocks, walls)\n return true\n }\n\n function minGround(terrain, o) {\n let m = Infinity\n for (const [dx, dz] of [[-0.5, -0.5], [0.5, -0.5], [0.5, 0.5], [-0.5, 0.5], [0, 0]]) {\n m = Math.min(m, terrain.heightAt(o.x + dx * o.w, o.z + dz * o.d))\n }\n return m\n }\n\n const tint = new Color()\n function writeTrees(terrain) {\n if (!trees) return\n for (let i = 0; i < treeData.length; i++) {\n const t = treeData[i]\n dummy.position.set(t.x, terrain.heightAt(t.x, t.z) - 0.2, t.z)\n dummy.rotation.set(Math.cos(t.leanDir) * t.lean, t.rot, Math.sin(t.leanDir) * t.lean)\n dummy.scale.setScalar(t.s)\n dummy.updateMatrix()\n trees.setMatrixAt(i, dummy.matrix)\n if (t.burnt) tint.copy(BURNT)\n else tint.setScalar(t.tint)\n trees.setColorAt(i, tint)\n }\n trees.instanceMatrix.needsUpdate = true\n if (trees.instanceColor) trees.instanceColor.needsUpdate = true\n }\n\n function reground(terrain) {\n writeTrees(terrain)\n }\n\n /** Scorch / knock trees near an explosion. */\n function blast(terrain, x, z, radius) {\n let any = false\n for (const t of treeData) {\n const d = Math.hypot(t.x - x, t.z - z)\n if (d < radius * 1.25) {\n t.burnt = true\n t.lean = Math.min(1.1, t.lean + (1 - d / (radius * 1.25)) * 0.9)\n t.leanDir = Math.atan2(t.z - z, t.x - x) + Math.PI / 2\n any = true\n }\n }\n if (any) writeTrees(terrain)\n return any\n }\n\n return {\n build,\n blast,\n reground,\n setQuality(q, parent) {\n quality = q\n if (lastWorld && lastTerrain && parent) build(parent, lastWorld, lastTerrain)\n },\n setShadows(on) {\n shadows = on\n if (trees) trees.castShadow = on\n if (rocks) rocks.castShadow = rocks.receiveShadow = on\n if (walls) walls.castShadow = walls.receiveShadow = on\n },\n dispose() {\n disposeMeshes()\n geoTree.dispose()\n geoRock.dispose()\n geoWall.dispose()\n matTree.dispose()\n matRock.dispose()\n matWall.dispose()\n },\n }\n}\n","// Procedural low-poly tank. Geometry is built once and shared by every tank; each tank only\n// owns its materials (team tint, accent glow, track texture offset).\n// Local frame: +x forward, +y up, +z right side. Units: meters before TANK_SCALE.\nimport {\n BufferAttribute,\n BufferGeometry,\n DoubleSide,\n Group,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n MeshLambertMaterial,\n MeshStandardMaterial,\n Quaternion,\n Vector3,\n} from 'three'\nimport { GeoBuilder } from '../../battleship/scene/core-geo.js'\nimport { lin, trackTexture } from './util.js'\n\nexport const TANK_SCALE = 1.15\nexport const TEAM = {\n green: { tint: lin('#7fa35c'), accent: lin('#22c55e'), hex: '#22c55e' },\n red: { tint: lin('#b8584a'), accent: lin('#ef4444'), hex: '#ef4444' },\n}\nconst W = lin('#e9e6dc') // body panel (tinted by material color)\nconst W2 = lin('#c9c4b6')\nconst G = lin('#6d6a64') // darker panel\nconst D = lin('#2a2927') // grille / dark\nconst M = lin('#55565b') // metal (barrel ends)\nconst K = lin('#ffffff')\n\nconst TRACK_Z = 1.35\nconst TRACK_W = 0.74\nconst WHEEL_R = 0.36\nconst WHEEL_X = [-2.1, -1.05, 0, 1.05, 2.1]\nconst SPROCKET = [2.85, 0.62, 0.3]\nconst IDLER = [-2.85, 0.62, 0.3]\nconst TRACK_TILE = 0.9 // meters of track per texture repeat\n\nexport const TURRET_PIVOT = new Vector3(-0.35, 1.6, 0)\nexport const GUN_PIVOT = new Vector3(1.55, 0.42, 0)\nexport const MUZZLE = new Vector3(4.7, 0, 0)\n\n// hexagonal section (y,z): bottom edge, vertical sides, bevelled top\nconst sec = (yb, yt, z, b, zb = z) => [\n [yb, -zb],\n [yb, zb],\n [yt - b, z],\n [yt, z - b * 1.6],\n [yt, -(z - b * 1.6)],\n [yt - b, -z],\n]\n\n// Loft rings along x (each ring same point count) + end caps.\nfunction loft(b, rings, color, glow = 0, topColor = null) {\n let cx = 0, cy = 0, n = 0\n for (const r of rings) for (const p of r.pts) { cx += r.x; cy += p[0]; n++ }\n const ins = [cx / n, cy / n, 0]\n for (let i = 0; i < rings.length - 1; i++) {\n const A = rings[i], B = rings[i + 1]\n const m = A.pts.length\n for (let k = 0; k < m; k++) {\n const k1 = (k + 1) % m\n const a0 = [A.x, A.pts[k][0], A.pts[k][1]]\n const a1 = [A.x, A.pts[k1][0], A.pts[k1][1]]\n const b0 = [B.x, B.pts[k][0], B.pts[k][1]]\n const b1 = [B.x, B.pts[k1][0], B.pts[k1][1]]\n const isTop = topColor && A.pts[k][0] === A.pts[k1][0] && A.pts[k][0] > ins[1]\n b.quad(a0, a1, b1, b0, ins, isTop ? topColor : color, glow)\n }\n }\n for (const r of [rings[0], rings[rings.length - 1]]) {\n const c = [r.x, 0, 0]\n for (const p of r.pts) c[1] += p[0] / r.pts.length\n for (let k = 0; k < r.pts.length; k++) {\n const p0 = r.pts[k], p1 = r.pts[(k + 1) % r.pts.length]\n b.tri(c, [r.x, p0[0], p0[1]], [r.x, p1[0], p1[1]], ins, color, glow)\n }\n }\n}\n\n// Cylinder along x.\nfunction cylX(b, x0, x1, r0, r1, seg, color, y = 0, z = 0, glow = 0) {\n const ins = [(x0 + x1) / 2, y, z]\n for (let i = 0; i < seg; i++) {\n const a0 = (i / seg) * Math.PI * 2 + Math.PI / seg\n const a1 = ((i + 1) / seg) * Math.PI * 2 + Math.PI / seg\n const p = (x, r, a) => [x, y + Math.cos(a) * r, z + Math.sin(a) * r]\n b.quad(p(x0, r0, a0), p(x0, r0, a1), p(x1, r1, a1), p(x1, r1, a0), ins, color, glow)\n b.tri([x0, y, z], p(x0, r0, a0), p(x0, r0, a1), [x1, y, z], color, glow)\n b.tri([x1, y, z], p(x1, r1, a0), p(x1, r1, a1), [x0, y, z], color, glow)\n }\n}\n\n// Cylinder along z centred at origin (wheel).\nfunction cylZ(b, z0, z1, r, seg, color, cx = 0, cy = 0) {\n const ins = [cx, cy, (z0 + z1) / 2]\n for (let i = 0; i < seg; i++) {\n const a0 = (i / seg) * Math.PI * 2\n const a1 = ((i + 1) / seg) * Math.PI * 2\n const p = (z, a) => [cx + Math.cos(a) * r, cy + Math.sin(a) * r, z]\n b.quad(p(z0, a0), p(z0, a1), p(z1, a1), p(z1, a0), ins, color)\n b.tri([cx, cy, z0], p(z0, a0), p(z0, a1), [cx, cy, z1], color)\n b.tri([cx, cy, z1], p(z1, a0), p(z1, a1), [cx, cy, z0], color)\n }\n}\n\nfunction buildHull() {\n const b = new GeoBuilder()\n // lower hull between the tracks\n loft(b, [\n { x: -3.0, pts: [[0.5, -0.9], [0.5, 0.9], [1.0, 0.98], [1.0, -0.98]] },\n { x: 2.55, pts: [[0.45, -0.9], [0.45, 0.9], [1.0, 0.98], [1.0, -0.98]] },\n { x: 3.15, pts: [[0.85, -0.85], [0.85, 0.85], [1.0, 0.95], [1.0, -0.95]] },\n ], G)\n // upper hull / deck over the tracks with sloped glacis\n loft(b, [\n { x: -3.15, pts: sec(0.98, 1.48, 1.68, 0.1) },\n { x: -2.95, pts: sec(0.95, 1.6, 1.8, 0.14) },\n { x: 1.85, pts: sec(0.95, 1.6, 1.8, 0.14) },\n { x: 3.3, pts: sec(0.95, 1.1, 1.72, 0.06) },\n ], W, 0, W2)\n // engine deck grilles + exhausts\n b.box(-2.2, 1.62, 0, 1.1, 0.05, 1.7, D)\n for (let i = 0; i < 4; i++) b.box(-2.65 + i * 0.3, 1.66, 0, 0.12, 0.03, 1.6, G)\n b.box(-3.18, 1.22, 0.9, 0.12, 0.28, 0.5, D)\n b.box(-3.18, 1.22, -0.9, 0.12, 0.28, 0.5, D)\n // side skirts (cover the upper run of the tracks)\n for (const s of [-1, 1]) {\n loft(b, [\n { x: -2.95, pts: [[0.62, s * 1.82], [0.98, s * 1.8], [0.98, s * 1.88], [0.62, s * 1.9]] },\n { x: 2.35, pts: [[0.62, s * 1.82], [0.98, s * 1.8], [0.98, s * 1.88], [0.62, s * 1.9]] },\n ], W2)\n // fender storage boxes\n b.box(-1.3, 1.72, s * 1.4, 1.3, 0.24, 0.5, G)\n b.box(0.7, 1.7, s * 1.45, 0.7, 0.2, 0.4, W2)\n // tow hooks / front bumpers\n b.box(3.2, 0.92, s * 1.25, 0.25, 0.14, 0.22, D)\n }\n // driver hatch\n b.prism(1.35, 1.6, 0.55, 0.32, 0.32, 0.08, 6, G)\n b.box(1.8, 1.61, -0.45, 0.35, 0.06, 0.5, D)\n return b.build()\n}\n\nfunction buildHullAccent() {\n const b = new GeoBuilder()\n for (const s of [-1, 1]) {\n b.box(-0.3, 1.0, s * 1.905, 5.0, 0.07, 0.03, K, 1) // skirt top stripe\n b.box(-0.3, 0.66, s * 1.915, 5.0, 0.04, 0.03, K, 1)\n b.box(-3.19, 1.4, s * 1.3, 0.04, 0.12, 0.4, K, 1) // rear lights\n }\n b.box(2.9, 1.24, 0, 0.6, 0.02, 0.22, K, 1) // glacis chevron\n return b.build()\n}\n\nfunction buildLamps() {\n const b = new GeoBuilder()\n for (const s of [-1, 1]) {\n b.box(3.24, 1.16, s * 1.3, 0.12, 0.16, 0.26, K, 1)\n }\n return b.build()\n}\n\nfunction buildTurret() {\n const b = new GeoBuilder()\n loft(b, [\n { x: -2.25, pts: sec(0.05, 0.62, 1.0, 0.1, 0.95) },\n { x: -1.55, pts: sec(0.0, 0.8, 1.32, 0.14, 1.25) },\n { x: 0.85, pts: sec(0.0, 0.8, 1.35, 0.14, 1.28) },\n { x: 1.75, pts: sec(0.05, 0.55, 0.85, 0.08, 0.95) },\n ], W, 0, W2)\n // ring base\n b.prism(-0.2, -0.08, 0, 1.15, 1.15, 0.1, 10, D)\n // commander cupola + hatch\n b.prism(-0.75, 0.8, 0.55, 0.4, 0.4, 0.22, 8, G, 0, 0.9)\n b.prism(-0.75, 1.02, 0.55, 0.3, 0.3, 0.07, 8, W2)\n b.box(-0.2, 0.86, -0.6, 0.6, 0.1, 0.45, G)\n // gunner sight\n b.box(0.55, 0.92, -0.75, 0.42, 0.26, 0.3, G)\n b.box(0.77, 0.94, -0.75, 0.02, 0.16, 0.22, D)\n // bustle rack\n b.box(-2.3, 0.45, 0, 0.32, 0.4, 1.7, D)\n // smoke dischargers\n for (const s of [-1, 1]) {\n for (let i = 0; i < 3; i++) b.box(1.0 - i * 0.12, 0.58, s * (1.18 + i * 0.03), 0.22, 0.12, 0.12, G)\n }\n // antenna\n b.box(-1.85, 1.5, -0.85, 0.04, 1.5, 0.04, D)\n return b.build()\n}\n\nfunction buildTurretAccent() {\n const b = new GeoBuilder()\n for (const s of [-1, 1]) {\n b.box(-0.35, 0.42, s * 1.34, 2.3, 0.1, 0.03, K, 1)\n }\n b.box(-2.42, 0.45, 0, 0.03, 0.08, 1.6, K, 1)\n b.box(-1.85, 2.27, -0.85, 0.08, 0.08, 0.08, K, 1) // antenna tip\n return b.build()\n}\n\nfunction buildGun() {\n const b = new GeoBuilder()\n // mantlet\n loft(b, [\n { x: -0.05, pts: [[-0.32, -0.5], [-0.32, 0.5], [0.3, 0.5], [0.3, -0.5]] },\n { x: 0.55, pts: [[-0.22, -0.36], [-0.22, 0.36], [0.22, 0.36], [0.22, -0.36]] },\n ], G)\n cylX(b, 0.5, 4.3, 0.15, 0.12, 10, W2)\n cylX(b, 1.9, 2.55, 0.21, 0.21, 10, G)\n cylX(b, 4.25, 4.7, 0.19, 0.19, 8, M)\n b.box(4.47, 0, 0, 0.18, 0.3, 0.46, D)\n return b.build()\n}\n\nfunction buildWheel() {\n const b = new GeoBuilder()\n const h = TRACK_W * 0.42\n cylZ(b, -h, h, WHEEL_R, 10, D)\n cylZ(b, h - 0.01, h + 0.04, WHEEL_R * 0.66, 10, W2)\n cylZ(b, -h - 0.04, -h + 0.01, WHEEL_R * 0.66, 10, W2)\n // spokes (make rotation readable)\n for (let i = 0; i < 3; i++) {\n const a = (i / 3) * Math.PI\n const c = Math.cos(a), s = Math.sin(a)\n const L = WHEEL_R * 0.55\n const w = 0.07\n const zf = h + 0.06\n for (const zz of [zf, -zf]) {\n const ins = [0, 0, zz > 0 ? zz - 0.1 : zz + 0.1]\n b.quad(\n [-c * L - s * w, -s * L + c * w, zz],\n [c * L - s * w, s * L + c * w, zz],\n [c * L + s * w, s * L - c * w, zz],\n [-c * L + s * w, -s * L - c * w, zz],\n ins,\n G,\n )\n }\n }\n cylZ(b, -h - 0.08, h + 0.08, 0.08, 6, M)\n return b.build()\n}\n\n// Track loop (outer surface only) with uv along the loop.\nfunction buildTrack() {\n const pts = []\n const arc = (cx, cy, r, a0, a1, n) => {\n for (let i = 0; i <= n; i++) {\n const a = a0 + ((a1 - a0) * i) / n\n pts.push([cx + Math.cos(a) * r, cy + Math.sin(a) * r])\n }\n }\n const rr = 0.38\n pts.push([-2.1, -0.0])\n pts.push([2.1, -0.0])\n arc(SPROCKET[0], SPROCKET[1], rr, -2.0, Math.PI / 2, 6)\n arc(IDLER[0], IDLER[1], rr, Math.PI / 2, Math.PI + 2.0, 6)\n pts.push(pts[0])\n const lens = [0]\n for (let i = 1; i < pts.length; i++) {\n lens.push(lens[i - 1] + Math.hypot(pts[i][0] - pts[i - 1][0], pts[i][1] - pts[i - 1][1]))\n }\n const P = [], Nn = [], UV = []\n for (const side of [-1, 1]) {\n const z0 = side * TRACK_Z - TRACK_W / 2\n const z1 = side * TRACK_Z + TRACK_W / 2\n for (let i = 0; i < pts.length - 1; i++) {\n const [x0, y0] = pts[i]\n const [x1, y1] = pts[i + 1]\n // loop is CCW in (x,y) seen from +z → outward normal = (dy, -dx)\n let nx = y1 - y0, ny = -(x1 - x0)\n const l = Math.hypot(nx, ny) || 1\n nx /= l\n ny /= l\n const u0 = lens[i] / TRACK_TILE\n const u1 = lens[i + 1] / TRACK_TILE\n const quad = [\n [x0, y0, z0, u0, 0], [x1, y1, z0, u1, 0], [x1, y1, z1, u1, 1],\n [x0, y0, z0, u0, 0], [x1, y1, z1, u1, 1], [x0, y0, z1, u0, 1],\n ]\n for (const q of quad) {\n P.push(q[0], q[1] + 0.02, q[2])\n Nn.push(nx, ny, 0)\n UV.push(q[3], q[4])\n }\n }\n }\n const g = new BufferGeometry()\n g.setAttribute('position', new BufferAttribute(new Float32Array(P), 3))\n g.setAttribute('normal', new BufferAttribute(new Float32Array(Nn), 3))\n g.setAttribute('uv', new BufferAttribute(new Float32Array(UV), 2))\n g.computeBoundingSphere()\n return g\n}\n\n// Local wheel transforms (position + radius scale) for one tank: 14 wheels.\nexport const WHEELS = (() => {\n const list = []\n for (const s of [-1, 1]) {\n for (const x of WHEEL_X) list.push({ x, y: WHEEL_R, z: s * TRACK_Z, r: WHEEL_R })\n list.push({ x: SPROCKET[0], y: SPROCKET[1], z: s * TRACK_Z, r: SPROCKET[2] })\n list.push({ x: IDLER[0], y: IDLER[1], z: s * TRACK_Z, r: IDLER[2] })\n }\n return list\n})()\n\nexport function createTankGeometries() {\n const g = {\n hull: buildHull(),\n hullAccent: buildHullAccent(),\n lamps: buildLamps(),\n turret: buildTurret(),\n turretAccent: buildTurretAccent(),\n gun: buildGun(),\n wheel: buildWheel(),\n track: buildTrack(),\n }\n g.dispose = () => {\n for (const k of Object.keys(g)) if (g[k] && g[k].isBufferGeometry) g[k].dispose()\n }\n return g\n}\n\nconst CHAR = lin('#3a3431')\nconst CHAR_ACCENT = lin('#2a201b')\n\n/** One tank instance (scene graph + own materials). */\nexport function createTank(geos, shared, { id, color = 'green', quality = 'high' }) {\n const team = TEAM[color] || TEAM.green\n const root = new Group()\n root.scale.setScalar(TANK_SCALE)\n const body = new Group() // tilt + hull yaw\n root.add(body)\n const turret = new Group()\n turret.position.copy(TURRET_PIVOT)\n const gun = new Group()\n gun.position.copy(GUN_PIVOT)\n turret.add(gun)\n body.add(turret)\n\n const accentMat = new MeshBasicMaterial({ color: team.accent.clone() })\n accentMat.color.multiplyScalar(1.35)\n const trackTex = shared.trackTex.clone()\n trackTex.needsUpdate = true\n let bodyMat = null\n let trackMat = null\n\n const hull = new Mesh(geos.hull, null)\n const hullAccent = new Mesh(geos.hullAccent, accentMat)\n const lamps = new Mesh(geos.lamps, shared.lampMat)\n const track = new Mesh(geos.track, null)\n const turretMesh = new Mesh(geos.turret, null)\n const turretAccent = new Mesh(geos.turretAccent, accentMat)\n const gunMesh = new Mesh(geos.gun, null)\n body.add(hull, hullAccent, lamps, track)\n turret.add(turretMesh, turretAccent)\n gun.add(gunMesh)\n const casters = [hull, track, turretMesh, gunMesh]\n\n function makeMaterials(q) {\n if (bodyMat) bodyMat.dispose()\n if (trackMat) trackMat.dispose()\n if (q === 'low') {\n bodyMat = new MeshLambertMaterial({ vertexColors: true, color: team.tint.clone() })\n trackMat = new MeshLambertMaterial({ map: trackTex, color: lin('#9a9a9a'), side: DoubleSide })\n } else {\n bodyMat = new MeshStandardMaterial({\n vertexColors: true,\n color: team.tint.clone(),\n roughness: 0.62,\n metalness: 0.18,\n flatShading: true,\n })\n trackMat = new MeshStandardMaterial({\n map: trackTex,\n color: lin('#a0a0a0'),\n roughness: 0.85,\n metalness: 0.2,\n side: DoubleSide,\n })\n }\n hull.material = bodyMat\n turretMesh.material = bodyMat\n gunMesh.material = bodyMat\n track.material = trackMat\n if (state.charred) applyCharred()\n }\n\n const state = {\n id,\n color,\n alive: true,\n charred: false,\n hp: 100,\n maxHp: 100,\n x: 0,\n y: 0,\n z: 0,\n hullYaw: 0, // deg\n yaw: 0, // turret absolute deg\n pitch: 10, // deg\n targetYaw: null,\n targetPitch: null,\n recoil: 0,\n hitFlash: 0,\n trackDist: 0,\n wheelSpin: 0,\n smokeAcc: 0,\n blown: null, // { pos:Vector3, vel:Vector3, rot:Vector3, spin:Vector3, landed }\n }\n\n function applyCharred() {\n bodyMat.color.copy(CHAR)\n accentMat.color.copy(CHAR_ACCENT)\n lamps.visible = false\n if (trackMat) trackMat.color.copy(lin('#3a3836'))\n }\n\n makeMaterials(quality)\n\n const up = new Vector3(0, 1, 0)\n const nrm = new Vector3()\n const qTilt = new Quaternion()\n const qYaw = new Quaternion()\n const tiltTarget = new Quaternion()\n let tiltInit = false\n\n /** Place hull on terrain: position + tilt from terrain normal. */\n function place(terrain, dt = 0) {\n root.position.set(state.x, state.y, state.z)\n terrain.normalAt(state.x, state.z, nrm, 2.2)\n tiltTarget.setFromUnitVectors(up, nrm)\n if (!tiltInit || dt <= 0) {\n qTilt.copy(tiltTarget)\n tiltInit = true\n } else {\n qTilt.slerp(tiltTarget, 1 - Math.exp(-10 * dt))\n }\n qYaw.setFromAxisAngle(up, (-state.hullYaw * Math.PI) / 180)\n body.quaternion.copy(qTilt).multiply(qYaw)\n turret.rotation.y = (-(state.yaw - state.hullYaw) * Math.PI) / 180\n gun.rotation.z = (state.pitch * Math.PI) / 180\n gun.position.x = GUN_PIVOT.x - state.recoil * 0.55\n }\n\n function setCharred(on) {\n if (state.charred === on) return\n state.charred = on\n if (on) applyCharred()\n else {\n bodyMat.color.copy(team.tint)\n accentMat.color.copy(team.accent).multiplyScalar(1.35)\n lamps.visible = true\n trackMat.color.copy(lin(quality === 'low' ? '#9a9a9a' : '#a0a0a0'))\n }\n }\n\n function setFlash(k) {\n bodyMat.emissive.setRGB(1.0 * k, 0.45 * k, 0.2 * k)\n }\n\n function setShadows(on) {\n for (const m of casters) {\n m.castShadow = on\n m.receiveShadow = on\n }\n }\n\n const tmpM = new Matrix4()\n const tmpQ = new Quaternion()\n const tmpP = new Vector3()\n const tmpS = new Vector3()\n const zAxis = new Vector3(0, 0, 1)\n /** Write 14 wheel matrices into an InstancedMesh starting at offset. */\n function writeWheels(mesh, offset) {\n body.updateWorldMatrix(true, false)\n for (let i = 0; i < WHEELS.length; i++) {\n const w = WHEELS[i]\n tmpQ.setFromAxisAngle(zAxis, -state.trackDist / w.r)\n tmpS.setScalar(w.r / WHEEL_R)\n tmpP.set(w.x, w.y, w.z)\n tmpM.compose(tmpP, tmpQ, tmpS)\n tmpM.premultiply(body.matrixWorld)\n mesh.setMatrixAt(offset + i, tmpM)\n }\n }\n\n return {\n id,\n team,\n root,\n body,\n turret,\n gun,\n turretMesh,\n turretAccent,\n state,\n trackTex,\n place,\n setCharred,\n setFlash,\n setShadows,\n writeWheels,\n setQuality(q) {\n quality = q\n makeMaterials(q)\n },\n scrollTracks(d) {\n state.trackDist += d\n trackTex.offset.x = -state.trackDist / TRACK_TILE\n },\n muzzleWorld(out) {\n gun.updateWorldMatrix(true, false)\n return out.copy(MUZZLE).applyMatrix4(gun.matrixWorld)\n },\n gunDirWorld(out) {\n gun.updateWorldMatrix(true, false)\n return out.set(1, 0, 0).transformDirection(gun.matrixWorld)\n },\n localToWorld(out, x, y, z) {\n body.updateWorldMatrix(true, false)\n return out.set(x, y, z).applyMatrix4(body.matrixWorld)\n },\n dispose() {\n bodyMat.dispose()\n trackMat.dispose()\n accentMat.dispose()\n trackTex.dispose()\n root.removeFromParent()\n },\n }\n}\n\nexport function createTankShared() {\n return {\n trackTex: trackTexture(),\n lampMat: new MeshBasicMaterial({ color: lin('#fff1c2').multiplyScalar(1.6) }),\n dispose() {\n this.trackTex.dispose()\n this.lampMat.dispose()\n },\n }\n}\n","// Tanks FX: pooled CPU-simulated particles (2 Points draw calls), projectiles with glow,\n// shockwave rings, instanced debris with terrain bounce, one shared flash light, aim preview.\n// Every GPU resource is created once; update() performs no allocations.\nimport {\n AdditiveBlending,\n BufferAttribute,\n BufferGeometry,\n Color,\n DoubleSide,\n DynamicDrawUsage,\n IcosahedronGeometry,\n InstancedMesh,\n Mesh,\n MeshBasicMaterial,\n MeshLambertMaterial,\n NormalBlending,\n Object3D,\n OctahedronGeometry,\n PlaneGeometry,\n PointLight,\n Points,\n ShaderMaterial,\n Sprite,\n SpriteMaterial,\n Vector3,\n} from 'three'\nimport { glowTexture, lin, ringTexture, smokeTexture } from './util.js'\n\nconst CAPS = { low: 250, medium: 520, high: 900 }\nconst STRIDE = 20\n// field offsets\nconst PX = 0, PY = 1, PZ = 2, VX = 3, VY = 4, VZ = 5, AGE = 6, LIFE = 7, S0 = 8, S1 = 9\nconst R0 = 10, G0 = 11, B0 = 12, R1 = 13, G1 = 14, B1 = 15, A0 = 16, DRAG = 17, GRAV = 18, HOT = 19\n\nconst MAX_PROJ = 8\nconst MAX_RINGS = 4\nconst MAX_DEBRIS = 56\nconst PREVIEW_MAX = 320\n\nconst COL = {\n white: lin('#fff6e0'),\n yellow: lin('#ffd36b'),\n orange: lin('#ff7a1a'),\n red: lin('#b3200e'),\n ember: lin('#ffb347'),\n smoke: lin('#5b5552'),\n smokeLight: lin('#9a918a'),\n smokeDark: lin('#2c2826'),\n dirt: lin('#6e5034'),\n dirtLight: lin('#a07a50'),\n spark: lin('#ffe2a8'),\n dust: lin('#c9ad85'),\n exhaust: lin('#3a3633'),\n}\n\nconst VERT = /* glsl */ `\nuniform float uScale;\nuniform float uMaxSize;\nattribute vec4 aColor;\nattribute float aSize;\nvarying vec4 vColor;\nvoid main() {\n vec4 mv = modelViewMatrix * vec4(position, 1.0);\n gl_Position = projectionMatrix * mv;\n gl_PointSize = aColor.a > 0.003 ? min(aSize * uScale / max(-mv.z, 0.5), uMaxSize) : 0.0;\n vColor = aColor;\n}\n`\nconst FRAG_ADD = /* glsl */ `\nuniform sampler2D uMap;\nvarying vec4 vColor;\nvoid main() {\n float a = texture2D(uMap, gl_PointCoord).a * vColor.a;\n gl_FragColor = vec4(vColor.rgb, a);\n #include <encodings_fragment>\n}\n`\nconst FRAG_ALPHA = /* glsl */ `\nuniform sampler2D uMap;\nvarying vec4 vColor;\nvoid main() {\n float a = texture2D(uMap, gl_PointCoord).a * vColor.a;\n if (a < 0.004) discard;\n gl_FragColor = vec4(vColor.rgb, a);\n #include <encodings_fragment>\n}\n`\n\nfunction createBatch(cap, additive, map, scaleUniform) {\n const data = new Float32Array(cap * STRIDE)\n const pos = new Float32Array(cap * 3)\n const color = new Float32Array(cap * 4)\n const size = new Float32Array(cap)\n const geo = new BufferGeometry()\n geo.setAttribute('position', new BufferAttribute(pos, 3).setUsage(DynamicDrawUsage))\n geo.setAttribute('aColor', new BufferAttribute(color, 4).setUsage(DynamicDrawUsage))\n geo.setAttribute('aSize', new BufferAttribute(size, 1).setUsage(DynamicDrawUsage))\n geo.setDrawRange(0, 0)\n const mat = new ShaderMaterial({\n uniforms: { uScale: scaleUniform, uMap: { value: map }, uMaxSize: { value: 512 } },\n vertexShader: VERT,\n fragmentShader: additive ? FRAG_ADD : FRAG_ALPHA,\n transparent: true,\n depthWrite: false,\n blending: additive ? AdditiveBlending : NormalBlending,\n premultipliedAlpha: false,\n })\n const points = new Points(geo, mat)\n points.frustumCulled = false\n points.renderOrder = additive ? 6 : 5\n let count = 0\n let cursor = 0\n let capacity = cap\n let wind = null\n\n const b = {\n points,\n get count() {\n return count\n },\n setCap(n) {\n capacity = Math.min(cap, n)\n if (count > capacity) count = capacity\n },\n setWind(w) {\n wind = w\n },\n spawn(x, y, z, vx, vy, vz, life, s0, s1, c0, c1, a0, drag, grav, hot = 0) {\n let i\n if (count < capacity) i = count++\n else {\n i = cursor\n cursor = (cursor + 1) % capacity\n }\n const o = i * STRIDE\n data[o + PX] = x; data[o + PY] = y; data[o + PZ] = z\n data[o + VX] = vx; data[o + VY] = vy; data[o + VZ] = vz\n data[o + AGE] = 0; data[o + LIFE] = life\n data[o + S0] = s0; data[o + S1] = s1\n data[o + R0] = c0.r; data[o + G0] = c0.g; data[o + B0] = c0.b\n data[o + R1] = c1.r; data[o + G1] = c1.g; data[o + B1] = c1.b\n data[o + A0] = a0; data[o + DRAG] = drag; data[o + GRAV] = grav; data[o + HOT] = hot\n },\n update(dt) {\n let i = 0\n const wx = wind ? wind.x : 0\n const wz = wind ? wind.z : 0\n while (i < count) {\n const o = i * STRIDE\n const age = data[o + AGE] + dt\n if (age >= data[o + LIFE]) {\n // swap-remove\n count--\n if (i !== count) data.copyWithin(o, count * STRIDE, count * STRIDE + STRIDE)\n continue\n }\n data[o + AGE] = age\n const dr = Math.exp(-data[o + DRAG] * dt)\n const g = data[o + GRAV]\n data[o + VX] = data[o + VX] * dr + (g > 0 ? wx * 0.35 * dt : 0)\n data[o + VY] = data[o + VY] * dr - g * dt\n data[o + VZ] = data[o + VZ] * dr + (g > 0 ? wz * 0.35 * dt : 0)\n data[o + PX] += data[o + VX] * dt\n data[o + PY] += data[o + VY] * dt\n data[o + PZ] += data[o + VZ] * dt\n const k = age / data[o + LIFE]\n const t = k < 0.6 ? k / 0.6 : 1\n const ct = t * t * (3 - 2 * t)\n const hot = 1 + data[o + HOT] * (1 - k) * (1 - k) * (1 - k)\n const p3 = i * 3\n pos[p3] = data[o + PX]; pos[p3 + 1] = data[o + PY]; pos[p3 + 2] = data[o + PZ]\n const p4 = i * 4\n color[p4] = (data[o + R0] + (data[o + R1] - data[o + R0]) * ct) * hot\n color[p4 + 1] = (data[o + G0] + (data[o + G1] - data[o + G0]) * ct) * hot\n color[p4 + 2] = (data[o + B0] + (data[o + B1] - data[o + B0]) * ct) * hot\n // alpha: quick fade in, fade out over the last 45%\n const fin = k < 0.06 ? k / 0.06 : 1\n const fout = k > 0.55 ? 1 - (k - 0.55) / 0.45 : 1\n color[p4 + 3] = data[o + A0] * fin * fout\n size[i] = data[o + S0] + (data[o + S1] - data[o + S0]) * Math.sqrt(k)\n i++\n }\n geo.setDrawRange(0, count)\n points.visible = count > 0\n if (count > 0) {\n geo.attributes.position.updateRange.count = count * 3\n geo.attributes.aColor.updateRange.count = count * 4\n geo.attributes.aSize.updateRange.count = count\n geo.attributes.position.needsUpdate = true\n geo.attributes.aColor.needsUpdate = true\n geo.attributes.aSize.needsUpdate = true\n }\n return count > 0\n },\n clear() {\n count = 0\n geo.setDrawRange(0, 0)\n points.visible = false\n },\n dispose() {\n geo.dispose()\n mat.dispose()\n },\n }\n return b\n}\n\nexport function createFx(scene, { quality = 'high', reducedMotion = false, heightAt }) {\n const texGlow = glowTexture(64)\n const texSmoke = smokeTexture(64)\n const texRing = ringTexture(128)\n const scaleU = { value: 600 }\n const capTotal = CAPS.high\n const add = createBatch(Math.round(capTotal * 0.55), true, texGlow, scaleU)\n const alpha = createBatch(Math.round(capTotal * 0.45), false, texSmoke, scaleU)\n scene.add(alpha.points, add.points)\n let qf = 1\n\n // ---- flash light (always present; intensity 0 idle → no shader recompiles)\n const light = new PointLight(lin('#ffb066'), 0, 60, 2)\n scene.add(light)\n let lightLevel = 0\n let lightDecay = 6\n\n // ---- projectiles\n const shellGeo = new OctahedronGeometry(0.28, 0)\n shellGeo.scale(2.2, 1, 1)\n const shellMat = new MeshBasicMaterial({ color: lin('#fff1cf').multiplyScalar(2) })\n const projs = []\n for (let i = 0; i < MAX_PROJ; i++) {\n const mesh = new Mesh(shellGeo, shellMat)\n mesh.visible = false\n const glowMat = new SpriteMaterial({\n map: texGlow,\n color: lin('#ff9440').multiplyScalar(1.2),\n blending: AdditiveBlending,\n depthWrite: false,\n transparent: true,\n })\n const glow = new Sprite(glowMat)\n glow.scale.setScalar(4)\n glow.visible = false\n glow.renderOrder = 7\n scene.add(mesh, glow)\n projs.push({ mesh, glow, active: false, px: 0, py: 0, pz: 0, has: false, acc: 0 })\n }\n\n // ---- muzzle flash sprite + generic flash sprites (pool of 3)\n const flashes = []\n for (let i = 0; i < 3; i++) {\n const m = new SpriteMaterial({\n map: texGlow,\n color: new Color(1, 0.8, 0.5),\n blending: AdditiveBlending,\n depthWrite: false,\n transparent: true,\n })\n const s = new Sprite(m)\n s.visible = false\n s.renderOrder = 8\n scene.add(s)\n flashes.push({ s, t: 0, dur: 0.2, size: 4, color: new Color() })\n }\n let flashCursor = 0\n\n // ---- shockwave rings\n const ringGeo = new PlaneGeometry(1, 1)\n ringGeo.rotateX(-Math.PI / 2)\n const rings = []\n for (let i = 0; i < MAX_RINGS; i++) {\n const mat = new MeshBasicMaterial({\n map: texRing,\n color: lin('#ffd9a0'),\n transparent: true,\n blending: AdditiveBlending,\n depthWrite: false,\n side: DoubleSide,\n fog: false,\n })\n const m = new Mesh(ringGeo, mat)\n m.visible = false\n m.renderOrder = 4\n scene.add(m)\n rings.push({ m, t: 0, dur: 0.6, r: 10 })\n }\n let ringCursor = 0\n\n // ---- debris\n const debrisGeo = new IcosahedronGeometry(0.32, 0)\n debrisGeo.computeVertexNormals()\n const debrisMat = new MeshLambertMaterial({ color: 0xffffff })\n const debris = new InstancedMesh(debrisGeo, debrisMat, MAX_DEBRIS)\n debris.frustumCulled = false\n debris.instanceMatrix.setUsage(DynamicDrawUsage)\n const dummy = new Object3D()\n dummy.scale.setScalar(0)\n dummy.updateMatrix()\n for (let i = 0; i < MAX_DEBRIS; i++) {\n debris.setMatrixAt(i, dummy.matrix)\n debris.setColorAt(i, COL.dirt)\n }\n debris.instanceColor.setUsage(DynamicDrawUsage)\n scene.add(debris)\n const bodies = []\n for (let i = 0; i < MAX_DEBRIS; i++) {\n bodies.push({ alive: false, p: new Vector3(), v: new Vector3(), r: new Vector3(), w: new Vector3(), life: 0, s: 1, rest: false, smoke: false, acc: 0 })\n }\n let debrisCursor = 0\n let debrisAlive = 0\n\n // ---- aim preview: glowing dots + end marker\n const pvPos = new Float32Array(PREVIEW_MAX * 3)\n const pvCol = new Float32Array(PREVIEW_MAX * 4)\n const pvSize = new Float32Array(PREVIEW_MAX)\n const pvMax = { value: 16 }\n const pvGeo = new BufferGeometry()\n pvGeo.setAttribute('position', new BufferAttribute(pvPos, 3).setUsage(DynamicDrawUsage))\n pvGeo.setAttribute('aColor', new BufferAttribute(pvCol, 4).setUsage(DynamicDrawUsage))\n pvGeo.setAttribute('aSize', new BufferAttribute(pvSize, 1).setUsage(DynamicDrawUsage))\n pvGeo.setDrawRange(0, 0)\n const pvMat = new ShaderMaterial({\n uniforms: { uScale: scaleU, uMap: { value: texGlow }, uMaxSize: pvMax },\n vertexShader: VERT,\n fragmentShader: FRAG_ADD,\n transparent: true,\n depthWrite: false,\n depthTest: false,\n blending: AdditiveBlending,\n })\n const preview = new Points(pvGeo, pvMat)\n preview.frustumCulled = false\n preview.visible = false\n preview.renderOrder = 9\n const markerMat = new MeshBasicMaterial({\n map: texRing,\n color: lin('#fff3c4').multiplyScalar(1.4),\n transparent: true,\n blending: AdditiveBlending,\n depthWrite: false,\n depthTest: false,\n side: DoubleSide,\n fog: false,\n })\n const marker = new Mesh(ringGeo, markerMat)\n marker.visible = false\n marker.renderOrder = 9\n scene.add(preview, marker)\n let pvCount = 0\n let pvSrc = null\n let pvTime = 0\n const pvColor = lin('#fff0c0')\n\n const tmp = new Vector3()\n\n function setQuality(q) {\n quality = q\n const cap = CAPS[q] || CAPS.high\n qf = cap / CAPS.high\n add.setCap(Math.round(cap * 0.55))\n alpha.setCap(Math.round(cap * 0.45))\n }\n setQuality(quality)\n\n const rnd = Math.random\n const rs = (a) => (rnd() * 2 - 1) * a\n const n = (base) => Math.max(1, Math.round(base * qf))\n\n function flash(x, y, z, size, color, dur) {\n const f = flashes[flashCursor]\n flashCursor = (flashCursor + 1) % flashes.length\n f.s.position.set(x, y, z)\n f.t = 0\n f.dur = dur\n f.size = size\n f.color.copy(color)\n f.s.material.color.copy(color)\n f.s.visible = true\n f.s.scale.setScalar(size)\n }\n\n function lightFlash(x, y, z, level, distance = 60, decay = 6) {\n light.position.set(x, y, z)\n light.distance = distance\n if (level >= lightLevel) {\n lightLevel = level\n lightDecay = decay\n }\n }\n\n function ring(x, y, z, r, dur = 0.6, color = null) {\n const g = rings[ringCursor]\n ringCursor = (ringCursor + 1) % rings.length\n g.m.position.set(x, y + 0.25, z)\n g.t = 0\n g.dur = dur\n g.r = r\n g.m.visible = true\n g.m.scale.setScalar(0.1)\n g.m.material.color.copy(color || COL.yellow)\n }\n\n function spawnDebris(x, y, z, count, speed, color, size = 1, smoke = false) {\n for (let i = 0; i < count; i++) {\n const b = bodies[debrisCursor]\n const idx = debrisCursor\n debrisCursor = (debrisCursor + 1) % MAX_DEBRIS\n b.alive = true\n b.rest = false\n b.p.set(x + rs(0.6), y + 0.4, z + rs(0.6))\n const a = rnd() * Math.PI * 2\n const h = speed * (0.35 + rnd() * 0.65)\n b.v.set(Math.cos(a) * h * 0.6, speed * (0.6 + rnd() * 0.7), Math.sin(a) * h * 0.6)\n b.r.set(rnd() * 6, rnd() * 6, rnd() * 6)\n b.w.set(rs(9), rs(9), rs(9))\n b.life = 2.6 + rnd() * 1.6\n b.s = size * (0.5 + rnd() * 0.9)\n b.smoke = smoke && rnd() < 0.5\n b.acc = 0\n debris.setColorAt(idx, color)\n }\n debrisAlive += count\n debris.instanceColor.needsUpdate = true\n }\n\n // ------------------------------------------------------------ public emitters\n function muzzle(p, d) {\n flash(p.x + d.x * 0.6, p.y + d.y * 0.6, p.z + d.z * 0.6, 4.5, COL.orange, 0.14)\n lightFlash(p.x, p.y + 0.5, p.z, 3.5, 40, 12)\n const c = n(26)\n for (let i = 0; i < c; i++) {\n const sp = 6 + rnd() * 14\n add.spawn(p.x, p.y, p.z, d.x * sp + rs(2), d.y * sp + rs(2), d.z * sp + rs(2), 0.12 + rnd() * 0.18, 0.9, 1.8, COL.white, COL.orange, 0.9, 5, 0, 2)\n }\n const s = n(14)\n for (let i = 0; i < s; i++) {\n const sp = 2 + rnd() * 6\n alpha.spawn(p.x, p.y, p.z, d.x * sp + rs(1.5), d.y * sp + rs(1) + 0.6, d.z * sp + rs(1.5), 1.2 + rnd() * 1.2, 1.0, 3.6, COL.smokeLight, COL.smoke, 0.45, 2.2, -0.4)\n }\n }\n\n function trail(x0, y0, z0, x1, y1, z1, big = false) {\n const len = Math.hypot(x1 - x0, y1 - y0, z1 - z0)\n const step = quality === 'low' ? 1.6 : 0.8\n const k = Math.min(24, Math.ceil(len / step))\n for (let i = 0; i < k; i++) {\n const t = (i + rnd()) / k\n const x = x0 + (x1 - x0) * t, y = y0 + (y1 - y0) * t, z = z0 + (z1 - z0) * t\n add.spawn(x, y, z, rs(0.3), rs(0.3), rs(0.3), 0.25 + rnd() * 0.2, big ? 1.1 : 0.8, 0.2, COL.yellow, COL.red, 0.8, 1, 0, 1)\n if (i % 2 === 0) alpha.spawn(x, y, z, rs(0.4), 0.3 + rnd() * 0.4, rs(0.4), 1.1 + rnd() * 0.9, 0.5, big ? 2.4 : 1.8, COL.smokeLight, COL.smoke, 0.32, 1.5, -0.25)\n }\n }\n\n function explosion(x, y, z, radius, kind) {\n const r = Math.max(2, radius || 6)\n const big = r >= 7\n const s = r / 6\n flash(x, y + 1.2 * s, z, 7 * s, COL.yellow, 0.22)\n lightFlash(x, y + 3, z, big ? 5 : 3.5, 30 + r * 5, 3.5)\n ring(x, y, z, r * 2.4, 0.55, COL.yellow)\n if (!reducedMotion || true) ring(x, y, z, r * 1.4, 0.9, COL.orange)\n // fireball\n const nf = n(70 * s)\n for (let i = 0; i < nf; i++) {\n const th = rnd() * Math.PI * 2\n const ph = Math.acos(rnd() * 0.9)\n const sp = (4 + rnd() * 9) * s\n const vx = Math.cos(th) * Math.sin(ph) * sp\n const vz = Math.sin(th) * Math.sin(ph) * sp\n const vy = Math.cos(ph) * sp * 0.9 + 2\n add.spawn(x + rs(0.6), y + 0.6, z + rs(0.6), vx, vy, vz, 0.45 + rnd() * 0.5, 1.8 * s, 3.8 * s, COL.yellow, COL.red, 0.55, 4.5, -2.5, 1.6)\n }\n // sparks\n const ns = n(46 * s)\n for (let i = 0; i < ns; i++) {\n const th = rnd() * Math.PI * 2\n const sp = (9 + rnd() * 16) * s\n add.spawn(x, y + 0.8, z, Math.cos(th) * sp * 0.7, (6 + rnd() * 14) * s, Math.sin(th) * sp * 0.7, 0.7 + rnd() * 0.9, 0.35, 0.15, COL.spark, COL.ember, 1, 0.8, 16, 1.5)\n }\n // smoke column\n const nk = n(40 * s)\n for (let i = 0; i < nk; i++) {\n const th = rnd() * Math.PI * 2\n const sp = (1 + rnd() * 4) * s\n alpha.spawn(x + rs(1.2 * s), y + 0.8 + rnd() * 2 * s, z + rs(1.2 * s), Math.cos(th) * sp, 2.5 + rnd() * 4, Math.sin(th) * sp, 2.0 + rnd() * 2.2, 2.4 * s, 6.5 * s, COL.smoke, COL.smokeLight, 0.62, 1.4, -0.6)\n }\n if (kind === 'terrain' || kind === 'obstacle') {\n // dirt burst\n const nd = n(48 * s)\n const dc = kind === 'obstacle' ? COL.smokeLight : COL.dirt\n for (let i = 0; i < nd; i++) {\n const th = rnd() * Math.PI * 2\n const sp = (2 + rnd() * 6) * s\n alpha.spawn(x, y + 0.3, z, Math.cos(th) * sp, (8 + rnd() * 12) * s, Math.sin(th) * sp, 0.9 + rnd() * 0.7, 1.0 * s, 2.2 * s, dc, COL.dirtLight, 0.95, 0.6, 18)\n }\n spawnDebris(x, y, z, Math.round((quality === 'low' ? 8 : 16) * s), 13 * s, kind === 'obstacle' ? lin('#8b8680') : COL.dirt, 1.1)\n } else if (kind === 'tank') {\n spawnDebris(x, y, z, quality === 'low' ? 6 : 12, 14, lin('#3a3633'), 0.9, true)\n }\n }\n\n function pop(x, y, z) {\n flash(x, y, z, 5, COL.yellow, 0.18)\n lightFlash(x, y, z, 2.5, 30, 10)\n const c = n(30)\n for (let i = 0; i < c; i++) {\n const th = rnd() * Math.PI * 2\n const ph = rnd() * Math.PI\n const sp = 5 + rnd() * 6\n add.spawn(x, y, z, Math.cos(th) * Math.sin(ph) * sp, Math.cos(ph) * sp, Math.sin(th) * Math.sin(ph) * sp, 0.3 + rnd() * 0.3, 0.6, 0.2, COL.spark, COL.orange, 1, 2, 4, 1)\n }\n for (let i = 0; i < n(8); i++) alpha.spawn(x, y, z, rs(1), rs(1), rs(1), 1 + rnd(), 1, 3, COL.smokeLight, COL.smoke, 0.4, 1, -0.3)\n }\n\n function outPuff(x, y, z) {\n for (let i = 0; i < n(10); i++) alpha.spawn(x, y, z, rs(1.5), rs(1), rs(1.5), 0.8 + rnd(), 1, 3, COL.smokeLight, COL.smoke, 0.35, 1, 0)\n }\n\n function hitSparks(x, y, z) {\n flash(x, y, z, 7, COL.white, 0.18)\n for (let i = 0; i < n(40); i++) {\n const th = rnd() * Math.PI * 2\n const sp = 10 + rnd() * 14\n add.spawn(x, y, z, Math.cos(th) * sp, 4 + rnd() * 12, Math.sin(th) * sp, 0.5 + rnd() * 0.5, 0.35, 0.12, COL.white, COL.ember, 1, 1.2, 18, 2)\n }\n }\n\n function bigExplosion(x, y, z) {\n explosion(x, y + 0.8, z, 10, 'tank')\n flash(x, y + 3, z, 15, COL.orange, 0.4)\n lightFlash(x, y + 4, z, 7, 80, 2.2)\n ring(x, y, z, 32, 1.0, COL.orange)\n spawnDebris(x, y + 1, z, quality === 'low' ? 10 : 20, 18, lin('#2f2b29'), 1.3, true)\n for (let i = 0; i < n(60); i++) {\n const th = rnd() * Math.PI * 2\n const sp = 2 + rnd() * 5\n alpha.spawn(x + rs(2), y + 2 + rnd() * 4, z + rs(2), Math.cos(th) * sp, 4 + rnd() * 6, Math.sin(th) * sp, 3 + rnd() * 2.5, 3, 9, COL.smokeDark, COL.smoke, 0.7, 1, -0.7)\n }\n }\n\n // Persistent damage smoke / fire from a world point (called every frame with dt).\n function emitDamage(x, y, z, dt, level, accObj) {\n accObj.smokeAcc += dt * (level >= 2 ? 16 : 7) * (quality === 'low' ? 0.5 : 1)\n while (accObj.smokeAcc >= 1) {\n accObj.smokeAcc -= 1\n const dark = level >= 2\n alpha.spawn(x + rs(0.5), y, z + rs(0.5), rs(0.4), 2.2 + rnd() * 1.6, rs(0.4), 2.6 + rnd() * 1.8, 1.0, dark ? 6 : 4, dark ? COL.smokeDark : COL.smoke, COL.smokeLight, dark ? 0.55 : 0.36, 0.5, -0.35)\n if (dark) {\n add.spawn(x + rs(0.6), y - 0.2, z + rs(0.6), rs(0.6), 2 + rnd() * 2, rs(0.6), 0.45 + rnd() * 0.35, 1.6, 0.7, COL.yellow, COL.red, 0.8, 1.5, -1, 1.5)\n }\n }\n }\n\n function exhaust(x, y, z) {\n alpha.spawn(x, y, z, rs(0.4), 0.8 + rnd() * 0.6, rs(0.4), 0.9 + rnd() * 0.5, 0.4, 1.4, COL.exhaust, COL.smoke, 0.4, 1.5, -0.2)\n }\n\n function dust(x, y, z, strength = 1) {\n alpha.spawn(x + rs(0.4), y + 0.1, z + rs(0.4), rs(1.2), 0.6 + rnd() * 0.9, rs(1.2), 1.0 + rnd() * 0.8, 0.8, 2.8 * strength, COL.dust, COL.dirtLight, 0.42, 1.8, 0.2)\n }\n\n function firework(x, y, z, color) {\n flash(x, y, z, 6, color, 0.3)\n const c = n(70)\n for (let i = 0; i < c; i++) {\n const th = rnd() * Math.PI * 2\n const ph = Math.acos(rnd() * 2 - 1)\n const sp = 7 + rnd() * 2\n add.spawn(x, y, z, Math.cos(th) * Math.sin(ph) * sp, Math.cos(ph) * sp, Math.sin(th) * Math.sin(ph) * sp, 1.1 + rnd() * 0.6, 1.1, 0.35, COL.white, color, 1, 1.6, 3.5, 1.2)\n }\n }\n\n // ------------------------------------------------------------ projectiles\n function projShow(i, x, y, z, big) {\n const p = projs[i]\n p.active = true\n p.has = false\n p.mesh.visible = true\n p.glow.visible = true\n p.glow.scale.setScalar(big ? 3.6 : 2.6)\n p.mesh.scale.setScalar(big ? 1.3 : 0.9)\n projMove(i, x, y, z)\n }\n function projMove(i, x, y, z) {\n const p = projs[i]\n if (p.has) {\n tmp.set(x, y, z)\n if (Math.abs(x - p.px) + Math.abs(y - p.py) + Math.abs(z - p.pz) > 1e-4) {\n p.mesh.lookAt(tmp)\n p.mesh.rotateY(-Math.PI / 2)\n trail(p.px, p.py, p.pz, x, y, z, p.mesh.scale.x > 1)\n }\n }\n p.mesh.position.set(x, y, z)\n p.glow.position.set(x, y, z)\n p.px = x\n p.py = y\n p.pz = z\n p.has = true\n }\n function projHide(i) {\n const p = projs[i]\n p.active = false\n p.mesh.visible = false\n p.glow.visible = false\n }\n\n // ------------------------------------------------------------ preview\n function setPreview(points) {\n pvSrc = points && points.length >= 6 ? points : null\n if (!pvSrc) {\n preview.visible = false\n marker.visible = false\n pvCount = 0\n return\n }\n // resample by arc length every ~1.6 m\n const step = 1.6\n let travelled = 0\n let next = step\n pvPos[0] = pvSrc[0]; pvPos[1] = pvSrc[1]; pvPos[2] = pvSrc[2]\n let k = 1\n for (let i = 3; i + 2 < pvSrc.length && k < PREVIEW_MAX; i += 3) {\n const x0 = pvSrc[i - 3], y0 = pvSrc[i - 2], z0 = pvSrc[i - 1]\n const x1 = pvSrc[i], y1 = pvSrc[i + 1], z1 = pvSrc[i + 2]\n const L = Math.hypot(x1 - x0, y1 - y0, z1 - z0)\n while (L > 0 && next <= travelled + L && k < PREVIEW_MAX) {\n const f = (next - travelled) / L\n pvPos[k * 3] = x0 + (x1 - x0) * f\n pvPos[k * 3 + 1] = y0 + (y1 - y0) * f\n pvPos[k * 3 + 2] = z0 + (z1 - z0) * f\n k++\n next += step\n }\n travelled += L\n }\n pvCount = k\n const ex = pvSrc[pvSrc.length - 3]\n const ey = pvSrc[pvSrc.length - 2]\n const ez = pvSrc[pvSrc.length - 1]\n marker.position.set(ex, ey + 0.3, ez)\n marker.scale.setScalar(5)\n marker.visible = true\n preview.visible = true\n writePreview()\n }\n function writePreview() {\n for (let i = 0; i < pvCount; i++) {\n const f = i / Math.max(1, pvCount - 1)\n const wave = 0.55 + 0.45 * Math.cos((i * 0.55 - pvTime * 7))\n pvCol[i * 4] = pvColor.r * (1.4 - f * 0.3)\n pvCol[i * 4 + 1] = pvColor.g * (1.3 - f * 0.4)\n pvCol[i * 4 + 2] = pvColor.b * (1.1 - f * 0.5)\n pvCol[i * 4 + 3] = (0.35 + 0.65 * wave) * (1 - f * 0.45)\n pvSize[i] = 0.55 + 0.25 * wave\n }\n pvGeo.setDrawRange(0, pvCount)\n pvGeo.attributes.position.needsUpdate = true\n pvGeo.attributes.aColor.needsUpdate = true\n pvGeo.attributes.aSize.needsUpdate = true\n }\n\n // ------------------------------------------------------------ update\n function update(dt, camera, renderer, animatePreview) {\n // point scale: pixels per meter at distance 1\n scaleU.value = renderer.getDrawingBufferSize(tmp).y * 0.5 * camera.projectionMatrix.elements[5]\n pvMax.value = 11 * renderer.getPixelRatio()\n let busy = false\n if (add.update(dt)) busy = true\n if (alpha.update(dt)) busy = true\n\n if (lightLevel > 0.01) {\n lightLevel *= Math.exp(-lightDecay * dt)\n light.intensity = lightLevel\n busy = true\n } else if (light.intensity !== 0) {\n lightLevel = 0\n light.intensity = 0\n }\n\n for (const f of flashes) {\n if (!f.s.visible) continue\n f.t += dt\n const k = f.t / f.dur\n if (k >= 1) {\n f.s.visible = false\n continue\n }\n busy = true\n f.s.scale.setScalar(f.size * (0.6 + 0.6 * k))\n f.s.material.opacity = 1 - k * k\n }\n\n for (const g of rings) {\n if (!g.m.visible) continue\n g.t += dt\n const k = g.t / g.dur\n if (k >= 1) {\n g.m.visible = false\n continue\n }\n busy = true\n const e = 1 - (1 - k) * (1 - k) * (1 - k)\n g.m.scale.setScalar(Math.max(0.1, g.r * e))\n g.m.material.opacity = (1 - k) * 0.9\n }\n\n for (const p of projs) if (p.active) busy = true\n\n // debris physics with terrain bounce\n if (debrisAlive > 0) {\n debrisAlive = 0\n for (let i = 0; i < MAX_DEBRIS; i++) {\n const b = bodies[i]\n if (!b.alive) continue\n b.life -= dt\n if (b.life <= 0) {\n b.alive = false\n dummy.scale.setScalar(0)\n dummy.updateMatrix()\n debris.setMatrixAt(i, dummy.matrix)\n continue\n }\n debrisAlive++\n if (!b.rest) {\n b.v.y -= 22 * dt\n b.p.addScaledVector(b.v, dt)\n b.r.addScaledVector(b.w, dt)\n const gy = heightAt(b.p.x, b.p.z) + 0.15 * b.s\n if (b.p.y < gy) {\n b.p.y = gy\n if (b.v.y < -2) {\n b.v.y *= -0.32\n b.v.x *= 0.55\n b.v.z *= 0.55\n b.w.multiplyScalar(0.6)\n } else {\n b.rest = true\n }\n }\n if (b.smoke) {\n b.acc += dt * 22\n while (b.acc >= 1) {\n b.acc -= 1\n alpha.spawn(b.p.x, b.p.y, b.p.z, 0, 0.4, 0, 0.7, 0.35, 1.4, COL.smoke, COL.smokeLight, 0.4, 1, -0.2)\n }\n }\n }\n const fade = Math.min(1, b.life / 0.5)\n dummy.position.copy(b.p)\n dummy.rotation.set(b.r.x, b.r.y, b.r.z)\n dummy.scale.setScalar(b.s * fade)\n dummy.updateMatrix()\n debris.setMatrixAt(i, dummy.matrix)\n }\n debris.instanceMatrix.needsUpdate = true\n if (debrisAlive > 0) busy = true\n }\n\n if (pvCount > 0 && animatePreview) {\n pvTime += dt\n writePreview()\n marker.material.opacity = 0.7 + 0.3 * Math.sin(pvTime * 5)\n marker.rotation.y += dt * 0.8\n }\n return busy\n }\n\n function clear() {\n add.clear()\n alpha.clear()\n for (let i = 0; i < MAX_PROJ; i++) projHide(i)\n for (const f of flashes) f.s.visible = false\n for (const g of rings) g.m.visible = false\n for (const b of bodies) b.alive = false\n dummy.scale.setScalar(0)\n dummy.updateMatrix()\n for (let i = 0; i < MAX_DEBRIS; i++) debris.setMatrixAt(i, dummy.matrix)\n debris.instanceMatrix.needsUpdate = true\n lightLevel = 0\n light.intensity = 0\n }\n\n return {\n muzzle,\n trail,\n explosion,\n bigExplosion,\n pop,\n outPuff,\n hitSparks,\n emitDamage,\n exhaust,\n dust,\n firework,\n flash,\n lightFlash,\n ring,\n projShow,\n projMove,\n projHide,\n setPreview,\n update,\n clear,\n setQuality,\n setWind(w) {\n alpha.setWind(w)\n },\n get particleCount() {\n return add.count + alpha.count\n },\n get hasPreview() {\n return pvCount > 0\n },\n dispose() {\n add.dispose()\n alpha.dispose()\n shellGeo.dispose()\n shellMat.dispose()\n for (const p of projs) p.glow.material.dispose()\n for (const f of flashes) f.s.material.dispose()\n ringGeo.dispose()\n for (const g of rings) g.m.material.dispose()\n debris.dispose()\n debrisGeo.dispose()\n debrisMat.dispose()\n pvGeo.dispose()\n pvMat.dispose()\n markerMat.dispose()\n texGlow.dispose()\n texSmoke.dispose()\n texRing.dispose()\n light.dispose && light.dispose()\n },\n }\n}\n","// Tanques de guerra 3D — three.js scene (three >=0.134 <0.138). Framework-agnostic.\n//\n// createTankScene(container, { quality, reducedMotion, onEvent }) → {\n// setWorld, setAim, setPreview, playTurn, setCameraMode, setQuality, celebrate,\n// resize, getStats, dispose\n// }\n// World units are meters: map size×size, x right, z depth, y up, terrain origin at (0,0).\n// Renders on demand: the rAF loop stops when nothing animates.\nimport {\n ACESFilmicToneMapping,\n Clock,\n DirectionalLight,\n DynamicDrawUsage,\n Fog,\n Group,\n HemisphereLight,\n InstancedMesh,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n MeshLambertMaterial,\n MeshStandardMaterial,\n PCFSoftShadowMap,\n PerspectiveCamera,\n PlaneGeometry,\n Scene,\n sRGBEncoding,\n Vector3,\n WebGLRenderer,\n} from 'three'\nimport { createTerrain, createSky, createHills, SKY } from './terrain.js'\nimport { createDecor } from './decor.js'\nimport { createTank, createTankGeometries, createTankShared, WHEELS } from './tank.js'\nimport { createFx } from './fx.js'\nimport { blobTexture, clamp, dampK, DEG, lin, ringTexture, wrapPi } from './util.js'\n\nconst MAX_DT = 1 / 15\nconst MAX_TANKS = 4\nconst SAMPLE_DT = 0.04 // 2 ticks @ 50 Hz\nconst PIXEL_RATIO = { low: 1.25, medium: 1.5, high: 1.75 }\nconst SHADOW_SIZE = 2048\nconst SUN_DIR = new Vector3(0.62, 0.42, 0.66).normalize()\n\nexport function detectQuality() {\n if (typeof window === 'undefined') return 'low'\n const coarse = !!(window.matchMedia && window.matchMedia('(pointer: coarse)').matches)\n const small = Math.min(window.innerWidth || 0, window.innerHeight || 0) < 640\n const cores = (typeof navigator !== 'undefined' && navigator.hardwareConcurrency) || 8\n if (coarse || small || cores <= 4) return 'low'\n return cores >= 8 ? 'high' : 'medium'\n}\n\nfunction pixelRatioFor(q) {\n const d = (typeof window !== 'undefined' && window.devicePixelRatio) || 1\n return Math.min(d, PIXEL_RATIO[q] || 1.5)\n}\n\nconst normQ = (q) => (q === 'low' || q === 'medium' || q === 'high' ? q : null)\n\nexport function createTankScene(container, { quality = 'auto', reducedMotion = false, onEvent } = {}) {\n if (!container) throw new Error('createTankScene: container element required')\n const emit = (e) => {\n if (typeof onEvent === 'function') {\n try {\n onEvent(e)\n } catch (err) {\n // listener errors must never break the render loop\n if (typeof console !== 'undefined') console.error(err)\n }\n }\n }\n\n let autoQuality = !normQ(quality)\n let currentQuality = normQ(quality) || detectQuality()\n let disposed = false\n\n // ------------------------------------------------------------------ renderer\n const renderer = new WebGLRenderer({\n antialias: !(currentQuality === 'low' && ((typeof window !== 'undefined' && window.devicePixelRatio) || 1) >= 2),\n alpha: false,\n stencil: false,\n powerPreference: 'high-performance',\n })\n renderer.outputEncoding = sRGBEncoding\n renderer.toneMapping = ACESFilmicToneMapping\n renderer.toneMappingExposure = 1.05\n renderer.shadowMap.enabled = true\n renderer.shadowMap.type = PCFSoftShadowMap\n renderer.shadowMap.autoUpdate = false\n renderer.setPixelRatio(pixelRatioFor(currentQuality))\n renderer.setClearColor(SKY.horizon, 1)\n const canvas = renderer.domElement\n canvas.style.display = 'block'\n canvas.style.width = '100%'\n canvas.style.height = '100%'\n canvas.style.outline = 'none'\n container.appendChild(canvas)\n\n let width = Math.max(1, container.clientWidth)\n let height = Math.max(1, container.clientHeight)\n renderer.setSize(width, height, false)\n\n // ------------------------------------------------------------------ scene\n const scene = new Scene()\n scene.fog = new Fog(SKY.fog.clone(), 200, 700)\n const camera = new PerspectiveCamera(45, width / height, 0.5, 1400)\n const world = new Group()\n scene.add(world)\n\n const hemi = new HemisphereLight(lin('#ffd2b0'), lin('#33402f'), 0.6)\n const sun = new DirectionalLight(lin('#ffbe7a'), 1.9)\n sun.shadow.mapSize.set(SHADOW_SIZE, SHADOW_SIZE)\n sun.shadow.bias = -0.0006\n sun.shadow.normalBias = 0.04\n const sc = sun.shadow.camera\n sc.left = -120\n sc.right = 120\n sc.top = 120\n sc.bottom = -120\n sc.near = 20\n sc.far = 520\n sc.updateProjectionMatrix()\n scene.add(hemi, sun, sun.target)\n\n const sky = createSky(SUN_DIR)\n scene.add(sky.mesh)\n const hills = createHills(new Vector3(80, 0, 80), SUN_DIR)\n scene.add(hills.mesh)\n\n const terrain = createTerrain()\n world.add(terrain.mesh)\n const decor = createDecor()\n const fx = createFx(scene, { quality: currentQuality, reducedMotion, heightAt: terrain.heightAt })\n\n const tankGeos = createTankGeometries()\n const tankShared = createTankShared()\n const tanks = new Map() // id → tank\n const tankOrder = []\n\n // wheels for all tanks: one InstancedMesh\n let wheels = null\n function makeWheelMaterial() {\n return currentQuality === 'low'\n ? new MeshLambertMaterial({ vertexColors: true })\n : new MeshStandardMaterial({ vertexColors: true, roughness: 0.7, metalness: 0.25 })\n }\n function makeWheels() {\n tankShared.wheelMat = makeWheelMaterial()\n wheels = new InstancedMesh(tankGeos.wheel, tankShared.wheelMat, MAX_TANKS * WHEELS.length)\n wheels.instanceMatrix.setUsage(DynamicDrawUsage)\n wheels.frustumCulled = false\n wheels.count = 0\n world.add(wheels)\n }\n makeWheels()\n\n // blob shadows (medium/low)\n const blobTex = blobTexture(64)\n const blobGeo = new PlaneGeometry(1, 1)\n blobGeo.rotateX(-Math.PI / 2)\n const blobMat = new MeshBasicMaterial({\n map: blobTex,\n transparent: true,\n depthWrite: false,\n polygonOffset: true,\n polygonOffsetFactor: -2,\n polygonOffsetUnits: -2,\n })\n const blobs = new InstancedMesh(blobGeo, blobMat, MAX_TANKS)\n blobs.frustumCulled = false\n blobs.count = 0\n blobs.renderOrder = 2\n world.add(blobs)\n\n // active tank ring\n const activeTex = ringTexture(128)\n const activeMat = new MeshBasicMaterial({\n map: activeTex,\n transparent: true,\n depthWrite: false,\n opacity: 0.85,\n polygonOffset: true,\n polygonOffsetFactor: -3,\n polygonOffsetUnits: -3,\n })\n const activeRing = new Mesh(blobGeo, activeMat)\n activeRing.visible = false\n activeRing.renderOrder = 3\n world.add(activeRing)\n\n // ------------------------------------------------------------------ state\n let lastWorld = null\n let activeId = null\n let wind = { x: 0, z: 0 }\n let mapSize = 160\n let hasWorld = false\n let shadowDirty = true\n let wheelsDirty = true\n let aimDirty = false\n let wakeTime = 0 // keep rendering until elapsed > wakeTime\n let elapsed = 0\n let timeScale = 1\n let realDt = 0\n const turnQueue = []\n let currentTurn = null // { turn, gen, resolve, started, deadline }\n let celebrateState = null\n\n const mapCenter = new Vector3(80, 0, 80)\n const v1 = new Vector3()\n const v2 = new Vector3()\n const v3 = new Vector3()\n const mtx = new Matrix4()\n const scl = new Vector3()\n\n // ------------------------------------------------------------------ camera rig\n const cam = {\n mode: 'overview',\n userMode: 'overview',\n pos: new Vector3(80, 120, 260),\n target: new Vector3(80, 0, 80),\n dPos: new Vector3(),\n dTarget: new Vector3(),\n focus: new Vector3(),\n vel: new Vector3(1, 0, 0),\n tankId: null,\n orbit: 0,\n orbitSpeed: 0,\n radius: 25,\n lift: 10,\n rate: 2.5,\n shake: 0,\n snap: true,\n moving: true,\n }\n let portrait = false\n\n function updateFov() {\n const aspect = width / height\n portrait = aspect < 0.85\n camera.fov = portrait ? 62 : aspect < 1.25 ? 52 : 45\n camera.aspect = aspect\n camera.updateProjectionMatrix()\n }\n updateFov()\n\n function setCam(mode, opts = {}) {\n cam.mode = mode\n if (opts.tankId !== undefined) cam.tankId = opts.tankId\n if (opts.focus) cam.focus.copy(opts.focus)\n if (opts.orbitFromCurrent) {\n cam.orbit = Math.atan2(cam.pos.z - cam.focus.z, cam.pos.x - cam.focus.x)\n }\n if (reducedMotion || opts.cut) cam.snap = true\n cam.moving = true\n }\n\n function frameOverview() {\n let n = 0\n v1.set(0, 0, 0)\n let ax = 0, az = 0, bx = 0, bz = 0\n for (const id of tankOrder) {\n const t = tanks.get(id)\n if (!t) continue\n const s = t.state\n if (n === 0) { ax = s.x; az = s.z } else { bx = s.x; bz = s.z }\n v1.x += s.x\n v1.y += s.y\n v1.z += s.z\n n++\n }\n if (n === 0) {\n v1.copy(mapCenter)\n v1.y = terrain.ready ? terrain.heightAt(mapCenter.x, mapCenter.z) : 0\n bx = ax + 1\n bz = az\n } else v1.multiplyScalar(1 / n)\n if (n < 2) {\n bx = ax + 1\n bz = az\n }\n const dx = bx - ax\n const dz = bz - az\n const span = n >= 2 ? Math.hypot(dx, dz) : 30\n const fovV = (camera.fov * DEG) / 2\n if (portrait && n >= 2) {\n // tall screens: look along the line between tanks, active tank nearest\n let ux = dx / span, uz = dz / span\n let nx = ax, ny = 0, nz = az\n const act = activeId != null ? tanks.get(activeId) : null\n if (act && act.state.x === bx && act.state.z === bz) {\n ux = -ux\n uz = -uz\n nx = bx\n nz = bz\n }\n ny = terrain.ready ? terrain.heightAt(nx, nz) : v1.y\n // slight sideways offset so the tanks don't line up with the view axis\n const sx = -uz, sz = ux\n const B = clamp(span * 0.3, 16, 70)\n const H = span * 0.3 + 8\n const S = span * 0.1\n cam.dPos.set(nx - ux * B + sx * S, ny + H, nz - uz * B + sz * S)\n cam.dTarget.set(nx + ux * span * 0.42, ny + 1, nz + uz * span * 0.42)\n cam.rate = 2.2\n return\n }\n let px = -dz, pz = dx\n const pl = Math.hypot(px, pz) || 1\n px /= pl\n pz /= pl\n if (pz < 0) { px = -px; pz = -pz }\n const el = portrait ? 0.78 : 0.52\n const halfH = Math.atan(Math.tan(fovV) * camera.aspect)\n const need = span / 2 + 14\n let d = need / Math.tan(halfH)\n d = Math.max(d, 26 / Math.tan(fovV))\n d = clamp(d * 1.05, 38, 260)\n cam.dTarget.set(v1.x, v1.y + 2, v1.z)\n cam.dPos.set(\n v1.x + px * Math.cos(el) * d,\n v1.y + Math.sin(el) * d,\n v1.z + pz * Math.cos(el) * d,\n )\n cam.rate = 2.2\n }\n\n function frameBehind(t, useHull) {\n const s = t.state\n const yaw = (useHull ? s.hullYaw : s.yaw) * DEG\n const dx = Math.cos(yaw)\n const dz = Math.sin(yaw)\n const rx = -dz\n const rz = dx\n const back = portrait ? 24 : 20\n const side = portrait ? 2 : 4.5\n cam.dPos.set(s.x - dx * back + rx * side, s.y + (portrait ? 10 : 8.5), s.z - dz * back + rz * side)\n const pitchLift = clamp(Math.tan(clamp(s.pitch, 0, 70) * DEG) * 4, 0, 10)\n cam.dTarget.set(s.x + dx * 40, s.y + 1 + pitchLift, s.z + dz * 40)\n cam.rate = useHull ? 3 : 4.5\n }\n\n function frameFollow() {\n const vx = cam.vel.x, vz = cam.vel.z\n const hl = Math.hypot(vx, vz) || 1\n const hx = vx / hl, hz = vz / hl\n cam.dPos.set(cam.focus.x - hx * 18 - hz * 4, cam.focus.y + 6, cam.focus.z - hz * 18 + hx * 4)\n cam.dTarget.set(cam.focus.x + cam.vel.x * 0.35, cam.focus.y + cam.vel.y * 0.2, cam.focus.z + cam.vel.z * 0.35)\n cam.rate = 4.5\n }\n\n function frameOrbit(dt) {\n cam.orbit += cam.orbitSpeed * dt * (reducedMotion ? 0 : 1)\n cam.dPos.set(\n cam.focus.x + Math.cos(cam.orbit) * cam.radius,\n cam.focus.y + cam.lift,\n cam.focus.z + Math.sin(cam.orbit) * cam.radius,\n )\n cam.dTarget.set(cam.focus.x, cam.focus.y + (cam.mode === 'celebrate' ? 4 : 1.5), cam.focus.z)\n }\n\n function updateCamera(dt) {\n const t = cam.tankId != null ? tanks.get(cam.tankId) : null\n switch (cam.mode) {\n case 'aim':\n if (t) frameBehind(t, false)\n else frameOverview()\n break\n case 'drive':\n if (t) frameBehind(t, true)\n else frameOverview()\n break\n case 'follow':\n frameFollow()\n break\n case 'impact':\n cam.radius = 30\n cam.lift = 12\n cam.orbitSpeed = 0.22\n cam.rate = 2.4\n frameOrbit(dt)\n break\n case 'killcam':\n if (t) cam.focus.set(t.state.x, t.state.y, t.state.z)\n cam.radius = 17\n cam.lift = 6.5\n cam.orbitSpeed = 0.32\n cam.rate = 2\n frameOrbit(dt)\n break\n case 'celebrate':\n if (t) cam.focus.set(t.state.x, t.state.y, t.state.z)\n cam.radius = portrait ? 24 : 19\n cam.lift = 4.5\n cam.orbitSpeed = 0.38\n cam.rate = 1.8\n frameOrbit(dt)\n break\n default:\n frameOverview()\n }\n // keep the camera above terrain\n if (terrain.ready) {\n const g = terrain.heightAt(cam.dPos.x, cam.dPos.z) + 3\n if (cam.dPos.y < g) cam.dPos.y = g\n }\n let moving\n if (cam.snap) {\n cam.pos.copy(cam.dPos)\n cam.target.copy(cam.dTarget)\n cam.snap = false\n moving = true\n } else {\n const k = dampK(cam.rate, dt)\n cam.pos.lerp(cam.dPos, k)\n cam.target.lerp(cam.dTarget, k)\n moving = cam.pos.distanceToSquared(cam.dPos) > 0.0025 || cam.target.distanceToSquared(cam.dTarget) > 0.0025\n }\n if (terrain.ready) {\n const g = terrain.heightAt(cam.pos.x, cam.pos.z) + 2\n if (cam.pos.y < g) cam.pos.y = g\n }\n camera.position.copy(cam.pos)\n if (cam.shake > 0.001 && !reducedMotion) {\n const s = cam.shake\n camera.position.x += (Math.random() - 0.5) * s\n camera.position.y += (Math.random() - 0.5) * s\n camera.position.z += (Math.random() - 0.5) * s\n cam.shake *= Math.exp(-6 * dt)\n moving = true\n } else cam.shake = 0\n camera.lookAt(cam.target)\n // fog follows framing distance\n const dist = cam.pos.distanceTo(cam.target)\n scene.fog.near = dist * 1.1 + 20\n scene.fog.far = dist * 3.2 + 260\n cam.moving = moving || cam.mode === 'impact' || cam.mode === 'killcam' || (cam.mode === 'celebrate' && !!celebrateState)\n return cam.moving\n }\n\n // ------------------------------------------------------------------ tanks\n function tankColorFor(wt, index) {\n if (wt.color === 'red' || wt.color === 'green') return wt.color\n return index === 0 ? 'green' : 'red'\n }\n\n function ensureTank(wt, index) {\n let t = tanks.get(wt.id)\n if (t) return t\n t = createTank(tankGeos, tankShared, { id: wt.id, color: tankColorFor(wt, index), quality: currentQuality })\n t.setShadows(currentQuality === 'high')\n world.add(t.root)\n tanks.set(wt.id, t)\n tankOrder.push(wt.id)\n return t\n }\n\n function removeTank(id) {\n const t = tanks.get(id)\n if (!t) return\n if (t.state.blown) t.turret.removeFromParent()\n t.dispose()\n tanks.delete(id)\n const i = tankOrder.indexOf(id)\n if (i >= 0) tankOrder.splice(i, 1)\n }\n\n function restoreTurret(t) {\n if (!t.state.blown) return\n t.state.blown = null\n t.body.add(t.turret)\n t.turret.position.set(-0.35, 1.6, 0)\n t.turret.rotation.set(0, 0, 0)\n t.turret.scale.setScalar(1)\n }\n\n // Wreck turret resting beside the hull (used when a dead tank appears without animation).\n function placeWreckTurret(t) {\n const s = t.state\n if (s.blown) return\n t.place(terrain)\n world.attach(t.turret)\n const a = (s.hullYaw + 120) * DEG\n const x = s.x + Math.cos(a) * 4.5\n const z = s.z + Math.sin(a) * 4.5\n t.turret.position.set(x, terrain.heightAt(x, z) + 0.2, z)\n t.turret.rotation.set(0.5, a, 2.6)\n s.blown = { p: t.turret.position.clone(), v: new Vector3(), w: new Vector3(), landed: true }\n }\n\n function blowTurret(t) {\n const s = t.state\n if (s.blown) return\n world.attach(t.turret)\n const a = Math.random() * Math.PI * 2\n s.blown = {\n p: t.turret.position.clone(),\n v: new Vector3(Math.cos(a) * 3.5, 15, Math.sin(a) * 3.5),\n w: new Vector3((Math.random() - 0.5) * 6, (Math.random() - 0.5) * 5, (Math.random() - 0.5) * 6),\n landed: false,\n }\n }\n\n function updateBlown(t, dt) {\n const b = t.state.blown\n if (!b || b.landed) return false\n b.v.y -= 20 * dt\n b.p.addScaledVector(b.v, dt)\n t.turret.rotation.x += b.w.x * dt\n t.turret.rotation.y += b.w.y * dt\n t.turret.rotation.z += b.w.z * dt\n const g = terrain.heightAt(b.p.x, b.p.z) + 0.25\n if (b.p.y < g && b.v.y < 0) {\n b.p.y = g\n if (b.v.y < -5) {\n b.v.y *= -0.25\n b.v.x *= 0.5\n b.v.z *= 0.5\n b.w.multiplyScalar(0.4)\n fx.dust(b.p.x, g, b.p.z, 2)\n fx.dust(b.p.x, g, b.p.z, 2)\n } else {\n b.landed = true\n // settle roughly upside-down / on its side\n t.turret.rotation.x = Math.round(t.turret.rotation.x / Math.PI) * Math.PI + 0.25\n t.turret.rotation.z = Math.round(t.turret.rotation.z / Math.PI) * Math.PI + 0.2\n }\n }\n t.turret.position.copy(b.p)\n shadowDirty = true\n return true\n }\n\n function syncTankStatics() {\n // wheels + blobs + active ring\n let k = 0\n let bi = 0\n for (const id of tankOrder) {\n const t = tanks.get(id)\n t.writeWheels(wheels, k)\n k += WHEELS.length\n const s = t.state\n v1.set(s.x, s.y + 0.08, s.z)\n scl.set(7.2, 1, 5.2)\n mtx.compose(v1, t.body.quaternion, scl)\n blobs.setMatrixAt(bi++, mtx)\n }\n wheels.count = k\n wheels.instanceMatrix.needsUpdate = true\n blobs.count = currentQuality === 'high' ? 0 : bi\n blobs.instanceMatrix.needsUpdate = true\n const at = activeId != null ? tanks.get(activeId) : null\n if (at && at.state.alive && !currentTurn && !celebrateState) {\n activeRing.visible = true\n activeRing.position.set(at.state.x, at.state.y + 0.12, at.state.z)\n activeRing.quaternion.copy(at.body.quaternion)\n activeRing.scale.set(9, 1, 9)\n activeMat.color.copy(at.team.accent).multiplyScalar(1.4)\n } else activeRing.visible = false\n wheelsDirty = false\n }\n\n function damageLevel(t) {\n const s = t.state\n if (!s.alive) return 2\n return s.hp / Math.max(1, s.maxHp) <= 0.5 ? 1 : 0\n }\n\n // ------------------------------------------------------------------ world\n function applyWorld(w, { fromTurn = false } = {}) {\n if (!w || disposed) return\n lastWorld = w\n hasWorld = true\n mapSize = w.size || 160\n mapCenter.set(mapSize / 2, 0, mapSize / 2)\n const res = terrain.setHeights(w)\n if (res !== 'same') {\n shadowDirty = true\n const sunTarget = mapCenter\n sun.target.position.copy(sunTarget)\n sun.position.copy(sunTarget).addScaledVector(SUN_DIR, 260)\n sun.target.updateMatrixWorld()\n }\n if (decor.build(world, w, terrain)) shadowDirty = true\n else if (res !== 'same') decor.reground(terrain)\n decor.setShadows(currentQuality === 'high')\n\n const list = Array.isArray(w.tanks) ? w.tanks : []\n const seen = new Set()\n list.forEach((wt, i) => {\n if (!wt || wt.id == null) return\n seen.add(wt.id)\n const t = ensureTank(wt, i)\n const s = t.state\n s.x = +wt.x || 0\n s.z = +wt.z || 0\n s.y = Number.isFinite(wt.y) ? wt.y : terrain.heightAt(s.x, s.z)\n s.hullYaw = +wt.hullYaw || 0\n const keepAim = !fromTurn && wt.id === w.activeId && s.targetYaw != null\n if (!keepAim) {\n s.yaw = Number.isFinite(wt.yaw) ? wt.yaw : s.hullYaw\n s.pitch = Number.isFinite(wt.pitch) ? wt.pitch : 10\n s.targetYaw = null\n s.targetPitch = null\n }\n s.hp = Number.isFinite(wt.hp) ? wt.hp : 100\n s.maxHp = Math.max(100, s.maxHp, s.hp)\n const alive = wt.alive !== undefined ? !!wt.alive : s.hp > 0\n if (alive && !s.alive) {\n restoreTurret(t)\n t.setCharred(false)\n }\n s.alive = alive\n if (!alive) {\n t.setCharred(true)\n if (!s.blown) placeWreckTurret(t)\n }\n t.place(terrain)\n })\n for (const id of Array.from(tanks.keys())) if (!seen.has(id)) removeTank(id)\n activeId = w.activeId != null ? w.activeId : w.turnPlayerId != null ? w.turnPlayerId : activeId\n wind = w.wind || wind\n fx.setWind(wind)\n wheelsDirty = true\n shadowDirty = true\n if (!currentTurn && !celebrateState) {\n cam.tankId = activeId\n if (cam.mode !== cam.userMode) setCam(cam.userMode)\n }\n }\n\n // ------------------------------------------------------------------ turns\n function* wait(sec) {\n let t = 0\n while (t < sec) t += yield\n }\n function* waitReal(sec) {\n let t = 0\n while (t < sec) {\n yield\n t += realDt\n }\n }\n\n function samplePos(samples, u, out) {\n const n = (samples.length / 3) | 0\n if (n === 0) return out.set(0, 0, 0)\n if (u <= 0) return out.set(samples[0], samples[1], samples[2])\n if (u >= n - 1) return out.set(samples[(n - 1) * 3], samples[(n - 1) * 3 + 1], samples[(n - 1) * 3 + 2])\n const i = Math.floor(u)\n const f = u - i\n const a = i * 3\n return out.set(\n samples[a] + (samples[a + 3] - samples[a]) * f,\n samples[a + 1] + (samples[a + 4] - samples[a + 1]) * f,\n samples[a + 2] + (samples[a + 5] - samples[a + 2]) * f,\n )\n }\n\n function* turnScript(turn) {\n const tank = tanks.get(turn.tankId)\n const speedK = reducedMotion ? 2 : 1\n if (tank) {\n tank.state.targetYaw = null\n tank.state.targetPitch = null\n }\n activeRing.visible = false\n fx.setPreview(null)\n\n // ---------------- drive\n const path = Array.isArray(turn.movePath) ? turn.movePath.filter((p) => p && Number.isFinite(p.x) && Number.isFinite(p.z)) : []\n let total = 0\n const seg = []\n for (let i = 1; i < path.length; i++) {\n const L = Math.hypot(path[i].x - path[i - 1].x, path[i].z - path[i - 1].z)\n seg.push(L)\n total += L\n }\n if (tank && tank.state.alive && total > 0.05) {\n const s = tank.state\n setCam('drive', { tankId: tank.id })\n emit({ type: 'engine_start', tankId: tank.id })\n yield* wait(reducedMotion ? 0.05 : 0.35)\n emit({ type: 'move_start', tankId: tank.id })\n const speed = 5 * speedK\n let d = 0\n let dustAcc = 0\n const fwdX = Math.cos(s.hullYaw * DEG)\n const fwdZ = Math.sin(s.hullYaw * DEG)\n while (d < total) {\n const dt = yield\n const prevX = s.x, prevZ = s.z\n d = Math.min(total, d + speed * dt)\n // locate on path\n let acc = 0\n let i = 0\n while (i < seg.length - 1 && acc + seg[i] < d) acc += seg[i++]\n const f = seg[i] > 0 ? (d - acc) / seg[i] : 1\n const a = path[i], b = path[i + 1]\n s.x = a.x + (b.x - a.x) * f\n s.z = a.z + (b.z - a.z) * f\n const ay = Number.isFinite(a.y) ? a.y : terrain.heightAt(a.x, a.z)\n const by = Number.isFinite(b.y) ? b.y : terrain.heightAt(b.x, b.z)\n s.y = ay + (by - ay) * f\n const mx = s.x - prevX, mz = s.z - prevZ\n const step = Math.hypot(mx, mz)\n if (step > 1e-5) {\n const dot = (mx * fwdX + mz * fwdZ) / step\n if (Math.abs(dot) < 0.9) {\n // path bends: steer the hull toward travel direction\n const head = Math.atan2(mz, mx) / DEG\n const tgt = dot >= 0 ? head : head + 180\n const diff = wrapPi((tgt - s.hullYaw) * DEG) / DEG\n const turnD = diff * dampK(6, dt)\n s.hullYaw += turnD\n s.yaw += turnD\n }\n tank.scrollTracks(dot >= 0 ? step : -step)\n dustAcc += step\n }\n tank.place(terrain, dt)\n while (dustAcc > 0.7) {\n dustAcc -= 0.7\n tank.localToWorld(v2, -2.6, 0.2, 1.4)\n fx.dust(v2.x, v2.y, v2.z)\n tank.localToWorld(v2, -2.6, 0.2, -1.4)\n fx.dust(v2.x, v2.y, v2.z)\n tank.localToWorld(v2, -3.3, 1.3, 0.9)\n fx.exhaust(v2.x, v2.y, v2.z)\n }\n wheelsDirty = true\n shadowDirty = true\n }\n emit({ type: 'move_end', tankId: tank.id })\n }\n\n // ---------------- turret\n if (tank && tank.state.alive) {\n const s = tank.state\n const ty = Number.isFinite(turn.yaw) ? turn.yaw : s.yaw\n const tp = Number.isFinite(turn.pitch) ? turn.pitch : s.pitch\n const dy = wrapPi((ty - s.yaw) * DEG) / DEG\n const dp = tp - s.pitch\n if (cam.mode !== 'drive' && !reducedMotion) setCam('aim', { tankId: tank.id })\n else if (cam.mode === 'drive') setCam('aim', { tankId: tank.id })\n if (Math.abs(dy) > 0.5 || Math.abs(dp) > 0.5) {\n emit({ type: 'turret_start', tankId: tank.id })\n const rate = 90 * speedK\n const dur = Math.max(0.25, Math.max(Math.abs(dy), Math.abs(dp)) / rate)\n const y0 = s.yaw, p0 = s.pitch\n let t = 0\n while (t < dur) {\n t += yield\n const k = Math.min(1, t / dur)\n const e = k * k * (3 - 2 * k)\n s.yaw = y0 + dy * e\n s.pitch = p0 + dp * e\n tank.place(terrain)\n shadowDirty = true\n }\n emit({ type: 'turret_end', tankId: tank.id })\n }\n s.yaw = ty\n s.pitch = tp\n tank.place(terrain)\n yield* wait(reducedMotion ? 0.05 : 0.2)\n }\n\n // ---------------- shots\n const shots = Array.isArray(turn.shots) ? turn.shots.slice(0, 8) : []\n const craters = Array.isArray(turn.craters) ? turn.craters.map((c) => ({ ...c, used: false })) : []\n const damage = turn.damage || {}\n const flashed = new Set()\n const recs = shots.map((sh, i) => {\n const samples = sh && sh.samples && sh.samples.length >= 3 ? sh.samples : null\n const n = samples ? (samples.length / 3) | 0 : 0\n return {\n shot: sh,\n samples,\n n,\n start: (Number.isFinite(sh && sh.startMs) ? sh.startMs / 1000 : 0) / speedK,\n dur: (Math.max(1, n - 1) * SAMPLE_DT) / speedK,\n role: (sh && sh.role) || 'main',\n slot: i,\n started: false,\n done: !samples,\n offset: new Vector3(),\n }\n })\n let fired = false\n let lastImpact = null\n const carrier = recs.find((r) => r.role === 'carrier' && !r.done) || null\n if (recs.length) {\n let t = 0\n let remaining = recs.filter((r) => !r.done).length\n const firstStart = Math.min(...recs.map((r) => r.start))\n while (remaining > 0 && t < 30) {\n // fire moment\n if (!fired && tank) {\n fired = true\n tank.muzzleWorld(v2)\n tank.gunDirWorld(v3)\n fx.muzzle(v2, v3)\n tank.state.recoil = 1\n cam.shake = 0.6\n emit({ type: 'fire', tankId: tank.id })\n }\n let fx0 = 0, fy0 = 0, fz0 = 0, vx = 0, vy = 0, vz = 0, active = 0\n for (const r of recs) {\n if (r.done) continue\n const lt = t - r.start\n if (lt < 0) continue\n if (!r.started && r.role === 'bomblet' && carrier && !carrier.done) continue\n if (!r.started) {\n r.started = true\n samplePos(r.samples, 0, v1)\n if (tank && (r.role === 'main' || r.role === 'carrier') && r.start <= firstStart + 1e-6) {\n tank.muzzleWorld(v2)\n r.offset.copy(v2).sub(v1)\n }\n fx.projShow(r.slot, v1.x + r.offset.x, v1.y + r.offset.y, v1.z + r.offset.z, (r.shot.radius || 0) >= 7)\n emit({ type: 'projectile_start', tankId: turn.tankId, role: r.role })\n }\n const u = lt / SAMPLE_DT * speedK\n if (lt >= r.dur) {\n // impact\n r.done = true\n remaining--\n fx.projHide(r.slot)\n lastImpact = impactShot(r, craters, damage, flashed) || lastImpact\n continue\n }\n samplePos(r.samples, u, v1)\n const w = Math.max(0, 1 - u / 5)\n v1.addScaledVector(r.offset, w)\n fx.projMove(r.slot, v1.x, v1.y, v1.z)\n samplePos(r.samples, u + 1, v3)\n fx0 += v1.x; fy0 += v1.y; fz0 += v1.z\n vx += (v3.x - v1.x) / SAMPLE_DT\n vy += (v3.y - v1.y) / SAMPLE_DT\n vz += (v3.z - v1.z) / SAMPLE_DT\n active++\n }\n if (active > 0) {\n cam.focus.set(fx0 / active, fy0 / active, fz0 / active)\n if (Math.hypot(vx, vz) > 0.1) cam.vel.set(vx / active, vy / active, vz / active)\n if (cam.mode !== 'follow' && !reducedMotion) setCam('follow')\n if (reducedMotion && cam.mode !== 'overview') setCam('overview', { cut: true })\n } else if (lastImpact && cam.mode === 'follow') {\n setCam('impact', { focus: lastImpact, orbitFromCurrent: true })\n }\n t += yield\n }\n }\n\n // leftover craters (no matching impact)\n for (const c of craters) {\n if (c.used) continue\n terrain.crater(c.x, c.z, c.radius || 4, c.depth || 1)\n decor.blast(terrain, c.x, c.z, c.radius || 4)\n shadowDirty = true\n }\n // splash damage flashes\n for (const id of Object.keys(damage)) {\n if (damage[id] > 0 && !flashed.has(id)) {\n const t = tanks.get(id)\n if (t) t.state.hitFlash = 1\n }\n }\n\n if (lastImpact) {\n if (!reducedMotion && cam.mode !== 'impact') setCam('impact', { focus: lastImpact, orbitFromCurrent: true })\n if (reducedMotion) setCam('overview', { cut: true })\n yield* wait(reducedMotion ? 0.5 : 1.3)\n } else {\n yield* wait(0.4)\n }\n\n // ---------------- destruction\n const destroyed = Array.isArray(turn.destroyed) ? turn.destroyed : []\n for (const id of destroyed) {\n const t = tanks.get(id)\n if (!t || (!t.state.alive && t.state.charred)) continue\n if (!reducedMotion) {\n setCam('killcam', { tankId: id, focus: v1.set(t.state.x, t.state.y, t.state.z), orbitFromCurrent: true })\n timeScale = 0.35\n yield* waitReal(0.35)\n }\n t.state.alive = false\n t.setCharred(true)\n blowTurret(t)\n fx.bigExplosion(t.state.x, t.state.y + 1, t.state.z)\n cam.shake = 1.6\n shadowDirty = true\n emit({ type: 'destroyed', tankId: id })\n emit({ type: 'big_explosion', tankId: id })\n yield* waitReal(reducedMotion ? 0.6 : 1.5)\n timeScale = 1\n yield* wait(reducedMotion ? 0.3 : 1.0)\n }\n timeScale = 1\n }\n\n function impactShot(r, craters, damage, flashed) {\n const imp = r.shot.impact || {}\n const n = r.n\n const x = Number.isFinite(imp.x) ? imp.x : r.samples[(n - 1) * 3]\n const y = Number.isFinite(imp.y) ? imp.y : r.samples[(n - 1) * 3 + 1]\n const z = Number.isFinite(imp.z) ? imp.z : r.samples[(n - 1) * 3 + 2]\n const kind = imp.kind || 'terrain'\n emit({ type: 'impact', kind, tankId: imp.tankId, role: r.role })\n if (kind === 'split') {\n fx.pop(x, y, z)\n return null\n }\n if (kind === 'out') {\n fx.outPuff(x, y, z)\n return null\n }\n const radius = r.shot.radius || 5\n fx.explosion(x, y, z, radius, kind)\n cam.shake = Math.max(cam.shake, radius >= 7 ? 1.4 : 0.9)\n if (radius >= 7) emit({ type: 'big_explosion' })\n // nearest crater\n let best = null\n let bd = Infinity\n for (const c of craters) {\n if (c.used) continue\n const d = Math.hypot(c.x - x, c.z - z)\n if (d < bd) {\n bd = d\n best = c\n }\n }\n if (best && bd < Math.max(3, radius * 1.5)) {\n best.used = true\n terrain.crater(best.x, best.z, best.radius || radius, best.depth || 0.8)\n }\n decor.blast(terrain, x, z, radius)\n shadowDirty = true\n if (kind === 'tank' && imp.tankId != null) {\n const t = tanks.get(imp.tankId)\n if (t) {\n t.state.hitFlash = 1\n fx.hitSparks(x, y, z)\n flashed.add(String(imp.tankId))\n }\n emit({ type: 'tank_hit', tankId: imp.tankId })\n }\n // splash flashes for tanks within radius\n for (const id of Object.keys(damage)) {\n if (!(damage[id] > 0) || flashed.has(id)) continue\n const t = tanks.get(id)\n if (t && Math.hypot(t.state.x - x, t.state.z - z) < radius * 1.3) {\n t.state.hitFlash = 1\n flashed.add(id)\n emit({ type: 'tank_hit', tankId: id })\n }\n }\n return new Vector3(x, y, z)\n }\n\n function startNextTurn() {\n if (currentTurn || !turnQueue.length) return\n const rec = turnQueue.shift()\n if (disposed || !running || !hasWorld) {\n finishTurn(rec)\n startNextTurn()\n return\n }\n rec.gen = turnScript(rec.turn)\n rec.realT = 0\n currentTurn = rec\n rec.gen.next(0)\n wake()\n }\n\n function finishTurn(rec) {\n if (rec.finished) return\n rec.finished = true\n if (rec.timer) clearTimeout(rec.timer)\n if (currentTurn === rec) currentTurn = null\n timeScale = 1\n for (let i = 0; i < 8; i++) fx.projHide(i)\n if (!disposed) {\n try {\n const w = rec.turn && rec.turn.world\n if (w) applyWorld(w, { fromTurn: true })\n setCam(cam.userMode, { tankId: activeId })\n } catch (err) {\n if (typeof console !== 'undefined') console.error(err)\n }\n }\n rec.resolve()\n }\n\n function flushTurns() {\n if (currentTurn) finishTurn(currentTurn)\n while (turnQueue.length) finishTurn(turnQueue.shift())\n }\n\n // ------------------------------------------------------------------ resize / visibility\n function resize() {\n if (disposed) return\n const w = container.clientWidth\n const h = container.clientHeight\n if (!w || !h) return\n width = w\n height = h\n renderer.setSize(w, h, false)\n updateFov()\n wake(0.3)\n }\n const ro = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(resize) : null\n if (ro) ro.observe(container)\n else window.addEventListener('resize', resize)\n\n let docVisible = typeof document === 'undefined' ? true : !document.hidden\n let onScreen = true\n let running = docVisible\n const io =\n typeof IntersectionObserver !== 'undefined'\n ? new IntersectionObserver((entries) => {\n onScreen = entries[entries.length - 1].isIntersecting\n updateRunning()\n })\n : null\n if (io) io.observe(container)\n const onVisibility = () => {\n docVisible = !document.hidden\n updateRunning()\n }\n document.addEventListener('visibilitychange', onVisibility)\n\n let contextLost = false\n const onContextLost = (e) => {\n if (e && e.preventDefault) e.preventDefault()\n contextLost = true\n updateRunning()\n emit({ type: 'context_lost' })\n }\n canvas.addEventListener('webglcontextlost', onContextLost)\n\n // ------------------------------------------------------------------ loop\n const clock = new Clock(false)\n let rafId = 0\n let slowTimer = 0\n let perfAcc = 0\n let perfFrames = 0\n let lastStats = { calls: 0, triangles: 0, particles: 0, quality: currentQuality, fps: 0 }\n\n function wake(sec = 0.05) {\n if (disposed) return\n wakeTime = Math.max(wakeTime, elapsed + sec)\n schedule()\n }\n function schedule() {\n if (disposed || !running || rafId) return\n if (slowTimer) {\n clearTimeout(slowTimer)\n slowTimer = 0\n }\n if (!clock.running) {\n clock.start()\n }\n rafId = requestAnimationFrame(frame)\n }\n\n function frame() {\n rafId = 0\n if (disposed || !running) return\n const raw = clock.getDelta()\n realDt = Math.min(raw, MAX_DT)\n const dt = realDt * timeScale\n elapsed += realDt\n let animating = elapsed < wakeTime\n\n // turn script\n if (currentTurn) {\n animating = true\n currentTurn.realT += realDt\n let res\n try {\n res = currentTurn.gen.next(dt)\n } catch (err) {\n if (typeof console !== 'undefined') console.error(err)\n res = { done: true }\n }\n if (res.done || currentTurn.realT > currentTurn.deadline) finishTurn(currentTurn)\n if (!currentTurn) startNextTurn()\n }\n\n // tanks: aim smoothing, recoil, hit flash, damage smoke, blown turrets\n for (const id of tankOrder) {\n const t = tanks.get(id)\n const s = t.state\n let changed = false\n if (s.targetYaw != null && !currentTurn) {\n const dy = wrapPi((s.targetYaw - s.yaw) * DEG) / DEG\n const dp = s.targetPitch - s.pitch\n if (Math.abs(dy) > 0.02 || Math.abs(dp) > 0.02) {\n const k = reducedMotion ? 1 : dampK(14, realDt)\n s.yaw += dy * k\n s.pitch += dp * k\n changed = true\n animating = true\n } else if (aimDirty) {\n s.yaw = s.targetYaw\n s.pitch = s.targetPitch\n changed = true\n }\n }\n if (s.recoil > 0) {\n s.recoil = Math.max(0, s.recoil - dt * 2.2)\n changed = true\n animating = true\n }\n if (s.hitFlash > 0) {\n s.hitFlash = Math.max(0, s.hitFlash - dt * 2.5)\n t.setFlash(s.hitFlash * s.hitFlash * 1.5)\n animating = true\n }\n if (updateBlown(t, dt)) animating = true\n if (changed) {\n t.place(terrain)\n shadowDirty = true\n }\n const lvl = damageLevel(t)\n if (lvl > 0) {\n if (s.blown && lvl >= 2) v1.set(s.x, s.y + 1.4, s.z)\n else t.localToWorld(v1, lvl >= 2 ? -0.5 : -1.8, 1.8, 0)\n fx.emitDamage(v1.x, v1.y, v1.z, dt, lvl, s)\n }\n }\n aimDirty = false\n\n // celebration\n if (celebrateState) {\n const c = celebrateState\n c.t += realDt\n c.next -= realDt\n animating = true\n if (c.next <= 0 && c.t < 5.5) {\n c.next = 0.55\n const t = c.id != null ? tanks.get(c.id) : null\n const cx = t ? t.state.x : mapCenter.x\n const cz = t ? t.state.z : mapCenter.z\n const cy = t ? t.state.y : terrain.heightAt(cx, cz)\n const col = t ? t.team.accent : lin('#ffd36b')\n fx.firework(cx + (Math.random() - 0.5) * 10, cy + 9 + Math.random() * 3, cz + (Math.random() - 0.5) * 10, col)\n }\n if (c.t > 9) {\n celebrateState = null\n }\n }\n\n if (wheelsDirty) syncTankStatics()\n if (fx.update(dt, camera, renderer, animating || !!currentTurn)) animating = true\n if (updateCamera(realDt)) animating = true\n if (fx.hasPreview && cam.mode === 'aim') animating = animating || elapsed < wakeTime\n\n if (shadowDirty && currentQuality === 'high') {\n renderer.shadowMap.needsUpdate = true\n }\n shadowDirty = false\n renderer.render(scene, camera)\n const info = renderer.info.render\n lastStats = {\n calls: info.calls,\n triangles: info.triangles,\n particles: fx.particleCount,\n quality: currentQuality,\n fps: raw > 0 ? Math.round(1 / raw) : 0,\n }\n\n // auto quality: downgrade one tier if animation can't hold ~38 fps\n if (autoQuality && animating && currentQuality !== 'low' && elapsed > 2) {\n perfAcc += Math.min(raw, 0.25)\n perfFrames++\n if (perfFrames >= 90) {\n if (perfAcc / perfFrames > 1 / 38) applyQuality(currentQuality === 'high' ? 'medium' : 'low')\n perfAcc = 0\n perfFrames = 0\n }\n }\n\n if (animating) schedule()\n else if (hasAmbient()) {\n // ambient smoke: throttled ~24 fps\n slowTimer = setTimeout(() => {\n slowTimer = 0\n schedule()\n }, 40)\n } else {\n clock.stop()\n }\n }\n\n function hasAmbient() {\n for (const id of tankOrder) if (damageLevel(tanks.get(id)) > 0) return true\n return fx.particleCount > 0\n }\n\n function updateRunning() {\n const should = !disposed && !contextLost && docVisible && onScreen\n if (should === running) {\n if (should) schedule()\n return\n }\n running = should\n if (should) {\n clock.stop()\n wake(0.1)\n } else {\n if (rafId) cancelAnimationFrame(rafId)\n rafId = 0\n if (slowTimer) clearTimeout(slowTimer)\n slowTimer = 0\n clock.stop()\n flushTurns() // never leave awaited turns hanging while paused\n }\n }\n\n function applyQuality(q) {\n if (q === currentQuality) return\n currentQuality = q\n renderer.setPixelRatio(pixelRatioFor(q))\n renderer.setSize(width, height, false)\n const hi = q === 'high'\n sun.castShadow = hi\n decor.setQuality(q, world)\n decor.setShadows(hi)\n terrain.mesh.receiveShadow = hi\n for (const t of tanks.values()) {\n t.setQuality(q)\n t.setShadows(hi)\n }\n if (tankShared.wheelMat) {\n tankShared.wheelMat.dispose()\n tankShared.wheelMat = makeWheelMaterial()\n wheels.material = tankShared.wheelMat\n }\n wheels.castShadow = hi\n fx.setQuality(q)\n sun.intensity = q === 'low' ? 1.7 : 1.9\n hemi.intensity = q === 'low' ? 0.55 : 0.6\n wheelsDirty = true\n shadowDirty = true\n wake(0.1)\n }\n // initial quality wiring (applyQuality skips when equal)\n {\n const q = currentQuality\n currentQuality = null\n applyQuality(q)\n }\n\n // ------------------------------------------------------------------ public API\n return {\n setWorld(w) {\n if (disposed || !w) return\n if (currentTurn) {\n // authoritative end state arrives with the turn; keep the latest for afterwards\n if (currentTurn.turn) currentTurn.turn.world = currentTurn.turn.world || w\n return\n }\n const first = !hasWorld\n applyWorld(w)\n if (first) {\n frameOverview()\n if (reducedMotion) cam.snap = true\n else {\n cam.pos.copy(cam.dPos).sub(cam.dTarget).multiplyScalar(1.7).add(cam.dTarget)\n cam.pos.y += 40\n cam.target.copy(cam.dTarget)\n }\n }\n wake(0.2)\n },\n\n setAim({ yaw, pitch, power } = {}) {\n if (disposed || currentTurn) return\n const t = activeId != null ? tanks.get(activeId) : null\n if (!t || !t.state.alive) return\n if (Number.isFinite(yaw)) t.state.targetYaw = yaw\n else if (t.state.targetYaw == null) t.state.targetYaw = t.state.yaw\n if (Number.isFinite(pitch)) t.state.targetPitch = pitch\n else if (t.state.targetPitch == null) t.state.targetPitch = t.state.pitch\n t.state.power = power\n aimDirty = true\n wake(0.6)\n },\n\n setPreview(points) {\n if (disposed) return\n fx.setPreview(points && points.length ? points : null)\n wake(1.5)\n },\n\n playTurn(turn) {\n return new Promise((resolve) => {\n if (disposed || !turn) {\n if (turn && turn.world && !disposed) applyWorld(turn.world, { fromTurn: true })\n resolve()\n return\n }\n const shots = Array.isArray(turn.shots) ? turn.shots : []\n let est = 4 + (Array.isArray(turn.movePath) ? turn.movePath.length * 0.3 : 0)\n for (const s of shots) {\n const n = s && s.samples ? s.samples.length / 3 : 0\n est = Math.max(est, 4 + ((s && s.startMs) || 0) / 1000 + n * SAMPLE_DT)\n }\n est += (Array.isArray(turn.destroyed) ? turn.destroyed.length : 0) * 4\n const rec = { turn, resolve, finished: false, deadline: est * 2 + 6, timer: 0 }\n // wall-clock watchdog (in case rAF never fires while \"visible\")\n rec.timer = setTimeout(() => finishTurn(rec), (est * 2 + 12) * 1000)\n turnQueue.push(rec)\n celebrateState = null\n startNextTurn()\n })\n },\n\n setCameraMode(mode) {\n if (disposed) return\n cam.userMode = mode === 'aim' ? 'aim' : 'overview'\n if (!currentTurn && !celebrateState) setCam(cam.userMode, { tankId: activeId })\n wake(0.2)\n },\n\n setQuality(q) {\n if (disposed) return\n const n = normQ(q)\n autoQuality = false\n if (n) applyQuality(n)\n },\n\n celebrate(winnerId) {\n if (disposed) return\n activeRing.visible = false\n if (winnerId == null || !tanks.has(winnerId)) {\n celebrateState = null\n setCam('overview')\n wake(0.5)\n return\n }\n celebrateState = { id: winnerId, t: 0, next: 0.3 }\n setCam('celebrate', { tankId: winnerId, orbitFromCurrent: true })\n const t = tanks.get(winnerId)\n cam.focus.set(t.state.x, t.state.y, t.state.z)\n cam.orbit = Math.atan2(cam.pos.z - cam.focus.z, cam.pos.x - cam.focus.x)\n wake(0.5)\n },\n\n resize,\n\n getStats() {\n return { ...lastStats }\n },\n\n dispose() {\n if (disposed) return\n flushTurns()\n disposed = true\n running = false\n if (rafId) cancelAnimationFrame(rafId)\n rafId = 0\n if (slowTimer) clearTimeout(slowTimer)\n if (ro) ro.disconnect()\n else window.removeEventListener('resize', resize)\n if (io) io.disconnect()\n document.removeEventListener('visibilitychange', onVisibility)\n canvas.removeEventListener('webglcontextlost', onContextLost)\n for (const id of Array.from(tanks.keys())) removeTank(id)\n wheels.dispose()\n if (tankShared.wheelMat) tankShared.wheelMat.dispose()\n tankShared.dispose()\n tankGeos.dispose()\n blobs.dispose()\n blobGeo.dispose()\n blobMat.dispose()\n blobTex.dispose()\n activeMat.dispose()\n activeTex.dispose()\n fx.dispose()\n decor.dispose()\n terrain.dispose()\n sky.dispose()\n hills.dispose()\n if (sun.shadow && sun.shadow.map) sun.shadow.map.dispose()\n scene.clear()\n renderer.dispose()\n renderer.forceContextLoss()\n if (canvas.parentNode) canvas.parentNode.removeChild(canvas)\n },\n }\n}\n\nexport default createTankScene\n"],"mappings":"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"}