@minicode-dev/chat 0.1.6 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/README.md +25 -0
  2. package/assets/sounds/tanks/big_explosion.mp3 +0 -0
  3. package/assets/sounds/tanks/big_explosion.ogg +0 -0
  4. package/assets/sounds/tanks/cannon_fire.mp3 +0 -0
  5. package/assets/sounds/tanks/cannon_fire.ogg +0 -0
  6. package/assets/sounds/tanks/defeat.mp3 +0 -0
  7. package/assets/sounds/tanks/defeat.ogg +0 -0
  8. package/assets/sounds/tanks/engine_loop.mp3 +0 -0
  9. package/assets/sounds/tanks/engine_loop.ogg +0 -0
  10. package/assets/sounds/tanks/engine_start.mp3 +0 -0
  11. package/assets/sounds/tanks/engine_start.ogg +0 -0
  12. package/assets/sounds/tanks/projectile_whistle.mp3 +0 -0
  13. package/assets/sounds/tanks/projectile_whistle.ogg +0 -0
  14. package/assets/sounds/tanks/tank_destroyed.mp3 +0 -0
  15. package/assets/sounds/tanks/tank_destroyed.ogg +0 -0
  16. package/assets/sounds/tanks/tank_hit.mp3 +0 -0
  17. package/assets/sounds/tanks/tank_hit.ogg +0 -0
  18. package/assets/sounds/tanks/terrain_impact.mp3 +0 -0
  19. package/assets/sounds/tanks/terrain_impact.ogg +0 -0
  20. package/assets/sounds/tanks/tracks_loop.mp3 +0 -0
  21. package/assets/sounds/tanks/tracks_loop.ogg +0 -0
  22. package/assets/sounds/tanks/turret_loop.mp3 +0 -0
  23. package/assets/sounds/tanks/turret_loop.ogg +0 -0
  24. package/assets/sounds/tanks/victory.mp3 +0 -0
  25. package/assets/sounds/tanks/victory.ogg +0 -0
  26. package/dist/chunks/{BattleshipGameCard-S-UdM6rn.js → BattleshipGameCard-BFqA0cjT.js} +67 -65
  27. package/dist/chunks/{BattleshipGameCard-S-UdM6rn.js.map → BattleshipGameCard-BFqA0cjT.js.map} +1 -1
  28. package/dist/chunks/{BattleshipPrototype-Dm6U_mCr.js → BattleshipPrototype-CmQd5AUO.js} +4 -3
  29. package/dist/chunks/{BattleshipPrototype-Dm6U_mCr.js.map → BattleshipPrototype-CmQd5AUO.js.map} +1 -1
  30. package/dist/chunks/ChatContext-dty_KPDX.js +90 -0
  31. package/dist/chunks/ChatContext-dty_KPDX.js.map +1 -0
  32. package/dist/chunks/TanksGameCard-D0n-lzTs.js +1535 -0
  33. package/dist/chunks/TanksGameCard-D0n-lzTs.js.map +1 -0
  34. package/dist/chunks/TanksLiveGameCard-BmNRXP66.js +849 -0
  35. package/dist/chunks/TanksLiveGameCard-BmNRXP66.js.map +1 -0
  36. package/dist/chunks/WebRtcLab-B7xBlJy1.js +510 -0
  37. package/dist/chunks/WebRtcLab-B7xBlJy1.js.map +1 -0
  38. package/dist/chunks/{battleship-DXKuIZ1I.js → board-DXKuIZ1I.js} +1 -1
  39. package/dist/chunks/board-DXKuIZ1I.js.map +1 -0
  40. package/dist/chunks/connect4Sounds-BN7d_TM2.js +3235 -0
  41. package/dist/chunks/connect4Sounds-BN7d_TM2.js.map +1 -0
  42. package/dist/chunks/core-geo-UJY-tH9L.js +361 -0
  43. package/dist/chunks/core-geo-UJY-tH9L.js.map +1 -0
  44. package/dist/chunks/createBattleScene-L4ZRWDED.js +1265 -0
  45. package/dist/chunks/createBattleScene-L4ZRWDED.js.map +1 -0
  46. package/dist/chunks/createLiveScene-CtYPcOPo.js +364 -0
  47. package/dist/chunks/createLiveScene-CtYPcOPo.js.map +1 -0
  48. package/dist/chunks/createPeerLink-qei05vpV.js +478 -0
  49. package/dist/chunks/createPeerLink-qei05vpV.js.map +1 -0
  50. package/dist/chunks/createTankScene-CV7Brxmt.js +685 -0
  51. package/dist/chunks/createTankScene-CV7Brxmt.js.map +1 -0
  52. package/dist/chunks/fx-BHsl4S_J.js +1470 -0
  53. package/dist/chunks/fx-BHsl4S_J.js.map +1 -0
  54. package/dist/chunks/gameStatus-Cu1Z8un9.js +69 -0
  55. package/dist/chunks/gameStatus-Cu1Z8un9.js.map +1 -0
  56. package/dist/chunks/signalFaults-Dv2YjjKy.js +36 -0
  57. package/dist/chunks/signalFaults-Dv2YjjKy.js.map +1 -0
  58. package/dist/chunks/tanksSounds-C99OD2xD.js +177 -0
  59. package/dist/chunks/tanksSounds-C99OD2xD.js.map +1 -0
  60. package/dist/index.js +2404 -2427
  61. package/dist/index.js.map +1 -1
  62. package/dist/styles.css +1 -1
  63. package/index.d.ts +63 -0
  64. package/package.json +1 -1
  65. package/dist/chunks/battleship-DXKuIZ1I.js.map +0 -1
  66. package/dist/chunks/connect4Sounds-9u0p-dAf.js +0 -1847
  67. package/dist/chunks/connect4Sounds-9u0p-dAf.js.map +0 -1
  68. package/dist/chunks/createBattleScene-HIAvjixn.js +0 -1621
  69. package/dist/chunks/createBattleScene-HIAvjixn.js.map +0 -1
@@ -0,0 +1,1265 @@
1
+ import { a as e, i as t, n, r } from "./core-geo-UJY-tH9L.js";
2
+ import { ACESFilmicToneMapping as i, AdditiveBlending as a, BackSide as o, BufferAttribute as s, BufferGeometry as c, CanvasTexture as l, Clock as u, Color as d, DataTexture as f, DirectionalLight as p, DoubleSide as m, DynamicDrawUsage as h, ExtrudeGeometry as g, FogExp2 as _, Group as v, HemisphereLight as y, InstancedMesh as b, LinearFilter as x, Matrix4 as S, Mesh as C, MeshBasicMaterial as w, MeshStandardMaterial as T, NormalBlending as E, PCFSoftShadowMap as ee, Path as D, PerspectiveCamera as O, Plane as k, PlaneGeometry as A, PointLight as j, Points as M, Quaternion as N, RGBAFormat as P, Raycaster as te, Scene as F, ShaderMaterial as I, ShadowMaterial as ne, Shape as L, SphereGeometry as re, Sprite as R, SpriteMaterial as z, Vector2 as ie, Vector3 as B, Vector4 as ae, WebGLMultisampleRenderTarget as oe, WebGLRenderer as V, sRGBEncoding as se } from "three";
3
+ import { OrbitControls as ce } from "three/examples/jsm/controls/OrbitControls.js";
4
+ import { EffectComposer as le } from "three/examples/jsm/postprocessing/EffectComposer.js";
5
+ import { RenderPass as ue } from "three/examples/jsm/postprocessing/RenderPass.js";
6
+ import { ShaderPass as de } from "three/examples/jsm/postprocessing/ShaderPass.js";
7
+ import { UnrealBloomPass as fe } from "three/examples/jsm/postprocessing/UnrealBloomPass.js";
8
+ // src/games/battleship/scene/effects.js
9
+ var H = 6, U = 260, pe = 90, W = 32, G = 14, me = .22, K = 10, q = new d("#22d3ee"), he = new d("#a78bfa"), ge = new d("#fb923c"), J = new d("#f43f5e"), _e = new d("#e8fbff"), ve = new d("#fff3d6");
10
+ function Y(e = 64) {
11
+ let t = new Uint8Array(e * e * 4);
12
+ for (let n = 0; n < e; n++) for (let r = 0; r < e; r++) {
13
+ let i = (r + .5) / e * 2 - 1, a = (n + .5) / e * 2 - 1, o = 1 - Math.min(1, Math.sqrt(i * i + a * a)), s = Math.min(1, o ** 2.2 + o ** 10 * .8), c = (n * e + r) * 4;
14
+ t[c] = 255, t[c + 1] = 255, t[c + 2] = 255, t[c + 3] = Math.round(s * 255);
15
+ }
16
+ let n = new f(t, e, e, P);
17
+ return n.magFilter = x, n.minFilter = x, n.generateMipmaps = !1, n.needsUpdate = !0, n;
18
+ }
19
+ var ye = (e) => e < 0 ? 0 : e > 1 ? 1 : e, be = (e) => 1 - (1 - e) * (1 - e) * (1 - e), xe = (e) => {
20
+ let t = ye(e);
21
+ return t * .45 + (.5 - .5 * Math.cos(Math.PI * t)) * .55;
22
+ }, Se = "\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", Ce = "\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", we = "\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", Te = "\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", Ee = "\nvarying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n", De = "\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";
23
+ function Oe(e, { quality: t = "high", reducedMotion: n = !1 } = {}) {
24
+ let r = new v();
25
+ r.name = "battleship-effects", e.add(r);
26
+ let i = { value: 600 }, o = new ie(), l = (e, t, n) => {
27
+ e.getDrawingBufferSize(o), i.value = o.y * .5 * n.projectionMatrix.elements[5];
28
+ }, u = Y(64), f = new A(1, 1), p = new c();
29
+ {
30
+ let e = U, t = new Float32Array(e * 3), n = new Float32Array(e * 3), r = new Float32Array(e * 4);
31
+ for (let t = 0; t < e; t++) {
32
+ let e = Math.random() * 2 - 1, i = Math.random() * Math.PI * 2, a = Math.sqrt(1 - e * e);
33
+ n[t * 3] = a * Math.cos(i), n[t * 3 + 1] = e, n[t * 3 + 2] = a * Math.sin(i), r[t * 4] = Math.random(), r[t * 4 + 1] = Math.random(), r[t * 4 + 2] = Math.random(), r[t * 4 + 3] = Math.random();
34
+ }
35
+ p.setAttribute("position", new s(t, 3)), p.setAttribute("aDir", new s(n, 3)), p.setAttribute("aSeed", new s(r, 4));
36
+ }
37
+ let m = new z({
38
+ map: u,
39
+ color: q,
40
+ blending: a,
41
+ transparent: !0,
42
+ depthWrite: !1
43
+ }), g = new z({
44
+ map: u,
45
+ color: 16777215,
46
+ blending: a,
47
+ transparent: !0,
48
+ depthWrite: !1
49
+ }), _ = new j(ge, 0, 6, 2);
50
+ _.castShadow = !1, r.add(_);
51
+ let y = -1, b = [], x = [m, g], S = [f, p];
52
+ function w(e) {
53
+ let t = new z({
54
+ map: u,
55
+ color: e,
56
+ blending: a,
57
+ transparent: !0,
58
+ depthWrite: !1,
59
+ opacity: 0
60
+ });
61
+ return x.push(t), t;
62
+ }
63
+ for (let e = 0; e < H; e++) {
64
+ let t = new R(m), n = new R(g);
65
+ t.scale.setScalar(.7), n.scale.setScalar(.24), t.renderOrder = 11, n.renderOrder = 12;
66
+ let o = w(q), u = new R(o);
67
+ u.renderOrder = 12;
68
+ let _ = w(ve), v = new R(_);
69
+ v.renderOrder = 13;
70
+ let y = /* @__PURE__ */ new Float32Array(96), T = new Float32Array(W), E = new c(), ee = new s(y, 3);
71
+ ee.setUsage(h), E.setAttribute("position", ee), E.setAttribute("aFade", new s(T, 1));
72
+ let D = new I({
73
+ uniforms: {
74
+ uScale: i,
75
+ uSize: { value: .16 },
76
+ uOpacity: { value: 1 },
77
+ uHead: { value: q.clone() },
78
+ uTail: { value: he.clone() }
79
+ },
80
+ vertexShader: we,
81
+ fragmentShader: Te,
82
+ blending: a,
83
+ transparent: !0,
84
+ depthWrite: !1
85
+ }), O = new M(E, D);
86
+ O.frustumCulled = !1, O.renderOrder = K, O.onBeforeRender = l;
87
+ let k = new I({
88
+ uniforms: {
89
+ uTime: { value: 0 },
90
+ uOrigin: { value: new B() },
91
+ uMode: { value: 0 },
92
+ uScale: i,
93
+ uSpin: { value: 0 },
94
+ uPower: { value: 1 },
95
+ uLife: { value: 1 },
96
+ uFlicker: { value: 1 }
97
+ },
98
+ vertexShader: Se,
99
+ fragmentShader: Ce,
100
+ blending: a,
101
+ transparent: !0,
102
+ depthWrite: !1
103
+ }), A = new M(p, k);
104
+ A.frustumCulled = !1, A.renderOrder = K, A.onBeforeRender = l;
105
+ let j = new I({
106
+ uniforms: {
107
+ uColor: { value: new d() },
108
+ uInner: { value: new d() },
109
+ uOpacity: { value: 0 },
110
+ uWidth: { value: .1 },
111
+ uNoise: { value: 0 },
112
+ uSeed: { value: 0 }
113
+ },
114
+ vertexShader: Ee,
115
+ fragmentShader: De,
116
+ blending: a,
117
+ transparent: !0,
118
+ depthWrite: !1
119
+ }), N = new C(f, j);
120
+ N.rotation.x = -Math.PI / 2, N.renderOrder = 9, x.push(D, k, j), S.push(E);
121
+ let P = [
122
+ t,
123
+ n,
124
+ u,
125
+ v,
126
+ O,
127
+ A,
128
+ N
129
+ ];
130
+ for (let e of P) e.visible = !1, r.add(e);
131
+ b.push({
132
+ index: e,
133
+ active: !1,
134
+ result: "miss",
135
+ onImpact: null,
136
+ start: 0,
137
+ flightDur: .9,
138
+ impacted: !1,
139
+ impactAt: 0,
140
+ endAt: 0,
141
+ arcHeight: 1.5,
142
+ from: new B(),
143
+ to: new B(),
144
+ halo: t,
145
+ core: n,
146
+ muzzle: u,
147
+ muzzleMat: o,
148
+ flash: v,
149
+ flashMat: _,
150
+ trail: O,
151
+ trailMat: D,
152
+ trailPos: y,
153
+ trailPosAttr: ee,
154
+ trailFade: T,
155
+ trailGeom: E,
156
+ particles: A,
157
+ partMat: k,
158
+ ring: N,
159
+ ringMat: j
160
+ });
161
+ }
162
+ let T = t === "low" ? "low" : "high", E = W, ee = n ? .65 : .9;
163
+ function D() {
164
+ let e = T === "low" ? pe : U, t = n ? Math.round(e * .5) : e;
165
+ p.setDrawRange(0, t), E = T === "low" ? G : W;
166
+ for (let e = 0; e < b.length; e++) {
167
+ let t = b[e], n = t.trailFade;
168
+ for (let e = 0; e < W; e++) n[e] = e < E ? e / (E - 1) : 1;
169
+ t.trailGeom.getAttribute("aFade").needsUpdate = !0, t.trailGeom.setDrawRange(0, E), t.trailMat.uniforms.uSize.value = T === "low" ? .2 : .15;
170
+ }
171
+ }
172
+ D();
173
+ let O = 0;
174
+ function k(e, t, n) {
175
+ return n.lerpVectors(e.from, e.to, t), n.y += e.arcHeight * 4 * t * (1 - t), n;
176
+ }
177
+ function N(e) {
178
+ e.halo.visible = !1, e.core.visible = !1, e.muzzle.visible = !1, e.flash.visible = !1, e.trail.visible = !1, e.particles.visible = !1, e.ring.visible = !1;
179
+ }
180
+ function P(e) {
181
+ if (e.impacted) return;
182
+ e.impacted = !0, e.impactAt = O;
183
+ let t = e.result === "hit", r = e.partMat.uniforms;
184
+ r.uOrigin.value.copy(e.to), r.uMode.value = +!!t, r.uSpin.value = Math.random() * Math.PI * 2, r.uPower.value = n ? .7 : 1, r.uLife.value = n ? .6 : 1, r.uFlicker.value = +!n, r.uTime.value = 0, e.particles.visible = !0;
185
+ let i = e.ringMat.uniforms;
186
+ i.uColor.value.copy(t ? ge : _e), i.uInner.value.copy(t ? J : q), i.uNoise.value = t ? .2 : 1, i.uWidth.value = t ? .09 : .12, i.uSeed.value = Math.random() * 10, e.ring.position.set(e.to.x, e.to.y + .02, e.to.z), e.ring.visible = !0, e.flashMat.color.copy(t ? ve : _e), e.flash.position.set(e.to.x, e.to.y + (t ? .25 : .1), e.to.z), e.flash.visible = !0, e.endAt = O + (t ? n ? 1.5 : 2.4 : n ? .9 : 1.3), t && (_.position.set(e.to.x, e.to.y + .6, e.to.z), y = O);
187
+ let a = e.onImpact;
188
+ e.onImpact = null, a && a();
189
+ }
190
+ function te(e) {
191
+ let t = O - e.start, r = t / e.flightDur;
192
+ if (!e.impacted && r >= 1 && P(e), r < 1) {
193
+ let t = k(e, xe(r), e.halo.position);
194
+ e.core.position.copy(t), e.halo.visible = !0, e.core.visible = !0;
195
+ } else e.halo.visible = !1, e.core.visible = !1;
196
+ if (r < 1.22) {
197
+ let t = e.trailPos, n = E - 1;
198
+ for (let i = 0; i < E; i++) {
199
+ let a = r - i / n * me, o = xe(a < 0 ? 0 : a > 1 ? 1 : a), s = e.from, c = e.to, l = i * 3;
200
+ t[l] = s.x + (c.x - s.x) * o, t[l + 1] = s.y + (c.y - s.y) * o + e.arcHeight * 4 * o * (1 - o), t[l + 2] = s.z + (c.z - s.z) * o;
201
+ }
202
+ e.trailPosAttr.needsUpdate = !0, e.trailMat.uniforms.uOpacity.value = r < 1 ? 1 : 1 - (r - 1) / me, e.trail.visible = !0;
203
+ } else e.trail.visible = !1;
204
+ let i = n ? .12 : .2;
205
+ if (t < i) {
206
+ let r = t / i;
207
+ e.muzzle.scale.setScalar(.35 + r * (n ? .4 : .9)), e.muzzleMat.opacity = (1 - r) * (1 - r), e.muzzle.visible = !0;
208
+ } else e.muzzle.visible = !1;
209
+ if (!e.impacted) return;
210
+ let a = O - e.impactAt, o = e.result === "hit";
211
+ e.partMat.uniforms.uTime.value = a;
212
+ let s = o ? .32 : .18;
213
+ if (a < s) {
214
+ let t = a / s, r = o ? n ? 1.3 : 2.4 : .9;
215
+ e.flash.scale.setScalar(.3 + be(t) * r), e.flashMat.opacity = (1 - t) * (o ? 1 : .6), o && e.flashMat.color.copy(ve).lerp(ge, t);
216
+ } else e.flash.visible = !1;
217
+ let c = o ? .65 : 1;
218
+ if (a < c) {
219
+ let t = a / c, r = .08 + be(t) * (o ? n ? .9 : 1.6 : .85);
220
+ e.ring.scale.setScalar(r * 2 / .85), e.ringMat.uniforms.uOpacity.value = (1 - t) * (1 - t * .5) * (o ? 1.2 : .8);
221
+ } else e.ring.visible = !1;
222
+ }
223
+ function F() {
224
+ if (y < 0) return;
225
+ let e = O - y;
226
+ if (e > .9) {
227
+ _.intensity = 0, y = -1;
228
+ return;
229
+ }
230
+ let t = n ? 2.5 : 4, r = n ? 1 : .85 + .15 * Math.sin(e * 47);
231
+ _.intensity = t * Math.exp(-e * 5) * r;
232
+ }
233
+ function ne() {
234
+ let e = null;
235
+ for (let t = 0; t < b.length; t++) {
236
+ let n = b[t];
237
+ if (!n.active) return n;
238
+ (!e || n.start < e.start) && (e = n);
239
+ }
240
+ if (!e.impacted) {
241
+ let t = e.onImpact;
242
+ e.onImpact = null, e.impacted = !0, t && t();
243
+ }
244
+ return e;
245
+ }
246
+ let L = !1;
247
+ return {
248
+ shoot(e, t, r, i) {
249
+ if (L) return;
250
+ let a = ne();
251
+ N(a), a.active = !0, a.result = r === "hit" ? "hit" : "miss", a.onImpact = typeof i == "function" ? i : null, a.from.copy(e), a.to.copy(t), a.start = O, a.flightDur = ee, a.impacted = !1, a.endAt = Infinity;
252
+ let o = Math.hypot(t.x - e.x, t.z - e.z);
253
+ a.arcHeight = Math.min(5, Math.max(1.2, 1 + o * .35)) * (n ? .7 : 1), a.muzzle.position.copy(e), a.halo.position.copy(e), a.core.position.copy(e);
254
+ },
255
+ update(e) {
256
+ if (!L) {
257
+ O += Math.min(Math.max(e || 0, 0), .1);
258
+ for (let e = 0; e < b.length; e++) {
259
+ let t = b[e];
260
+ t.active && (te(t), t.impacted && O >= t.endAt && (t.active = !1, N(t)));
261
+ }
262
+ F();
263
+ }
264
+ },
265
+ setQuality(e) {
266
+ let t = e === "low" ? "low" : "high";
267
+ t !== T && (T = t, D());
268
+ },
269
+ dispose() {
270
+ if (!L) {
271
+ L = !0;
272
+ for (let e of b) e.onImpact = null;
273
+ e.remove(r), r.clear();
274
+ for (let e of S) e.dispose();
275
+ for (let e of x) e.dispose();
276
+ u.dispose(), _.dispose?.(), b.length = 0;
277
+ }
278
+ }
279
+ };
280
+ }
281
+ // src/games/battleship/scene/radar.js
282
+ var ke = 100, Ae = (e) => new d(e).convertSRGBToLinear(), je = "\nvarying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n", Me = "\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", Ne = "\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", Pe = "\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";
283
+ function Fe({ quality: e = "high", reducedMotion: t = !1 } = {}) {
284
+ let n = new v();
285
+ n.name = "battleship-radar";
286
+ let r = new v();
287
+ r.rotation.x = -Math.PI / 2, n.add(r);
288
+ let i = 3 / 2, o = { value: 0 }, l = { value: 0 }, u = { value: 0 }, d = new A(3, 3), f = new I({
289
+ uniforms: {
290
+ uAngle: l,
291
+ uTime: u,
292
+ uOpacity: o,
293
+ uCyan: { value: Ae("#22d3ee") },
294
+ uViolet: { value: Ae("#a78bfa") }
295
+ },
296
+ vertexShader: je,
297
+ fragmentShader: Me,
298
+ blending: a,
299
+ transparent: !0,
300
+ depthWrite: !1,
301
+ extensions: { derivatives: !0 },
302
+ toneMapped: !1
303
+ }), p = new C(d, f);
304
+ p.renderOrder = 8, r.add(p);
305
+ let m = /* @__PURE__ */ new Float32Array(300), h = new c();
306
+ h.setAttribute("position", new s(m, 3)), h.setDrawRange(0, 0);
307
+ let g = { value: 600 }, _ = new ie(), y = new I({
308
+ uniforms: {
309
+ uAngle: l,
310
+ uTime: u,
311
+ uScale: g,
312
+ uOpacity: o,
313
+ uColor: { value: Ae("#fb923c") }
314
+ },
315
+ vertexShader: Ne,
316
+ fragmentShader: Pe,
317
+ blending: a,
318
+ transparent: !0,
319
+ depthWrite: !1,
320
+ toneMapped: !1
321
+ }), b = new M(h, y);
322
+ b.frustumCulled = !1, b.renderOrder = 9, b.visible = !1, b.onBeforeRender = (e, t, n) => {
323
+ e.getDrawingBufferSize(_), g.value = _.y * .5 * n.projectionMatrix.elements[5];
324
+ }, r.add(b);
325
+ let x = 0, S = t ? .7 : 1.8;
326
+ return n.visible = !1, {
327
+ object: n,
328
+ update(e, r) {
329
+ if (u.value = r, l.value = (l.value + e * S) % (Math.PI * 2), o.value !== x) {
330
+ let n = e / (t ? .12 : .35);
331
+ o.value = x > o.value ? Math.min(x, o.value + n) : Math.max(x, o.value - n);
332
+ }
333
+ n.visible = o.value > .001;
334
+ },
335
+ setVisible(e) {
336
+ x = +!!e, e && (n.visible = !0);
337
+ },
338
+ setContacts(e) {
339
+ let t = 0;
340
+ if (Array.isArray(e)) for (let n = 0; n < e.length && t < ke; n++) {
341
+ let r = e[n];
342
+ r && Number.isFinite(r.row) && Number.isFinite(r.col) && (m[t * 3] = (r.col - 4.5) / 5 * .84 * i, m[t * 3 + 1] = -(r.row - 4.5) / 5 * .84 * i, m[t * 3 + 2] = .01, t++);
343
+ }
344
+ h.attributes.position.needsUpdate = !0, h.setDrawRange(0, t), b.visible = t > 0;
345
+ },
346
+ dispose() {
347
+ n.removeFromParent(), d.dispose(), f.dispose(), h.dispose(), y.dispose();
348
+ }
349
+ };
350
+ }
351
+ // src/games/battleship/scene/core-ocean.js
352
+ var Ie = -.1, Le = .55, Re = .16, X = [
353
+ [
354
+ 1,
355
+ .28,
356
+ .17,
357
+ 9,
358
+ 0
359
+ ],
360
+ [
361
+ -.45,
362
+ 1,
363
+ .13,
364
+ 5.6,
365
+ 0
366
+ ],
367
+ [
368
+ .72,
369
+ -.62,
370
+ .1,
371
+ 3.3,
372
+ 1
373
+ ],
374
+ [
375
+ -.92,
376
+ -.3,
377
+ .075,
378
+ 2.2,
379
+ 1
380
+ ]
381
+ ].map(([e, t, n, r, i]) => {
382
+ let a = Math.hypot(e, t), o = Math.PI * 2 / r;
383
+ return {
384
+ dx: e / a,
385
+ dz: t / a,
386
+ s: n,
387
+ l: r,
388
+ f: i,
389
+ k: o,
390
+ c: Math.sqrt(9.8 / o)
391
+ };
392
+ }), ze = (e) => new d(e).convertSRGBToLinear(), Be = (e) => e.toFixed(5), Ve = X.map((e) => `off += gerstner(vec4(${Be(e.dx)}, ${Be(e.dz)}, ${Be(e.s)}, ${Be(e.l)}), p, damp${e.f ? " * fine" : ""}, uTime, tg, bn);`).join("\n "), He = `
393
+ uniform float uTime;
394
+ uniform float uAmp;
395
+ varying vec3 vWorld;
396
+ varying vec3 vNormal;
397
+ varying float vHeight;
398
+ varying float vFogDepth;
399
+
400
+ vec3 gerstner(vec4 w, vec2 p, float s, float t, inout vec3 tg, inout vec3 bn) {
401
+ float k = 6.2831853 / w.w;
402
+ float c = sqrt(9.8 / k);
403
+ vec2 d = w.xy;
404
+ float st = w.z * s;
405
+ float ph = k * (dot(d, p) - c * t);
406
+ float a = st / k;
407
+ float sf = sin(ph);
408
+ float cf = cos(ph);
409
+ tg += vec3(-d.x * d.x * st * sf, d.x * st * cf, -d.x * d.y * st * sf);
410
+ bn += vec3(-d.x * d.y * st * sf, d.y * st * cf, -d.y * d.y * st * sf);
411
+ return vec3(d.x * a * cf, a * sf, d.y * a * cf);
412
+ }
413
+
414
+ void main() {
415
+ vec4 wp = modelMatrix * vec4(position, 1.0);
416
+ vec2 p = wp.xz;
417
+ vec2 q = abs(p);
418
+ float damp = mix(${Be(Re)}, 1.0, smoothstep(6.0, 10.0, max(q.x, q.y))) * uAmp;
419
+ float fine = 1.0 - smoothstep(18.0, 45.0, length(p));
420
+ vec3 tg = vec3(1.0, 0.0, 0.0);
421
+ vec3 bn = vec3(0.0, 0.0, 1.0);
422
+ vec3 off = vec3(0.0);
423
+ ${Ve}
424
+ wp.xyz += off;
425
+ vHeight = off.y;
426
+ vNormal = normalize(cross(bn, tg));
427
+ vWorld = wp.xyz;
428
+ vec4 mv = viewMatrix * wp;
429
+ vFogDepth = -mv.z;
430
+ gl_Position = projectionMatrix * mv;
431
+ }
432
+ `, Ue = "\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", We = "\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", Ge = "\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";
433
+ function Ke(e) {
434
+ let t = new A(2, 2, e, e);
435
+ t.rotateX(-Math.PI / 2);
436
+ let n = t.attributes.position, r = (e) => 110 * (.2 * e + .8 * e * e * e);
437
+ for (let e = 0; e < n.count; e++) n.setX(e, r(n.getX(e))), n.setZ(e, r(n.getZ(e)));
438
+ return t.deleteAttribute("uv"), t.deleteAttribute("normal"), t.computeBoundingSphere(), t;
439
+ }
440
+ function qe({ quality: e, reducedMotion: t, fogColor: n, fogDensity: r }) {
441
+ let i = n.clone().convertSRGBToLinear(), a = {
442
+ uTime: { value: 0 },
443
+ uAmp: { value: t ? .3 : 1 },
444
+ uDetail: { value: e === "low" ? .4 : 1 },
445
+ uDeep: { value: ze("#04101f") },
446
+ uShallow: { value: ze("#0f4c5c") },
447
+ uSky: { value: ze("#16233d") },
448
+ uHorizon: { value: ze("#33507a") },
449
+ uFoam: { value: ze("#cfefff") },
450
+ uSunDir: { value: new B(-.35, .55, -.75).normalize() },
451
+ uSunColor: { value: ze("#e6f6ff") },
452
+ uGlow: { value: ze("#22d3ee") },
453
+ uFogColor: { value: i },
454
+ uFogDensity: { value: r }
455
+ }, s = new I({
456
+ uniforms: a,
457
+ vertexShader: He,
458
+ fragmentShader: Ue
459
+ }), c = e === "low" ? 64 : 160, l = new C(Ke(c), s);
460
+ l.position.y = Ie, l.frustumCulled = !1, l.renderOrder = -1;
461
+ let u = new re(300, 24, 12), d = new I({
462
+ uniforms: {
463
+ uFogColor: { value: i },
464
+ uTop: { value: ze("#03060d") },
465
+ uHaze: { value: ze("#123048") }
466
+ },
467
+ vertexShader: We,
468
+ fragmentShader: Ge,
469
+ side: o,
470
+ depthWrite: !1
471
+ }), f = new C(u, d);
472
+ f.frustumCulled = !1, f.renderOrder = -2;
473
+ let p = t ? .35 : 1, m = 0, h = a.uAmp.value;
474
+ return {
475
+ mesh: l,
476
+ sky: f,
477
+ uniforms: a,
478
+ update(e) {
479
+ m += e * Le * p, a.uTime.value = m;
480
+ },
481
+ heightAt(e, t) {
482
+ let n = Math.min(1, Math.max(0, (Math.max(Math.abs(e), Math.abs(t)) - 6) / 4)), r = (Re + .84 * n * n * (3 - 2 * n)) * h, i = 0;
483
+ for (let n = 0; n < X.length; n++) {
484
+ let a = X[n];
485
+ i += a.s * r / a.k * Math.sin(a.k * (a.dx * e + a.dz * t - a.c * m));
486
+ }
487
+ return Ie + i;
488
+ },
489
+ setQuality(e) {
490
+ let t = e === "low" ? 64 : 160;
491
+ a.uDetail.value = e === "low" ? .4 : 1, t !== c && (c = t, l.geometry.dispose(), l.geometry = Ke(t));
492
+ },
493
+ setReducedMotion(e) {
494
+ h = e ? .3 : 1, a.uAmp.value = h;
495
+ },
496
+ dispose() {
497
+ l.geometry.dispose(), s.dispose(), u.dispose(), d.dispose();
498
+ }
499
+ };
500
+ }
501
+ // src/games/battleship/scene/core-board.js
502
+ var Je = .035, Z = 5.35, Ye = 6.3, Q = (e) => new d(e).convertSRGBToLinear(), Xe = {
503
+ own: {
504
+ line: Q("#22d3ee").lerp(Q("#a78bfa"), .55),
505
+ accent: Q("#a78bfa")
506
+ },
507
+ target: {
508
+ line: Q("#22d3ee"),
509
+ accent: Q("#f43f5e")
510
+ }
511
+ }, Ze = "\nvarying vec2 vP;\nvoid main() {\n vP = position.xz;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n", Qe = `
512
+ uniform vec3 uLine;
513
+ uniform vec3 uAccent;
514
+ uniform vec2 uHover;
515
+ uniform float uHoverAmt;
516
+ uniform float uTime;
517
+ uniform float uScan;
518
+ uniform float uActive;
519
+ varying vec2 vP;
520
+ void main() {
521
+ vec2 p = vP;
522
+ vec2 a = abs(p);
523
+ float m = max(a.x, a.y);
524
+ float inside = 1.0 - step(5.0, m);
525
+ vec2 fw = max(fwidth(p), vec2(1e-4));
526
+ vec2 g = abs(fract(p + 0.5) - 0.5);
527
+ vec2 l = 1.0 - smoothstep(fw * 0.6, fw * 1.9, g);
528
+ float line = max(l.x, l.y) * inside;
529
+ vec2 gg = exp(-g * 16.0);
530
+ float glow = max(gg.x, gg.y) * 0.2 * inside;
531
+ float node = l.x * l.y * inside;
532
+
533
+ float border = 1.0 - smoothstep(0.0, 0.035 + fw.x * 1.5, abs(m - 5.0));
534
+ float borderGlow = exp(-abs(m - 5.0) * 9.0) * 0.45;
535
+ 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)));
536
+
537
+ float scan = 0.55 + 0.45 * sin(p.y * 70.0 + uTime * 3.0);
538
+ float sweep = exp(-pow((p.y - uScan) * 2.4, 2.0)) * inside;
539
+
540
+ vec2 cell = floor(p + 5.0);
541
+ vec2 local = fract(p) - 0.5;
542
+ float hov = uHoverAmt * inside * (1.0 - step(0.5, abs(cell.x - uHover.x) + abs(cell.y - uHover.y)));
543
+ float hEdge = smoothstep(0.36, 0.47, max(abs(local.x), abs(local.y)));
544
+ float hPulse = 0.8 + 0.2 * sin(uTime * 6.0);
545
+
546
+ vec3 col = uLine * ((line * 0.85 + glow + node * 0.6) * mix(0.55, 1.0, uActive) + inside * 0.045 * scan + sweep * 0.14 * uActive);
547
+ col += uAccent * (border * 1.1 + borderGlow + corner * 1.6);
548
+ col += mix(uLine, vec3(1.0), 0.35) * hov * (0.16 + hEdge * 0.9) * hPulse;
549
+ col *= 1.0 - smoothstep(5.22, ${Z.toFixed(2)}, m);
550
+ gl_FragColor = vec4(col, 1.0);
551
+ #include <encodings_fragment>
552
+ }
553
+ `, $ = "\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", $e = "\nvarying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n", et = "\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", tt = "\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", nt = "\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", rt = "\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", it = "\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";
554
+ function at() {
555
+ let e = document.createElement("canvas");
556
+ e.width = 512, e.height = 256;
557
+ let t = e.getContext("2d");
558
+ t.clearRect(0, 0, e.width, e.height), t.textAlign = "center", t.textBaseline = "middle", t.fillStyle = "#ffffff", t.shadowColor = "rgba(255,255,255,0.85)", t.shadowBlur = 7;
559
+ let n = [];
560
+ for (let e = 0; e < 10; e++) n.push(String.fromCharCode(65 + e));
561
+ for (let e = 1; e <= 10; e++) n.push(String(e));
562
+ n.forEach((e, n) => {
563
+ let r = n % 8 * 64 + 32, i = Math.floor(n / 8) * 64 + 32 + 2;
564
+ t.font = `600 ${e.length > 1 ? 34 : 40}px "Inter", "Segoe UI", system-ui, sans-serif`, t.fillText(e, r, i);
565
+ });
566
+ let r = new l(e);
567
+ return r.minFilter = x, r.magFilter = x, r.generateMipmaps = !1, r;
568
+ }
569
+ function ot() {
570
+ let e = .5, t = [], n = [], r = [], i = (i, a, o) => {
571
+ let s = o % 8 / 8, c = 1 - Math.floor(o / 8) / 4, l = s + 1 / 8, u = c - 1 / 4, d = t.length / 3;
572
+ t.push(i - e / 2, 0, a + e / 2, i + e / 2, 0, a + e / 2, i + e / 2, 0, a - e / 2, i - e / 2, 0, a - e / 2), n.push(s, u, l, u, l, c, s, c), r.push(d, d + 1, d + 2, d, d + 2, d + 3);
573
+ };
574
+ for (let e = 0; e < 10; e++) i(-5.824999999999999, e - 4.5, e);
575
+ for (let e = 0; e < 10; e++) i(e - 4.5, -5.824999999999999, 10 + e);
576
+ let a = new c();
577
+ return a.setAttribute("position", new s(new Float32Array(t), 3)), a.setAttribute("uv", new s(new Float32Array(n), 2)), a.setIndex(r), a.computeBoundingSphere(), a;
578
+ }
579
+ function st() {
580
+ let e = new L();
581
+ e.moveTo(-6.3, -6.3), e.lineTo(Ye, -6.3), e.lineTo(Ye, Ye), e.lineTo(-6.3, Ye), e.lineTo(-6.3, -6.3);
582
+ let t = new D();
583
+ t.moveTo(-5.35, -5.35), t.lineTo(-5.35, Z), t.lineTo(Z, Z), t.lineTo(Z, -5.35), t.lineTo(-5.35, -5.35), e.holes.push(t);
584
+ let n = new g(e, {
585
+ depth: .16,
586
+ bevelEnabled: !0,
587
+ bevelThickness: .025,
588
+ bevelSize: .025,
589
+ bevelSegments: 1,
590
+ curveSegments: 1
591
+ });
592
+ return n.rotateX(-Math.PI / 2), n.translate(0, -.135, 0), n;
593
+ }
594
+ function ct({ quality: e }) {
595
+ let t = { value: 0 }, i = [], o = [], s = [], l = (e, t) => {
596
+ e && o.push(e), t && s.push(t);
597
+ }, u = Xe.target.line.clone(), f = Xe.target.accent.clone(), p = new A(Z * 2, Z * 2, 1, 1);
598
+ p.rotateX(-Math.PI / 2);
599
+ let h = {
600
+ uLine: { value: u },
601
+ uAccent: { value: f },
602
+ uHover: { value: new ie(-10, -10) },
603
+ uHoverAmt: { value: 0 },
604
+ uTime: t,
605
+ uScan: { value: -6 },
606
+ uActive: { value: 1 }
607
+ }, g = new I({
608
+ uniforms: h,
609
+ vertexShader: Ze,
610
+ fragmentShader: Qe,
611
+ blending: a,
612
+ transparent: !0,
613
+ depthWrite: !1,
614
+ extensions: { derivatives: !0 },
615
+ toneMapped: !1
616
+ }), _ = new C(p, g);
617
+ _.position.y = Je, _.renderOrder = 2, i.push(_), l(p, g);
618
+ let v = st(), y = new T({
619
+ color: Q("#151c2b"),
620
+ metalness: .75,
621
+ roughness: .38,
622
+ emissive: f,
623
+ emissiveIntensity: .06
624
+ }), x = new C(v, y);
625
+ x.receiveShadow = !0, i.push(x), l(v, y);
626
+ let E = at(), ee = ot(), D = new w({
627
+ map: E,
628
+ color: u,
629
+ transparent: !0,
630
+ depthWrite: !1,
631
+ blending: a,
632
+ toneMapped: !1
633
+ }), O = new C(ee, D);
634
+ O.position.y = .055, O.renderOrder = 3, i.push(O), l(ee, D);
635
+ let k = new A(Z * 2, Z * 2);
636
+ k.rotateX(-Math.PI / 2);
637
+ let j = new ne({
638
+ opacity: .35,
639
+ depthWrite: !1
640
+ }), M = new C(k, j);
641
+ M.position.y = .030000000000000002, M.receiveShadow = !0, M.renderOrder = 1, M.visible = e !== "low", i.push(M), l(k, j);
642
+ let P = new A(1.25, 1.25);
643
+ P.rotateX(-Math.PI / 2);
644
+ let te = new I({
645
+ uniforms: {
646
+ uColor: { value: f },
647
+ uTime: t,
648
+ uOpacity: { value: 1 }
649
+ },
650
+ vertexShader: $e,
651
+ fragmentShader: $,
652
+ blending: a,
653
+ transparent: !0,
654
+ depthWrite: !1,
655
+ toneMapped: !1
656
+ }), F = new C(P, te);
657
+ F.position.y = .05500000000000001, F.renderOrder = 4, F.visible = !1, i.push(F), l(P, te);
658
+ let L = new A(.92, .92);
659
+ L.rotateX(-Math.PI / 2);
660
+ let re = { value: Q("#34d399") }, R = new I({
661
+ uniforms: {
662
+ uColor: re,
663
+ uTime: t
664
+ },
665
+ vertexShader: et,
666
+ fragmentShader: tt,
667
+ blending: a,
668
+ transparent: !0,
669
+ depthWrite: !1,
670
+ toneMapped: !1
671
+ }), z = new b(L, R, 5);
672
+ z.count = 0, z.visible = !1, z.frustumCulled = !1, z.renderOrder = 4, i.push(z), l(L, R);
673
+ let ae = new I({
674
+ uniforms: {
675
+ uColor: re,
676
+ uTime: t
677
+ },
678
+ vertexShader: rt,
679
+ fragmentShader: it,
680
+ blending: a,
681
+ transparent: !0,
682
+ depthWrite: !1,
683
+ side: m,
684
+ toneMapped: !1
685
+ }), oe = new c(), V = new C(oe, ae);
686
+ V.visible = !1, V.renderOrder = 5, i.push(V), l(oe, ae);
687
+ let se = r(), ce = n(), le = (e, t) => new T({
688
+ vertexColors: !0,
689
+ metalness: .2,
690
+ roughness: .35,
691
+ emissive: e,
692
+ emissiveIntensity: t
693
+ }), ue = le(Q("#9fe8ff"), .35), de = le(Q("#fb923c"), 1.4), fe = new b(se, ue, 100), H = new b(ce, de, 100);
694
+ fe.castShadow = H.castShadow = e !== "low";
695
+ let U = new A(1, 1);
696
+ U.rotateX(-Math.PI / 2);
697
+ let pe = new I({
698
+ uniforms: {
699
+ uTime: t,
700
+ uHot: { value: Q("#fb923c") },
701
+ uRed: { value: Q("#f43f5e") }
702
+ },
703
+ vertexShader: et,
704
+ fragmentShader: nt,
705
+ blending: a,
706
+ transparent: !0,
707
+ depthWrite: !1,
708
+ toneMapped: !1
709
+ }), W = new b(U, pe, 100);
710
+ W.renderOrder = 3;
711
+ for (let e of [
712
+ fe,
713
+ H,
714
+ W
715
+ ]) e.count = 0, e.visible = !1, e.frustumCulled = !1, i.push(e);
716
+ l(se, ue), l(ce, de), l(U, pe);
717
+ let G = new S(), me = new N(), K = new B(), q = new B(1, 1, 1), he = {
718
+ line: new d(),
719
+ accent: new d()
720
+ }, ge = {
721
+ line: new d(),
722
+ accent: new d()
723
+ }, J = 1, _e = null, ve = 0, Y = 0, ye = 0;
724
+ return {
725
+ objects: i,
726
+ uTime: t,
727
+ setMode(e, t) {
728
+ let n = Xe[e] || Xe.target;
729
+ he.line.copy(u), he.accent.copy(f), ge.line.copy(n.line), ge.accent.copy(n.accent), J = +!!t, t && (u.copy(n.line), f.copy(n.accent), y.emissive.copy(f), D.color.copy(u));
730
+ },
731
+ setActive(e) {
732
+ h.uActive.value = +!!e;
733
+ },
734
+ setHover(e) {
735
+ e ? (h.uHover.value.x = e.col, h.uHover.value.y = e.row, Y = 1) : Y = 0;
736
+ },
737
+ setSelected(e) {
738
+ e ? (_e = e, F.position.x = e.col - 4.5, F.position.z = e.row - 4.5, F.visible = !0, ve = 0) : (_e = null, F.visible = !1);
739
+ },
740
+ setPreview(e, t) {
741
+ if (!e || !e.cells || e.cells.length === 0) {
742
+ z.visible = !1, V.visible = !1;
743
+ return;
744
+ }
745
+ re.value.copy(e.valid ? Q("#34d399") : Q("#f43f5e"));
746
+ let n = Math.min(5, e.cells.length), r = 99, i = -1, a = 99, o = -1;
747
+ for (let t = 0; t < n; t++) {
748
+ let n = e.cells[t];
749
+ K.set(n.col - 4.5, .047, n.row - 4.5), G.compose(K, me, q), z.setMatrixAt(t, G), n.row < r && (r = n.row), n.row > i && (i = n.row), n.col < a && (a = n.col), n.col > o && (o = n.col);
750
+ }
751
+ z.count = n, z.instanceMatrix.needsUpdate = !0, z.visible = !0, t ? (V.geometry = t, V.position.set((a + o) / 2 - 4.5, .02, (r + i) / 2 - 4.5), V.rotation.set(0, i > r ? -Math.PI / 2 : 0, 0), V.visible = !0) : V.visible = !1;
752
+ },
753
+ setMarkers(e, t) {
754
+ let n = 0, r = 0;
755
+ if (Array.isArray(e)) for (let i = 0; i < 10; i++) {
756
+ let a = e[i];
757
+ if (a) for (let e = 0; e < 10; e++) {
758
+ let o = a[e];
759
+ o !== "hit" && o !== "miss" || t(i * 10 + e) || (o === "miss" ? (K.set(e - 4.5, Je, i - 4.5), G.compose(K, me, q), fe.setMatrixAt(n++, G)) : (K.set(e - 4.5, Je, i - 4.5), G.compose(K, me, q), H.setMatrixAt(r, G), K.y = .045000000000000005, G.compose(K, me, q), W.setMatrixAt(r++, G)));
760
+ }
761
+ }
762
+ fe.count = n, H.count = r, W.count = r, fe.visible = n > 0, H.visible = W.visible = r > 0, fe.instanceMatrix.needsUpdate = !0, H.instanceMatrix.needsUpdate = !0, W.instanceMatrix.needsUpdate = !0;
763
+ },
764
+ setQuality(e) {
765
+ M.visible = e !== "low", fe.castShadow = H.castShadow = e !== "low";
766
+ },
767
+ update(e, n, r) {
768
+ if (t.value = n, J < 1) {
769
+ J = Math.min(1, J + e / .45);
770
+ let t = J * J * (3 - 2 * J);
771
+ u.copy(he.line).lerp(ge.line, t), f.copy(he.accent).lerp(ge.accent, t), y.emissive.copy(f), D.color.copy(u);
772
+ }
773
+ let i = h.uHoverAmt;
774
+ if (i.value += (Y - i.value) * Math.min(1, e * 14), r ? h.uScan.value = -20 : (ye += e, h.uScan.value = ye * 2.2 % 16 - 8), _e) {
775
+ ve += e;
776
+ let t = Math.min(1, ve / .22), i = r ? 1 : 1 + .05 * Math.sin(n * 5), a = (1.35 - .35 * t * (2 - t)) * i;
777
+ F.scale.set(a, 1, a), te.uniforms.uOpacity.value = t;
778
+ }
779
+ },
780
+ dispose() {
781
+ for (let e of o) e.dispose();
782
+ for (let e of s) e.dispose();
783
+ E.dispose();
784
+ }
785
+ };
786
+ }
787
+ // src/games/battleship/scene/core-ships.js
788
+ var lt = 5, ut = 36, dt = 20, ft = (e) => new d(e).convertSRGBToLinear();
789
+ function pt(e, { color: t, trim: n, trimIntensity: r, roughness: i }) {
790
+ let a = { value: n }, o = { value: r }, s = new T({
791
+ vertexColors: !0,
792
+ color: t,
793
+ metalness: .6,
794
+ roughness: i
795
+ });
796
+ return s.onBeforeCompile = (e) => {
797
+ e.uniforms.uTrim = a, e.uniforms.uTrimIntensity = o, e.vertexShader = e.vertexShader.replace("#include <common>", "#include <common>\nattribute float aGlow;\nvarying float vGlow;").replace("#include <begin_vertex>", "#include <begin_vertex>\nvGlow = aGlow;"), e.fragmentShader = e.fragmentShader.replace("#include <common>", "#include <common>\nuniform vec3 uTrim;\nuniform float uTrimIntensity;\nvarying float vGlow;").replace("#include <emissivemap_fragment>", "#include <emissivemap_fragment>\ntotalEmissiveRadiance += uTrim * vGlow * uTrimIntensity;\ndiffuseColor.rgb *= 1.0 - vGlow * 0.7;");
798
+ }, s.customProgramCacheKey = () => "bs-ship-" + e, {
799
+ material: s,
800
+ uTrim: a,
801
+ uTrimIntensity: o
802
+ };
803
+ }
804
+ var mt = `
805
+ uniform vec4 uEmitA[${lt}];
806
+ uniform vec4 uEmitB[${lt}];
807
+ uniform float uTime;
808
+ uniform float uScale;
809
+ uniform float uEmber;
810
+ attribute float aEmitter;
811
+ attribute vec4 aSeed;
812
+ varying vec4 vColor;
813
+ void main() {
814
+ int idx = int(aEmitter + 0.5);
815
+ vec4 A = uEmitA[idx];
816
+ vec4 B = uEmitB[idx];
817
+ float life = mix(2.8 + aSeed.y * 1.6, 1.0 + aSeed.y * 0.8, uEmber);
818
+ float t = fract((uTime + aSeed.w * life) / life);
819
+ vec3 base = A.xyz + vec3(B.x, 0.0, B.y) * (aSeed.x * 2.0 - 1.0) * B.z;
820
+ vec3 pos;
821
+ float alpha;
822
+ float size;
823
+ vec3 col;
824
+ if (uEmber < 0.5) {
825
+ 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);
826
+ alpha = smoothstep(0.0, 0.12, t) * (1.0 - smoothstep(0.5, 1.0, t)) * 0.55;
827
+ size = (0.22 + 0.6 * t) * (0.7 + 0.6 * aSeed.z);
828
+ col = mix(vec3(0.05, 0.045, 0.06), vec3(0.16, 0.17, 0.22), t);
829
+ } else {
830
+ float sway = sin(t * 9.0 + aSeed.x * 20.0) * 0.06;
831
+ pos = base + vec3(sway + 0.2 * t, t * (0.7 + aSeed.z * 0.8), sway * 0.6);
832
+ float flick = 0.55 + 0.45 * sin(uTime * 23.0 + aSeed.w * 50.0);
833
+ alpha = (1.0 - t) * flick;
834
+ size = 0.045 + 0.04 * aSeed.z;
835
+ col = mix(vec3(1.0, 0.75, 0.35), vec3(0.96, 0.25, 0.37), t);
836
+ }
837
+ alpha *= A.w;
838
+ vec4 mv = modelViewMatrix * vec4(pos, 1.0);
839
+ gl_Position = projectionMatrix * mv;
840
+ gl_PointSize = alpha > 0.003 ? size * uScale / max(-mv.z, 0.1) : 0.0;
841
+ vColor = vec4(col, alpha);
842
+ }
843
+ `, ht = "\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";
844
+ function gt(e) {
845
+ let t = e * lt, n = new c(), r = new Float32Array(t), i = new Float32Array(t * 4);
846
+ for (let e = 0; e < t; e++) {
847
+ r[e] = e % lt;
848
+ for (let t = 0; t < 4; t++) i[e * 4 + t] = Math.random();
849
+ }
850
+ return n.setAttribute("position", new s(new Float32Array(t * 3), 3)), n.setAttribute("aEmitter", new s(r, 1)), n.setAttribute("aSeed", new s(i, 4)), n;
851
+ }
852
+ function _t({ quality: n, reducedMotion: r, heightAt: i }) {
853
+ let o = new v();
854
+ o.name = "battleship-fleet";
855
+ let s = pt("intact", {
856
+ color: new d(1, 1, 1),
857
+ trim: ft("#a78bfa"),
858
+ trimIntensity: 1.6,
859
+ roughness: .42
860
+ }), c = pt("wreck", {
861
+ color: new d(.32, .3, .32),
862
+ trim: ft("#fb923c"),
863
+ trimIntensity: .5,
864
+ roughness: .75
865
+ }), l = /* @__PURE__ */ new Map();
866
+ function u(e, n) {
867
+ let r = e + ":" + n, i = l.get(r);
868
+ return i || (i = t(e, n), l.set(r, i)), i;
869
+ }
870
+ let f = [], p = [];
871
+ for (let e = 0; e < lt; e++) f.push(new ae(0, 0, 0, 0)), p.push(new ae(1, 0, .5, 0));
872
+ let m = { value: f }, h = { value: p }, g = { value: 0 }, _ = { value: 600 }, y = new ie(), b = (e, t, n) => {
873
+ e.getDrawingBufferSize(y), _.value = y.y * .5 * n.projectionMatrix.elements[5];
874
+ }, x = gt(ut), S = gt(dt), w = (e) => new I({
875
+ uniforms: {
876
+ uEmitA: m,
877
+ uEmitB: h,
878
+ uTime: g,
879
+ uScale: _,
880
+ uEmber: { value: +!!e }
881
+ },
882
+ vertexShader: mt,
883
+ fragmentShader: ht,
884
+ transparent: !0,
885
+ depthWrite: !1,
886
+ blending: e ? a : E,
887
+ toneMapped: !e
888
+ }), T = w(!1), ee = w(!0), D = new M(x, T), O = new M(S, ee);
889
+ for (let e of [D, O]) e.frustumCulled = !1, e.visible = !1, e.onBeforeRender = b, o.add(e);
890
+ D.renderOrder = 6, O.renderOrder = 7;
891
+ function k(e) {
892
+ let t = e === "low" || r;
893
+ x.setDrawRange(0, (t ? 14 : ut) * lt), S.setDrawRange(0, (t ? 8 : dt) * lt);
894
+ }
895
+ k(n);
896
+ let A = n !== "low", j = /* @__PURE__ */ new Map(), N = r ? .45 : 1.2, P = 0;
897
+ function te(e, t) {
898
+ let n = t.cells || [], r = n.length || t.size || 1, i = 0, a = 0, o = 99, s = -1, c = 99, l = -1;
899
+ for (let e of n) i += e.row, a += e.col, e.row < o && (o = e.row), e.row > s && (s = e.row), e.col < c && (c = e.col), e.col > l && (l = e.col);
900
+ let u = Math.max(1, n.length), d = n.length > 1 ? s > o : t.orientation === "vertical";
901
+ e.x = a / u - 4.5, e.z = i / u - 4.5, e.yaw = d ? -Math.PI / 2 : 0, e.dirX = +!d, e.dirZ = +!!d, e.halfLen = r / 2 - .1, e.size = r;
902
+ }
903
+ function F() {
904
+ for (let e of j.values()) o.remove(e.mesh);
905
+ j.clear();
906
+ }
907
+ return {
908
+ group: o,
909
+ geometryFor: u,
910
+ sync(t, n) {
911
+ let r = /* @__PURE__ */ new Set();
912
+ if (Array.isArray(t)) for (let i of t) {
913
+ if (!i || i.id == null || n.hide(i)) continue;
914
+ let t = String(i.id);
915
+ r.add(t);
916
+ let a = !!i.sunk && !n.forceIntact(i), l = i.size || (i.cells ? i.cells.length : 1), d = e(i.id, l), f = j.get(t), p = !f;
917
+ if (f ? (f.cls !== d || f.size !== l) && (f.mesh.geometry = u(d, l), f.cls = d) : (f = {
918
+ id: t,
919
+ mesh: new C(u(d, l), s.material),
920
+ cls: d,
921
+ phase: Math.random() * Math.PI * 2,
922
+ sunk: !1,
923
+ sinkT: 0,
924
+ sinking: !1,
925
+ forcedUntil: 0,
926
+ x: 0,
927
+ z: 0,
928
+ yaw: 0,
929
+ dirX: 1,
930
+ dirZ: 0,
931
+ halfLen: 1,
932
+ size: l
933
+ }, f.mesh.castShadow = A, f.mesh.rotation.order = "YZX", j.set(t, f), o.add(f.mesh)), te(f, i), a && !f.sunk) {
934
+ f.sunk = !0, f.mesh.material = c.material;
935
+ let e = !p || n.sunkAnimate(i);
936
+ f.sinking = e, f.sinkT = +!e;
937
+ } else !a && f.sunk && P > f.forcedUntil && (f.sunk = !1, f.sinking = !1, f.sinkT = 0, f.mesh.material = s.material);
938
+ }
939
+ for (let [e, t] of j) r.has(e) || (o.remove(t.mesh), j.delete(e));
940
+ },
941
+ clear: F,
942
+ sinkAt(e, t) {
943
+ let n = t - 4.5, r = e - 4.5;
944
+ for (let e of j.values()) {
945
+ let t = (n - e.x) * e.dirX + (r - e.z) * e.dirZ;
946
+ if (Math.abs((n - e.x) * e.dirZ - (r - e.z) * e.dirX) < .4 && Math.abs(t) <= e.halfLen + .2) return e.sunk || (e.sunk = !0, e.sinking = !0, e.sinkT = 0, e.forcedUntil = P + 3, e.mesh.material = c.material), !0;
947
+ }
948
+ return !1;
949
+ },
950
+ occupies(e, t) {
951
+ let n = t - 4.5, r = e - 4.5;
952
+ for (let e of j.values()) {
953
+ let t = (n - e.x) * e.dirX + (r - e.z) * e.dirZ;
954
+ if (Math.abs((n - e.x) * e.dirZ - (r - e.z) * e.dirX) < .4 && Math.abs(t) <= e.halfLen + .2) return !0;
955
+ }
956
+ return !1;
957
+ },
958
+ setTrimColor(e) {
959
+ s.uTrim.value.copy(e);
960
+ },
961
+ setQuality(e) {
962
+ A = e !== "low";
963
+ for (let e of j.values()) e.mesh.castShadow = A;
964
+ k(e);
965
+ },
966
+ update(e) {
967
+ P += e, g.value = P;
968
+ let t = 0, n = r ? .3 : 1;
969
+ for (let r of j.values()) {
970
+ r.sinking && (r.sinkT = Math.min(1, r.sinkT + e / N), r.sinkT >= 1 && (r.sinking = !1));
971
+ let a = r.sinkT, o = a * a * (3 - 2 * a), s = r.halfLen, c = i(r.x + r.dirX * s, r.z + r.dirZ * s), l = i(r.x - r.dirX * s, r.z - r.dirZ * s), u = i(r.x + r.dirZ * .3, r.z - r.dirX * .3), d = i(r.x - r.dirZ * .3, r.z + r.dirX * .3), m = (c + l + u + d) * .25, h = Math.sin(P * 1.3 + r.phase) * .012 * n, g = Math.atan2(c - l, 2 * s) * n + .11 * o, _ = Math.atan2(u - d, .6) * n + Math.sin(P * .9 + r.phase) * .02 * n + .3 * o;
972
+ if (r.mesh.position.set(r.x, m + h - .14 * o, r.z), r.mesh.rotation.set(_, r.yaw, g), r.sunk && t < lt) {
973
+ let e = f[t], n = p[t];
974
+ e.set(r.x, m + .08 - .1 * o, r.z, Math.min(1, a * 1.5)), n.set(r.dirX, r.dirZ, s * .7, 0), t++;
975
+ }
976
+ }
977
+ for (let e = t; e < lt; e++) f[e].w = 0;
978
+ D.visible = O.visible = t > 0;
979
+ },
980
+ dispose() {
981
+ F();
982
+ for (let e of l.values()) e.dispose();
983
+ l.clear(), s.material.dispose(), c.material.dispose(), x.dispose(), S.dispose(), T.dispose(), ee.dispose();
984
+ }
985
+ };
986
+ }
987
+ // src/games/battleship/scene/createBattleScene.js
988
+ var vt = "#0b1220", yt = .018, bt = 38, xt = 6, St = 1 / 20, Ct = (e) => new d(e).convertSRGBToLinear(), wt = {
989
+ uniforms: { tDiffuse: { value: null } },
990
+ vertexShader: "\n varying vec2 vUv;\n void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); }\n ",
991
+ fragmentShader: "\n uniform sampler2D tDiffuse;\n varying vec2 vUv;\n void main() { gl_FragColor = LinearTosRGB(texture2D(tDiffuse, vUv)); }\n "
992
+ };
993
+ function Tt() {
994
+ if (typeof window > "u") return "low";
995
+ let e = !!(window.matchMedia && window.matchMedia("(pointer: coarse)").matches), t = Math.min(window.innerWidth || 0, window.innerHeight || 0) < 640, n = typeof navigator < "u" && navigator.hardwareConcurrency || 8;
996
+ return e || t || n <= 4 ? "low" : "high";
997
+ }
998
+ function Et(e) {
999
+ let t = typeof window < "u" && window.devicePixelRatio || 1;
1000
+ return e === "high" ? Math.min(t, 1.75) : Math.min(t, t > 1.5 ? 1.25 : 1);
1001
+ }
1002
+ var Dt = (e) => e < .5 ? 4 * e * e * e : 1 - (-2 * e + 2) ** 3 / 2, Ot = (e) => e && Number.isInteger(e.row) && Number.isInteger(e.col) && e.row >= 0 && e.row < 10 && e.col >= 0 && e.col < 10;
1003
+ function kt(t, { quality: n = "auto", reducedMotion: r = !1, onCellHover: a, onCellSelect: o } = {}) {
1004
+ if (!t) throw Error("createBattleScene: container element required");
1005
+ let s = n === "auto", c = s ? Tt() : n === "low" ? "low" : "high", l = !1, f = Et(c), m = new V({
1006
+ antialias: !(c === "low" && (window.devicePixelRatio || 1) >= 2),
1007
+ alpha: !1,
1008
+ stencil: !1,
1009
+ powerPreference: "high-performance"
1010
+ });
1011
+ m.outputEncoding = se, m.toneMapping = i, m.toneMappingExposure = 1.08, m.shadowMap.enabled = !0, m.shadowMap.type = ee, m.setPixelRatio(f), m.setClearColor(vt, 1);
1012
+ let h = m.domElement;
1013
+ h.style.display = "block", h.style.width = "100%", h.style.height = "100%", h.style.touchAction = "none", h.style.outline = "none", t.appendChild(h);
1014
+ let g = Math.max(1, t.clientWidth), v = Math.max(1, t.clientHeight);
1015
+ m.setSize(g, v, !1);
1016
+ let b = new F();
1017
+ b.fog = new _(Ct(vt), yt);
1018
+ let x = new O(bt, g / v, .1, 500);
1019
+ x.position.set(11, 12, 11);
1020
+ let S = new ce(x, h);
1021
+ S.enableDamping = !0, S.dampingFactor = .08, S.enablePan = !1, S.rotateSpeed = .6, S.zoomSpeed = .8, S.minPolarAngle = .32, S.maxPolarAngle = 1.22;
1022
+ let C = new y(Ct("#9db8ff"), Ct(vt), .55), w = new p(Ct("#e8f0ff"), 1.5);
1023
+ w.position.set(-5, 14, -7), w.shadow.mapSize.set(1024, 1024);
1024
+ let T = w.shadow.camera;
1025
+ T.left = -7.5, T.right = 7.5, T.top = 7.5, T.bottom = -7.5, T.near = 4, T.far = 32, T.updateProjectionMatrix(), w.shadow.bias = -4e-4, w.shadow.normalBias = .02, w.castShadow = c === "high";
1026
+ let E = new j(Ct("#22d3ee"), 1.1, 22, 2);
1027
+ E.position.set(-7.5, 3, 7.5);
1028
+ let D = new j(Ct("#a78bfa"), 1, 22, 2);
1029
+ D.position.set(7.5, 2.5, -7.5), b.add(C, w, w.target, E, D);
1030
+ let A = qe({
1031
+ quality: c,
1032
+ reducedMotion: r,
1033
+ fogColor: new d(vt),
1034
+ fogDensity: yt
1035
+ });
1036
+ b.add(A.sky, A.mesh);
1037
+ let M = ct({ quality: c });
1038
+ for (let e of M.objects) b.add(e);
1039
+ let N = _t({
1040
+ quality: c,
1041
+ reducedMotion: r,
1042
+ heightAt: A.heightAt
1043
+ });
1044
+ b.add(N.group);
1045
+ let I = Fe({
1046
+ quality: c,
1047
+ reducedMotion: r
1048
+ });
1049
+ I.object.rotation.order = "YXZ", b.add(I.object);
1050
+ let ne = Oe(b, {
1051
+ quality: c,
1052
+ reducedMotion: r
1053
+ }), L = null, re = null, R = null;
1054
+ function z() {
1055
+ if (L) return;
1056
+ let e;
1057
+ m.capabilities.isWebGL2 && (e = new oe(g, v, { format: P }), e.samples = 4), L = new le(m, e), L.setPixelRatio(m.getPixelRatio()), L.setSize(g, v), L.addPass(new ue(b, x)), re = new fe(new ie(g, v), .6, .45, .7), L.addPass(re), R = new de(wt), L.addPass(R);
1058
+ }
1059
+ function ae() {
1060
+ L && (L.renderTarget1.dispose(), L.renderTarget2.dispose(), re.dispose(), R.material.dispose(), R.fsQuad && R.fsQuad.dispose && R.fsQuad.dispose(), L.copyPass && (L.copyPass.material.dispose(), L.copyPass.fsQuad && L.copyPass.fsQuad.dispose && L.copyPass.fsQuad.dispose()), L = null, re = null, R = null);
1061
+ }
1062
+ c === "high" && z();
1063
+ let H = {
1064
+ pos: new B(),
1065
+ target: new B()
1066
+ }, U = {
1067
+ active: !1,
1068
+ t: 0,
1069
+ dur: 1,
1070
+ fromPos: new B(),
1071
+ fromTarget: new B()
1072
+ }, pe = new B(), W = !1;
1073
+ function G() {
1074
+ let e = g / v, t = e < .85, n = bt / 2 * Math.PI / 180, r = Math.atan(Math.tan(n) * e), i = t ? 6.9 : 9.1, a = t ? 7.6 : 6.2, o = Math.min(52, Math.max(14, Math.max(i / Math.tan(r), a / Math.tan(n)) * 1.06));
1075
+ t ? pe.set(0, 1.45, 1) : pe.set(1, 1.12, 1), pe.normalize(), H.target.set(0, 0, t ? .9 : .2), H.pos.copy(H.target).addScaledVector(pe, o), S.minDistance = o * .55, S.maxDistance = o * 1.5, t ? (I.object.position.set(-4.4, .25, 8.1), I.object.rotation.set(.45, 0, 0)) : (I.object.position.set(-8.1, .25, 2.6), I.object.rotation.set(.45, Math.PI / 4, 0));
1076
+ }
1077
+ function me() {
1078
+ U.active = !1, x.position.copy(H.pos), S.target.copy(H.target), S.update();
1079
+ }
1080
+ function K(e) {
1081
+ U.fromPos.copy(x.position), U.fromTarget.copy(S.target), U.t = 0, U.dur = e, U.active = !0;
1082
+ }
1083
+ G(), r ? me() : (x.position.copy(H.target).addScaledVector(pe.copy(H.pos).sub(H.target), 1.45), x.position.y += 4, S.target.copy(H.target), S.update(), K(1.8)), S.addEventListener("start", () => {
1084
+ W = !0, U.active = !1;
1085
+ });
1086
+ function q() {
1087
+ let e = t.clientWidth, n = t.clientHeight;
1088
+ e && n && (g = e, v = n, m.setSize(e, n, !1), x.aspect = e / n, x.updateProjectionMatrix(), L && (L.setPixelRatio(m.getPixelRatio()), L.setSize(e, n)), G(), !W && !U.active && me());
1089
+ }
1090
+ let he = typeof ResizeObserver < "u" ? new ResizeObserver(q) : null;
1091
+ he ? he.observe(t) : window.addEventListener("resize", q);
1092
+ let ge = typeof document > "u" || !document.hidden, J = !0, _e = typeof IntersectionObserver < "u" ? new IntersectionObserver((e) => {
1093
+ J = e[e.length - 1].isIntersecting, nt();
1094
+ }) : null;
1095
+ _e && _e.observe(t);
1096
+ let ve = () => {
1097
+ ge = !document.hidden, nt();
1098
+ };
1099
+ document.addEventListener("visibilitychange", ve);
1100
+ let Y = null, ye = !1, be = null, xe = /* @__PURE__ */ new Map(), Se = /* @__PURE__ */ new Set(), Ce = [], we = 0, Te = (e, t) => {
1101
+ let n = e.cells;
1102
+ if (!Array.isArray(n)) return !1;
1103
+ for (let e = 0; e < n.length; e++) if (t(n[e].row * 10 + n[e].col)) return !0;
1104
+ return !1;
1105
+ }, Ee = (e) => xe.has(e), De = (e) => {
1106
+ for (let t = 0; t < Ce.length; t++) if (Ce[t].key === e && we - Ce[t].at < 3) return !0;
1107
+ return !1;
1108
+ }, ke = {
1109
+ hide: (e) => Y === "target" && !!e.sunk && Te(e, Ee),
1110
+ forceIntact: (e) => Te(e, Ee),
1111
+ sunkAnimate: (e) => Te(e, De)
1112
+ };
1113
+ function Ae() {
1114
+ N.sync(be ? be.ships : null, ke);
1115
+ }
1116
+ function je() {
1117
+ M.setMarkers(be ? be.shots : null, Ee);
1118
+ }
1119
+ let Me = new te(), Ne = new ie(), Pe = new k(new B(0, 1, 0), -Je), Ie = new B(), Le = -1, Re = "", X = {
1120
+ id: -1,
1121
+ x: 0,
1122
+ y: 0,
1123
+ moved: !1
1124
+ };
1125
+ function ze(e) {
1126
+ e !== Re && (Re = e, h.style.cursor = e);
1127
+ }
1128
+ function Be(e, t) {
1129
+ let n = h.getBoundingClientRect();
1130
+ if (!n.width || !n.height || (Ne.set((e - n.left) / n.width * 2 - 1, -((t - n.top) / n.height) * 2 + 1), Me.setFromCamera(Ne, x), !Me.ray.intersectPlane(Pe, Ie))) return -1;
1131
+ let r = Math.floor(Ie.x + 5), i = Math.floor(Ie.z + 5);
1132
+ return i < 0 || i > 9 || r < 0 || r > 9 ? -1 : i * 10 + r;
1133
+ }
1134
+ function Ve(e) {
1135
+ if (e === Le) return;
1136
+ Le = e;
1137
+ let t = e < 0 ? null : {
1138
+ row: Math.floor(e / 10),
1139
+ col: e % 10
1140
+ };
1141
+ M.setHover(t), ze(t ? "pointer" : ""), typeof a == "function" && a(t);
1142
+ }
1143
+ function He(e) {
1144
+ X.id = e.pointerId, X.x = e.clientX, X.y = e.clientY, X.moved = !1;
1145
+ }
1146
+ function Ue(e) {
1147
+ X.id === e.pointerId && !X.moved && Math.hypot(e.clientX - X.x, e.clientY - X.y) >= xt && (X.moved = !0), ye && !X.moved && e.pointerType !== "touch" && Ve(Be(e.clientX, e.clientY));
1148
+ }
1149
+ function We(e) {
1150
+ if (X.id !== e.pointerId) return;
1151
+ let t = !X.moved && Math.hypot(e.clientX - X.x, e.clientY - X.y) < xt;
1152
+ if (X.id = -1, !t || !ye) return;
1153
+ let n = Be(e.clientX, e.clientY);
1154
+ n < 0 || (e.pointerType !== "mouse" && Ve(n), typeof o == "function" && o({
1155
+ row: Math.floor(n / 10),
1156
+ col: n % 10
1157
+ }));
1158
+ }
1159
+ function Ge(e) {
1160
+ e.pointerType === "mouse" && Ve(-1);
1161
+ }
1162
+ function Ke() {
1163
+ X.id = -1;
1164
+ }
1165
+ h.addEventListener("pointerdown", He), h.addEventListener("pointermove", Ue), h.addEventListener("pointerup", We), h.addEventListener("pointerleave", Ge), h.addEventListener("pointercancel", Ke);
1166
+ let Z = new B(), Ye = new B();
1167
+ function Q(e) {
1168
+ if (e.done) return;
1169
+ e.done = !0, Se.delete(e);
1170
+ let t = (xe.get(e.key) || 1) - 1;
1171
+ t <= 0 ? xe.delete(e.key) : xe.set(e.key, t), Ce.push({
1172
+ key: e.key,
1173
+ at: we
1174
+ }), Ce.length > 12 && Ce.shift(), l || (je(), e.sunk && (Ae(), e.result === "hit" && N.sinkAt(e.row, e.col))), e.resolve();
1175
+ }
1176
+ function Ze() {
1177
+ for (let e of Array.from(Se)) Q(e);
1178
+ }
1179
+ let Qe = new u(!1), $ = 0, $e = 0, et = 0;
1180
+ function tt() {
1181
+ $ = requestAnimationFrame(tt);
1182
+ let e = Qe.getDelta(), t = Math.min(e, St);
1183
+ if (we += t, A.update(t), N.update(t), M.update(t, we, r), I.update(t, we), ne.update(t), U.active) {
1184
+ U.t += t / U.dur;
1185
+ let e = Dt(Math.min(1, U.t));
1186
+ x.position.lerpVectors(U.fromPos, H.pos, e), S.target.lerpVectors(U.fromTarget, H.target, e), U.t >= 1 && (U.active = !1);
1187
+ }
1188
+ S.update(), L ? L.render(t) : m.render(b, x), s && c === "high" && we > 3 && ($e += Math.min(e, .25), et++, et >= 120 && ($e / et > 1 / 40 && (rt("low"), s = !1), $e = 0, et = 0));
1189
+ }
1190
+ function nt() {
1191
+ let e = !l && ge && J;
1192
+ e && !$ ? (Qe.start(), Qe.getDelta(), $e = 0, et = 0, $ = requestAnimationFrame(tt)) : !e && $ && (cancelAnimationFrame($), $ = 0, Qe.stop(), Ze());
1193
+ }
1194
+ function rt(e) {
1195
+ c = e, m.setPixelRatio(Et(e)), m.setSize(g, v, !1), w.castShadow = e === "high", A.setQuality(e), M.setQuality(e), N.setQuality(e), ne.setQuality(e), e === "high" ? z() : ae(), L && (L.setPixelRatio(m.getPixelRatio()), L.setSize(g, v));
1196
+ }
1197
+ return nt(), {
1198
+ setView(t) {
1199
+ if (l || !t) return;
1200
+ let n = t.mode === "own" ? "own" : "target";
1201
+ if (n !== Y) {
1202
+ let e = Y === null;
1203
+ Y = n, N.clear(), M.setMode(Y, e || r), N.setTrimColor(Xe[Y].accent);
1204
+ }
1205
+ ye = !!t.interactive, M.setActive(ye), ye || Ve(-1), be = t, Ae(), je();
1206
+ let i = t.preview;
1207
+ if (i && Array.isArray(i.cells) && i.cells.length) {
1208
+ let t = Math.min(5, i.cells.length);
1209
+ M.setPreview(i, N.geometryFor(e(null, t), t));
1210
+ } else M.setPreview(null, null);
1211
+ },
1212
+ playShot({ row: e, col: t, result: n, sunk: r = !1, incoming: i = !1 } = {}) {
1213
+ return new Promise((a) => {
1214
+ if (l || !Ot({
1215
+ row: e,
1216
+ col: t
1217
+ })) {
1218
+ a();
1219
+ return;
1220
+ }
1221
+ let o = e * 10 + t, s = {
1222
+ key: o,
1223
+ row: e,
1224
+ col: t,
1225
+ result: n === "hit" ? "hit" : "miss",
1226
+ sunk: !!r,
1227
+ done: !1,
1228
+ resolve: a
1229
+ };
1230
+ if (Se.add(s), xe.set(o, (xe.get(o) || 0) + 1), je(), !$) {
1231
+ Q(s);
1232
+ return;
1233
+ }
1234
+ let c = t - 4.5, u = e - 4.5;
1235
+ i ? Z.set(c * .35, 5, -12) : Z.set(c * .3, 4, 9.5);
1236
+ let d = s.result === "hit" && N.occupies(e, t);
1237
+ Ye.set(c, d ? .12 : Je, u), ne.shoot(Z, Ye, s.result, () => Q(s));
1238
+ });
1239
+ },
1240
+ selectCell(e) {
1241
+ l || M.setSelected(Ot(e) ? e : null);
1242
+ },
1243
+ setRadarVisible(e) {
1244
+ l || I.setVisible(!!e);
1245
+ },
1246
+ setRadarContacts(e) {
1247
+ l || I.setContacts(e);
1248
+ },
1249
+ resetCamera() {
1250
+ l || (W = !1, G(), r ? me() : K(.9));
1251
+ },
1252
+ setQuality(e) {
1253
+ if (l) return;
1254
+ s = !1;
1255
+ let t = e === "low" ? "low" : "high";
1256
+ t !== c && rt(t);
1257
+ },
1258
+ dispose() {
1259
+ l || (l = !0, $ && cancelAnimationFrame($), $ = 0, he ? he.disconnect() : window.removeEventListener("resize", q), _e && _e.disconnect(), document.removeEventListener("visibilitychange", ve), h.removeEventListener("pointerdown", He), h.removeEventListener("pointermove", Ue), h.removeEventListener("pointerup", We), h.removeEventListener("pointerleave", Ge), h.removeEventListener("pointercancel", Ke), Ze(), S.dispose(), ne.dispose(), I.dispose(), N.dispose(), M.dispose(), A.dispose(), ae(), w.shadow && w.shadow.map && w.shadow.map.dispose(), b.clear(), m.dispose(), m.forceContextLoss(), h.parentNode && h.parentNode.removeChild(h));
1260
+ }
1261
+ };
1262
+ }
1263
+ export { kt as createBattleScene, kt as default };
1264
+
1265
+ //# sourceMappingURL=createBattleScene-L4ZRWDED.js.map