@minicode-dev/chat 0.1.7 → 0.1.9

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 +1956 -1857
  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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fx-BHsl4S_J.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"],"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"],"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"],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import { createStore as e } from "zustand/vanilla";
2
+ import { useStore as t } from "zustand";
3
+ // src/core/connection/connectionStore.js
4
+ var n = e(() => ({ status: "idle" }));
5
+ function r(e) {
6
+ n.setState({ status: e });
7
+ }
8
+ function i() {
9
+ return t(n, (e) => e.status);
10
+ }
11
+ // src/games/shared/gameStatus.js
12
+ var a = (e, t) => e != null && t != null && String(e) === String(t), o = (e) => [
13
+ "won",
14
+ "draw",
15
+ "declined",
16
+ "closed"
17
+ ].includes(e?.status), s = (e) => !!e && ([
18
+ "invited",
19
+ "placement",
20
+ "seeding",
21
+ "active",
22
+ "conflict"
23
+ ].includes(e.status) || !!e.pendingEvent), c = (e) => e?.game === "battleship", l = (e) => e?.game === "tanks", u = {
24
+ connect4: "Conecta 4",
25
+ battleship: "Batalla Naval",
26
+ tanks: "Tanques de guerra",
27
+ tanks_live: "Tanques LIVE 3D"
28
+ }, d = (e) => u[e?.game] ?? "Conecta 4", f = {
29
+ ok: "Partida verificada",
30
+ mismatch: "Resultados inconsistentes del rival",
31
+ pending: "Verificando…"
32
+ }, p = (e) => f[e?.verification] || "";
33
+ function m(e, t) {
34
+ let n = a(t, e.turnId);
35
+ return e.status === "placement" ? e.myReady ? e.opponentReady ? "Iniciando batalla…" : "Esperando a que el rival coloque su flota" : "Coloca tu flota" : e.status === "active" ? e.pendingShot ? "Esperando resultado…" : n ? "Tu turno · elige una casilla" : "Turno del rival" : e.status === "won" ? a(t, e.winnerId) ? "¡Ganaste!" : "Tu rival ganó" : null;
36
+ }
37
+ function h(e, t) {
38
+ if (e.status === "seeding") return "Preparando el campo de batalla…";
39
+ if (e.status === "active") return a(t, e.turnId) ? "Tu turno · apunta y dispara" : "Turno del rival";
40
+ if (e.status === "won") {
41
+ let n = a(t, e.winnerId), r = e.logic?.reason;
42
+ return r === "resign" ? n ? "¡Victoria! Tu rival se rindió" : "Te rendiste" : r === "timeout" ? n ? "¡Victoria! Tu rival dejó pasar sus turnos" : "Perdiste por inactividad" : r === "max_shots" ? n ? "¡Victoria por vida restante!" : "Tu rival terminó con más vida" : n ? "¡Victoria! Destruiste al rival" : "Tu tanque fue destruido";
43
+ }
44
+ return e.status === "draw" ? e.logic?.reason === "max_shots" ? "Empate · misma vida al agotar los disparos" : "Empate · ambos tanques destruidos" : null;
45
+ }
46
+ function g(e, t) {
47
+ if (e?.game === "tanks_live" && e.status === "active") return "Combate en vivo · conduce, apunta y dispara";
48
+ if (c(e)) {
49
+ let n = m(e, t);
50
+ if (n) return n;
51
+ }
52
+ if (l(e)) {
53
+ let n = h(e, t);
54
+ if (n) return n;
55
+ }
56
+ let n = e.status === "active" && a(t, e.turnId);
57
+ return e.status === "invited" ? a(t, e.guestId) ? "Te han invitado a jugar" : "Esperando respuesta a la invitación" : e.status === "active" ? n ? "Tu turno · elige una columna" : "Turno de tu rival" : e.status === "won" ? a(t, e.winnerId) ? "¡Ganaste la partida!" : "Tu rival ganó la partida" : e.status === "draw" ? "Empate · tablero completo" : e.status === "declined" ? "Invitación rechazada" : e.status === "closed" ? "Partida finalizada" : e.status === "conflict" ? "Partida pausada por un conflicto de sincronización" : "Esperando respuesta a la invitación";
58
+ }
59
+ function _(e, t) {
60
+ if (e?.game === "tanks_live" && e.status === "active") return "Combate LIVE";
61
+ if (c(e)) {
62
+ if (e.status === "placement") return e.myReady ? "Esperando al rival" : "Coloca tu flota";
63
+ if (e.status === "active" && e.pendingShot) return "Esperando resultado…";
64
+ }
65
+ return l(e) && e.status === "seeding" ? "Preparando…" : e.status === "active" ? a(t, e.turnId) ? "Tu turno" : "Turno del rival" : e.status === "invited" ? a(t, e.guestId) ? "Invitación recibida" : "Invitación enviada" : e.status === "conflict" ? e.sync?.status === "requesting" ? "Sincronizando…" : "Sin sincronizar" : g(e, t);
66
+ }
67
+ export { c as a, o as c, r as d, i as f, p as i, a as l, d as n, s as o, _ as r, l as s, g as t, n as u };
68
+
69
+ //# sourceMappingURL=gameStatus-Cu1Z8un9.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gameStatus-Cu1Z8un9.js","names":["chatConnectionStore","createStore","setChatConnectionStatus","useChatConnectionStatus","useStore","state","sameUser","left","right","isTerminalGame","game","isLiveGame","isBattleshipGame","isTanksGame","GAME_TITLES","getGameTitle","VERIFICATION_LABELS","getVerificationLabel","getBattleshipStatus","myTurn","currentUserId","getTanksStatus","won","reason","getGameStatus","status","getShortGameStatus"],"sources":["../../src/core/connection/connectionStore.js","../../src/games/shared/gameStatus.js"],"sourcesContent":["import { useStore } from 'zustand';\nimport { createStore } from 'zustand/vanilla';\n\n// Transport-agnostic connection status for chat UI (host app syncs it).\nexport const chatConnectionStore = createStore(() => ({ status: 'idle' }));\n\nexport function setChatConnectionStatus(status) {\n chatConnectionStore.setState({ status });\n}\n\nexport function useChatConnectionStatus() {\n return useStore(chatConnectionStore, (state) => state.status);\n}\n","export const sameUser = (left, right) => left != null && right != null && String(left) === String(right);\nexport const isTerminalGame = (game) => ['won', 'draw', 'declined', 'closed'].includes(game?.status);\nexport const isLiveGame = (game) => Boolean(game) && (['invited', 'placement', 'seeding', 'active', 'conflict'].includes(game.status) || Boolean(game.pendingEvent));\nexport const isBattleshipGame = (game) => game?.game === 'battleship';\nexport const isTanksGame = (game) => game?.game === 'tanks';\nconst GAME_TITLES = { connect4: 'Conecta 4', battleship: 'Batalla Naval', tanks: 'Tanques de guerra', tanks_live: 'Tanques LIVE 3D' };\nexport const getGameTitle = (game) => GAME_TITLES[game?.game] ?? 'Conecta 4';\n\nconst VERIFICATION_LABELS = { ok: 'Partida verificada', mismatch: 'Resultados inconsistentes del rival', pending: 'Verificando…' };\nexport const getVerificationLabel = (game) => VERIFICATION_LABELS[game?.verification] || '';\n\nfunction getBattleshipStatus(game, currentUserId) {\n const myTurn = sameUser(currentUserId, game.turnId);\n if (game.status === 'placement') {\n if (!game.myReady) return 'Coloca tu flota';\n return game.opponentReady ? 'Iniciando batalla…' : 'Esperando a que el rival coloque su flota';\n }\n if (game.status === 'active') {\n if (game.pendingShot) return 'Esperando resultado…';\n return myTurn ? 'Tu turno · elige una casilla' : 'Turno del rival';\n }\n if (game.status === 'won') return sameUser(currentUserId, game.winnerId) ? '¡Ganaste!' : 'Tu rival ganó';\n return null;\n}\n\nfunction getTanksStatus(game, currentUserId) {\n if (game.status === 'seeding') return 'Preparando el campo de batalla…';\n if (game.status === 'active') return sameUser(currentUserId, game.turnId) ? 'Tu turno · apunta y dispara' : 'Turno del rival';\n if (game.status === 'won') {\n const won = sameUser(currentUserId, game.winnerId);\n const reason = game.logic?.reason;\n if (reason === 'resign') return won ? '¡Victoria! Tu rival se rindió' : 'Te rendiste';\n if (reason === 'timeout') return won ? '¡Victoria! Tu rival dejó pasar sus turnos' : 'Perdiste por inactividad';\n if (reason === 'max_shots') return won ? '¡Victoria por vida restante!' : 'Tu rival terminó con más vida';\n return won ? '¡Victoria! Destruiste al rival' : 'Tu tanque fue destruido';\n }\n if (game.status === 'draw') return game.logic?.reason === 'max_shots' ? 'Empate · misma vida al agotar los disparos' : 'Empate · ambos tanques destruidos';\n return null;\n}\n\nexport function getGameStatus(game, currentUserId) {\n if (game?.game === 'tanks_live' && game.status === 'active') return 'Combate en vivo · conduce, apunta y dispara';\n if (isBattleshipGame(game)) {\n const status = getBattleshipStatus(game, currentUserId);\n if (status) return status;\n }\n if (isTanksGame(game)) {\n const status = getTanksStatus(game, currentUserId);\n if (status) return status;\n }\n const myTurn = game.status === 'active' && sameUser(currentUserId, game.turnId);\n if (game.status === 'invited') return sameUser(currentUserId, game.guestId) ? 'Te han invitado a jugar' : 'Esperando respuesta a la invitación';\n if (game.status === 'active') return myTurn ? 'Tu turno · elige una columna' : 'Turno de tu rival';\n if (game.status === 'won') return sameUser(currentUserId, game.winnerId) ? '¡Ganaste la partida!' : 'Tu rival ganó la partida';\n if (game.status === 'draw') return 'Empate · tablero completo';\n if (game.status === 'declined') return 'Invitación rechazada';\n if (game.status === 'closed') return 'Partida finalizada';\n if (game.status === 'conflict') return 'Partida pausada por un conflicto de sincronización';\n return 'Esperando respuesta a la invitación';\n}\n\n// Short label for the minimized bar and the timeline placeholder.\nexport function getShortGameStatus(game, currentUserId) {\n if (game?.game === 'tanks_live' && game.status === 'active') return 'Combate LIVE';\n if (isBattleshipGame(game)) {\n if (game.status === 'placement') return game.myReady ? 'Esperando al rival' : 'Coloca tu flota';\n if (game.status === 'active' && game.pendingShot) return 'Esperando resultado…';\n }\n if (isTanksGame(game) && game.status === 'seeding') return 'Preparando…';\n if (game.status === 'active') return sameUser(currentUserId, game.turnId) ? 'Tu turno' : 'Turno del rival';\n if (game.status === 'invited') return sameUser(currentUserId, game.guestId) ? 'Invitación recibida' : 'Invitación enviada';\n if (game.status === 'conflict') return game.sync?.status === 'requesting' ? 'Sincronizando…' : 'Sin sincronizar';\n return getGameStatus(game, currentUserId);\n}\n"],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ // src/net/webrtc/signalFaults.js
2
+ function e(e, t = () => ({})) {
3
+ let n = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Set(), i = 0, a = () => Date.now() < i, o = (e, t) => {
4
+ let r = setTimeout(() => {
5
+ n.delete(r), e();
6
+ }, t);
7
+ n.add(r);
8
+ };
9
+ return {
10
+ send(t) {
11
+ return a() ? Promise.reject(/* @__PURE__ */ Error("señalización caída (simulada)")) : e.send(t);
12
+ },
13
+ subscribe(n) {
14
+ let i = e.subscribe((e) => {
15
+ let { drop: r = 0, duplicate: i = 0, jitter: s = 0 } = t() ?? {};
16
+ if (a() || Math.random() * 100 < r) return;
17
+ let c = Math.random() * 100 < i ? 2 : 1;
18
+ for (let t = 0; t < c; t += 1) s ? o(() => {
19
+ a() || n(e);
20
+ }, Math.random() * s) : n(e);
21
+ });
22
+ return r.add(i), () => {
23
+ r.delete(i), i?.();
24
+ };
25
+ },
26
+ pause(e) {
27
+ i = Date.now() + e;
28
+ },
29
+ dispose() {
30
+ n.forEach(clearTimeout), n.clear(), r.forEach((e) => e?.()), r.clear(), e.dispose?.();
31
+ }
32
+ };
33
+ }
34
+ export { e as t };
35
+
36
+ //# sourceMappingURL=signalFaults-Dv2YjjKy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signalFaults-Dv2YjjKy.js","names":["withSignalFaults","timers","unsubscribers","pausedUntil","paused","later","timer","fn","ms","signaling","text","off","getFaults","drop","copies","duplicate","i","jitter","listener","frame"],"sources":["../../src/net/webrtc/signalFaults.js"],"sourcesContent":["// Test wrapper for any signaling adapter ({ send, subscribe }): injects loss,\n// duplicates and jitter (reordering) on receive, and pause(ms) drops traffic in\n// both directions as if the chat socket were down. Never used outside labs/tests.\n\nexport function withSignalFaults(signaling, getFaults = () => ({})) {\n const timers = new Set();\n const unsubscribers = new Set();\n let pausedUntil = 0;\n const paused = () => Date.now() < pausedUntil;\n const later = (fn, ms) => {\n const timer = setTimeout(() => { timers.delete(timer); fn(); }, ms);\n timers.add(timer);\n };\n return {\n send(text) {\n if (paused()) return Promise.reject(new Error('señalización caída (simulada)'));\n return signaling.send(text);\n },\n subscribe(listener) {\n const off = signaling.subscribe((frame) => {\n const { drop = 0, duplicate = 0, jitter = 0 } = getFaults() ?? {};\n if (paused() || Math.random() * 100 < drop) return;\n const copies = Math.random() * 100 < duplicate ? 2 : 1;\n for (let i = 0; i < copies; i += 1) {\n if (!jitter) listener(frame);\n else later(() => { if (!paused()) listener(frame); }, Math.random() * jitter);\n }\n });\n unsubscribers.add(off);\n return () => { unsubscribers.delete(off); off?.(); };\n },\n pause(ms) { pausedUntil = Date.now() + ms; },\n dispose() {\n timers.forEach(clearTimeout);\n timers.clear();\n unsubscribers.forEach((off) => off?.());\n unsubscribers.clear();\n signaling.dispose?.();\n },\n };\n}\n"],"mappings":";AAIA,SAAgBA,EAAiB,GAAW,WAAmB,CAAC,IAAI;CAClE,IAAMC,oBAAS,IAAI,IAAI,GACjBC,oBAAgB,IAAI,IAAI,GAC1BC,IAAc,GACZC,UAAe,KAAK,IAAI,IAAID,GAC5BE,KAAS,GAAI,MAAO;EACxB,IAAMC,IAAQ,iBAAiB;GAAwB,AAAtBL,EAAO,OAAOK,CAAK,GAAGC,EAAG;EAAG,GAAGC,CAAE;EAClE,EAAO,IAAIF,CAAK;CAClB;CACA,OAAO;EACL,KAAK,GAAM;GAET,OADIF,EAAO,IAAU,QAAQ,OAAO,gBAAI,MAAM,+BAA+B,CAAC,IACvEK,EAAU,KAAKC,CAAI;EAC5B;EACA,UAAU,GAAU;GAClB,IAAMC,IAAMF,EAAU,WAAW,MAAU;IACzC,IAAM,EAAE,UAAO,GAAG,eAAY,GAAG,YAAS,MAAMG,EAAU,KAAK,CAAC;IAChE,IAAIR,EAAO,KAAK,KAAK,OAAO,IAAI,MAAMS,GAAM;IAC5C,IAAMC,IAAS,KAAK,OAAO,IAAI,MAAMC,IAAY,IAAI;IACrD,KAAK,IAAIC,IAAI,GAAGA,IAAIF,GAAQ,KAAK,GAC/B,AAAKG,IACAZ,QAAY;KAAE,AAAKD,EAAO,KAAGc,EAASC,CAAK;IAAG,GAAG,KAAK,OAAO,IAAIF,CAAM,IAD/DC,EAASC,CAAK;GAG/B,CAAC;GAED,OADAjB,EAAc,IAAIS,CAAG,SACR;IAA6B,AAA3BT,EAAc,OAAOS,CAAG,GAAGA,IAAM;GAAG;EACrD;EACA,MAAM,GAAI;GAAE,IAAc,KAAK,IAAI,IAAIH;EAAI;EAC3C,UAAU;GAKR,AAJAP,EAAO,QAAQ,YAAY,GAC3BA,EAAO,MAAM,GACbC,EAAc,SAAS,MAAQS,IAAM,CAAC,GACtCT,EAAc,MAAM,GACpBO,EAAU,UAAU;EACtB;CACF;AACF"}