@minicode-dev/chat 0.1.6 → 0.1.7
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.
- package/assets/sounds/tanks/big_explosion.mp3 +0 -0
- package/assets/sounds/tanks/big_explosion.ogg +0 -0
- package/assets/sounds/tanks/cannon_fire.mp3 +0 -0
- package/assets/sounds/tanks/cannon_fire.ogg +0 -0
- package/assets/sounds/tanks/defeat.mp3 +0 -0
- package/assets/sounds/tanks/defeat.ogg +0 -0
- package/assets/sounds/tanks/engine_loop.mp3 +0 -0
- package/assets/sounds/tanks/engine_loop.ogg +0 -0
- package/assets/sounds/tanks/engine_start.mp3 +0 -0
- package/assets/sounds/tanks/engine_start.ogg +0 -0
- package/assets/sounds/tanks/projectile_whistle.mp3 +0 -0
- package/assets/sounds/tanks/projectile_whistle.ogg +0 -0
- package/assets/sounds/tanks/tank_destroyed.mp3 +0 -0
- package/assets/sounds/tanks/tank_destroyed.ogg +0 -0
- package/assets/sounds/tanks/tank_hit.mp3 +0 -0
- package/assets/sounds/tanks/tank_hit.ogg +0 -0
- package/assets/sounds/tanks/terrain_impact.mp3 +0 -0
- package/assets/sounds/tanks/terrain_impact.ogg +0 -0
- package/assets/sounds/tanks/tracks_loop.mp3 +0 -0
- package/assets/sounds/tanks/tracks_loop.ogg +0 -0
- package/assets/sounds/tanks/turret_loop.mp3 +0 -0
- package/assets/sounds/tanks/turret_loop.ogg +0 -0
- package/assets/sounds/tanks/victory.mp3 +0 -0
- package/assets/sounds/tanks/victory.ogg +0 -0
- package/dist/chunks/{BattleshipGameCard-S-UdM6rn.js → BattleshipGameCard-CAWHxqJE.js} +231 -230
- package/dist/chunks/{BattleshipGameCard-S-UdM6rn.js.map → BattleshipGameCard-CAWHxqJE.js.map} +1 -1
- package/dist/chunks/{BattleshipPrototype-Dm6U_mCr.js → BattleshipPrototype-CmQd5AUO.js} +4 -3
- package/dist/chunks/{BattleshipPrototype-Dm6U_mCr.js.map → BattleshipPrototype-CmQd5AUO.js.map} +1 -1
- package/dist/chunks/ChatContext-CUiEAMKK.js +90 -0
- package/dist/chunks/ChatContext-CUiEAMKK.js.map +1 -0
- package/dist/chunks/TanksGameCard-BEnXTz_J.js +1705 -0
- package/dist/chunks/TanksGameCard-BEnXTz_J.js.map +1 -0
- package/dist/chunks/{battleship-DXKuIZ1I.js → board-DXKuIZ1I.js} +1 -1
- package/dist/chunks/board-DXKuIZ1I.js.map +1 -0
- package/dist/chunks/connect4Sounds-BDXQAvU1.js +3199 -0
- package/dist/chunks/connect4Sounds-BDXQAvU1.js.map +1 -0
- package/dist/chunks/core-geo-UJY-tH9L.js +361 -0
- package/dist/chunks/core-geo-UJY-tH9L.js.map +1 -0
- package/dist/chunks/createBattleScene-L4ZRWDED.js +1265 -0
- package/dist/chunks/createBattleScene-L4ZRWDED.js.map +1 -0
- package/dist/chunks/createTankScene-BuliAxwR.js +2150 -0
- package/dist/chunks/createTankScene-BuliAxwR.js.map +1 -0
- package/dist/index.js +2393 -2448
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/index.d.ts +2 -0
- package/package.json +1 -1
- package/dist/chunks/battleship-DXKuIZ1I.js.map +0 -1
- package/dist/chunks/connect4Sounds-9u0p-dAf.js +0 -1847
- package/dist/chunks/connect4Sounds-9u0p-dAf.js.map +0 -1
- package/dist/chunks/createBattleScene-HIAvjixn.js +0 -1621
- package/dist/chunks/createBattleScene-HIAvjixn.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createBattleScene-L4ZRWDED.js","names":["RING_FRAG","lin","lin","lin","lin","shipClassOf","buildShipGeometry","MAX_SLOTS","PARTICLES_HIGH","PARTICLES_LOW","TRAIL_HIGH","TRAIL_LOW","TRAIL_SPAN","FX_ORDER","COLOR_CYAN","Color","COLOR_VIOLET","COLOR_ORANGE","COLOR_RED","COLOR_FOAM","COLOR_FLASH","makeGlowTexture","data","size","y","x","dx","dy","f","a","i","tex","DataTexture","RGBAFormat","LinearFilter","clamp01","v","easeOutCubic","t","easeFlight","c","PARTICLE_VERT","PARTICLE_FRAG","TRAIL_VERT","TRAIL_FRAG","RING_VERT","RING_FRAG$1","createEffects","root","Group","scene","scaleUniform","bufferSize","Vector2","updatePointScale","renderer","camera","glowTex","planeGeom","PlaneGeometry","particleGeom","BufferGeometry","n","pos","dir","seed","u","th","s","BufferAttribute","haloMat","SpriteMaterial","AdditiveBlending","coreMat","light","PointLight","lightStart","slots","allMaterials","allGeometries","makeSpriteMat","m","halo","Sprite","core","muzzleMat","muzzle","flashMat","flash","trailPos","trailFade","trailGeom","trailPosAttr","DynamicDrawUsage","trailMat","ShaderMaterial","trail","Points","partMat","Vector3","particles","ringMat","ring","Mesh","objects","o","currentQuality","quality","trailCount","flightDur","reducedMotion","applyQuality","base","count","slot","fade","now","arcPoint","out","hideSlot","fireImpact","hit","pu","ru","cb","updateSlot","local","p","last","ti","fx","tx","k","mDur","it","fDur","maxS","rDur","radius","updateLight","peak","flicker","acquireSlot","oldest","disposed","result","onImpact","from","to","dist","dt","next","q","g","MAX_CONTACTS","lin$4","hex","DISC_VERT","DISC_FRAG","BLIP_VERT","BLIP_FRAG","createRadar","object","plate","R","opacity","angle","time","discGeo","discMat","disc","blipPos","blipGeo","uScale","bufSize","blipMat","blips","target","speed","elapsed","step","b","cells","OCEAN_Y","TIME_SCALE","BOARD_DAMP","WAVES","z","l","len","lin$3","WAVE_GLSL","w","OCEAN_VERT","OCEAN_FRAG","SKY_VERT","SKY_FRAG","buildOceanGeometry","geo","seg","remap","createOcean","fogLin","fogColor","uniforms","fogDensity","material","segments","mesh","skyGeo","SphereGeometry","skyMat","BackSide","sky","timeScale","amp","sm","damp","rm","GRID_Y","INNER","OUTER","lin$2","MODE_COLORS","GRID_VERT","GRID_FRAG","RING_FRAG","UV_VERT","INST_VERT","TILE_FRAG","HITGLOW_FRAG","GHOST_VERT","GHOST_FRAG","makeLabelAtlas","canvas","ctx","glyphs","cx","cy","CanvasTexture","makeLabelGeometry","S","uv","idx","push","u0","v1","u1","v0","r","makeFrameGeometry","shape","Shape","hole","Path","ExtrudeGeometry","createBoard","uTime","geometries","materials","track","lineColor","accentColor","gridGeo","gridUniforms","gridMat","grid","frameGeo","frameMat","MeshStandardMaterial","frame","labelTex","labelGeo","labelMat","MeshBasicMaterial","labels","shadowGeo","shadowMat","ShadowMaterial","shadowCatcher","ringGeo","tileGeo","tileColor","tileMat","tiles","InstancedMesh","ghostMat","DoubleSide","ghostPlaceholder","ghost","missGeo","buildMissPegGeometry","hitGeo","buildHitPegGeometry","pegMat","intensity","missMat","hitMat","missPegs","hitPegs","glowGeo","glowMat","hitGlow","im","m4","Matrix4","qIdentity","Quaternion","v3","s3","colorFrom","colorTo","colorT","selected","selectT","hoverTarget","scanT","mode","instant","cell","preview","minR","maxR","minC","maxC","ghostGeo","nm","nh","shots","row","skip","ha","intro","pulse","MAX_EMITTERS","SMOKE_PER","EMBER_PER","lin$1","makeShipMaterial","uTrim","trim","uTrimIntensity","trimIntensity","shader","tag","SMOKE_VERT","SMOKE_FRAG","makeParticleGeometry","per","emitter","createFleet","group","intact","wreck","geoCache","geometryFor","key","cls","emitA","emitB","Vector4","uEmitA","uEmitB","uPTime","updateScale","smokeGeo","emberGeo","mkPMat","ember","NormalBlending","smokeMat","emberMat","smoke","embers","applyParticleQuality","low","castShadow","entries","sinkDur","layout","ship","sr","sc","vertical","clear","seen","ships","opts","id","sunk","e","isNew","animate","col","along","color","bobAmp","L","hb","heightAt","hs","hp","hq","h","idle","pitch","roll","NAVY","FOG_DENSITY","FOV","DRAG_PX","MAX_DT","lin","OutputShader","detectQuality","coarse","small","cores","pixelRatioFor","d","easeInOut","validCell","createBattleScene","container","autoQuality","initialDpr","WebGLRenderer","sRGBEncoding","ACESFilmicToneMapping","PCFSoftShadowMap","width","height","Scene","FogExp2","PerspectiveCamera","controls","OrbitControls","hemi","HemisphereLight","sun","DirectionalLight","rimCyan","rimViolet","ocean","board","fleet","radar","effects","composer","bloomPass","outputPass","ensureComposer","rt","WebGLMultisampleRenderTarget","EffectComposer","RenderPass","UnrealBloomPass","ShaderPass","disposeComposer","home","tween","tmpDir","userMoved","computeHome","aspect","portrait","halfV","halfH","rh","rv","snapCamera","startTween","dur","resize","ro","docVisible","onScreen","io","updateRunning","onVisibility","interactive","lastView","pendingKeys","pendingShots","recentImpacts","shipHas","test","isPending","isRecent","syncOpts","applyShips","applyMarkers","raycaster","Raycaster","ndc","boardPlane","Plane","hitPoint","hoverKey","cursor","down","setCursor","cellAt","rect","clientX","clientY","setHover","onCellHover","onPointerDown","onPointerMove","onPointerUp","click","onCellSelect","onPointerLeave","onPointerCancel","shotFrom","shotTo","finishShot","rec","flushPending","clock","Clock","rafId","perfAcc","perfFrames","raw","should","view","nextMode","first","incoming","onShip"],"sources":["../../src/games/battleship/scene/effects.js","../../src/games/battleship/scene/radar.js","../../src/games/battleship/scene/core-ocean.js","../../src/games/battleship/scene/core-board.js","../../src/games/battleship/scene/core-ships.js","../../src/games/battleship/scene/createBattleScene.js"],"sourcesContent":["// Battleship FX: projectiles, splashes, explosions.\n// Fully pooled: every GPU resource is created once; update() performs no allocations.\n// Particle motion runs on the GPU (CPU only sets a handful of uniforms per active slot).\nimport {\n AdditiveBlending,\n BufferAttribute,\n BufferGeometry,\n Color,\n DataTexture,\n DynamicDrawUsage,\n Group,\n LinearFilter,\n Mesh,\n PlaneGeometry,\n PointLight,\n Points,\n RGBAFormat,\n ShaderMaterial,\n Sprite,\n SpriteMaterial,\n Vector2,\n Vector3,\n} from 'three'\n\nconst MAX_SLOTS = 6\nconst PARTICLES_HIGH = 260\nconst PARTICLES_LOW = 90\nconst TRAIL_HIGH = 32\nconst TRAIL_LOW = 14\nconst TRAIL_SPAN = 0.22 // fraction of flight time covered by the trail\nconst FX_ORDER = 10\n\nconst COLOR_CYAN = new Color('#22d3ee')\nconst COLOR_VIOLET = new Color('#a78bfa')\nconst COLOR_ORANGE = new Color('#fb923c')\nconst COLOR_RED = new Color('#f43f5e')\nconst COLOR_FOAM = new Color('#e8fbff')\nconst COLOR_FLASH = new Color('#fff3d6')\n\n// ---------------------------------------------------------------- helpers\n\nfunction makeGlowTexture(size = 64) {\n const data = new Uint8Array(size * size * 4)\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const dx = ((x + 0.5) / size) * 2 - 1\n const dy = ((y + 0.5) / size) * 2 - 1\n const d = Math.min(1, Math.sqrt(dx * dx + dy * dy))\n const f = 1 - d\n const a = Math.min(1, Math.pow(f, 2.2) + Math.pow(f, 10) * 0.8)\n const i = (y * size + x) * 4\n data[i] = 255\n data[i + 1] = 255\n data[i + 2] = 255\n data[i + 3] = Math.round(a * 255)\n }\n }\n const tex = new DataTexture(data, size, size, RGBAFormat)\n tex.magFilter = LinearFilter\n tex.minFilter = LinearFilter\n tex.generateMipmaps = false\n tex.needsUpdate = true\n return tex\n}\n\nconst clamp01 = (v) => (v < 0 ? 0 : v > 1 ? 1 : v)\nconst easeOutCubic = (t) => 1 - (1 - t) * (1 - t) * (1 - t)\n// Ballistic-feeling ease: half linear, half sine in-out.\nconst easeFlight = (t) => {\n const c = clamp01(t)\n return c * 0.45 + (0.5 - 0.5 * Math.cos(Math.PI * c)) * 0.55\n}\n\n// ---------------------------------------------------------------- shaders\n\nconst PARTICLE_VERT = /* glsl */ `\nuniform float uTime;\nuniform vec3 uOrigin;\nuniform float uMode; // 0 = splash, 1 = explosion\nuniform float uScale; // drawingBufferHeight * 0.5 * proj[1][1]\nuniform float uSpin;\nuniform float uPower;\nuniform float uLife;\nuniform float uFlicker;\nattribute vec3 aDir;\nattribute vec4 aSeed;\nvarying vec4 vColor;\nconst float G = 9.8;\n\nvec3 rotY(vec3 v, float a) {\n float c = cos(a); float s = sin(a);\n return vec3(c * v.x - s * v.z, v.y, s * v.x + c * v.z);\n}\n\nvoid main() {\n vec3 dir = rotY(aDir, uSpin);\n float t = uTime - aSeed.w * 0.08;\n vec3 offs = vec3(0.0);\n float alpha = 0.0;\n float size = 0.0;\n vec3 col = vec3(1.0);\n\n if (t > 0.0) {\n if (uMode < 0.5) {\n // ---- water splash: central column + flung droplets, ballistic gravity\n float drop = step(0.68, aSeed.z);\n vec2 hd = normalize(dir.xz + vec2(1e-4));\n vec2 h = hd * mix(0.18 + 0.32 * aSeed.x, 0.8 + 0.9 * aSeed.x, drop) * uPower;\n float vy = mix(2.9 + 1.6 * aSeed.y, 1.5 + 1.3 * aSeed.y, drop) * uPower;\n float tl = 2.0 * vy / G;\n float k = clamp(t / tl, 0.0, 1.0);\n offs = vec3(h.x * t, vy * t - 0.5 * G * t * t, h.y * t);\n offs.y = max(offs.y, 0.0);\n alpha = (1.0 - smoothstep(0.7, 1.0, k)) * step(t, tl) * mix(0.5, 0.95, drop);\n size = mix(0.17, 0.06, drop) * (0.7 + 0.6 * aSeed.x) * (1.0 - 0.35 * k);\n col = mix(vec3(0.91, 0.98, 1.0), vec3(0.45, 0.85, 0.95), aSeed.y * 0.55 + drop * 0.25);\n } else {\n float kind = aSeed.z;\n if (kind < 0.58) {\n // ---- fireball: drag-damped burst, buoyant, orange -> red -> smoke gray\n vec3 d = normalize(vec3(dir.x, abs(dir.y) * 0.9 + 0.25, dir.z));\n float sp = (2.0 + 3.2 * aSeed.x) * uPower;\n float life = (0.55 + 0.5 * aSeed.y) * mix(1.0, uLife, 0.5);\n float k = t / life;\n float drag = 3.2;\n offs = d * sp * (1.0 - exp(-drag * t)) / drag + vec3(0.0, 0.35 * t * t, 0.0);\n alpha = (1.0 - smoothstep(0.55, 1.0, k)) * step(t, life);\n size = (0.2 + 0.24 * aSeed.y) * (0.55 + 0.9 * smoothstep(0.0, 0.6, k));\n col = mix(vec3(1.0, 0.95, 0.75), vec3(0.984, 0.573, 0.235), smoothstep(0.0, 0.2, k));\n col = mix(col, vec3(0.957, 0.247, 0.369), smoothstep(0.2, 0.55, k));\n col = mix(col, vec3(0.30, 0.29, 0.34), smoothstep(0.55, 0.95, k));\n } else if (kind < 0.8) {\n // ---- embers: fast sparks falling under gravity, flickering\n vec3 d = normalize(vec3(dir.x, abs(dir.y) + 0.4, dir.z));\n float sp = (3.0 + 3.0 * aSeed.x) * uPower;\n float life = (1.2 + 0.8 * aSeed.y) * uLife;\n float k = t / life;\n float drag = 1.4;\n offs = d * sp * (1.0 - exp(-drag * t)) / drag - vec3(0.0, 1.6 * t * t, 0.0);\n offs.y = max(offs.y, 0.02 - uOrigin.y);\n float fl = mix(1.0, 0.6 + 0.4 * sin(t * 30.0 + aSeed.w * 40.0), uFlicker);\n alpha = (1.0 - k) * step(t, life) * fl;\n size = 0.05 + 0.04 * aSeed.x;\n col = mix(vec3(1.0, 0.82, 0.5), vec3(0.984, 0.45, 0.2), k);\n } else {\n // ---- smoke: slow rise, grows, low alpha\n float life = (1.6 + 0.6 * aSeed.y) * uLife;\n float k = t / life;\n offs = vec3(dir.x * 0.5, 0.0, dir.z * 0.5) * (1.0 - exp(-2.0 * t)) + vec3(0.0, 0.55 * t, 0.0);\n alpha = smoothstep(0.0, 0.15, k) * (1.0 - smoothstep(0.5, 1.0, k)) * 0.26 * step(t, life);\n size = (0.35 + 0.3 * aSeed.x) * (0.6 + 1.4 * k);\n col = mix(vec3(0.55, 0.40, 0.36), vec3(0.30, 0.30, 0.40), k);\n }\n }\n }\n\n vec4 mv = modelViewMatrix * vec4(uOrigin + offs, 1.0);\n gl_Position = projectionMatrix * mv;\n gl_PointSize = alpha > 0.002 ? size * uScale / max(-mv.z, 0.1) : 0.0;\n vColor = vec4(col, alpha);\n}\n`\n\nconst PARTICLE_FRAG = /* glsl */ `\nvarying vec4 vColor;\nvoid main() {\n float d = length(gl_PointCoord - 0.5) * 2.0;\n if (d > 1.0) discard;\n float f = 1.0 - d;\n float a = pow(f, 1.6);\n gl_FragColor = vec4(vColor.rgb * (1.0 + 0.6 * pow(f, 6.0)), vColor.a * a);\n #include <encodings_fragment>\n}\n`\n\nconst TRAIL_VERT = /* glsl */ `\nuniform float uScale;\nuniform float uSize;\nattribute float aFade;\nvarying float vFade;\nvoid main() {\n vec4 mv = modelViewMatrix * vec4(position, 1.0);\n gl_Position = projectionMatrix * mv;\n gl_PointSize = uSize * (1.0 - aFade * 0.8) * uScale / max(-mv.z, 0.1);\n vFade = aFade;\n}\n`\n\nconst TRAIL_FRAG = /* glsl */ `\nuniform float uOpacity;\nuniform vec3 uHead;\nuniform vec3 uTail;\nvarying float vFade;\nvoid main() {\n float d = length(gl_PointCoord - 0.5) * 2.0;\n if (d > 1.0) discard;\n float a = pow(1.0 - d, 1.8) * pow(1.0 - vFade, 1.5) * uOpacity;\n gl_FragColor = vec4(mix(uHead, uTail, vFade), a);\n #include <encodings_fragment>\n}\n`\n\nconst RING_VERT = /* glsl */ `\nvarying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`\n\nconst RING_FRAG = /* glsl */ `\nuniform vec3 uColor;\nuniform vec3 uInner;\nuniform float uOpacity;\nuniform float uWidth;\nuniform float uNoise;\nuniform float uSeed;\nvarying vec2 vUv;\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float r = length(p);\n if (r > 1.0) discard;\n float band = 1.0 - smoothstep(0.0, uWidth, abs(r - 0.85));\n float ang = atan(p.y, p.x);\n float n = 0.65 + 0.35 * sin(ang * 13.0 + uSeed) * sin(ang * 7.0 - uSeed * 1.7);\n band *= mix(1.0, n, uNoise);\n float fill = smoothstep(0.85, 0.2, r) * 0.18;\n vec3 col = uColor * band + uInner * fill;\n gl_FragColor = vec4(col, (band + fill) * uOpacity);\n #include <encodings_fragment>\n}\n`\n\n// ---------------------------------------------------------------- factory\n\nexport function createEffects(scene, { quality = 'high', reducedMotion = false } = {}) {\n const root = new Group()\n root.name = 'battleship-effects'\n scene.add(root)\n\n // Shared, view-dependent point scale (written in onBeforeRender, read by all point shaders).\n const scaleUniform = { value: 600 }\n const bufferSize = new Vector2()\n const updatePointScale = (renderer, _scene, camera) => {\n renderer.getDrawingBufferSize(bufferSize)\n scaleUniform.value = bufferSize.y * 0.5 * camera.projectionMatrix.elements[5]\n }\n\n // ---- shared resources\n const glowTex = makeGlowTexture(64)\n const planeGeom = new PlaneGeometry(1, 1)\n\n const particleGeom = new BufferGeometry()\n {\n const n = PARTICLES_HIGH\n const pos = new Float32Array(n * 3)\n const dir = new Float32Array(n * 3)\n const seed = new Float32Array(n * 4)\n for (let i = 0; i < n; i++) {\n // uniform direction on the unit sphere\n const u = Math.random() * 2 - 1\n const th = Math.random() * Math.PI * 2\n const s = Math.sqrt(1 - u * u)\n dir[i * 3] = s * Math.cos(th)\n dir[i * 3 + 1] = u\n dir[i * 3 + 2] = s * Math.sin(th)\n seed[i * 4] = Math.random()\n seed[i * 4 + 1] = Math.random()\n seed[i * 4 + 2] = Math.random()\n seed[i * 4 + 3] = Math.random()\n }\n particleGeom.setAttribute('position', new BufferAttribute(pos, 3))\n particleGeom.setAttribute('aDir', new BufferAttribute(dir, 3))\n particleGeom.setAttribute('aSeed', new BufferAttribute(seed, 4))\n }\n\n const haloMat = new SpriteMaterial({\n map: glowTex,\n color: COLOR_CYAN,\n blending: AdditiveBlending,\n transparent: true,\n depthWrite: false,\n })\n const coreMat = new SpriteMaterial({\n map: glowTex,\n color: 0xffffff,\n blending: AdditiveBlending,\n transparent: true,\n depthWrite: false,\n })\n\n // Single pooled light. Always in the scene (intensity 0 when idle) so lit\n // materials never recompile because the light count changes.\n const light = new PointLight(COLOR_ORANGE, 0, 6, 2)\n light.castShadow = false\n root.add(light)\n let lightStart = -1\n\n // ---- per-slot objects\n const slots = []\n const allMaterials = [haloMat, coreMat]\n const allGeometries = [planeGeom, particleGeom]\n\n function makeSpriteMat(color) {\n const m = new SpriteMaterial({\n map: glowTex,\n color,\n blending: AdditiveBlending,\n transparent: true,\n depthWrite: false,\n opacity: 0,\n })\n allMaterials.push(m)\n return m\n }\n\n for (let i = 0; i < MAX_SLOTS; i++) {\n const halo = new Sprite(haloMat)\n const core = new Sprite(coreMat)\n halo.scale.setScalar(0.7)\n core.scale.setScalar(0.24)\n halo.renderOrder = FX_ORDER + 1\n core.renderOrder = FX_ORDER + 2\n\n const muzzleMat = makeSpriteMat(COLOR_CYAN)\n const muzzle = new Sprite(muzzleMat)\n muzzle.renderOrder = FX_ORDER + 2\n\n const flashMat = makeSpriteMat(COLOR_FLASH)\n const flash = new Sprite(flashMat)\n flash.renderOrder = FX_ORDER + 3\n\n // trail: fixed-size buffer, positions re-evaluated analytically from the arc\n const trailPos = new Float32Array(TRAIL_HIGH * 3)\n const trailFade = new Float32Array(TRAIL_HIGH)\n const trailGeom = new BufferGeometry()\n const trailPosAttr = new BufferAttribute(trailPos, 3)\n trailPosAttr.setUsage(DynamicDrawUsage)\n trailGeom.setAttribute('position', trailPosAttr)\n trailGeom.setAttribute('aFade', new BufferAttribute(trailFade, 1))\n const trailMat = new ShaderMaterial({\n uniforms: {\n uScale: scaleUniform,\n uSize: { value: 0.16 },\n uOpacity: { value: 1 },\n uHead: { value: COLOR_CYAN.clone() },\n uTail: { value: COLOR_VIOLET.clone() },\n },\n vertexShader: TRAIL_VERT,\n fragmentShader: TRAIL_FRAG,\n blending: AdditiveBlending,\n transparent: true,\n depthWrite: false,\n })\n const trail = new Points(trailGeom, trailMat)\n trail.frustumCulled = false\n trail.renderOrder = FX_ORDER\n trail.onBeforeRender = updatePointScale\n\n const partMat = new ShaderMaterial({\n uniforms: {\n uTime: { value: 0 },\n uOrigin: { value: new Vector3() },\n uMode: { value: 0 },\n uScale: scaleUniform,\n uSpin: { value: 0 },\n uPower: { value: 1 },\n uLife: { value: 1 },\n uFlicker: { value: 1 },\n },\n vertexShader: PARTICLE_VERT,\n fragmentShader: PARTICLE_FRAG,\n blending: AdditiveBlending,\n transparent: true,\n depthWrite: false,\n })\n const particles = new Points(particleGeom, partMat)\n particles.frustumCulled = false\n particles.renderOrder = FX_ORDER\n particles.onBeforeRender = updatePointScale\n\n const ringMat = new ShaderMaterial({\n uniforms: {\n uColor: { value: new Color() },\n uInner: { value: new Color() },\n uOpacity: { value: 0 },\n uWidth: { value: 0.1 },\n uNoise: { value: 0 },\n uSeed: { value: 0 },\n },\n vertexShader: RING_VERT,\n fragmentShader: RING_FRAG,\n blending: AdditiveBlending,\n transparent: true,\n depthWrite: false,\n })\n const ring = new Mesh(planeGeom, ringMat)\n ring.rotation.x = -Math.PI / 2\n ring.renderOrder = FX_ORDER - 1\n\n allMaterials.push(trailMat, partMat, ringMat)\n allGeometries.push(trailGeom)\n\n const objects = [halo, core, muzzle, flash, trail, particles, ring]\n for (const o of objects) {\n o.visible = false\n root.add(o)\n }\n\n slots.push({\n index: i,\n active: false,\n result: 'miss',\n onImpact: null,\n start: 0,\n flightDur: 0.9,\n impacted: false,\n impactAt: 0,\n endAt: 0,\n arcHeight: 1.5,\n from: new Vector3(),\n to: new Vector3(),\n halo,\n core,\n muzzle,\n muzzleMat,\n flash,\n flashMat,\n trail,\n trailMat,\n trailPos,\n trailPosAttr,\n trailFade,\n trailGeom,\n particles,\n partMat,\n ring,\n ringMat,\n })\n }\n\n // ---- quality state\n let currentQuality = quality === 'low' ? 'low' : 'high'\n let trailCount = TRAIL_HIGH\n const flightDur = reducedMotion ? 0.65 : 0.9\n\n function applyQuality() {\n const base = currentQuality === 'low' ? PARTICLES_LOW : PARTICLES_HIGH\n const count = reducedMotion ? Math.round(base * 0.5) : base\n particleGeom.setDrawRange(0, count)\n trailCount = currentQuality === 'low' ? TRAIL_LOW : TRAIL_HIGH\n for (let s = 0; s < slots.length; s++) {\n const slot = slots[s]\n const fade = slot.trailFade\n for (let i = 0; i < TRAIL_HIGH; i++) fade[i] = i < trailCount ? i / (trailCount - 1) : 1\n slot.trailGeom.getAttribute('aFade').needsUpdate = true\n slot.trailGeom.setDrawRange(0, trailCount)\n slot.trailMat.uniforms.uSize.value = currentQuality === 'low' ? 0.2 : 0.15\n }\n }\n applyQuality()\n\n let now = 0\n\n // Writes the arc position at normalized progress u (0..1) into out.\n function arcPoint(slot, u, out) {\n out.lerpVectors(slot.from, slot.to, u)\n out.y += slot.arcHeight * 4 * u * (1 - u)\n return out\n }\n\n function hideSlot(slot) {\n slot.halo.visible = false\n slot.core.visible = false\n slot.muzzle.visible = false\n slot.flash.visible = false\n slot.trail.visible = false\n slot.particles.visible = false\n slot.ring.visible = false\n }\n\n function fireImpact(slot) {\n if (slot.impacted) return\n slot.impacted = true\n slot.impactAt = now\n const hit = slot.result === 'hit'\n const pu = slot.partMat.uniforms\n pu.uOrigin.value.copy(slot.to)\n pu.uMode.value = hit ? 1 : 0\n pu.uSpin.value = Math.random() * Math.PI * 2\n pu.uPower.value = reducedMotion ? 0.7 : 1\n pu.uLife.value = reducedMotion ? 0.6 : 1\n pu.uFlicker.value = reducedMotion ? 0 : 1\n pu.uTime.value = 0\n slot.particles.visible = true\n\n const ru = slot.ringMat.uniforms\n ru.uColor.value.copy(hit ? COLOR_ORANGE : COLOR_FOAM)\n ru.uInner.value.copy(hit ? COLOR_RED : COLOR_CYAN)\n ru.uNoise.value = hit ? 0.2 : 1\n ru.uWidth.value = hit ? 0.09 : 0.12\n ru.uSeed.value = Math.random() * 10\n slot.ring.position.set(slot.to.x, slot.to.y + 0.02, slot.to.z)\n slot.ring.visible = true\n\n slot.flashMat.color.copy(hit ? COLOR_FLASH : COLOR_FOAM)\n slot.flash.position.set(slot.to.x, slot.to.y + (hit ? 0.25 : 0.1), slot.to.z)\n slot.flash.visible = true\n\n slot.endAt = now + (hit ? (reducedMotion ? 1.5 : 2.4) : reducedMotion ? 0.9 : 1.3)\n\n if (hit) {\n light.position.set(slot.to.x, slot.to.y + 0.6, slot.to.z)\n lightStart = now\n }\n\n const cb = slot.onImpact\n slot.onImpact = null\n if (cb) cb()\n }\n\n function updateSlot(slot) {\n const local = now - slot.start\n const t = local / slot.flightDur\n\n if (!slot.impacted && t >= 1) fireImpact(slot)\n\n // projectile\n if (t < 1) {\n const p = arcPoint(slot, easeFlight(t), slot.halo.position)\n slot.core.position.copy(p)\n slot.halo.visible = true\n slot.core.visible = true\n } else {\n slot.halo.visible = false\n slot.core.visible = false\n }\n\n // trail (re-sampled analytically: no history buffer needed)\n if (t < 1 + TRAIL_SPAN) {\n const pos = slot.trailPos\n const last = trailCount - 1\n for (let i = 0; i < trailCount; i++) {\n const ti = t - (i / last) * TRAIL_SPAN\n const u = easeFlight(ti < 0 ? 0 : ti > 1 ? 1 : ti)\n const fx = slot.from\n const tx = slot.to\n const k = i * 3\n pos[k] = fx.x + (tx.x - fx.x) * u\n pos[k + 1] = fx.y + (tx.y - fx.y) * u + slot.arcHeight * 4 * u * (1 - u)\n pos[k + 2] = fx.z + (tx.z - fx.z) * u\n }\n slot.trailPosAttr.needsUpdate = true\n slot.trailMat.uniforms.uOpacity.value = t < 1 ? 1 : 1 - (t - 1) / TRAIL_SPAN\n slot.trail.visible = true\n } else {\n slot.trail.visible = false\n }\n\n // muzzle flash\n const mDur = reducedMotion ? 0.12 : 0.2\n if (local < mDur) {\n const k = local / mDur\n slot.muzzle.scale.setScalar(0.35 + k * (reducedMotion ? 0.4 : 0.9))\n slot.muzzleMat.opacity = (1 - k) * (1 - k)\n slot.muzzle.visible = true\n } else {\n slot.muzzle.visible = false\n }\n\n if (!slot.impacted) return\n\n const it = now - slot.impactAt\n const hit = slot.result === 'hit'\n slot.partMat.uniforms.uTime.value = it\n\n // impact flash\n const fDur = hit ? 0.32 : 0.18\n if (it < fDur) {\n const k = it / fDur\n const maxS = hit ? (reducedMotion ? 1.3 : 2.4) : 0.9\n slot.flash.scale.setScalar(0.3 + easeOutCubic(k) * maxS)\n slot.flashMat.opacity = (1 - k) * (hit ? 1 : 0.6)\n if (hit) slot.flashMat.color.copy(COLOR_FLASH).lerp(COLOR_ORANGE, k)\n } else {\n slot.flash.visible = false\n }\n\n // shockwave / foam ring\n const rDur = hit ? 0.65 : 1.0\n if (it < rDur) {\n const k = it / rDur\n const radius = 0.08 + easeOutCubic(k) * (hit ? (reducedMotion ? 0.9 : 1.6) : 0.85)\n slot.ring.scale.setScalar((radius * 2) / 0.85)\n slot.ringMat.uniforms.uOpacity.value = (1 - k) * (1 - k * 0.5) * (hit ? 1.2 : 0.8)\n } else {\n slot.ring.visible = false\n }\n }\n\n function updateLight() {\n if (lightStart < 0) return\n const it = now - lightStart\n if (it > 0.9) {\n light.intensity = 0\n lightStart = -1\n return\n }\n const peak = reducedMotion ? 2.5 : 4\n const flicker = reducedMotion ? 1 : 0.85 + 0.15 * Math.sin(it * 47)\n light.intensity = peak * Math.exp(-it * 5) * flicker\n }\n\n function acquireSlot() {\n let oldest = null\n for (let i = 0; i < slots.length; i++) {\n const s = slots[i]\n if (!s.active) return s\n if (!oldest || s.start < oldest.start) oldest = s\n }\n // Steal the oldest; guarantee its onImpact still fires exactly once.\n if (!oldest.impacted) {\n const cb = oldest.onImpact\n oldest.onImpact = null\n oldest.impacted = true\n if (cb) cb()\n }\n return oldest\n }\n\n let disposed = false\n\n return {\n shoot(from, to, result, onImpact) {\n if (disposed) return\n const slot = acquireSlot()\n hideSlot(slot)\n slot.active = true\n slot.result = result === 'hit' ? 'hit' : 'miss'\n slot.onImpact = typeof onImpact === 'function' ? onImpact : null\n slot.from.copy(from)\n slot.to.copy(to)\n slot.start = now\n slot.flightDur = flightDur\n slot.impacted = false\n slot.endAt = Infinity\n const dist = Math.hypot(to.x - from.x, to.z - from.z)\n slot.arcHeight = Math.min(5, Math.max(1.2, 1.0 + dist * 0.35)) * (reducedMotion ? 0.7 : 1)\n slot.muzzle.position.copy(from)\n slot.halo.position.copy(from)\n slot.core.position.copy(from)\n },\n\n update(dt) {\n if (disposed) return\n now += Math.min(Math.max(dt || 0, 0), 0.1)\n for (let i = 0; i < slots.length; i++) {\n const slot = slots[i]\n if (!slot.active) continue\n updateSlot(slot)\n if (slot.impacted && now >= slot.endAt) {\n slot.active = false\n hideSlot(slot)\n }\n }\n updateLight()\n },\n\n setQuality(q) {\n const next = q === 'low' ? 'low' : 'high'\n if (next === currentQuality) return\n currentQuality = next\n applyQuality()\n },\n\n // Pending onImpact callbacks are dropped on dispose (scene teardown).\n dispose() {\n if (disposed) return\n disposed = true\n for (const s of slots) s.onImpact = null\n scene.remove(root)\n root.clear()\n for (const g of allGeometries) g.dispose()\n for (const m of allMaterials) m.dispose()\n glowTex.dispose()\n light.dispose?.()\n slots.length = 0\n },\n }\n}\n","// Holographic radar disc: rings, crosshair, ticks, rotating sweep with afterglow,\n// scanline noise; contacts as Points that flare as the sweep passes. 2 draw calls.\nimport {\n AdditiveBlending,\n BufferAttribute,\n BufferGeometry,\n Color,\n Group,\n Mesh,\n PlaneGeometry,\n Points,\n ShaderMaterial,\n Vector2,\n} from 'three'\n\nconst MAX_CONTACTS = 100\nexport const RADAR_DIAMETER = 3\nconst lin = (hex) => new Color(hex).convertSRGBToLinear()\n\nconst DISC_VERT = /* glsl */ `\nvarying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`\n\nconst DISC_FRAG = /* glsl */ `\nuniform float uAngle;\nuniform float uTime;\nuniform float uOpacity;\nuniform vec3 uCyan;\nuniform vec3 uViolet;\nvarying vec2 vUv;\nfloat hash(vec2 p) { return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453); }\nfloat band(float x, float w) { return 1.0 - smoothstep(0.0, w, abs(x)); }\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float r = length(p);\n if (r > 1.0) discard;\n float aa = max(fwidth(r), 1e-4) * 1.5;\n float ang = atan(p.y, p.x);\n\n float rings = band(r - 0.25, aa) + band(r - 0.5, aa) + band(r - 0.75, aa);\n float outer = band(r - 0.96, aa * 1.6) * 1.4 + band(r - 0.995, aa) * 0.8;\n float hair = (band(p.x, aa) + band(p.y, aa)) * step(r, 0.96) * 0.6;\n float tickPos = abs(fract(ang * 5.729578) - 0.5);\n float ticks = step(0.88, r) * step(r, 0.95) * band(tickPos, 0.08);\n\n float d = mod(uAngle - ang, 6.2831853);\n float trail = exp(-d * 2.4) * step(r, 0.96);\n float lead = band(d, 0.025) * step(r, 0.96);\n float noise = hash(floor(vec2(r * 70.0, ang * 30.0)) + floor(uTime * 14.0));\n float scan = 0.6 + 0.4 * sin(r * 140.0 - uTime * 5.0);\n\n vec3 col = uCyan * (rings * 0.5 + hair * 0.5 + trail * (0.4 + 0.25 * noise) * scan + lead * 1.3);\n col += uCyan * (1.0 - r) * 0.06;\n col += uViolet * (outer + ticks * 0.8 + smoothstep(0.82, 1.0, r) * 0.25);\n gl_FragColor = vec4(col, uOpacity);\n #include <encodings_fragment>\n}\n`\n\nconst BLIP_VERT = /* glsl */ `\nuniform float uAngle;\nuniform float uTime;\nuniform float uScale;\nvarying float vBright;\nvoid main() {\n float ang = atan(position.y, position.x);\n float d = mod(uAngle - ang, 6.2831853);\n vBright = 0.18 + exp(-d * 2.2) * 0.95;\n vec4 mv = modelViewMatrix * vec4(position, 1.0);\n gl_Position = projectionMatrix * mv;\n float size = 0.14 * (0.8 + 0.5 * vBright) * (0.9 + 0.1 * sin(uTime * 4.0 + position.x * 9.0));\n gl_PointSize = size * uScale / max(-mv.z, 0.1);\n}\n`\n\nconst BLIP_FRAG = /* glsl */ `\nuniform vec3 uColor;\nuniform float uOpacity;\nvarying float vBright;\nvoid main() {\n float d = length(gl_PointCoord - 0.5) * 2.0;\n if (d > 1.0) discard;\n float core = pow(1.0 - d, 2.2);\n vec3 col = mix(uColor, vec3(1.0), core * vBright * 0.6) * core * vBright * 1.6;\n gl_FragColor = vec4(col, uOpacity);\n #include <encodings_fragment>\n}\n`\n\nexport function createRadar({ quality = 'high', reducedMotion = false } = {}) {\n void quality // radar cost is already minimal; same in both modes\n const object = new Group()\n object.name = 'battleship-radar'\n // plate maps local XY → world XZ (tilted toward the viewer by the parent).\n const plate = new Group()\n plate.rotation.x = -Math.PI / 2\n object.add(plate)\n\n const R = RADAR_DIAMETER / 2\n const opacity = { value: 0 }\n const angle = { value: 0 }\n const time = { value: 0 }\n\n const discGeo = new PlaneGeometry(RADAR_DIAMETER, RADAR_DIAMETER)\n const discMat = new ShaderMaterial({\n uniforms: {\n uAngle: angle,\n uTime: time,\n uOpacity: opacity,\n uCyan: { value: lin('#22d3ee') },\n uViolet: { value: lin('#a78bfa') },\n },\n vertexShader: DISC_VERT,\n fragmentShader: DISC_FRAG,\n blending: AdditiveBlending,\n transparent: true,\n depthWrite: false,\n extensions: { derivatives: true },\n toneMapped: false,\n })\n const disc = new Mesh(discGeo, discMat)\n disc.renderOrder = 8\n plate.add(disc)\n\n const blipPos = new Float32Array(MAX_CONTACTS * 3)\n const blipGeo = new BufferGeometry()\n blipGeo.setAttribute('position', new BufferAttribute(blipPos, 3))\n blipGeo.setDrawRange(0, 0)\n const uScale = { value: 600 }\n const bufSize = new Vector2()\n const blipMat = new ShaderMaterial({\n uniforms: {\n uAngle: angle,\n uTime: time,\n uScale,\n uOpacity: opacity,\n uColor: { value: lin('#fb923c') },\n },\n vertexShader: BLIP_VERT,\n fragmentShader: BLIP_FRAG,\n blending: AdditiveBlending,\n transparent: true,\n depthWrite: false,\n toneMapped: false,\n })\n const blips = new Points(blipGeo, blipMat)\n blips.frustumCulled = false\n blips.renderOrder = 9\n blips.visible = false\n blips.onBeforeRender = (renderer, _s, camera) => {\n renderer.getDrawingBufferSize(bufSize)\n uScale.value = bufSize.y * 0.5 * camera.projectionMatrix.elements[5]\n }\n plate.add(blips)\n\n let target = 0\n const speed = reducedMotion ? 0.7 : 1.8\n object.visible = false\n\n return {\n object,\n update(dt, elapsed) {\n time.value = elapsed\n angle.value = (angle.value + dt * speed) % (Math.PI * 2)\n if (opacity.value !== target) {\n const step = dt / (reducedMotion ? 0.12 : 0.35)\n opacity.value = target > opacity.value ? Math.min(target, opacity.value + step) : Math.max(target, opacity.value - step)\n }\n object.visible = opacity.value > 0.001\n },\n setVisible(b) {\n target = b ? 1 : 0\n if (b) object.visible = true\n },\n setContacts(cells) {\n let n = 0\n if (Array.isArray(cells)) {\n for (let i = 0; i < cells.length && n < MAX_CONTACTS; i++) {\n const c = cells[i]\n if (!c || !Number.isFinite(c.row) || !Number.isFinite(c.col)) continue\n // board (col → x, row → z) into disc space; row grows toward the viewer (−local y)\n blipPos[n * 3] = ((c.col - 4.5) / 5) * 0.84 * R\n blipPos[n * 3 + 1] = (-(c.row - 4.5) / 5) * 0.84 * R\n blipPos[n * 3 + 2] = 0.01\n n++\n }\n }\n blipGeo.attributes.position.needsUpdate = true\n blipGeo.setDrawRange(0, n)\n blips.visible = n > 0\n },\n dispose() {\n object.removeFromParent()\n discGeo.dispose()\n discMat.dispose()\n blipGeo.dispose()\n blipMat.dispose()\n },\n }\n}\n","// Gerstner ocean + matching sky dome. The CPU mirrors the vertical wave term\n// (heightAt) so ships can bob in sync with the GPU surface.\nimport { BackSide, Color, Mesh, PlaneGeometry, ShaderMaterial, SphereGeometry, Vector3 } from 'three'\n\nexport const OCEAN_Y = -0.1\nconst TIME_SCALE = 0.55\nconst BOARD_DAMP = 0.16\n\n// [dirX, dirZ, steepness, wavelength, fine(0|1)] — dirs normalised below.\nconst WAVES = [\n [1.0, 0.28, 0.17, 9.0, 0],\n [-0.45, 1.0, 0.13, 5.6, 0],\n [0.72, -0.62, 0.1, 3.3, 1],\n [-0.92, -0.3, 0.075, 2.2, 1],\n].map(([x, z, s, l, f]) => {\n const len = Math.hypot(x, z)\n const k = (Math.PI * 2) / l\n return { dx: x / len, dz: z / len, s, l, f, k, c: Math.sqrt(9.8 / k) }\n})\n\nconst lin = (hex) => new Color(hex).convertSRGBToLinear()\nconst f = (n) => n.toFixed(5)\n\nconst WAVE_GLSL = WAVES.map(\n (w) =>\n `off += gerstner(vec4(${f(w.dx)}, ${f(w.dz)}, ${f(w.s)}, ${f(w.l)}), p, damp${w.f ? ' * fine' : ''}, uTime, tg, bn);`,\n).join('\\n ')\n\nconst OCEAN_VERT = /* glsl */ `\nuniform float uTime;\nuniform float uAmp;\nvarying vec3 vWorld;\nvarying vec3 vNormal;\nvarying float vHeight;\nvarying float vFogDepth;\n\nvec3 gerstner(vec4 w, vec2 p, float s, float t, inout vec3 tg, inout vec3 bn) {\n float k = 6.2831853 / w.w;\n float c = sqrt(9.8 / k);\n vec2 d = w.xy;\n float st = w.z * s;\n float ph = k * (dot(d, p) - c * t);\n float a = st / k;\n float sf = sin(ph);\n float cf = cos(ph);\n tg += vec3(-d.x * d.x * st * sf, d.x * st * cf, -d.x * d.y * st * sf);\n bn += vec3(-d.x * d.y * st * sf, d.y * st * cf, -d.y * d.y * st * sf);\n return vec3(d.x * a * cf, a * sf, d.y * a * cf);\n}\n\nvoid main() {\n vec4 wp = modelMatrix * vec4(position, 1.0);\n vec2 p = wp.xz;\n vec2 q = abs(p);\n float damp = mix(${f(BOARD_DAMP)}, 1.0, smoothstep(6.0, 10.0, max(q.x, q.y))) * uAmp;\n float fine = 1.0 - smoothstep(18.0, 45.0, length(p));\n vec3 tg = vec3(1.0, 0.0, 0.0);\n vec3 bn = vec3(0.0, 0.0, 1.0);\n vec3 off = vec3(0.0);\n ${WAVE_GLSL}\n wp.xyz += off;\n vHeight = off.y;\n vNormal = normalize(cross(bn, tg));\n vWorld = wp.xyz;\n vec4 mv = viewMatrix * wp;\n vFogDepth = -mv.z;\n gl_Position = projectionMatrix * mv;\n}\n`\n\nconst OCEAN_FRAG = /* glsl */ `\nuniform float uTime;\nuniform float uDetail;\nuniform vec3 uDeep;\nuniform vec3 uShallow;\nuniform vec3 uSky;\nuniform vec3 uHorizon;\nuniform vec3 uFoam;\nuniform vec3 uSunDir;\nuniform vec3 uSunColor;\nuniform vec3 uGlow;\nuniform vec3 uFogColor;\nuniform float uFogDensity;\nvarying vec3 vWorld;\nvarying vec3 vNormal;\nvarying float vHeight;\nvarying float vFogDepth;\n\nvoid main() {\n vec2 q = vWorld.xz;\n vec3 n = normalize(vNormal);\n float r1 = sin(dot(q, vec2(1.7, 0.9)) * 2.3 + uTime * 2.1);\n float r2 = sin(dot(q, vec2(-1.1, 1.9)) * 2.9 - uTime * 1.7);\n float r3 = sin(dot(q, vec2(0.4, -2.3)) * 4.1 + uTime * 2.7);\n n = normalize(n + vec3(r1 * 0.05 + r3 * 0.025, 0.0, r2 * 0.05 - r3 * 0.02) * uDetail);\n\n vec3 v = normalize(cameraPosition - vWorld);\n float ndv = max(dot(n, v), 0.0);\n float fres = 0.03 + 0.97 * pow(1.0 - ndv, 5.0);\n\n vec3 water = mix(uDeep, uShallow, clamp(vHeight * 2.4 + 0.35, 0.0, 1.0));\n vec3 rf = reflect(-v, n);\n vec3 sky = mix(uHorizon, uSky, clamp(rf.y * 1.6, 0.0, 1.0));\n vec3 col = mix(water, sky, fres * 0.9);\n\n float sd = max(dot(rf, uSunDir), 0.0);\n float sparkle = pow(sd, 240.0) * (2.2 + 1.8 * uDetail * max(r1 * r2, 0.0)) + pow(sd, 24.0) * 0.08;\n col += uSunColor * sparkle;\n\n vec2 aq = abs(q);\n float m = max(aq.x, aq.y);\n col *= mix(0.5, 1.0, smoothstep(5.0, 6.6, m));\n col += uGlow * exp(-max(m - 6.3, 0.0) * 0.6) * (0.08 + 0.3 * fres);\n\n float noise = 0.5 + 0.5 * sin(q.x * 3.1 + uTime * 0.7) * sin(q.y * 2.7 - uTime * 0.5);\n float crest = smoothstep(0.12, 0.34, vHeight) * (0.35 + 0.65 * noise);\n float edge = (1.0 - smoothstep(0.0, 0.45, abs(m - 6.42))) * (0.35 + 0.65 * noise);\n col = mix(col, uFoam, clamp(crest * 0.55 + edge * 0.45, 0.0, 1.0));\n\n float fogF = 1.0 - exp(-uFogDensity * uFogDensity * vFogDepth * vFogDepth);\n gl_FragColor = vec4(mix(col, uFogColor, clamp(fogF, 0.0, 1.0)), 1.0);\n #include <tonemapping_fragment>\n #include <encodings_fragment>\n}\n`\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`\n\nconst SKY_FRAG = /* glsl */ `\nuniform vec3 uFogColor;\nuniform vec3 uTop;\nuniform vec3 uHaze;\nvarying vec3 vDir;\nfloat hash(vec3 p) { return fract(sin(dot(p, vec3(12.9898, 78.233, 37.719))) * 43758.5453); }\nvoid main() {\n float h = vDir.y;\n vec3 col = mix(uFogColor, uTop, smoothstep(0.0, 0.55, h));\n col += uHaze * exp(-abs(h) * 14.0) * 0.6;\n vec3 cell = floor(vDir * 160.0);\n float s = hash(cell);\n col += vec3(0.75, 0.85, 1.0) * step(0.9975, s) * smoothstep(0.08, 0.4, h) * 0.6;\n gl_FragColor = vec4(col, 1.0);\n #include <tonemapping_fragment>\n #include <encodings_fragment>\n}\n`\n\nfunction buildOceanGeometry(seg) {\n const geo = new PlaneGeometry(2, 2, seg, seg)\n geo.rotateX(-Math.PI / 2)\n const pos = geo.attributes.position\n const R = 110\n // denser vertices near the board, sparse toward the horizon\n const remap = (u) => R * (0.2 * u + 0.8 * u * u * u)\n for (let i = 0; i < pos.count; i++) {\n pos.setX(i, remap(pos.getX(i)))\n pos.setZ(i, remap(pos.getZ(i)))\n }\n geo.deleteAttribute('uv')\n geo.deleteAttribute('normal')\n geo.computeBoundingSphere()\n return geo\n}\n\nexport function createOcean({ quality, reducedMotion, fogColor, fogDensity }) {\n const fogLin = fogColor.clone().convertSRGBToLinear()\n const uniforms = {\n uTime: { value: 0 },\n uAmp: { value: reducedMotion ? 0.3 : 1 },\n uDetail: { value: quality === 'low' ? 0.4 : 1 },\n uDeep: { value: lin('#04101f') },\n uShallow: { value: lin('#0f4c5c') },\n uSky: { value: lin('#16233d') },\n uHorizon: { value: lin('#33507a') },\n uFoam: { value: lin('#cfefff') },\n uSunDir: { value: new Vector3(-0.35, 0.55, -0.75).normalize() },\n uSunColor: { value: lin('#e6f6ff') },\n uGlow: { value: lin('#22d3ee') },\n uFogColor: { value: fogLin },\n uFogDensity: { value: fogDensity },\n }\n const material = new ShaderMaterial({\n uniforms,\n vertexShader: OCEAN_VERT,\n fragmentShader: OCEAN_FRAG,\n })\n let segments = quality === 'low' ? 64 : 160\n const mesh = new Mesh(buildOceanGeometry(segments), material)\n mesh.position.y = OCEAN_Y\n mesh.frustumCulled = false\n mesh.renderOrder = -1\n\n const skyGeo = new SphereGeometry(300, 24, 12)\n const skyMat = new ShaderMaterial({\n uniforms: {\n uFogColor: { value: fogLin },\n uTop: { value: lin('#03060d') },\n uHaze: { value: lin('#123048') },\n },\n vertexShader: SKY_VERT,\n fragmentShader: SKY_FRAG,\n side: BackSide,\n depthWrite: false,\n })\n const sky = new Mesh(skyGeo, skyMat)\n sky.frustumCulled = false\n sky.renderOrder = -2\n\n const timeScale = reducedMotion ? 0.35 : 1\n let t = 0\n let amp = uniforms.uAmp.value\n\n return {\n mesh,\n sky,\n uniforms,\n update(dt) {\n t += dt * TIME_SCALE * timeScale\n uniforms.uTime.value = t\n },\n // Vertical displacement at (x, z) — mirrors the vertex shader (ignores horizontal drift).\n heightAt(x, z) {\n const m = Math.max(Math.abs(x), Math.abs(z))\n const sm = Math.min(1, Math.max(0, (m - 6) / 4))\n const damp = (BOARD_DAMP + (1 - BOARD_DAMP) * sm * sm * (3 - 2 * sm)) * amp\n let y = 0\n for (let i = 0; i < WAVES.length; i++) {\n const w = WAVES[i]\n y += ((w.s * damp) / w.k) * Math.sin(w.k * (w.dx * x + w.dz * z - w.c * t))\n }\n return OCEAN_Y + y\n },\n setQuality(q) {\n const seg = q === 'low' ? 64 : 160\n uniforms.uDetail.value = q === 'low' ? 0.4 : 1\n if (seg === segments) return\n segments = seg\n mesh.geometry.dispose()\n mesh.geometry = buildOceanGeometry(seg)\n },\n setReducedMotion(rm) {\n amp = rm ? 0.3 : 1\n uniforms.uAmp.value = amp\n },\n dispose() {\n mesh.geometry.dispose()\n material.dispose()\n skyGeo.dispose()\n skyMat.dispose()\n },\n }\n}\n","// Holographic board: grid platform shader, steel frame, label atlas, hover (in-shader),\n// selection ring, placement preview (instanced tiles + ghost hull) and instanced shot markers.\nimport {\n AdditiveBlending,\n BufferAttribute,\n BufferGeometry,\n CanvasTexture,\n Color,\n DoubleSide,\n ExtrudeGeometry,\n InstancedMesh,\n LinearFilter,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n MeshStandardMaterial,\n Path,\n PlaneGeometry,\n Quaternion,\n ShaderMaterial,\n Shape,\n ShadowMaterial,\n Vector2,\n Vector3,\n} from 'three'\nimport { buildHitPegGeometry, buildMissPegGeometry } from './core-geo.js'\n\nexport const GRID_Y = 0.035\nconst INNER = 5.35\nconst OUTER = 6.3\nconst lin = (hex) => new Color(hex).convertSRGBToLinear()\n\nexport const MODE_COLORS = {\n own: { line: lin('#22d3ee').lerp(lin('#a78bfa'), 0.55), accent: lin('#a78bfa') },\n target: { line: lin('#22d3ee'), accent: lin('#f43f5e') },\n}\n\nconst GRID_VERT = /* glsl */ `\nvarying vec2 vP;\nvoid main() {\n vP = position.xz;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`\n\nconst GRID_FRAG = /* glsl */ `\nuniform vec3 uLine;\nuniform vec3 uAccent;\nuniform vec2 uHover;\nuniform float uHoverAmt;\nuniform float uTime;\nuniform float uScan;\nuniform float uActive;\nvarying vec2 vP;\nvoid main() {\n vec2 p = vP;\n vec2 a = abs(p);\n float m = max(a.x, a.y);\n float inside = 1.0 - step(5.0, m);\n vec2 fw = max(fwidth(p), vec2(1e-4));\n vec2 g = abs(fract(p + 0.5) - 0.5);\n vec2 l = 1.0 - smoothstep(fw * 0.6, fw * 1.9, g);\n float line = max(l.x, l.y) * inside;\n vec2 gg = exp(-g * 16.0);\n float glow = max(gg.x, gg.y) * 0.2 * inside;\n float node = l.x * l.y * inside;\n\n float border = 1.0 - smoothstep(0.0, 0.035 + fw.x * 1.5, abs(m - 5.0));\n float borderGlow = exp(-abs(m - 5.0) * 9.0) * 0.45;\n float corner = step(3.9, min(a.x, a.y)) * (1.0 - smoothstep(0.0, 0.035 + fw.x * 1.5, abs(m - 5.2)));\n\n float scan = 0.55 + 0.45 * sin(p.y * 70.0 + uTime * 3.0);\n float sweep = exp(-pow((p.y - uScan) * 2.4, 2.0)) * inside;\n\n vec2 cell = floor(p + 5.0);\n vec2 local = fract(p) - 0.5;\n float hov = uHoverAmt * inside * (1.0 - step(0.5, abs(cell.x - uHover.x) + abs(cell.y - uHover.y)));\n float hEdge = smoothstep(0.36, 0.47, max(abs(local.x), abs(local.y)));\n float hPulse = 0.8 + 0.2 * sin(uTime * 6.0);\n\n vec3 col = uLine * ((line * 0.85 + glow + node * 0.6) * mix(0.55, 1.0, uActive) + inside * 0.045 * scan + sweep * 0.14 * uActive);\n col += uAccent * (border * 1.1 + borderGlow + corner * 1.6);\n col += mix(uLine, vec3(1.0), 0.35) * hov * (0.16 + hEdge * 0.9) * hPulse;\n col *= 1.0 - smoothstep(5.22, ${INNER.toFixed(2)}, m);\n gl_FragColor = vec4(col, 1.0);\n #include <encodings_fragment>\n}\n`\n\nconst RING_FRAG = /* glsl */ `\nuniform vec3 uColor;\nuniform float uTime;\nuniform float uOpacity;\nvarying vec2 vUv;\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n vec2 a = abs(p);\n float sq = max(a.x, a.y);\n float bracket = (1.0 - smoothstep(0.0, 0.06, abs(sq - 0.8))) * step(0.42, min(a.x, a.y));\n float r = length(p);\n float ang = atan(p.y, p.x);\n float dash = step(0.45, fract(ang * 1.909859 + uTime * 0.25));\n float ring = (1.0 - smoothstep(0.0, 0.04, abs(r - 0.62))) * dash;\n float fill = (1.0 - smoothstep(0.0, 0.7, r)) * 0.12;\n vec3 col = uColor * (bracket * 1.4 + ring * 0.9 + fill);\n gl_FragColor = vec4(col, uOpacity);\n #include <encodings_fragment>\n}\n`\n\nconst UV_VERT = /* glsl */ `\nvarying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`\n\nconst INST_VERT = /* glsl */ `\nvarying vec2 vUv;\nvarying float vPhase;\nvoid main() {\n vUv = uv;\n vec4 wp = modelMatrix * instanceMatrix * vec4(position, 1.0);\n vPhase = wp.x * 1.7 + wp.z * 2.3;\n gl_Position = projectionMatrix * viewMatrix * wp;\n}\n`\n\nconst TILE_FRAG = /* glsl */ `\nuniform vec3 uColor;\nuniform float uTime;\nvarying vec2 vUv;\nvarying float vPhase;\nvoid main() {\n vec2 p = abs(vUv * 2.0 - 1.0);\n float m = max(p.x, p.y);\n float edge = smoothstep(0.78, 0.95, m) * (1.0 - smoothstep(0.95, 1.0, m));\n float pulse = 0.75 + 0.25 * sin(uTime * 5.0 + vPhase);\n float fill = 0.22 + 0.08 * sin((vUv.y + uTime * 0.6) * 30.0);\n gl_FragColor = vec4(uColor * (edge * 1.3 + fill) * pulse, 1.0);\n #include <encodings_fragment>\n}\n`\n\nconst HITGLOW_FRAG = /* glsl */ `\nuniform float uTime;\nuniform vec3 uHot;\nuniform vec3 uRed;\nvarying vec2 vUv;\nvarying float vPhase;\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float r = length(p);\n float pulse = 0.7 + 0.3 * sin(uTime * 3.2 + vPhase);\n float core = exp(-r * r * 9.0);\n float ring = (1.0 - smoothstep(0.0, 0.06, abs(r - (0.45 + 0.08 * pulse)))) * 0.5;\n vec3 col = mix(uRed, uHot, core) * (core * 0.9 + ring) * pulse;\n col *= 1.0 - smoothstep(0.85, 1.0, r);\n gl_FragColor = vec4(col, 1.0);\n #include <encodings_fragment>\n}\n`\n\nconst GHOST_VERT = /* glsl */ `\nvarying vec3 vN;\nvarying vec3 vView;\nvarying float vY;\nvoid main() {\n vec4 wp = modelMatrix * vec4(position, 1.0);\n vN = normalize(mat3(modelMatrix) * normal);\n vView = cameraPosition - wp.xyz;\n vY = wp.y;\n gl_Position = projectionMatrix * viewMatrix * wp;\n}\n`\n\nconst GHOST_FRAG = /* glsl */ `\nuniform vec3 uColor;\nuniform float uTime;\nvarying vec3 vN;\nvarying vec3 vView;\nvarying float vY;\nvoid main() {\n float f = 1.0 - abs(dot(normalize(vN), normalize(vView)));\n float scan = 0.6 + 0.4 * sin(vY * 120.0 - uTime * 6.0);\n gl_FragColor = vec4(uColor * (0.12 + pow(f, 2.0) * 0.9) * scan, 1.0);\n #include <encodings_fragment>\n}\n`\n\nfunction makeLabelAtlas() {\n const cell = 64\n const canvas = document.createElement('canvas')\n canvas.width = cell * 8\n canvas.height = cell * 4\n const ctx = canvas.getContext('2d')\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.fillStyle = '#ffffff'\n ctx.shadowColor = 'rgba(255,255,255,0.85)'\n ctx.shadowBlur = 7\n const glyphs = []\n for (let i = 0; i < 10; i++) glyphs.push(String.fromCharCode(65 + i))\n for (let i = 1; i <= 10; i++) glyphs.push(String(i))\n glyphs.forEach((g, i) => {\n const cx = (i % 8) * cell + cell / 2\n const cy = Math.floor(i / 8) * cell + cell / 2 + 2\n ctx.font = `600 ${g.length > 1 ? 34 : 40}px \"Inter\", \"Segoe UI\", system-ui, sans-serif`\n ctx.fillText(g, cx, cy)\n })\n const tex = new CanvasTexture(canvas)\n tex.minFilter = LinearFilter\n tex.magFilter = LinearFilter\n tex.generateMipmaps = false\n return tex\n}\n\n// One merged quad set (20 quads) lying on the frame, UV-mapped into the atlas.\nfunction makeLabelGeometry() {\n const S = 0.5\n const pos = []\n const uv = []\n const idx = []\n const push = (x, z, g) => {\n const u0 = (g % 8) / 8\n const v1 = 1 - Math.floor(g / 8) / 4\n const u1 = u0 + 1 / 8\n const v0 = v1 - 1 / 4\n const b = pos.length / 3\n pos.push(x - S / 2, 0, z + S / 2, x + S / 2, 0, z + S / 2, x + S / 2, 0, z - S / 2, x - S / 2, 0, z - S / 2)\n uv.push(u0, v0, u1, v0, u1, v1, u0, v1)\n idx.push(b, b + 1, b + 2, b, b + 2, b + 3)\n }\n const edge = (INNER + OUTER) / 2\n for (let r = 0; r < 10; r++) push(-edge, r - 4.5, r)\n for (let c = 0; c < 10; c++) push(c - 4.5, -edge, 10 + c)\n const geo = new BufferGeometry()\n geo.setAttribute('position', new BufferAttribute(new Float32Array(pos), 3))\n geo.setAttribute('uv', new BufferAttribute(new Float32Array(uv), 2))\n geo.setIndex(idx)\n geo.computeBoundingSphere()\n return geo\n}\n\nfunction makeFrameGeometry() {\n const shape = new Shape()\n shape.moveTo(-OUTER, -OUTER)\n shape.lineTo(OUTER, -OUTER)\n shape.lineTo(OUTER, OUTER)\n shape.lineTo(-OUTER, OUTER)\n shape.lineTo(-OUTER, -OUTER)\n const hole = new Path()\n hole.moveTo(-INNER, -INNER)\n hole.lineTo(-INNER, INNER)\n hole.lineTo(INNER, INNER)\n hole.lineTo(INNER, -INNER)\n hole.lineTo(-INNER, -INNER)\n shape.holes.push(hole)\n const geo = new ExtrudeGeometry(shape, {\n depth: 0.16,\n bevelEnabled: true,\n bevelThickness: 0.025,\n bevelSize: 0.025,\n bevelSegments: 1,\n curveSegments: 1,\n })\n geo.rotateX(-Math.PI / 2)\n geo.translate(0, -0.135, 0)\n return geo\n}\n\nexport function createBoard({ quality }) {\n const uTime = { value: 0 }\n const objects = []\n const geometries = []\n const materials = []\n const track = (g, m) => {\n if (g) geometries.push(g)\n if (m) materials.push(m)\n }\n\n const lineColor = MODE_COLORS.target.line.clone()\n const accentColor = MODE_COLORS.target.accent.clone()\n\n // --- grid platform\n const gridGeo = new PlaneGeometry(INNER * 2, INNER * 2, 1, 1)\n gridGeo.rotateX(-Math.PI / 2)\n const gridUniforms = {\n uLine: { value: lineColor },\n uAccent: { value: accentColor },\n uHover: { value: new Vector2(-10, -10) },\n uHoverAmt: { value: 0 },\n uTime,\n uScan: { value: -6 },\n uActive: { value: 1 },\n }\n const gridMat = new ShaderMaterial({\n uniforms: gridUniforms,\n vertexShader: GRID_VERT,\n fragmentShader: GRID_FRAG,\n blending: AdditiveBlending,\n transparent: true,\n depthWrite: false,\n extensions: { derivatives: true },\n toneMapped: false,\n })\n const grid = new Mesh(gridGeo, gridMat)\n grid.position.y = GRID_Y\n grid.renderOrder = 2\n objects.push(grid)\n track(gridGeo, gridMat)\n\n // --- steel frame\n const frameGeo = makeFrameGeometry()\n const frameMat = new MeshStandardMaterial({\n color: lin('#151c2b'),\n metalness: 0.75,\n roughness: 0.38,\n emissive: accentColor,\n emissiveIntensity: 0.06,\n })\n const frame = new Mesh(frameGeo, frameMat)\n frame.receiveShadow = true\n objects.push(frame)\n track(frameGeo, frameMat)\n\n // --- labels (one draw call)\n const labelTex = makeLabelAtlas()\n const labelGeo = makeLabelGeometry()\n const labelMat = new MeshBasicMaterial({\n map: labelTex,\n color: lineColor,\n transparent: true,\n depthWrite: false,\n blending: AdditiveBlending,\n toneMapped: false,\n })\n const labels = new Mesh(labelGeo, labelMat)\n labels.position.y = 0.055\n labels.renderOrder = 3\n objects.push(labels)\n track(labelGeo, labelMat)\n\n // --- shadow catcher (high quality only)\n const shadowGeo = new PlaneGeometry(INNER * 2, INNER * 2)\n shadowGeo.rotateX(-Math.PI / 2)\n const shadowMat = new ShadowMaterial({ opacity: 0.35, depthWrite: false })\n const shadowCatcher = new Mesh(shadowGeo, shadowMat)\n shadowCatcher.position.y = GRID_Y - 0.005\n shadowCatcher.receiveShadow = true\n shadowCatcher.renderOrder = 1\n shadowCatcher.visible = quality !== 'low'\n objects.push(shadowCatcher)\n track(shadowGeo, shadowMat)\n\n // --- selection ring\n const ringGeo = new PlaneGeometry(1.25, 1.25)\n ringGeo.rotateX(-Math.PI / 2)\n const ringMat = new ShaderMaterial({\n uniforms: { uColor: { value: accentColor }, uTime, uOpacity: { value: 1 } },\n vertexShader: UV_VERT,\n fragmentShader: RING_FRAG,\n blending: AdditiveBlending,\n transparent: true,\n depthWrite: false,\n toneMapped: false,\n })\n const ring = new Mesh(ringGeo, ringMat)\n ring.position.y = GRID_Y + 0.02\n ring.renderOrder = 4\n ring.visible = false\n objects.push(ring)\n track(ringGeo, ringMat)\n\n // --- placement preview tiles (5 instances)\n const tileGeo = new PlaneGeometry(0.92, 0.92)\n tileGeo.rotateX(-Math.PI / 2)\n const tileColor = { value: lin('#34d399') }\n const tileMat = new ShaderMaterial({\n uniforms: { uColor: tileColor, uTime },\n vertexShader: INST_VERT,\n fragmentShader: TILE_FRAG,\n blending: AdditiveBlending,\n transparent: true,\n depthWrite: false,\n toneMapped: false,\n })\n const tiles = new InstancedMesh(tileGeo, tileMat, 5)\n tiles.count = 0\n tiles.visible = false\n tiles.frustumCulled = false\n tiles.renderOrder = 4\n objects.push(tiles)\n track(tileGeo, tileMat)\n\n const ghostMat = new ShaderMaterial({\n uniforms: { uColor: tileColor, uTime },\n vertexShader: GHOST_VERT,\n fragmentShader: GHOST_FRAG,\n blending: AdditiveBlending,\n transparent: true,\n depthWrite: false,\n side: DoubleSide,\n toneMapped: false,\n })\n const ghostPlaceholder = new BufferGeometry()\n const ghost = new Mesh(ghostPlaceholder, ghostMat)\n ghost.visible = false\n ghost.renderOrder = 5\n objects.push(ghost)\n track(ghostPlaceholder, ghostMat)\n\n // --- shot markers\n const missGeo = buildMissPegGeometry()\n const hitGeo = buildHitPegGeometry()\n const pegMat = (emissive, intensity) => {\n const m = new MeshStandardMaterial({\n vertexColors: true,\n metalness: 0.2,\n roughness: 0.35,\n emissive,\n emissiveIntensity: intensity,\n })\n return m\n }\n const missMat = pegMat(lin('#9fe8ff'), 0.35)\n const hitMat = pegMat(lin('#fb923c'), 1.4)\n const missPegs = new InstancedMesh(missGeo, missMat, 100)\n const hitPegs = new InstancedMesh(hitGeo, hitMat, 100)\n missPegs.castShadow = hitPegs.castShadow = quality !== 'low'\n const glowGeo = new PlaneGeometry(1, 1)\n glowGeo.rotateX(-Math.PI / 2)\n const glowMat = new ShaderMaterial({\n uniforms: { uTime, uHot: { value: lin('#fb923c') }, uRed: { value: lin('#f43f5e') } },\n vertexShader: INST_VERT,\n fragmentShader: HITGLOW_FRAG,\n blending: AdditiveBlending,\n transparent: true,\n depthWrite: false,\n toneMapped: false,\n })\n const hitGlow = new InstancedMesh(glowGeo, glowMat, 100)\n hitGlow.renderOrder = 3\n for (const im of [missPegs, hitPegs, hitGlow]) {\n im.count = 0\n im.visible = false\n im.frustumCulled = false\n objects.push(im)\n }\n track(missGeo, missMat)\n track(hitGeo, hitMat)\n track(glowGeo, glowMat)\n\n // --- helpers / temporaries (no per-frame allocation)\n const m4 = new Matrix4()\n const qIdentity = new Quaternion()\n const v3 = new Vector3()\n const s3 = new Vector3(1, 1, 1)\n const colorFrom = { line: new Color(), accent: new Color() }\n const colorTo = { line: new Color(), accent: new Color() }\n let colorT = 1\n let selected = null\n let selectT = 0\n let hoverTarget = 0\n let scanT = 0\n\n return {\n objects,\n uTime,\n\n setMode(mode, instant) {\n const c = MODE_COLORS[mode] || MODE_COLORS.target\n colorFrom.line.copy(lineColor)\n colorFrom.accent.copy(accentColor)\n colorTo.line.copy(c.line)\n colorTo.accent.copy(c.accent)\n colorT = instant ? 1 : 0\n if (instant) {\n lineColor.copy(c.line)\n accentColor.copy(c.accent)\n frameMat.emissive.copy(accentColor)\n labelMat.color.copy(lineColor)\n }\n },\n\n setActive(active) {\n gridUniforms.uActive.value = active ? 1 : 0\n },\n\n setHover(cell) {\n if (cell) {\n gridUniforms.uHover.value.x = cell.col\n gridUniforms.uHover.value.y = cell.row\n hoverTarget = 1\n } else {\n hoverTarget = 0\n }\n },\n\n setSelected(cell) {\n if (!cell) {\n selected = null\n ring.visible = false\n return\n }\n selected = cell\n ring.position.x = cell.col - 4.5\n ring.position.z = cell.row - 4.5\n ring.visible = true\n selectT = 0\n },\n\n // preview: {cells, valid} | null ; ghostGeo: geometry or null\n setPreview(preview, ghostGeo) {\n if (!preview || !preview.cells || preview.cells.length === 0) {\n tiles.visible = false\n ghost.visible = false\n return\n }\n tileColor.value.copy(preview.valid ? lin('#34d399') : lin('#f43f5e'))\n const n = Math.min(5, preview.cells.length)\n let minR = 99, maxR = -1, minC = 99, maxC = -1\n for (let i = 0; i < n; i++) {\n const c = preview.cells[i]\n v3.set(c.col - 4.5, GRID_Y + 0.012, c.row - 4.5)\n m4.compose(v3, qIdentity, s3)\n tiles.setMatrixAt(i, m4)\n if (c.row < minR) minR = c.row\n if (c.row > maxR) maxR = c.row\n if (c.col < minC) minC = c.col\n if (c.col > maxC) maxC = c.col\n }\n tiles.count = n\n tiles.instanceMatrix.needsUpdate = true\n tiles.visible = true\n if (ghostGeo) {\n ghost.geometry = ghostGeo\n ghost.position.set((minC + maxC) / 2 - 4.5, 0.02, (minR + maxR) / 2 - 4.5)\n ghost.rotation.set(0, maxR > minR ? -Math.PI / 2 : 0, 0)\n ghost.visible = true\n } else {\n ghost.visible = false\n }\n },\n\n // shots: 10x10 matrix; skip(key) hides cells whose projectile is still in flight.\n setMarkers(shots, skip) {\n let nm = 0\n let nh = 0\n if (Array.isArray(shots)) {\n for (let r = 0; r < 10; r++) {\n const row = shots[r]\n if (!row) continue\n for (let c = 0; c < 10; c++) {\n const s = row[c]\n if (s !== 'hit' && s !== 'miss') continue\n const key = r * 10 + c\n if (skip(key)) continue\n if (s === 'miss') {\n v3.set(c - 4.5, GRID_Y, r - 4.5)\n m4.compose(v3, qIdentity, s3)\n missPegs.setMatrixAt(nm++, m4)\n } else {\n v3.set(c - 4.5, GRID_Y, r - 4.5)\n m4.compose(v3, qIdentity, s3)\n hitPegs.setMatrixAt(nh, m4)\n v3.y = GRID_Y + 0.01\n m4.compose(v3, qIdentity, s3)\n hitGlow.setMatrixAt(nh++, m4)\n }\n }\n }\n }\n missPegs.count = nm\n hitPegs.count = nh\n hitGlow.count = nh\n missPegs.visible = nm > 0\n hitPegs.visible = hitGlow.visible = nh > 0\n missPegs.instanceMatrix.needsUpdate = true\n hitPegs.instanceMatrix.needsUpdate = true\n hitGlow.instanceMatrix.needsUpdate = true\n },\n\n setQuality(q) {\n shadowCatcher.visible = q !== 'low'\n missPegs.castShadow = hitPegs.castShadow = q !== 'low'\n },\n\n update(dt, elapsed, reducedMotion) {\n uTime.value = elapsed\n if (colorT < 1) {\n colorT = Math.min(1, colorT + dt / 0.45)\n const k = colorT * colorT * (3 - 2 * colorT)\n lineColor.copy(colorFrom.line).lerp(colorTo.line, k)\n accentColor.copy(colorFrom.accent).lerp(colorTo.accent, k)\n frameMat.emissive.copy(accentColor)\n labelMat.color.copy(lineColor)\n }\n const ha = gridUniforms.uHoverAmt\n ha.value += (hoverTarget - ha.value) * Math.min(1, dt * 14)\n if (!reducedMotion) {\n scanT += dt\n gridUniforms.uScan.value = ((scanT * 2.2) % 16) - 8\n } else {\n gridUniforms.uScan.value = -20\n }\n if (selected) {\n selectT += dt\n const intro = Math.min(1, selectT / 0.22)\n const pulse = reducedMotion ? 1 : 1 + 0.05 * Math.sin(elapsed * 5)\n const s = (1.35 - 0.35 * intro * (2 - intro)) * pulse\n ring.scale.set(s, 1, s)\n ringMat.uniforms.uOpacity.value = intro\n }\n },\n\n dispose() {\n for (const g of geometries) g.dispose()\n for (const m of materials) m.dispose()\n labelTex.dispose()\n },\n }\n}\n","// Fleet: cached low-poly geometry per class, two shared materials (intact / wreck),\n// wave-synced bob & roll, sinking animation, GPU-driven pooled smoke + embers.\nimport {\n AdditiveBlending,\n BufferAttribute,\n BufferGeometry,\n Color,\n Group,\n Mesh,\n MeshStandardMaterial,\n NormalBlending,\n Points,\n ShaderMaterial,\n Vector2,\n Vector4,\n} from 'three'\nimport { buildShipGeometry, shipClassOf } from './core-geo.js'\n\nconst MAX_EMITTERS = 5\nconst SMOKE_PER = 36\nconst EMBER_PER = 20\nconst lin = (hex) => new Color(hex).convertSRGBToLinear()\n\nfunction makeShipMaterial(tag, { color, trim, trimIntensity, roughness }) {\n const uTrim = { value: trim }\n const uTrimIntensity = { value: trimIntensity }\n const m = new MeshStandardMaterial({ vertexColors: true, color, metalness: 0.6, roughness })\n m.onBeforeCompile = (shader) => {\n shader.uniforms.uTrim = uTrim\n shader.uniforms.uTrimIntensity = uTrimIntensity\n shader.vertexShader = shader.vertexShader\n .replace('#include <common>', '#include <common>\\nattribute float aGlow;\\nvarying float vGlow;')\n .replace('#include <begin_vertex>', '#include <begin_vertex>\\nvGlow = aGlow;')\n shader.fragmentShader = shader.fragmentShader\n .replace('#include <common>', '#include <common>\\nuniform vec3 uTrim;\\nuniform float uTrimIntensity;\\nvarying float vGlow;')\n .replace(\n '#include <emissivemap_fragment>',\n '#include <emissivemap_fragment>\\ntotalEmissiveRadiance += uTrim * vGlow * uTrimIntensity;\\ndiffuseColor.rgb *= 1.0 - vGlow * 0.7;',\n )\n }\n m.customProgramCacheKey = () => 'bs-ship-' + tag\n return { material: m, uTrim, uTrimIntensity }\n}\n\nconst SMOKE_VERT = /* glsl */ `\nuniform vec4 uEmitA[${MAX_EMITTERS}];\nuniform vec4 uEmitB[${MAX_EMITTERS}];\nuniform float uTime;\nuniform float uScale;\nuniform float uEmber;\nattribute float aEmitter;\nattribute vec4 aSeed;\nvarying vec4 vColor;\nvoid main() {\n int idx = int(aEmitter + 0.5);\n vec4 A = uEmitA[idx];\n vec4 B = uEmitB[idx];\n float life = mix(2.8 + aSeed.y * 1.6, 1.0 + aSeed.y * 0.8, uEmber);\n float t = fract((uTime + aSeed.w * life) / life);\n vec3 base = A.xyz + vec3(B.x, 0.0, B.y) * (aSeed.x * 2.0 - 1.0) * B.z;\n vec3 pos;\n float alpha;\n float size;\n vec3 col;\n if (uEmber < 0.5) {\n pos = base + vec3((aSeed.z - 0.5) * 0.25 + 0.5 * t * t, t * 1.7, (aSeed.y - 0.5) * 0.25 + 0.25 * t * t);\n alpha = smoothstep(0.0, 0.12, t) * (1.0 - smoothstep(0.5, 1.0, t)) * 0.55;\n size = (0.22 + 0.6 * t) * (0.7 + 0.6 * aSeed.z);\n col = mix(vec3(0.05, 0.045, 0.06), vec3(0.16, 0.17, 0.22), t);\n } else {\n float sway = sin(t * 9.0 + aSeed.x * 20.0) * 0.06;\n pos = base + vec3(sway + 0.2 * t, t * (0.7 + aSeed.z * 0.8), sway * 0.6);\n float flick = 0.55 + 0.45 * sin(uTime * 23.0 + aSeed.w * 50.0);\n alpha = (1.0 - t) * flick;\n size = 0.045 + 0.04 * aSeed.z;\n col = mix(vec3(1.0, 0.75, 0.35), vec3(0.96, 0.25, 0.37), t);\n }\n alpha *= A.w;\n vec4 mv = modelViewMatrix * vec4(pos, 1.0);\n gl_Position = projectionMatrix * mv;\n gl_PointSize = alpha > 0.003 ? size * uScale / max(-mv.z, 0.1) : 0.0;\n vColor = vec4(col, alpha);\n}\n`\n\nconst SMOKE_FRAG = /* glsl */ `\nvarying vec4 vColor;\nvoid main() {\n float d = length(gl_PointCoord - 0.5) * 2.0;\n if (d > 1.0) discard;\n gl_FragColor = vec4(vColor.rgb, vColor.a * pow(1.0 - d, 1.5));\n #include <encodings_fragment>\n}\n`\n\nfunction makeParticleGeometry(per) {\n const n = per * MAX_EMITTERS\n const geo = new BufferGeometry()\n const emitter = new Float32Array(n)\n const seed = new Float32Array(n * 4)\n for (let i = 0; i < n; i++) {\n emitter[i] = i % MAX_EMITTERS // interleaved so drawRange trims every emitter evenly\n for (let k = 0; k < 4; k++) seed[i * 4 + k] = Math.random()\n }\n geo.setAttribute('position', new BufferAttribute(new Float32Array(n * 3), 3))\n geo.setAttribute('aEmitter', new BufferAttribute(emitter, 1))\n geo.setAttribute('aSeed', new BufferAttribute(seed, 4))\n return geo\n}\n\nexport function createFleet({ quality, reducedMotion, heightAt }) {\n const group = new Group()\n group.name = 'battleship-fleet'\n\n const intact = makeShipMaterial('intact', {\n color: new Color(1, 1, 1),\n trim: lin('#a78bfa'),\n trimIntensity: 1.6,\n roughness: 0.42,\n })\n const wreck = makeShipMaterial('wreck', {\n color: new Color(0.32, 0.3, 0.32),\n trim: lin('#fb923c'),\n trimIntensity: 0.5,\n roughness: 0.75,\n })\n\n const geoCache = new Map()\n function geometryFor(cls, size) {\n const key = cls + ':' + size\n let g = geoCache.get(key)\n if (!g) {\n g = buildShipGeometry(cls, size)\n geoCache.set(key, g)\n }\n return g\n }\n\n // --- particles (smoke: normal blend, embers: additive), shared emitter uniforms\n const emitA = []\n const emitB = []\n for (let i = 0; i < MAX_EMITTERS; i++) {\n emitA.push(new Vector4(0, 0, 0, 0))\n emitB.push(new Vector4(1, 0, 0.5, 0))\n }\n const uEmitA = { value: emitA }\n const uEmitB = { value: emitB }\n const uPTime = { value: 0 }\n const uScale = { value: 600 }\n const bufSize = new Vector2()\n const updateScale = (renderer, _s, camera) => {\n renderer.getDrawingBufferSize(bufSize)\n uScale.value = bufSize.y * 0.5 * camera.projectionMatrix.elements[5]\n }\n const smokeGeo = makeParticleGeometry(SMOKE_PER)\n const emberGeo = makeParticleGeometry(EMBER_PER)\n const mkPMat = (ember) =>\n new ShaderMaterial({\n uniforms: { uEmitA, uEmitB, uTime: uPTime, uScale, uEmber: { value: ember ? 1 : 0 } },\n vertexShader: SMOKE_VERT,\n fragmentShader: SMOKE_FRAG,\n transparent: true,\n depthWrite: false,\n blending: ember ? AdditiveBlending : NormalBlending,\n toneMapped: !ember,\n })\n const smokeMat = mkPMat(false)\n const emberMat = mkPMat(true)\n const smoke = new Points(smokeGeo, smokeMat)\n const embers = new Points(emberGeo, emberMat)\n for (const p of [smoke, embers]) {\n p.frustumCulled = false\n p.visible = false\n p.onBeforeRender = updateScale\n group.add(p)\n }\n smoke.renderOrder = 6\n embers.renderOrder = 7\n\n function applyParticleQuality(q) {\n const low = q === 'low' || reducedMotion\n smokeGeo.setDrawRange(0, (low ? 14 : SMOKE_PER) * MAX_EMITTERS)\n emberGeo.setDrawRange(0, (low ? 8 : EMBER_PER) * MAX_EMITTERS)\n }\n applyParticleQuality(quality)\n\n let castShadow = quality !== 'low'\n const entries = new Map() // id -> entry\n const sinkDur = reducedMotion ? 0.45 : 1.2\n let time = 0\n\n function layout(entry, ship) {\n const cells = ship.cells || []\n const size = cells.length || ship.size || 1\n let sr = 0\n let sc = 0\n let minR = 99, maxR = -1, minC = 99, maxC = -1\n for (const c of cells) {\n sr += c.row\n sc += c.col\n if (c.row < minR) minR = c.row\n if (c.row > maxR) maxR = c.row\n if (c.col < minC) minC = c.col\n if (c.col > maxC) maxC = c.col\n }\n const n = Math.max(1, cells.length)\n const vertical = cells.length > 1 ? maxR > minR : ship.orientation === 'vertical'\n entry.x = sc / n - 4.5\n entry.z = sr / n - 4.5\n entry.yaw = vertical ? -Math.PI / 2 : 0\n entry.dirX = vertical ? 0 : 1\n entry.dirZ = vertical ? 1 : 0\n entry.halfLen = size / 2 - 0.1\n entry.size = size\n }\n\n function clear() {\n for (const e of entries.values()) group.remove(e.mesh)\n entries.clear()\n }\n\n return {\n group,\n geometryFor,\n\n // ships: array; opts.sunkAnimate(ship) -> bool decides animate vs instant for newly sunk.\n // opts.hide(ship) -> true to skip; opts.forceIntact(ship) -> true to show un-sunk for now.\n sync(ships, opts) {\n const seen = new Set()\n if (Array.isArray(ships)) {\n for (const ship of ships) {\n if (!ship || ship.id == null) continue\n if (opts.hide(ship)) continue\n const id = String(ship.id)\n seen.add(id)\n const sunk = !!ship.sunk && !opts.forceIntact(ship)\n const size = ship.size || (ship.cells ? ship.cells.length : 1)\n const cls = shipClassOf(ship.id, size)\n let e = entries.get(id)\n const isNew = !e\n if (!e) {\n e = {\n id,\n mesh: new Mesh(geometryFor(cls, size), intact.material),\n cls,\n phase: Math.random() * Math.PI * 2,\n sunk: false,\n sinkT: 0,\n sinking: false,\n forcedUntil: 0,\n x: 0, z: 0, yaw: 0, dirX: 1, dirZ: 0, halfLen: 1, size,\n }\n e.mesh.castShadow = castShadow\n e.mesh.rotation.order = 'YZX'\n entries.set(id, e)\n group.add(e.mesh)\n } else if (e.cls !== cls || e.size !== size) {\n e.mesh.geometry = geometryFor(cls, size)\n e.cls = cls\n }\n layout(e, ship)\n if (sunk && !e.sunk) {\n e.sunk = true\n e.mesh.material = wreck.material\n const animate = !isNew || opts.sunkAnimate(ship)\n e.sinking = animate\n e.sinkT = animate ? 0 : 1\n } else if (!sunk && e.sunk && time > e.forcedUntil) {\n e.sunk = false\n e.sinking = false\n e.sinkT = 0\n e.mesh.material = intact.material\n }\n }\n }\n for (const [id, e] of entries) {\n if (seen.has(id)) continue\n group.remove(e.mesh)\n entries.delete(id)\n }\n },\n\n clear,\n\n // Starts sinking the ship occupying (row, col) if present & intact. Returns true if found.\n sinkAt(row, col) {\n const x = col - 4.5\n const z = row - 4.5\n for (const e of entries.values()) {\n const along = (x - e.x) * e.dirX + (z - e.z) * e.dirZ\n const across = Math.abs((x - e.x) * e.dirZ - (z - e.z) * e.dirX)\n if (across < 0.4 && Math.abs(along) <= e.halfLen + 0.2) {\n if (!e.sunk) {\n e.sunk = true\n e.sinking = true\n e.sinkT = 0\n e.forcedUntil = time + 3 // keep wreck until the UI view confirms `sunk`\n e.mesh.material = wreck.material\n }\n return true\n }\n }\n return false\n },\n\n occupies(row, col) {\n const x = col - 4.5\n const z = row - 4.5\n for (const e of entries.values()) {\n const along = (x - e.x) * e.dirX + (z - e.z) * e.dirZ\n const across = Math.abs((x - e.x) * e.dirZ - (z - e.z) * e.dirX)\n if (across < 0.4 && Math.abs(along) <= e.halfLen + 0.2) return true\n }\n return false\n },\n\n setTrimColor(color) {\n intact.uTrim.value.copy(color)\n },\n\n setQuality(q) {\n castShadow = q !== 'low'\n for (const e of entries.values()) e.mesh.castShadow = castShadow\n applyParticleQuality(q)\n },\n\n update(dt) {\n time += dt\n uPTime.value = time\n let emitter = 0\n const bobAmp = reducedMotion ? 0.3 : 1\n for (const e of entries.values()) {\n if (e.sinking) {\n e.sinkT = Math.min(1, e.sinkT + dt / sinkDur)\n if (e.sinkT >= 1) e.sinking = false\n }\n const s = e.sinkT\n const k = s * s * (3 - 2 * s)\n const L = e.halfLen\n // wave samples: bow / stern / port / starboard\n const hb = heightAt(e.x + e.dirX * L, e.z + e.dirZ * L)\n const hs = heightAt(e.x - e.dirX * L, e.z - e.dirZ * L)\n const hp = heightAt(e.x + e.dirZ * 0.3, e.z - e.dirX * 0.3)\n const hq = heightAt(e.x - e.dirZ * 0.3, e.z + e.dirX * 0.3)\n const h = (hb + hs + hp + hq) * 0.25\n const idle = Math.sin(time * 1.3 + e.phase) * 0.012 * bobAmp\n const pitch = Math.atan2(hb - hs, 2 * L) * bobAmp + 0.11 * k\n const roll = Math.atan2(hp - hq, 0.6) * bobAmp + Math.sin(time * 0.9 + e.phase) * 0.02 * bobAmp + 0.3 * k\n e.mesh.position.set(e.x, h + idle - 0.14 * k, e.z)\n e.mesh.rotation.set(roll, e.yaw, pitch)\n if (e.sunk && emitter < MAX_EMITTERS) {\n const a = emitA[emitter]\n const b = emitB[emitter]\n a.set(e.x, h + 0.08 - 0.1 * k, e.z, Math.min(1, s * 1.5))\n b.set(e.dirX, e.dirZ, L * 0.7, 0)\n emitter++\n }\n }\n for (let i = emitter; i < MAX_EMITTERS; i++) emitA[i].w = 0\n smoke.visible = embers.visible = emitter > 0\n },\n\n dispose() {\n clear()\n for (const g of geoCache.values()) g.dispose()\n geoCache.clear()\n intact.material.dispose()\n wreck.material.dispose()\n smokeGeo.dispose()\n emberGeo.dispose()\n smokeMat.dispose()\n emberMat.dispose()\n },\n }\n}\n","// Battleship 3D scene (three r134). Framework-agnostic: React only mounts/unmounts it.\n//\n// createBattleScene(container, { quality, reducedMotion, onCellHover, onCellSelect }) → {\n// setView, playShot, selectCell, setRadarVisible, setRadarContacts, resetCamera, setQuality, dispose\n// }\nimport {\n ACESFilmicToneMapping,\n Clock,\n Color,\n DirectionalLight,\n FogExp2,\n HemisphereLight,\n PCFSoftShadowMap,\n PerspectiveCamera,\n Plane,\n PointLight,\n Raycaster,\n RGBAFormat,\n Scene,\n sRGBEncoding,\n Vector2,\n Vector3,\n WebGLMultisampleRenderTarget,\n WebGLRenderer,\n} from 'three'\nimport { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js'\nimport { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass.js'\nimport { UnrealBloomPass } from 'three/examples/jsm/postprocessing/UnrealBloomPass.js'\nimport { createEffects } from './effects.js'\nimport { createRadar } from './radar.js'\nimport { createOcean } from './core-ocean.js'\nimport { createBoard, GRID_Y, MODE_COLORS } from './core-board.js'\nimport { createFleet } from './core-ships.js'\nimport { shipClassOf } from './core-geo.js'\n\nconst NAVY = '#0b1220'\nconst FOG_DENSITY = 0.018\nconst FOV = 38\nconst DRAG_PX = 6\nconst MAX_DT = 1 / 20\nconst lin = (hex) => new Color(hex).convertSRGBToLinear()\n\n// Final composer pass: linear → sRGB (materials already tone-mapped in r134 render targets).\nconst OutputShader = {\n uniforms: { tDiffuse: { value: null } },\n vertexShader: /* glsl */ `\n varying vec2 vUv;\n void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); }\n `,\n fragmentShader: /* glsl */ `\n uniform sampler2D tDiffuse;\n varying vec2 vUv;\n void main() { gl_FragColor = LinearTosRGB(texture2D(tDiffuse, vUv)); }\n `,\n}\n\nfunction 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 return coarse || small || cores <= 4 ? 'low' : 'high'\n}\n\nfunction pixelRatioFor(q) {\n const d = (typeof window !== 'undefined' && window.devicePixelRatio) || 1\n return q === 'high' ? Math.min(d, 1.75) : Math.min(d, d > 1.5 ? 1.25 : 1)\n}\n\nconst easeInOut = (t) => (t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2)\nconst validCell = (c) =>\n c && Number.isInteger(c.row) && Number.isInteger(c.col) && c.row >= 0 && c.row < 10 && c.col >= 0 && c.col < 10\n\nexport function createBattleScene(\n container,\n { quality = 'auto', reducedMotion = false, onCellHover, onCellSelect } = {},\n) {\n if (!container) throw new Error('createBattleScene: container element required')\n\n let autoQuality = quality === 'auto'\n let currentQuality = autoQuality ? detectQuality() : quality === 'low' ? 'low' : 'high'\n let disposed = false\n\n // ------------------------------------------------------------------ renderer\n const initialDpr = pixelRatioFor(currentQuality)\n const renderer = new WebGLRenderer({\n antialias: !(currentQuality === 'low' && (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.08\n renderer.shadowMap.enabled = true\n renderer.shadowMap.type = PCFSoftShadowMap\n renderer.setPixelRatio(initialDpr)\n renderer.setClearColor(NAVY, 1)\n const canvas = renderer.domElement\n canvas.style.display = 'block'\n canvas.style.width = '100%'\n canvas.style.height = '100%'\n canvas.style.touchAction = 'none'\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 / camera\n const scene = new Scene()\n scene.fog = new FogExp2(lin(NAVY), FOG_DENSITY)\n\n const camera = new PerspectiveCamera(FOV, width / height, 0.1, 500)\n camera.position.set(11, 12, 11)\n\n const controls = new OrbitControls(camera, canvas)\n controls.enableDamping = true\n controls.dampingFactor = 0.08\n controls.enablePan = false\n controls.rotateSpeed = 0.6\n controls.zoomSpeed = 0.8\n controls.minPolarAngle = 0.32\n controls.maxPolarAngle = 1.22\n\n // ------------------------------------------------------------------ lights\n const hemi = new HemisphereLight(lin('#9db8ff'), lin(NAVY), 0.55)\n const sun = new DirectionalLight(lin('#e8f0ff'), 1.5)\n sun.position.set(-5, 14, -7)\n sun.shadow.mapSize.set(1024, 1024)\n const sc = sun.shadow.camera\n sc.left = -7.5\n sc.right = 7.5\n sc.top = 7.5\n sc.bottom = -7.5\n sc.near = 4\n sc.far = 32\n sc.updateProjectionMatrix()\n sun.shadow.bias = -0.0004\n sun.shadow.normalBias = 0.02\n sun.castShadow = currentQuality === 'high'\n const rimCyan = new PointLight(lin('#22d3ee'), 1.1, 22, 2)\n rimCyan.position.set(-7.5, 3, 7.5)\n const rimViolet = new PointLight(lin('#a78bfa'), 1.0, 22, 2)\n rimViolet.position.set(7.5, 2.5, -7.5)\n scene.add(hemi, sun, sun.target, rimCyan, rimViolet)\n\n // ------------------------------------------------------------------ world\n const ocean = createOcean({\n quality: currentQuality,\n reducedMotion,\n fogColor: new Color(NAVY),\n fogDensity: FOG_DENSITY,\n })\n scene.add(ocean.sky, ocean.mesh)\n\n const board = createBoard({ quality: currentQuality })\n for (const o of board.objects) scene.add(o)\n\n const fleet = createFleet({ quality: currentQuality, reducedMotion, heightAt: ocean.heightAt })\n scene.add(fleet.group)\n\n const radar = createRadar({ quality: currentQuality, reducedMotion })\n radar.object.rotation.order = 'YXZ'\n scene.add(radar.object)\n\n const effects = createEffects(scene, { quality: currentQuality, reducedMotion })\n\n // ------------------------------------------------------------------ post-processing (high only)\n let composer = null\n let bloomPass = null\n let outputPass = null\n function ensureComposer() {\n if (composer) return\n let rt\n if (renderer.capabilities.isWebGL2) {\n rt = new WebGLMultisampleRenderTarget(width, height, { format: RGBAFormat })\n rt.samples = 4\n }\n composer = new EffectComposer(renderer, rt)\n composer.setPixelRatio(renderer.getPixelRatio())\n composer.setSize(width, height)\n composer.addPass(new RenderPass(scene, camera))\n bloomPass = new UnrealBloomPass(new Vector2(width, height), 0.6, 0.45, 0.7)\n composer.addPass(bloomPass)\n outputPass = new ShaderPass(OutputShader)\n composer.addPass(outputPass)\n }\n function disposeComposer() {\n if (!composer) return\n composer.renderTarget1.dispose()\n composer.renderTarget2.dispose()\n bloomPass.dispose()\n outputPass.material.dispose()\n if (outputPass.fsQuad && outputPass.fsQuad.dispose) outputPass.fsQuad.dispose()\n if (composer.copyPass) {\n composer.copyPass.material.dispose()\n if (composer.copyPass.fsQuad && composer.copyPass.fsQuad.dispose) composer.copyPass.fsQuad.dispose()\n }\n composer = null\n bloomPass = null\n outputPass = null\n }\n if (currentQuality === 'high') ensureComposer()\n\n // ------------------------------------------------------------------ camera framing\n const home = { pos: new Vector3(), target: new Vector3() }\n const tween = { active: false, t: 0, dur: 1, fromPos: new Vector3(), fromTarget: new Vector3() }\n const tmpDir = new Vector3()\n let userMoved = false\n\n function computeHome() {\n const aspect = width / height\n const portrait = aspect < 0.85\n const halfV = ((FOV / 2) * Math.PI) / 180\n const halfH = Math.atan(Math.tan(halfV) * aspect)\n const rh = portrait ? 6.9 : 9.1\n const rv = portrait ? 7.6 : 6.2\n const d = Math.min(52, Math.max(14, Math.max(rh / Math.tan(halfH), rv / Math.tan(halfV)) * 1.06))\n if (portrait) tmpDir.set(0, 1.45, 1)\n else tmpDir.set(1, 1.12, 1)\n tmpDir.normalize()\n home.target.set(0, 0, portrait ? 0.9 : 0.2)\n home.pos.copy(home.target).addScaledVector(tmpDir, d)\n controls.minDistance = d * 0.55\n controls.maxDistance = d * 1.5\n if (portrait) {\n radar.object.position.set(-4.4, 0.25, 8.1)\n radar.object.rotation.set(0.45, 0, 0)\n } else {\n radar.object.position.set(-8.1, 0.25, 2.6)\n radar.object.rotation.set(0.45, Math.PI / 4, 0)\n }\n }\n\n function snapCamera() {\n tween.active = false\n camera.position.copy(home.pos)\n controls.target.copy(home.target)\n controls.update()\n }\n\n function startTween(dur) {\n tween.fromPos.copy(camera.position)\n tween.fromTarget.copy(controls.target)\n tween.t = 0\n tween.dur = dur\n tween.active = true\n }\n\n computeHome()\n if (reducedMotion) {\n snapCamera()\n } else {\n // intro: glide in from a higher, wider orbit\n camera.position.copy(home.target).addScaledVector(tmpDir.copy(home.pos).sub(home.target), 1.45)\n camera.position.y += 4\n controls.target.copy(home.target)\n controls.update()\n startTween(1.8)\n }\n controls.addEventListener('start', () => {\n userMoved = true\n tween.active = false\n })\n\n // ------------------------------------------------------------------ resize / visibility\n function resize() {\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 camera.aspect = w / h\n camera.updateProjectionMatrix()\n if (composer) {\n composer.setPixelRatio(renderer.getPixelRatio())\n composer.setSize(w, h)\n }\n computeHome()\n if (!userMoved && !tween.active) snapCamera()\n }\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 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 // ------------------------------------------------------------------ view state\n let mode = null\n let interactive = false\n let lastView = null\n const pendingKeys = new Map() // cellKey -> in-flight count\n const pendingShots = new Set()\n const recentImpacts = [] // { key, at }\n let elapsed = 0\n\n const shipHas = (ship, test) => {\n const cells = ship.cells\n if (!Array.isArray(cells)) return false\n for (let i = 0; i < cells.length; i++) if (test(cells[i].row * 10 + cells[i].col)) return true\n return false\n }\n const isPending = (key) => pendingKeys.has(key)\n const isRecent = (key) => {\n for (let i = 0; i < recentImpacts.length; i++) {\n if (recentImpacts[i].key === key && elapsed - recentImpacts[i].at < 3) return true\n }\n return false\n }\n const syncOpts = {\n hide: (s) => mode === 'target' && !!s.sunk && shipHas(s, isPending),\n forceIntact: (s) => shipHas(s, isPending),\n sunkAnimate: (s) => shipHas(s, isRecent),\n }\n\n function applyShips() {\n fleet.sync(lastView ? lastView.ships : null, syncOpts)\n }\n function applyMarkers() {\n board.setMarkers(lastView ? lastView.shots : null, isPending)\n }\n\n // ------------------------------------------------------------------ picking\n const raycaster = new Raycaster()\n const ndc = new Vector2()\n const boardPlane = new Plane(new Vector3(0, 1, 0), -GRID_Y)\n const hitPoint = new Vector3()\n let hoverKey = -1\n let cursor = ''\n const down = { id: -1, x: 0, y: 0, moved: false }\n\n function setCursor(c) {\n if (c === cursor) return\n cursor = c\n canvas.style.cursor = c\n }\n\n function cellAt(clientX, clientY) {\n const rect = canvas.getBoundingClientRect()\n if (!rect.width || !rect.height) return -1\n ndc.set(((clientX - rect.left) / rect.width) * 2 - 1, -((clientY - rect.top) / rect.height) * 2 + 1)\n raycaster.setFromCamera(ndc, camera)\n if (!raycaster.ray.intersectPlane(boardPlane, hitPoint)) return -1\n const col = Math.floor(hitPoint.x + 5)\n const row = Math.floor(hitPoint.z + 5)\n if (row < 0 || row > 9 || col < 0 || col > 9) return -1\n return row * 10 + col\n }\n\n function setHover(key) {\n if (key === hoverKey) return\n hoverKey = key\n const cell = key < 0 ? null : { row: Math.floor(key / 10), col: key % 10 }\n board.setHover(cell)\n setCursor(cell ? 'pointer' : '')\n if (typeof onCellHover === 'function') onCellHover(cell)\n }\n\n function onPointerDown(e) {\n down.id = e.pointerId\n down.x = e.clientX\n down.y = e.clientY\n down.moved = false\n }\n function onPointerMove(e) {\n if (down.id === e.pointerId && !down.moved) {\n if (Math.hypot(e.clientX - down.x, e.clientY - down.y) >= DRAG_PX) down.moved = true\n }\n if (!interactive || down.moved || e.pointerType === 'touch') return\n setHover(cellAt(e.clientX, e.clientY))\n }\n function onPointerUp(e) {\n if (down.id !== e.pointerId) return\n const click = !down.moved && Math.hypot(e.clientX - down.x, e.clientY - down.y) < DRAG_PX\n down.id = -1\n if (!click || !interactive) return\n const key = cellAt(e.clientX, e.clientY)\n if (key < 0) return\n if (e.pointerType !== 'mouse') setHover(key)\n if (typeof onCellSelect === 'function') onCellSelect({ row: Math.floor(key / 10), col: key % 10 })\n }\n function onPointerLeave(e) {\n if (e.pointerType === 'mouse') setHover(-1)\n }\n function onPointerCancel() {\n down.id = -1\n }\n canvas.addEventListener('pointerdown', onPointerDown)\n canvas.addEventListener('pointermove', onPointerMove)\n canvas.addEventListener('pointerup', onPointerUp)\n canvas.addEventListener('pointerleave', onPointerLeave)\n canvas.addEventListener('pointercancel', onPointerCancel)\n\n // ------------------------------------------------------------------ shots\n const shotFrom = new Vector3()\n const shotTo = new Vector3()\n\n function finishShot(rec) {\n if (rec.done) return\n rec.done = true\n pendingShots.delete(rec)\n const n = (pendingKeys.get(rec.key) || 1) - 1\n if (n <= 0) pendingKeys.delete(rec.key)\n else pendingKeys.set(rec.key, n)\n recentImpacts.push({ key: rec.key, at: elapsed })\n if (recentImpacts.length > 12) recentImpacts.shift()\n if (!disposed) {\n applyMarkers()\n if (rec.sunk) {\n applyShips()\n if (rec.result === 'hit') fleet.sinkAt(rec.row, rec.col)\n }\n }\n rec.resolve()\n }\n\n function flushPending() {\n for (const rec of Array.from(pendingShots)) finishShot(rec)\n }\n\n // ------------------------------------------------------------------ loop\n const clock = new Clock(false)\n let rafId = 0\n let perfAcc = 0\n let perfFrames = 0\n\n function frame() {\n rafId = requestAnimationFrame(frame)\n const raw = clock.getDelta()\n const dt = Math.min(raw, MAX_DT)\n elapsed += dt\n\n ocean.update(dt)\n fleet.update(dt)\n board.update(dt, elapsed, reducedMotion)\n radar.update(dt, elapsed)\n effects.update(dt)\n\n if (tween.active) {\n tween.t += dt / tween.dur\n const k = easeInOut(Math.min(1, tween.t))\n camera.position.lerpVectors(tween.fromPos, home.pos, k)\n controls.target.lerpVectors(tween.fromTarget, home.target, k)\n if (tween.t >= 1) tween.active = false\n }\n controls.update()\n\n if (composer) composer.render(dt)\n else renderer.render(scene, camera)\n\n // auto quality: downgrade once if the GPU can't hold ~40fps on high\n if (autoQuality && currentQuality === 'high' && elapsed > 3) {\n perfAcc += Math.min(raw, 0.25)\n perfFrames++\n if (perfFrames >= 120) {\n if (perfAcc / perfFrames > 1 / 40) {\n applyQuality('low')\n autoQuality = false\n }\n perfAcc = 0\n perfFrames = 0\n }\n }\n }\n\n function updateRunning() {\n const should = !disposed && docVisible && onScreen\n if (should && !rafId) {\n clock.start()\n clock.getDelta()\n perfAcc = 0\n perfFrames = 0\n rafId = requestAnimationFrame(frame)\n } else if (!should && rafId) {\n cancelAnimationFrame(rafId)\n rafId = 0\n clock.stop()\n flushPending() // never leave awaited shots hanging while paused\n }\n }\n\n function applyQuality(q) {\n currentQuality = q\n renderer.setPixelRatio(pixelRatioFor(q))\n renderer.setSize(width, height, false)\n sun.castShadow = q === 'high'\n ocean.setQuality(q)\n board.setQuality(q)\n fleet.setQuality(q)\n effects.setQuality(q)\n if (q === 'high') ensureComposer()\n else disposeComposer()\n if (composer) {\n composer.setPixelRatio(renderer.getPixelRatio())\n composer.setSize(width, height)\n }\n }\n\n updateRunning()\n\n // ------------------------------------------------------------------ public API\n return {\n setView(view) {\n if (disposed || !view) return\n const nextMode = view.mode === 'own' ? 'own' : 'target'\n if (nextMode !== mode) {\n const first = mode === null\n mode = nextMode\n fleet.clear()\n board.setMode(mode, first || reducedMotion)\n fleet.setTrimColor(MODE_COLORS[mode].accent)\n }\n interactive = !!view.interactive\n board.setActive(interactive)\n if (!interactive) setHover(-1)\n lastView = view\n applyShips()\n applyMarkers()\n const p = view.preview\n if (p && Array.isArray(p.cells) && p.cells.length) {\n const n = Math.min(5, p.cells.length)\n board.setPreview(p, fleet.geometryFor(shipClassOf(null, n), n))\n } else {\n board.setPreview(null, null)\n }\n },\n\n playShot({ row, col, result, sunk = false, incoming = false } = {}) {\n return new Promise((resolve) => {\n if (disposed || !validCell({ row, col })) {\n resolve()\n return\n }\n const key = row * 10 + col\n const rec = { key, row, col, result: result === 'hit' ? 'hit' : 'miss', sunk: !!sunk, done: false, resolve }\n pendingShots.add(rec)\n pendingKeys.set(key, (pendingKeys.get(key) || 0) + 1)\n applyMarkers()\n if (!rafId) {\n finishShot(rec)\n return\n }\n const x = col - 4.5\n const z = row - 4.5\n if (incoming) shotFrom.set(x * 0.35, 5, -12)\n else shotFrom.set(x * 0.3, 4, 9.5)\n const onShip = rec.result === 'hit' && fleet.occupies(row, col)\n shotTo.set(x, onShip ? 0.12 : GRID_Y, z)\n effects.shoot(shotFrom, shotTo, rec.result, () => finishShot(rec))\n })\n },\n\n selectCell(cell) {\n if (disposed) return\n board.setSelected(validCell(cell) ? cell : null)\n },\n\n setRadarVisible(b) {\n if (!disposed) radar.setVisible(!!b)\n },\n\n setRadarContacts(cells) {\n if (!disposed) radar.setContacts(cells)\n },\n\n resetCamera() {\n if (disposed) return\n userMoved = false\n computeHome()\n if (reducedMotion) snapCamera()\n else startTween(0.9)\n },\n\n setQuality(q) {\n if (disposed) return\n autoQuality = false\n const next = q === 'low' ? 'low' : 'high'\n if (next !== currentQuality) applyQuality(next)\n },\n\n dispose() {\n if (disposed) return\n disposed = true\n if (rafId) cancelAnimationFrame(rafId)\n rafId = 0\n if (ro) ro.disconnect()\n else window.removeEventListener('resize', resize)\n if (io) io.disconnect()\n document.removeEventListener('visibilitychange', onVisibility)\n canvas.removeEventListener('pointerdown', onPointerDown)\n canvas.removeEventListener('pointermove', onPointerMove)\n canvas.removeEventListener('pointerup', onPointerUp)\n canvas.removeEventListener('pointerleave', onPointerLeave)\n canvas.removeEventListener('pointercancel', onPointerCancel)\n flushPending()\n controls.dispose()\n effects.dispose()\n radar.dispose()\n fleet.dispose()\n board.dispose()\n ocean.dispose()\n disposeComposer()\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 createBattleScene\n"],"mappings":"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"}
|