@minicode-dev/chat 0.1.13 → 0.1.15

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 (114) hide show
  1. package/CHANGELOG.md +112 -5
  2. package/README.md +401 -312
  3. package/assets/sounds/effects/avalanche.mp3 +0 -0
  4. package/assets/sounds/racing/car_boost.mp3 +0 -0
  5. package/assets/sounds/racing/car_boost.ogg +0 -0
  6. package/assets/sounds/racing/car_bump.mp3 +0 -0
  7. package/assets/sounds/racing/car_bump.ogg +0 -0
  8. package/assets/sounds/racing/car_drift_loop.mp3 +0 -0
  9. package/assets/sounds/racing/car_drift_loop.ogg +0 -0
  10. package/assets/sounds/racing/car_engine_loop.mp3 +0 -0
  11. package/assets/sounds/racing/car_engine_loop.ogg +0 -0
  12. package/assets/sounds/racing/car_engine_start.mp3 +0 -0
  13. package/assets/sounds/racing/car_engine_start.ogg +0 -0
  14. package/assets/sounds/racing/countdown_beep.mp3 +0 -0
  15. package/assets/sounds/racing/countdown_beep.ogg +0 -0
  16. package/assets/sounds/racing/countdown_go.mp3 +0 -0
  17. package/assets/sounds/racing/countdown_go.ogg +0 -0
  18. package/assets/sounds/racing/final_lap.mp3 +0 -0
  19. package/assets/sounds/racing/final_lap.ogg +0 -0
  20. package/assets/sounds/racing/finish_line.mp3 +0 -0
  21. package/assets/sounds/racing/finish_line.ogg +0 -0
  22. package/assets/sounds/racing/lap_complete.mp3 +0 -0
  23. package/assets/sounds/racing/lap_complete.ogg +0 -0
  24. package/assets/sounds/racing/music_circuit.mp3 +0 -0
  25. package/assets/sounds/racing/music_circuit.ogg +0 -0
  26. package/assets/sounds/racing/music_final_lap.mp3 +0 -0
  27. package/assets/sounds/racing/music_final_lap.ogg +0 -0
  28. package/assets/sounds/racing/race_defeat.mp3 +0 -0
  29. package/assets/sounds/racing/race_defeat.ogg +0 -0
  30. package/assets/sounds/racing/race_victory.mp3 +0 -0
  31. package/assets/sounds/racing/race_victory.ogg +0 -0
  32. package/assets/sounds/tanks/barrel_explode.mp3 +0 -0
  33. package/assets/sounds/tanks/barrel_explode.ogg +0 -0
  34. package/assets/sounds/tanks/crate_break.mp3 +0 -0
  35. package/assets/sounds/tanks/crate_break.ogg +0 -0
  36. package/assets/sounds/tanks/health_pickup.mp3 +0 -0
  37. package/assets/sounds/tanks/health_pickup.ogg +0 -0
  38. package/assets/sounds/tanks/last_life.mp3 +0 -0
  39. package/assets/sounds/tanks/last_life.ogg +0 -0
  40. package/assets/sounds/tanks/life_lost.mp3 +0 -0
  41. package/assets/sounds/tanks/life_lost.ogg +0 -0
  42. package/assets/sounds/tanks/respawn.mp3 +0 -0
  43. package/assets/sounds/tanks/respawn.ogg +0 -0
  44. package/assets/sounds/tanks/shield_end.mp3 +0 -0
  45. package/assets/sounds/tanks/shield_end.ogg +0 -0
  46. package/assets/sounds/tanks/shield_loop.mp3 +0 -0
  47. package/assets/sounds/tanks/shield_loop.ogg +0 -0
  48. package/assets/sounds/tanks/wall_hit.mp3 +0 -0
  49. package/assets/sounds/tanks/wall_hit.ogg +0 -0
  50. package/dist/chunks/{BattleshipGameCard-iRk8d4vR.js → BattleshipGameCard-8H-sBCsv.js} +146 -144
  51. package/dist/chunks/{BattleshipGameCard-iRk8d4vR.js.map → BattleshipGameCard-8H-sBCsv.js.map} +1 -1
  52. package/dist/chunks/{ChatContext-DjIEifGY.js → ChatContext-CVW58bzC.js} +2 -2
  53. package/dist/chunks/{ChatContext-DjIEifGY.js.map → ChatContext-CVW58bzC.js.map} +1 -1
  54. package/dist/chunks/RacingLiveGameCard-8j9QLnxW.js +1654 -0
  55. package/dist/chunks/RacingLiveGameCard-8j9QLnxW.js.map +1 -0
  56. package/dist/chunks/{TanksGameCard-GrqmdwJ7.js → TanksGameCard-DnCufSH6.js} +168 -166
  57. package/dist/chunks/{TanksGameCard-GrqmdwJ7.js.map → TanksGameCard-DnCufSH6.js.map} +1 -1
  58. package/dist/chunks/TanksLiveGameCard-D_27Jomp.js +1274 -0
  59. package/dist/chunks/TanksLiveGameCard-D_27Jomp.js.map +1 -0
  60. package/dist/chunks/avalancheScene3d-CIE2WKQn.js +1300 -0
  61. package/dist/chunks/avalancheScene3d-CIE2WKQn.js.map +1 -0
  62. package/dist/chunks/cars-D1PM7mVD.js +340 -0
  63. package/dist/chunks/cars-D1PM7mVD.js.map +1 -0
  64. package/dist/chunks/connect4Sounds-BqEHULjv.js +235 -0
  65. package/dist/chunks/connect4Sounds-BqEHULjv.js.map +1 -0
  66. package/dist/chunks/connectionStore-DwgIUl30.js +13 -0
  67. package/dist/chunks/connectionStore-DwgIUl30.js.map +1 -0
  68. package/dist/chunks/createLiveScene-MTGRv8rx.js +758 -0
  69. package/dist/chunks/createLiveScene-MTGRv8rx.js.map +1 -0
  70. package/dist/chunks/createRaceScene-BiEtQsVs.js +306 -0
  71. package/dist/chunks/createRaceScene-BiEtQsVs.js.map +1 -0
  72. package/dist/chunks/{createTankScene-6asWHKFf.js → createTankScene-yhX6la27.js} +125 -123
  73. package/dist/chunks/{createTankScene-6asWHKFf.js.map → createTankScene-yhX6la27.js.map} +1 -1
  74. package/dist/chunks/decor-CyyCnmct.js +418 -0
  75. package/dist/chunks/decor-CyyCnmct.js.map +1 -0
  76. package/dist/chunks/fx-1ZwzmPWj.js +458 -0
  77. package/dist/chunks/fx-1ZwzmPWj.js.map +1 -0
  78. package/dist/chunks/fx-DhXerGyt.js +248 -0
  79. package/dist/chunks/fx-DhXerGyt.js.map +1 -0
  80. package/dist/chunks/gameStatus-BChd29yI.js +62 -0
  81. package/dist/chunks/gameStatus-BChd29yI.js.map +1 -0
  82. package/dist/chunks/games-Bl_8raG6.js +3681 -0
  83. package/dist/chunks/games-Bl_8raG6.js.map +1 -0
  84. package/dist/chunks/rolldown-runtime-CGnMp29N.js +10 -0
  85. package/dist/chunks/tank-DjEQ4FXF.js +553 -0
  86. package/dist/chunks/tank-DjEQ4FXF.js.map +1 -0
  87. package/dist/chunks/tanks-live-BcKmrhnV.js +261 -0
  88. package/dist/chunks/tanks-live-BcKmrhnV.js.map +1 -0
  89. package/dist/chunks/{tanksSounds-CUNDIOal.js → tanksSounds-DTnidbiq.js} +44 -12
  90. package/dist/chunks/tanksSounds-DTnidbiq.js.map +1 -0
  91. package/dist/chunks/track-BcnnpnAm.js +259 -0
  92. package/dist/chunks/track-BcnnpnAm.js.map +1 -0
  93. package/dist/chunks/util-DwI9bfS7.js +57 -0
  94. package/dist/chunks/util-DwI9bfS7.js.map +1 -0
  95. package/dist/index.js +822 -635
  96. package/dist/index.js.map +1 -1
  97. package/dist/styles.css +1 -1
  98. package/index.d.ts +3 -1
  99. package/package.json +1 -1
  100. package/dist/chunks/TanksLiveGameCard-DSmQcUMh.js +0 -1225
  101. package/dist/chunks/TanksLiveGameCard-DSmQcUMh.js.map +0 -1
  102. package/dist/chunks/avalancheScene3d-Dnl2E3EA.js +0 -1878
  103. package/dist/chunks/avalancheScene3d-Dnl2E3EA.js.map +0 -1
  104. package/dist/chunks/connect4Sounds-Cv0q31VW.js +0 -3245
  105. package/dist/chunks/connect4Sounds-Cv0q31VW.js.map +0 -1
  106. package/dist/chunks/createLiveScene-819NWv84.js +0 -365
  107. package/dist/chunks/createLiveScene-819NWv84.js.map +0 -1
  108. package/dist/chunks/fx-BNJvJYOu.js +0 -871
  109. package/dist/chunks/fx-BNJvJYOu.js.map +0 -1
  110. package/dist/chunks/gameStatus-Cu1Z8un9.js +0 -69
  111. package/dist/chunks/gameStatus-Cu1Z8un9.js.map +0 -1
  112. package/dist/chunks/tank-DIn6Jyt8.js +0 -605
  113. package/dist/chunks/tank-DIn6Jyt8.js.map +0 -1
  114. package/dist/chunks/tanksSounds-CUNDIOal.js.map +0 -1
@@ -0,0 +1,458 @@
1
+ import { c as e, d as t, l as n, o as r } from "./util-DwI9bfS7.js";
2
+ import { AdditiveBlending as i, BufferAttribute as a, BufferGeometry as o, Color as s, DoubleSide as c, DynamicDrawUsage as l, IcosahedronGeometry as u, InstancedMesh as d, Mesh as f, MeshBasicMaterial as p, MeshLambertMaterial as m, NormalBlending as h, Object3D as g, OctahedronGeometry as _, PlaneGeometry as v, PointLight as y, Points as b, ShaderMaterial as ee, Sprite as te, SpriteMaterial as ne, Vector3 as x } from "three";
3
+ // src/games/tanks/scene/fx.js
4
+ var re = {
5
+ low: 250,
6
+ medium: 520,
7
+ high: 900
8
+ }, S = 20, ie = 0, ae = 1, C = 2, w = 3, T = 4, E = 5, D = 6, O = 7, k = 8, oe = 9, A = 10, j = 11, M = 12, N = 13, se = 14, P = 15, F = 16, I = 17, L = 18, R = 19, ce = 8, le = 4, z = 56, B = 320, V = {
9
+ white: e("#fff6e0"),
10
+ yellow: e("#ffd36b"),
11
+ orange: e("#ff7a1a"),
12
+ red: e("#b3200e"),
13
+ ember: e("#ffb347"),
14
+ smoke: e("#5b5552"),
15
+ smokeLight: e("#9a918a"),
16
+ smokeDark: e("#2c2826"),
17
+ dirt: e("#6e5034"),
18
+ dirtLight: e("#a07a50"),
19
+ spark: e("#ffe2a8"),
20
+ dust: e("#c9ad85"),
21
+ exhaust: e("#3a3633")
22
+ }, ue = "\nuniform float uScale;\nuniform float uMaxSize;\nattribute vec4 aColor;\nattribute float aSize;\nvarying vec4 vColor;\nvoid main() {\n vec4 mv = modelViewMatrix * vec4(position, 1.0);\n gl_Position = projectionMatrix * mv;\n gl_PointSize = aColor.a > 0.003 ? min(aSize * uScale / max(-mv.z, 0.5), uMaxSize) : 0.0;\n vColor = aColor;\n}\n", de = "\nuniform sampler2D uMap;\nvarying vec4 vColor;\nvoid main() {\n float a = texture2D(uMap, gl_PointCoord).a * vColor.a;\n gl_FragColor = vec4(vColor.rgb, a);\n #include <encodings_fragment>\n}\n", fe = "\nuniform sampler2D uMap;\nvarying vec4 vColor;\nvoid main() {\n float a = texture2D(uMap, gl_PointCoord).a * vColor.a;\n if (a < 0.004) discard;\n gl_FragColor = vec4(vColor.rgb, a);\n #include <encodings_fragment>\n}\n";
23
+ function pe(e, t, n, r) {
24
+ let s = new Float32Array(e * S), c = new Float32Array(e * 3), u = new Float32Array(e * 4), d = new Float32Array(e), f = new o();
25
+ f.setAttribute("position", new a(c, 3).setUsage(l)), f.setAttribute("aColor", new a(u, 4).setUsage(l)), f.setAttribute("aSize", new a(d, 1).setUsage(l)), f.setDrawRange(0, 0);
26
+ let p = new ee({
27
+ uniforms: {
28
+ uScale: r,
29
+ uMap: { value: n },
30
+ uMaxSize: { value: 512 }
31
+ },
32
+ vertexShader: ue,
33
+ fragmentShader: t ? de : fe,
34
+ transparent: !0,
35
+ depthWrite: !1,
36
+ blending: t ? i : h,
37
+ premultipliedAlpha: !1
38
+ }), m = new b(f, p);
39
+ m.frustumCulled = !1, m.renderOrder = t ? 6 : 5;
40
+ let g = 0, _ = 0, v = e, y = null;
41
+ return {
42
+ points: m,
43
+ get count() {
44
+ return g;
45
+ },
46
+ setCap(t) {
47
+ v = Math.min(e, t), g > v && (g = v);
48
+ },
49
+ setWind(e) {
50
+ y = e;
51
+ },
52
+ spawn(e, t, n, r, i, a, o, c, l, u, d, f, p, m, h = 0) {
53
+ let y;
54
+ g < v ? y = g++ : (y = _, _ = (_ + 1) % v);
55
+ let b = y * S;
56
+ s[b + ie] = e, s[b + ae] = t, s[b + C] = n, s[b + w] = r, s[b + T] = i, s[b + E] = a, s[b + D] = 0, s[b + O] = o, s[b + k] = c, s[b + oe] = l, s[b + A] = u.r, s[b + j] = u.g, s[b + M] = u.b, s[b + N] = d.r, s[b + se] = d.g, s[b + P] = d.b, s[b + F] = f, s[b + I] = p, s[b + L] = m, s[b + R] = h;
57
+ },
58
+ update(e) {
59
+ let t = 0, n = y ? y.x : 0, r = y ? y.z : 0;
60
+ for (; t < g;) {
61
+ let i = t * S, a = s[i + D] + e;
62
+ if (a >= s[i + O]) {
63
+ g--, t !== g && s.copyWithin(i, g * S, g * S + S);
64
+ continue;
65
+ }
66
+ s[i + D] = a;
67
+ let o = Math.exp(-s[i + I] * e), l = s[i + L];
68
+ s[i + w] = s[i + w] * o + (l > 0 ? n * .35 * e : 0), s[i + T] = s[i + T] * o - l * e, s[i + E] = s[i + E] * o + (l > 0 ? r * .35 * e : 0), s[i + ie] += s[i + w] * e, s[i + ae] += s[i + T] * e, s[i + C] += s[i + E] * e;
69
+ let f = a / s[i + O], p = f < .6 ? f / .6 : 1, m = p * p * (3 - 2 * p), h = 1 + s[i + R] * (1 - f) * (1 - f) * (1 - f), _ = t * 3;
70
+ c[_] = s[i + ie], c[_ + 1] = s[i + ae], c[_ + 2] = s[i + C];
71
+ let v = t * 4;
72
+ u[v] = (s[i + A] + (s[i + N] - s[i + A]) * m) * h, u[v + 1] = (s[i + j] + (s[i + se] - s[i + j]) * m) * h, u[v + 2] = (s[i + M] + (s[i + P] - s[i + M]) * m) * h;
73
+ let y = f < .06 ? f / .06 : 1, b = f > .55 ? 1 - (f - .55) / .45 : 1;
74
+ u[v + 3] = s[i + F] * y * b, d[t] = s[i + k] + (s[i + oe] - s[i + k]) * Math.sqrt(f), t++;
75
+ }
76
+ return f.setDrawRange(0, g), m.visible = g > 0, g > 0 && (f.attributes.position.updateRange.count = g * 3, f.attributes.aColor.updateRange.count = g * 4, f.attributes.aSize.updateRange.count = g, f.attributes.position.needsUpdate = !0, f.attributes.aColor.needsUpdate = !0, f.attributes.aSize.needsUpdate = !0), g > 0;
77
+ },
78
+ clear() {
79
+ g = 0, f.setDrawRange(0, 0), m.visible = !1;
80
+ },
81
+ dispose() {
82
+ f.dispose(), p.dispose();
83
+ }
84
+ };
85
+ }
86
+ function me(h, { quality: S = "high", reducedMotion: ie = !1, heightAt: ae }) {
87
+ let C = r(64), w = t(64), T = n(128), E = { value: 600 }, D = re.high, O = pe(Math.round(D * .55), !0, C, E), k = pe(Math.round(D * .45), !1, w, E);
88
+ h.add(k.points, O.points);
89
+ let oe = 1, A = new y(e("#ffb066"), 0, 60, 2);
90
+ h.add(A);
91
+ let j = 0, M = 6, N = new _(.28, 0);
92
+ N.scale(2.2, 1, 1);
93
+ let se = new p({ color: e("#fff1cf").multiplyScalar(2) }), P = [];
94
+ for (let t = 0; t < ce; t++) {
95
+ let t = new f(N, se);
96
+ t.visible = !1;
97
+ let n = new ne({
98
+ map: C,
99
+ color: e("#ff9440").multiplyScalar(1.2),
100
+ blending: i,
101
+ depthWrite: !1,
102
+ transparent: !0
103
+ }), r = new te(n);
104
+ r.scale.setScalar(4), r.visible = !1, r.renderOrder = 7, h.add(t, r), P.push({
105
+ mesh: t,
106
+ glow: r,
107
+ active: !1,
108
+ px: 0,
109
+ py: 0,
110
+ pz: 0,
111
+ has: !1,
112
+ acc: 0
113
+ });
114
+ }
115
+ let F = [];
116
+ for (let e = 0; e < 3; e++) {
117
+ let e = new ne({
118
+ map: C,
119
+ color: new s(1, .8, .5),
120
+ blending: i,
121
+ depthWrite: !1,
122
+ transparent: !0
123
+ }), t = new te(e);
124
+ t.visible = !1, t.renderOrder = 8, h.add(t), F.push({
125
+ s: t,
126
+ t: 0,
127
+ dur: .2,
128
+ size: 4,
129
+ color: new s()
130
+ });
131
+ }
132
+ let I = 0, L = new v(1, 1);
133
+ L.rotateX(-Math.PI / 2);
134
+ let R = [];
135
+ for (let t = 0; t < le; t++) {
136
+ let t = new p({
137
+ map: T,
138
+ color: e("#ffd9a0"),
139
+ transparent: !0,
140
+ blending: i,
141
+ depthWrite: !1,
142
+ side: c,
143
+ fog: !1
144
+ }), n = new f(L, t);
145
+ n.visible = !1, n.renderOrder = 4, h.add(n), R.push({
146
+ m: n,
147
+ t: 0,
148
+ dur: .6,
149
+ r: 10
150
+ });
151
+ }
152
+ let fe = 0, me = new u(.32, 0);
153
+ me.computeVertexNormals();
154
+ let he = new m({ color: 16777215 }), H = new d(me, he, z);
155
+ H.frustumCulled = !1, H.instanceMatrix.setUsage(l);
156
+ let U = new g();
157
+ U.scale.setScalar(0), U.updateMatrix();
158
+ for (let e = 0; e < z; e++) H.setMatrixAt(e, U.matrix), H.setColorAt(e, V.dirt);
159
+ H.instanceColor.setUsage(l), h.add(H);
160
+ let ge = [];
161
+ for (let e = 0; e < z; e++) ge.push({
162
+ alive: !1,
163
+ p: new x(),
164
+ v: new x(),
165
+ r: new x(),
166
+ w: new x(),
167
+ life: 0,
168
+ s: 1,
169
+ rest: !1,
170
+ smoke: !1,
171
+ acc: 0
172
+ });
173
+ let _e = 0, ve = 0, W = new Float32Array(B * 3), ye = new Float32Array(B * 4), be = new Float32Array(B), xe = { value: 16 }, G = new o();
174
+ G.setAttribute("position", new a(W, 3).setUsage(l)), G.setAttribute("aColor", new a(ye, 4).setUsage(l)), G.setAttribute("aSize", new a(be, 1).setUsage(l)), G.setDrawRange(0, 0);
175
+ let Se = new ee({
176
+ uniforms: {
177
+ uScale: E,
178
+ uMap: { value: C },
179
+ uMaxSize: xe
180
+ },
181
+ vertexShader: ue,
182
+ fragmentShader: de,
183
+ transparent: !0,
184
+ depthWrite: !1,
185
+ depthTest: !1,
186
+ blending: i
187
+ }), K = new b(G, Se);
188
+ K.frustumCulled = !1, K.visible = !1, K.renderOrder = 9;
189
+ let Ce = new p({
190
+ map: T,
191
+ color: e("#fff3c4").multiplyScalar(1.4),
192
+ transparent: !0,
193
+ blending: i,
194
+ depthWrite: !1,
195
+ depthTest: !1,
196
+ side: c,
197
+ fog: !1
198
+ }), q = new f(L, Ce);
199
+ q.visible = !1, q.renderOrder = 9, h.add(K, q);
200
+ let J = 0, Y = null, we = 0, Te = e("#fff0c0"), Ee = new x();
201
+ function De(e) {
202
+ S = e;
203
+ let t = re[e] || re.high;
204
+ oe = t / re.high, O.setCap(Math.round(t * .55)), k.setCap(Math.round(t * .45));
205
+ }
206
+ De(S);
207
+ let X = Math.random, Z = (e) => (X() * 2 - 1) * e, Q = (e) => Math.max(1, Math.round(e * oe));
208
+ function $(e, t, n, r, i, a) {
209
+ let o = F[I];
210
+ I = (I + 1) % F.length, o.s.position.set(e, t, n), o.t = 0, o.dur = a, o.size = r, o.color.copy(i), o.s.material.color.copy(i), o.s.visible = !0, o.s.scale.setScalar(r);
211
+ }
212
+ function Oe(e, t, n, r, i = 60, a = 6) {
213
+ A.position.set(e, t, n), A.distance = i, r >= j && (j = r, M = a);
214
+ }
215
+ function ke(e, t, n, r, i = .6, a = null) {
216
+ let o = R[fe];
217
+ fe = (fe + 1) % R.length, o.m.position.set(e, t + .25, n), o.t = 0, o.dur = i, o.r = r, o.m.visible = !0, o.m.scale.setScalar(.1), o.m.material.color.copy(a || V.yellow);
218
+ }
219
+ function Ae(e, t, n, r, i, a, o = 1, s = !1) {
220
+ for (let c = 0; c < r; c++) {
221
+ let r = ge[_e], c = _e;
222
+ _e = (_e + 1) % z, r.alive = !0, r.rest = !1, r.p.set(e + Z(.6), t + .4, n + Z(.6));
223
+ let l = X() * Math.PI * 2, u = i * (.35 + X() * .65);
224
+ r.v.set(Math.cos(l) * u * .6, i * (.6 + X() * .7), Math.sin(l) * u * .6), r.r.set(X() * 6, X() * 6, X() * 6), r.w.set(Z(9), Z(9), Z(9)), r.life = 2.6 + X() * 1.6, r.s = o * (.5 + X() * .9), r.smoke = s && X() < .5, r.acc = 0, H.setColorAt(c, a);
225
+ }
226
+ ve += r, H.instanceColor.needsUpdate = !0;
227
+ }
228
+ function je(e, t) {
229
+ $(e.x + t.x * .6, e.y + t.y * .6, e.z + t.z * .6, 4.5, V.orange, .14), Oe(e.x, e.y + .5, e.z, 3.5, 40, 12);
230
+ let n = Q(26);
231
+ for (let r = 0; r < n; r++) {
232
+ let n = 6 + X() * 14;
233
+ O.spawn(e.x, e.y, e.z, t.x * n + Z(2), t.y * n + Z(2), t.z * n + Z(2), .12 + X() * .18, .9, 1.8, V.white, V.orange, .9, 5, 0, 2);
234
+ }
235
+ let r = Q(14);
236
+ for (let n = 0; n < r; n++) {
237
+ let n = 2 + X() * 6;
238
+ k.spawn(e.x, e.y, e.z, t.x * n + Z(1.5), t.y * n + Z(1) + .6, t.z * n + Z(1.5), 1.2 + X() * 1.2, 1, 3.6, V.smokeLight, V.smoke, .45, 2.2, -.4);
239
+ }
240
+ }
241
+ function Me(e, t, n, r, i, a, o = !1) {
242
+ let s = Math.hypot(r - e, i - t, a - n), c = Math.min(24, Math.ceil(s / (S === "low" ? 1.6 : .8)));
243
+ for (let s = 0; s < c; s++) {
244
+ let l = (s + X()) / c, u = e + (r - e) * l, d = t + (i - t) * l, f = n + (a - n) * l;
245
+ O.spawn(u, d, f, Z(.3), Z(.3), Z(.3), .25 + X() * .2, o ? 1.1 : .8, .2, V.yellow, V.red, .8, 1, 0, 1), s % 2 == 0 && k.spawn(u, d, f, Z(.4), .3 + X() * .4, Z(.4), 1.1 + X() * .9, .5, o ? 2.4 : 1.8, V.smokeLight, V.smoke, .32, 1.5, -.25);
246
+ }
247
+ }
248
+ function Ne(t, n, r, i, a) {
249
+ let o = Math.max(2, i || 6), s = o >= 7, c = o / 6;
250
+ $(t, n + 1.2 * c, r, 7 * c, V.yellow, .22), Oe(t, n + 3, r, s ? 5 : 3.5, 30 + o * 5, 3.5), ke(t, n, r, o * 2.4, .55, V.yellow), ke(t, n, r, o * 1.4, .9, V.orange);
251
+ let l = Q(70 * c);
252
+ for (let e = 0; e < l; e++) {
253
+ let e = X() * Math.PI * 2, i = Math.acos(X() * .9), a = (4 + X() * 9) * c, o = Math.cos(e) * Math.sin(i) * a, s = Math.sin(e) * Math.sin(i) * a, l = Math.cos(i) * a * .9 + 2;
254
+ O.spawn(t + Z(.6), n + .6, r + Z(.6), o, l, s, .45 + X() * .5, 1.8 * c, 3.8 * c, V.yellow, V.red, .55, 4.5, -2.5, 1.6);
255
+ }
256
+ let u = Q(46 * c);
257
+ for (let e = 0; e < u; e++) {
258
+ let e = X() * Math.PI * 2, i = (9 + X() * 16) * c;
259
+ O.spawn(t, n + .8, r, Math.cos(e) * i * .7, (6 + X() * 14) * c, Math.sin(e) * i * .7, .7 + X() * .9, .35, .15, V.spark, V.ember, 1, .8, 16, 1.5);
260
+ }
261
+ let d = Q(40 * c);
262
+ for (let e = 0; e < d; e++) {
263
+ let e = X() * Math.PI * 2, i = (1 + X() * 4) * c;
264
+ k.spawn(t + Z(1.2 * c), n + .8 + X() * 2 * c, r + Z(1.2 * c), Math.cos(e) * i, 2.5 + X() * 4, Math.sin(e) * i, 2 + X() * 2.2, 2.4 * c, 6.5 * c, V.smoke, V.smokeLight, .62, 1.4, -.6);
265
+ }
266
+ if (a === "terrain" || a === "obstacle") {
267
+ let i = Q(48 * c), o = a === "obstacle" ? V.smokeLight : V.dirt;
268
+ for (let e = 0; e < i; e++) {
269
+ let e = X() * Math.PI * 2, i = (2 + X() * 6) * c;
270
+ k.spawn(t, n + .3, r, Math.cos(e) * i, (8 + X() * 12) * c, Math.sin(e) * i, .9 + X() * .7, 1 * c, 2.2 * c, o, V.dirtLight, .95, .6, 18);
271
+ }
272
+ Ae(t, n, r, Math.round((S === "low" ? 8 : 16) * c), 13 * c, a === "obstacle" ? e("#8b8680") : V.dirt, 1.1);
273
+ } else a === "tank" && Ae(t, n, r, S === "low" ? 6 : 12, 14, e("#3a3633"), .9, !0);
274
+ }
275
+ function Pe(e, t, n) {
276
+ $(e, t, n, 5, V.yellow, .18), Oe(e, t, n, 2.5, 30, 10);
277
+ let r = Q(30);
278
+ for (let i = 0; i < r; i++) {
279
+ let r = X() * Math.PI * 2, i = X() * Math.PI, a = 5 + X() * 6;
280
+ O.spawn(e, t, n, Math.cos(r) * Math.sin(i) * a, Math.cos(i) * a, Math.sin(r) * Math.sin(i) * a, .3 + X() * .3, .6, .2, V.spark, V.orange, 1, 2, 4, 1);
281
+ }
282
+ for (let r = 0; r < Q(8); r++) k.spawn(e, t, n, Z(1), Z(1), Z(1), 1 + X(), 1, 3, V.smokeLight, V.smoke, .4, 1, -.3);
283
+ }
284
+ function Fe(e, t, n) {
285
+ for (let r = 0; r < Q(10); r++) k.spawn(e, t, n, Z(1.5), Z(1), Z(1.5), .8 + X(), 1, 3, V.smokeLight, V.smoke, .35, 1, 0);
286
+ }
287
+ function Ie(e, t, n) {
288
+ $(e, t, n, 7, V.white, .18);
289
+ for (let r = 0; r < Q(40); r++) {
290
+ let r = X() * Math.PI * 2, i = 10 + X() * 14;
291
+ O.spawn(e, t, n, Math.cos(r) * i, 4 + X() * 12, Math.sin(r) * i, .5 + X() * .5, .35, .12, V.white, V.ember, 1, 1.2, 18, 2);
292
+ }
293
+ }
294
+ function Le(t, n, r) {
295
+ Ne(t, n + .8, r, 10, "tank"), $(t, n + 3, r, 15, V.orange, .4), Oe(t, n + 4, r, 7, 80, 2.2), ke(t, n, r, 32, 1, V.orange), Ae(t, n + 1, r, S === "low" ? 10 : 20, 18, e("#2f2b29"), 1.3, !0);
296
+ for (let e = 0; e < Q(60); e++) {
297
+ let e = X() * Math.PI * 2, i = 2 + X() * 5;
298
+ k.spawn(t + Z(2), n + 2 + X() * 4, r + Z(2), Math.cos(e) * i, 4 + X() * 6, Math.sin(e) * i, 3 + X() * 2.5, 3, 9, V.smokeDark, V.smoke, .7, 1, -.7);
299
+ }
300
+ }
301
+ function Re(e, t, n, r, i, a) {
302
+ for (a.smokeAcc += r * (i >= 2 ? 16 : 7) * (S === "low" ? .5 : 1); a.smokeAcc >= 1;) {
303
+ --a.smokeAcc;
304
+ let r = i >= 2;
305
+ k.spawn(e + Z(.5), t, n + Z(.5), Z(.4), 2.2 + X() * 1.6, Z(.4), 2.6 + X() * 1.8, 1, r ? 6 : 4, r ? V.smokeDark : V.smoke, V.smokeLight, r ? .55 : .36, .5, -.35), r && O.spawn(e + Z(.6), t - .2, n + Z(.6), Z(.6), 2 + X() * 2, Z(.6), .45 + X() * .35, 1.6, .7, V.yellow, V.red, .8, 1.5, -1, 1.5);
306
+ }
307
+ }
308
+ function ze(e, t, n) {
309
+ k.spawn(e, t, n, Z(.4), .8 + X() * .6, Z(.4), .9 + X() * .5, .4, 1.4, V.exhaust, V.smoke, .4, 1.5, -.2);
310
+ }
311
+ function Be(e, t, n, r = 1) {
312
+ k.spawn(e + Z(.4), t + .1, n + Z(.4), Z(1.2), .6 + X() * .9, Z(1.2), 1 + X() * .8, .8, 2.8 * r, V.dust, V.dirtLight, .42, 1.8, .2);
313
+ }
314
+ function Ve(e, t, n, r) {
315
+ $(e, t, n, 6, r, .3);
316
+ let i = Q(70);
317
+ for (let a = 0; a < i; a++) {
318
+ let i = X() * Math.PI * 2, a = Math.acos(X() * 2 - 1), o = 7 + X() * 2;
319
+ O.spawn(e, t, n, Math.cos(i) * Math.sin(a) * o, Math.cos(a) * o, Math.sin(i) * Math.sin(a) * o, 1.1 + X() * .6, 1.1, .35, V.white, r, 1, 1.6, 3.5, 1.2);
320
+ }
321
+ }
322
+ function He(e, t, n, r, i) {
323
+ let a = P[e];
324
+ a.active = !0, a.has = !1, a.mesh.visible = !0, a.glow.visible = !0, a.glow.scale.setScalar(i ? 3.6 : 2.6), a.mesh.scale.setScalar(i ? 1.3 : .9), Ue(e, t, n, r);
325
+ }
326
+ function Ue(e, t, n, r) {
327
+ let i = P[e];
328
+ i.has && (Ee.set(t, n, r), Math.abs(t - i.px) + Math.abs(n - i.py) + Math.abs(r - i.pz) > 1e-4 && (i.mesh.lookAt(Ee), i.mesh.rotateY(-Math.PI / 2), Me(i.px, i.py, i.pz, t, n, r, i.mesh.scale.x > 1))), i.mesh.position.set(t, n, r), i.glow.position.set(t, n, r), i.px = t, i.py = n, i.pz = r, i.has = !0;
329
+ }
330
+ function We(e) {
331
+ let t = P[e];
332
+ t.active = !1, t.mesh.visible = !1, t.glow.visible = !1;
333
+ }
334
+ function Ge(e) {
335
+ if (Y = e && e.length >= 6 ? e : null, !Y) {
336
+ K.visible = !1, q.visible = !1, J = 0;
337
+ return;
338
+ }
339
+ let t = 1.6, n = 0, r = t;
340
+ W[0] = Y[0], W[1] = Y[1], W[2] = Y[2];
341
+ let i = 1;
342
+ for (let e = 3; e + 2 < Y.length && i < B; e += 3) {
343
+ let a = Y[e - 3], o = Y[e - 2], s = Y[e - 1], c = Y[e], l = Y[e + 1], u = Y[e + 2], d = Math.hypot(c - a, l - o, u - s);
344
+ for (; d > 0 && r <= n + d && i < B;) {
345
+ let e = (r - n) / d;
346
+ W[i * 3] = a + (c - a) * e, W[i * 3 + 1] = o + (l - o) * e, W[i * 3 + 2] = s + (u - s) * e, i++, r += t;
347
+ }
348
+ n += d;
349
+ }
350
+ J = i;
351
+ let a = Y[Y.length - 3], o = Y[Y.length - 2], s = Y[Y.length - 1];
352
+ q.position.set(a, o + .3, s), q.scale.setScalar(5), q.visible = !0, K.visible = !0, Ke();
353
+ }
354
+ function Ke() {
355
+ for (let e = 0; e < J; e++) {
356
+ let t = e / Math.max(1, J - 1), n = .55 + .45 * Math.cos(e * .55 - we * 7);
357
+ ye[e * 4] = Te.r * (1.4 - t * .3), ye[e * 4 + 1] = Te.g * (1.3 - t * .4), ye[e * 4 + 2] = Te.b * (1.1 - t * .5), ye[e * 4 + 3] = (.35 + .65 * n) * (1 - t * .45), be[e] = .55 + .25 * n;
358
+ }
359
+ G.setDrawRange(0, J), G.attributes.position.needsUpdate = !0, G.attributes.aColor.needsUpdate = !0, G.attributes.aSize.needsUpdate = !0;
360
+ }
361
+ function qe(e, t, n, r) {
362
+ E.value = n.getDrawingBufferSize(Ee).y * .5 * t.projectionMatrix.elements[5], xe.value = 11 * n.getPixelRatio();
363
+ let i = !1;
364
+ O.update(e) && (i = !0), k.update(e) && (i = !0), j > .01 ? (j *= Math.exp(-M * e), A.intensity = j, i = !0) : A.intensity !== 0 && (j = 0, A.intensity = 0);
365
+ for (let t of F) {
366
+ if (!t.s.visible) continue;
367
+ t.t += e;
368
+ let n = t.t / t.dur;
369
+ n >= 1 ? t.s.visible = !1 : (i = !0, t.s.scale.setScalar(t.size * (.6 + .6 * n)), t.s.material.opacity = 1 - n * n);
370
+ }
371
+ for (let t of R) {
372
+ if (!t.m.visible) continue;
373
+ t.t += e;
374
+ let n = t.t / t.dur;
375
+ if (n >= 1) {
376
+ t.m.visible = !1;
377
+ continue;
378
+ }
379
+ i = !0;
380
+ let r = 1 - (1 - n) * (1 - n) * (1 - n);
381
+ t.m.scale.setScalar(Math.max(.1, t.r * r)), t.m.material.opacity = (1 - n) * .9;
382
+ }
383
+ for (let e of P) e.active && (i = !0);
384
+ if (ve > 0) {
385
+ ve = 0;
386
+ for (let t = 0; t < z; t++) {
387
+ let n = ge[t];
388
+ if (!n.alive) continue;
389
+ if (n.life -= e, n.life <= 0) {
390
+ n.alive = !1, U.scale.setScalar(0), U.updateMatrix(), H.setMatrixAt(t, U.matrix);
391
+ continue;
392
+ }
393
+ if (ve++, !n.rest) {
394
+ n.v.y -= 22 * e, n.p.addScaledVector(n.v, e), n.r.addScaledVector(n.w, e);
395
+ let t = ae(n.p.x, n.p.z) + .15 * n.s;
396
+ if (n.p.y < t && (n.p.y = t, n.v.y < -2 ? (n.v.y *= -.32, n.v.x *= .55, n.v.z *= .55, n.w.multiplyScalar(.6)) : n.rest = !0), n.smoke) for (n.acc += e * 22; n.acc >= 1;) --n.acc, k.spawn(n.p.x, n.p.y, n.p.z, 0, .4, 0, .7, .35, 1.4, V.smoke, V.smokeLight, .4, 1, -.2);
397
+ }
398
+ let r = Math.min(1, n.life / .5);
399
+ U.position.copy(n.p), U.rotation.set(n.r.x, n.r.y, n.r.z), U.scale.setScalar(n.s * r), U.updateMatrix(), H.setMatrixAt(t, U.matrix);
400
+ }
401
+ H.instanceMatrix.needsUpdate = !0, ve > 0 && (i = !0);
402
+ }
403
+ return J > 0 && r && (we += e, Ke(), q.material.opacity = .7 + .3 * Math.sin(we * 5), q.rotation.y += e * .8), i;
404
+ }
405
+ function Je() {
406
+ O.clear(), k.clear();
407
+ for (let e = 0; e < ce; e++) We(e);
408
+ for (let e of F) e.s.visible = !1;
409
+ for (let e of R) e.m.visible = !1;
410
+ for (let e of ge) e.alive = !1;
411
+ U.scale.setScalar(0), U.updateMatrix();
412
+ for (let e = 0; e < z; e++) H.setMatrixAt(e, U.matrix);
413
+ H.instanceMatrix.needsUpdate = !0, j = 0, A.intensity = 0;
414
+ }
415
+ return {
416
+ muzzle: je,
417
+ trail: Me,
418
+ explosion: Ne,
419
+ bigExplosion: Le,
420
+ pop: Pe,
421
+ outPuff: Fe,
422
+ hitSparks: Ie,
423
+ emitDamage: Re,
424
+ exhaust: ze,
425
+ dust: Be,
426
+ firework: Ve,
427
+ flash: $,
428
+ lightFlash: Oe,
429
+ ring: ke,
430
+ projShow: He,
431
+ projMove: Ue,
432
+ projHide: We,
433
+ setPreview: Ge,
434
+ update: qe,
435
+ clear: Je,
436
+ setQuality: De,
437
+ setWind(e) {
438
+ k.setWind(e);
439
+ },
440
+ get particleCount() {
441
+ return O.count + k.count;
442
+ },
443
+ get hasPreview() {
444
+ return J > 0;
445
+ },
446
+ dispose() {
447
+ O.dispose(), k.dispose(), N.dispose(), se.dispose();
448
+ for (let e of P) e.glow.material.dispose();
449
+ for (let e of F) e.s.material.dispose();
450
+ L.dispose();
451
+ for (let e of R) e.m.material.dispose();
452
+ H.dispose(), me.dispose(), he.dispose(), G.dispose(), Se.dispose(), Ce.dispose(), C.dispose(), w.dispose(), T.dispose(), A.dispose && A.dispose();
453
+ }
454
+ };
455
+ }
456
+ export { me as t };
457
+
458
+ //# sourceMappingURL=fx-1ZwzmPWj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fx-1ZwzmPWj.js","names":["lin","smokeTexture","ringTexture","glowTexture","CAPS","STRIDE","PX","PY","PZ","VX","VY","VZ","AGE","LIFE","S0","S1","R0","G0","B0","R1","G1","B1","A0","DRAG","GRAV","HOT","MAX_PROJ","MAX_RINGS","MAX_DEBRIS","PREVIEW_MAX","COL","VERT","FRAG_ADD","FRAG_ALPHA","createBatch","data","cap","pos","color","size","geo","BufferGeometry","BufferAttribute","DynamicDrawUsage","mat","ShaderMaterial","scaleUniform","map","additive","AdditiveBlending","NormalBlending","points","Points","count","cursor","capacity","wind","n","w","i","o","x","y","z","vx","vy","vz","life","s0","s1","c0","c1","a0","drag","grav","hot","wx","wz","age","dt","dr","g","k","t","ct","p3","p4","fin","fout","createFx","texGlow","texSmoke","texRing","scaleU","capTotal","add","alpha","qf","light","PointLight","lightLevel","lightDecay","shellGeo","OctahedronGeometry","shellMat","MeshBasicMaterial","projs","mesh","Mesh","glowMat","SpriteMaterial","glow","Sprite","scene","flashes","m","Color","s","flashCursor","ringGeo","PlaneGeometry","rings","DoubleSide","ringCursor","debrisGeo","IcosahedronGeometry","debrisMat","MeshLambertMaterial","debris","InstancedMesh","dummy","Object3D","bodies","Vector3","debrisCursor","debrisAlive","pvPos","pvCol","pvSize","pvMax","pvGeo","pvMat","preview","markerMat","marker","pvCount","pvSrc","pvTime","pvColor","tmp","setQuality","q","quality","rnd","rs","a","base","flash","f","dur","lightFlash","distance","level","decay","ring","spawnDebris","b","idx","h","speed","smoke","muzzle","p","d","c","sp","trail","len","x1","x0","y1","y0","z1","z0","big","explosion","r","radius","nf","th","ph","ns","nk","kind","nd","dc","pop","outPuff","hitSparks","bigExplosion","emitDamage","accObj","dark","exhaust","dust","strength","firework","projShow","projMove","projHide","setPreview","step","travelled","next","L","ex","ey","ez","writePreview","wave","update","renderer","camera","busy","e","gy","heightAt","fade","animatePreview","clear"],"sources":["../../src/games/tanks/scene/fx.js"],"sourcesContent":["// Tanks FX: pooled CPU-simulated particles (2 Points draw calls), projectiles with glow,\n// shockwave rings, instanced debris with terrain bounce, one shared flash light, aim preview.\n// Every GPU resource is created once; update() performs no allocations.\nimport {\n AdditiveBlending,\n BufferAttribute,\n BufferGeometry,\n Color,\n DoubleSide,\n DynamicDrawUsage,\n IcosahedronGeometry,\n InstancedMesh,\n Mesh,\n MeshBasicMaterial,\n MeshLambertMaterial,\n NormalBlending,\n Object3D,\n OctahedronGeometry,\n PlaneGeometry,\n PointLight,\n Points,\n ShaderMaterial,\n Sprite,\n SpriteMaterial,\n Vector3,\n} from 'three'\nimport { glowTexture, lin, ringTexture, smokeTexture } from './util.js'\n\nconst CAPS = { low: 250, medium: 520, high: 900 }\nconst STRIDE = 20\n// field offsets\nconst PX = 0, PY = 1, PZ = 2, VX = 3, VY = 4, VZ = 5, AGE = 6, LIFE = 7, S0 = 8, S1 = 9\nconst R0 = 10, G0 = 11, B0 = 12, R1 = 13, G1 = 14, B1 = 15, A0 = 16, DRAG = 17, GRAV = 18, HOT = 19\n\nconst MAX_PROJ = 8\nconst MAX_RINGS = 4\nconst MAX_DEBRIS = 56\nconst PREVIEW_MAX = 320\n\nconst COL = {\n white: lin('#fff6e0'),\n yellow: lin('#ffd36b'),\n orange: lin('#ff7a1a'),\n red: lin('#b3200e'),\n ember: lin('#ffb347'),\n smoke: lin('#5b5552'),\n smokeLight: lin('#9a918a'),\n smokeDark: lin('#2c2826'),\n dirt: lin('#6e5034'),\n dirtLight: lin('#a07a50'),\n spark: lin('#ffe2a8'),\n dust: lin('#c9ad85'),\n exhaust: lin('#3a3633'),\n}\n\nconst VERT = /* glsl */ `\nuniform float uScale;\nuniform float uMaxSize;\nattribute vec4 aColor;\nattribute float aSize;\nvarying vec4 vColor;\nvoid main() {\n vec4 mv = modelViewMatrix * vec4(position, 1.0);\n gl_Position = projectionMatrix * mv;\n gl_PointSize = aColor.a > 0.003 ? min(aSize * uScale / max(-mv.z, 0.5), uMaxSize) : 0.0;\n vColor = aColor;\n}\n`\nconst FRAG_ADD = /* glsl */ `\nuniform sampler2D uMap;\nvarying vec4 vColor;\nvoid main() {\n float a = texture2D(uMap, gl_PointCoord).a * vColor.a;\n gl_FragColor = vec4(vColor.rgb, a);\n #include <encodings_fragment>\n}\n`\nconst FRAG_ALPHA = /* glsl */ `\nuniform sampler2D uMap;\nvarying vec4 vColor;\nvoid main() {\n float a = texture2D(uMap, gl_PointCoord).a * vColor.a;\n if (a < 0.004) discard;\n gl_FragColor = vec4(vColor.rgb, a);\n #include <encodings_fragment>\n}\n`\n\nfunction createBatch(cap, additive, map, scaleUniform) {\n const data = new Float32Array(cap * STRIDE)\n const pos = new Float32Array(cap * 3)\n const color = new Float32Array(cap * 4)\n const size = new Float32Array(cap)\n const geo = new BufferGeometry()\n geo.setAttribute('position', new BufferAttribute(pos, 3).setUsage(DynamicDrawUsage))\n geo.setAttribute('aColor', new BufferAttribute(color, 4).setUsage(DynamicDrawUsage))\n geo.setAttribute('aSize', new BufferAttribute(size, 1).setUsage(DynamicDrawUsage))\n geo.setDrawRange(0, 0)\n const mat = new ShaderMaterial({\n uniforms: { uScale: scaleUniform, uMap: { value: map }, uMaxSize: { value: 512 } },\n vertexShader: VERT,\n fragmentShader: additive ? FRAG_ADD : FRAG_ALPHA,\n transparent: true,\n depthWrite: false,\n blending: additive ? AdditiveBlending : NormalBlending,\n premultipliedAlpha: false,\n })\n const points = new Points(geo, mat)\n points.frustumCulled = false\n points.renderOrder = additive ? 6 : 5\n let count = 0\n let cursor = 0\n let capacity = cap\n let wind = null\n\n const b = {\n points,\n get count() {\n return count\n },\n setCap(n) {\n capacity = Math.min(cap, n)\n if (count > capacity) count = capacity\n },\n setWind(w) {\n wind = w\n },\n spawn(x, y, z, vx, vy, vz, life, s0, s1, c0, c1, a0, drag, grav, hot = 0) {\n let i\n if (count < capacity) i = count++\n else {\n i = cursor\n cursor = (cursor + 1) % capacity\n }\n const o = i * STRIDE\n data[o + PX] = x; data[o + PY] = y; data[o + PZ] = z\n data[o + VX] = vx; data[o + VY] = vy; data[o + VZ] = vz\n data[o + AGE] = 0; data[o + LIFE] = life\n data[o + S0] = s0; data[o + S1] = s1\n data[o + R0] = c0.r; data[o + G0] = c0.g; data[o + B0] = c0.b\n data[o + R1] = c1.r; data[o + G1] = c1.g; data[o + B1] = c1.b\n data[o + A0] = a0; data[o + DRAG] = drag; data[o + GRAV] = grav; data[o + HOT] = hot\n },\n update(dt) {\n let i = 0\n const wx = wind ? wind.x : 0\n const wz = wind ? wind.z : 0\n while (i < count) {\n const o = i * STRIDE\n const age = data[o + AGE] + dt\n if (age >= data[o + LIFE]) {\n // swap-remove\n count--\n if (i !== count) data.copyWithin(o, count * STRIDE, count * STRIDE + STRIDE)\n continue\n }\n data[o + AGE] = age\n const dr = Math.exp(-data[o + DRAG] * dt)\n const g = data[o + GRAV]\n data[o + VX] = data[o + VX] * dr + (g > 0 ? wx * 0.35 * dt : 0)\n data[o + VY] = data[o + VY] * dr - g * dt\n data[o + VZ] = data[o + VZ] * dr + (g > 0 ? wz * 0.35 * dt : 0)\n data[o + PX] += data[o + VX] * dt\n data[o + PY] += data[o + VY] * dt\n data[o + PZ] += data[o + VZ] * dt\n const k = age / data[o + LIFE]\n const t = k < 0.6 ? k / 0.6 : 1\n const ct = t * t * (3 - 2 * t)\n const hot = 1 + data[o + HOT] * (1 - k) * (1 - k) * (1 - k)\n const p3 = i * 3\n pos[p3] = data[o + PX]; pos[p3 + 1] = data[o + PY]; pos[p3 + 2] = data[o + PZ]\n const p4 = i * 4\n color[p4] = (data[o + R0] + (data[o + R1] - data[o + R0]) * ct) * hot\n color[p4 + 1] = (data[o + G0] + (data[o + G1] - data[o + G0]) * ct) * hot\n color[p4 + 2] = (data[o + B0] + (data[o + B1] - data[o + B0]) * ct) * hot\n // alpha: quick fade in, fade out over the last 45%\n const fin = k < 0.06 ? k / 0.06 : 1\n const fout = k > 0.55 ? 1 - (k - 0.55) / 0.45 : 1\n color[p4 + 3] = data[o + A0] * fin * fout\n size[i] = data[o + S0] + (data[o + S1] - data[o + S0]) * Math.sqrt(k)\n i++\n }\n geo.setDrawRange(0, count)\n points.visible = count > 0\n if (count > 0) {\n geo.attributes.position.updateRange.count = count * 3\n geo.attributes.aColor.updateRange.count = count * 4\n geo.attributes.aSize.updateRange.count = count\n geo.attributes.position.needsUpdate = true\n geo.attributes.aColor.needsUpdate = true\n geo.attributes.aSize.needsUpdate = true\n }\n return count > 0\n },\n clear() {\n count = 0\n geo.setDrawRange(0, 0)\n points.visible = false\n },\n dispose() {\n geo.dispose()\n mat.dispose()\n },\n }\n return b\n}\n\nexport function createFx(scene, { quality = 'high', reducedMotion = false, heightAt }) {\n const texGlow = glowTexture(64)\n const texSmoke = smokeTexture(64)\n const texRing = ringTexture(128)\n const scaleU = { value: 600 }\n const capTotal = CAPS.high\n const add = createBatch(Math.round(capTotal * 0.55), true, texGlow, scaleU)\n const alpha = createBatch(Math.round(capTotal * 0.45), false, texSmoke, scaleU)\n scene.add(alpha.points, add.points)\n let qf = 1\n\n // ---- flash light (always present; intensity 0 idle → no shader recompiles)\n const light = new PointLight(lin('#ffb066'), 0, 60, 2)\n scene.add(light)\n let lightLevel = 0\n let lightDecay = 6\n\n // ---- projectiles\n const shellGeo = new OctahedronGeometry(0.28, 0)\n shellGeo.scale(2.2, 1, 1)\n const shellMat = new MeshBasicMaterial({ color: lin('#fff1cf').multiplyScalar(2) })\n const projs = []\n for (let i = 0; i < MAX_PROJ; i++) {\n const mesh = new Mesh(shellGeo, shellMat)\n mesh.visible = false\n const glowMat = new SpriteMaterial({\n map: texGlow,\n color: lin('#ff9440').multiplyScalar(1.2),\n blending: AdditiveBlending,\n depthWrite: false,\n transparent: true,\n })\n const glow = new Sprite(glowMat)\n glow.scale.setScalar(4)\n glow.visible = false\n glow.renderOrder = 7\n scene.add(mesh, glow)\n projs.push({ mesh, glow, active: false, px: 0, py: 0, pz: 0, has: false, acc: 0 })\n }\n\n // ---- muzzle flash sprite + generic flash sprites (pool of 3)\n const flashes = []\n for (let i = 0; i < 3; i++) {\n const m = new SpriteMaterial({\n map: texGlow,\n color: new Color(1, 0.8, 0.5),\n blending: AdditiveBlending,\n depthWrite: false,\n transparent: true,\n })\n const s = new Sprite(m)\n s.visible = false\n s.renderOrder = 8\n scene.add(s)\n flashes.push({ s, t: 0, dur: 0.2, size: 4, color: new Color() })\n }\n let flashCursor = 0\n\n // ---- shockwave rings\n const ringGeo = new PlaneGeometry(1, 1)\n ringGeo.rotateX(-Math.PI / 2)\n const rings = []\n for (let i = 0; i < MAX_RINGS; i++) {\n const mat = new MeshBasicMaterial({\n map: texRing,\n color: lin('#ffd9a0'),\n transparent: true,\n blending: AdditiveBlending,\n depthWrite: false,\n side: DoubleSide,\n fog: false,\n })\n const m = new Mesh(ringGeo, mat)\n m.visible = false\n m.renderOrder = 4\n scene.add(m)\n rings.push({ m, t: 0, dur: 0.6, r: 10 })\n }\n let ringCursor = 0\n\n // ---- debris\n const debrisGeo = new IcosahedronGeometry(0.32, 0)\n debrisGeo.computeVertexNormals()\n const debrisMat = new MeshLambertMaterial({ color: 0xffffff })\n const debris = new InstancedMesh(debrisGeo, debrisMat, MAX_DEBRIS)\n debris.frustumCulled = false\n debris.instanceMatrix.setUsage(DynamicDrawUsage)\n const dummy = new Object3D()\n dummy.scale.setScalar(0)\n dummy.updateMatrix()\n for (let i = 0; i < MAX_DEBRIS; i++) {\n debris.setMatrixAt(i, dummy.matrix)\n debris.setColorAt(i, COL.dirt)\n }\n debris.instanceColor.setUsage(DynamicDrawUsage)\n scene.add(debris)\n const bodies = []\n for (let i = 0; i < MAX_DEBRIS; i++) {\n bodies.push({ alive: false, p: new Vector3(), v: new Vector3(), r: new Vector3(), w: new Vector3(), life: 0, s: 1, rest: false, smoke: false, acc: 0 })\n }\n let debrisCursor = 0\n let debrisAlive = 0\n\n // ---- aim preview: glowing dots + end marker\n const pvPos = new Float32Array(PREVIEW_MAX * 3)\n const pvCol = new Float32Array(PREVIEW_MAX * 4)\n const pvSize = new Float32Array(PREVIEW_MAX)\n const pvMax = { value: 16 }\n const pvGeo = new BufferGeometry()\n pvGeo.setAttribute('position', new BufferAttribute(pvPos, 3).setUsage(DynamicDrawUsage))\n pvGeo.setAttribute('aColor', new BufferAttribute(pvCol, 4).setUsage(DynamicDrawUsage))\n pvGeo.setAttribute('aSize', new BufferAttribute(pvSize, 1).setUsage(DynamicDrawUsage))\n pvGeo.setDrawRange(0, 0)\n const pvMat = new ShaderMaterial({\n uniforms: { uScale: scaleU, uMap: { value: texGlow }, uMaxSize: pvMax },\n vertexShader: VERT,\n fragmentShader: FRAG_ADD,\n transparent: true,\n depthWrite: false,\n depthTest: false,\n blending: AdditiveBlending,\n })\n const preview = new Points(pvGeo, pvMat)\n preview.frustumCulled = false\n preview.visible = false\n preview.renderOrder = 9\n const markerMat = new MeshBasicMaterial({\n map: texRing,\n color: lin('#fff3c4').multiplyScalar(1.4),\n transparent: true,\n blending: AdditiveBlending,\n depthWrite: false,\n depthTest: false,\n side: DoubleSide,\n fog: false,\n })\n const marker = new Mesh(ringGeo, markerMat)\n marker.visible = false\n marker.renderOrder = 9\n scene.add(preview, marker)\n let pvCount = 0\n let pvSrc = null\n let pvTime = 0\n const pvColor = lin('#fff0c0')\n\n const tmp = new Vector3()\n\n function setQuality(q) {\n quality = q\n const cap = CAPS[q] || CAPS.high\n qf = cap / CAPS.high\n add.setCap(Math.round(cap * 0.55))\n alpha.setCap(Math.round(cap * 0.45))\n }\n setQuality(quality)\n\n const rnd = Math.random\n const rs = (a) => (rnd() * 2 - 1) * a\n const n = (base) => Math.max(1, Math.round(base * qf))\n\n function flash(x, y, z, size, color, dur) {\n const f = flashes[flashCursor]\n flashCursor = (flashCursor + 1) % flashes.length\n f.s.position.set(x, y, z)\n f.t = 0\n f.dur = dur\n f.size = size\n f.color.copy(color)\n f.s.material.color.copy(color)\n f.s.visible = true\n f.s.scale.setScalar(size)\n }\n\n function lightFlash(x, y, z, level, distance = 60, decay = 6) {\n light.position.set(x, y, z)\n light.distance = distance\n if (level >= lightLevel) {\n lightLevel = level\n lightDecay = decay\n }\n }\n\n function ring(x, y, z, r, dur = 0.6, color = null) {\n const g = rings[ringCursor]\n ringCursor = (ringCursor + 1) % rings.length\n g.m.position.set(x, y + 0.25, z)\n g.t = 0\n g.dur = dur\n g.r = r\n g.m.visible = true\n g.m.scale.setScalar(0.1)\n g.m.material.color.copy(color || COL.yellow)\n }\n\n function spawnDebris(x, y, z, count, speed, color, size = 1, smoke = false) {\n for (let i = 0; i < count; i++) {\n const b = bodies[debrisCursor]\n const idx = debrisCursor\n debrisCursor = (debrisCursor + 1) % MAX_DEBRIS\n b.alive = true\n b.rest = false\n b.p.set(x + rs(0.6), y + 0.4, z + rs(0.6))\n const a = rnd() * Math.PI * 2\n const h = speed * (0.35 + rnd() * 0.65)\n b.v.set(Math.cos(a) * h * 0.6, speed * (0.6 + rnd() * 0.7), Math.sin(a) * h * 0.6)\n b.r.set(rnd() * 6, rnd() * 6, rnd() * 6)\n b.w.set(rs(9), rs(9), rs(9))\n b.life = 2.6 + rnd() * 1.6\n b.s = size * (0.5 + rnd() * 0.9)\n b.smoke = smoke && rnd() < 0.5\n b.acc = 0\n debris.setColorAt(idx, color)\n }\n debrisAlive += count\n debris.instanceColor.needsUpdate = true\n }\n\n // ------------------------------------------------------------ public emitters\n function muzzle(p, d) {\n flash(p.x + d.x * 0.6, p.y + d.y * 0.6, p.z + d.z * 0.6, 4.5, COL.orange, 0.14)\n lightFlash(p.x, p.y + 0.5, p.z, 3.5, 40, 12)\n const c = n(26)\n for (let i = 0; i < c; i++) {\n const sp = 6 + rnd() * 14\n add.spawn(p.x, p.y, p.z, d.x * sp + rs(2), d.y * sp + rs(2), d.z * sp + rs(2), 0.12 + rnd() * 0.18, 0.9, 1.8, COL.white, COL.orange, 0.9, 5, 0, 2)\n }\n const s = n(14)\n for (let i = 0; i < s; i++) {\n const sp = 2 + rnd() * 6\n alpha.spawn(p.x, p.y, p.z, d.x * sp + rs(1.5), d.y * sp + rs(1) + 0.6, d.z * sp + rs(1.5), 1.2 + rnd() * 1.2, 1.0, 3.6, COL.smokeLight, COL.smoke, 0.45, 2.2, -0.4)\n }\n }\n\n function trail(x0, y0, z0, x1, y1, z1, big = false) {\n const len = Math.hypot(x1 - x0, y1 - y0, z1 - z0)\n const step = quality === 'low' ? 1.6 : 0.8\n const k = Math.min(24, Math.ceil(len / step))\n for (let i = 0; i < k; i++) {\n const t = (i + rnd()) / k\n const x = x0 + (x1 - x0) * t, y = y0 + (y1 - y0) * t, z = z0 + (z1 - z0) * t\n add.spawn(x, y, z, rs(0.3), rs(0.3), rs(0.3), 0.25 + rnd() * 0.2, big ? 1.1 : 0.8, 0.2, COL.yellow, COL.red, 0.8, 1, 0, 1)\n if (i % 2 === 0) alpha.spawn(x, y, z, rs(0.4), 0.3 + rnd() * 0.4, rs(0.4), 1.1 + rnd() * 0.9, 0.5, big ? 2.4 : 1.8, COL.smokeLight, COL.smoke, 0.32, 1.5, -0.25)\n }\n }\n\n function explosion(x, y, z, radius, kind) {\n const r = Math.max(2, radius || 6)\n const big = r >= 7\n const s = r / 6\n flash(x, y + 1.2 * s, z, 7 * s, COL.yellow, 0.22)\n lightFlash(x, y + 3, z, big ? 5 : 3.5, 30 + r * 5, 3.5)\n ring(x, y, z, r * 2.4, 0.55, COL.yellow)\n if (!reducedMotion || true) ring(x, y, z, r * 1.4, 0.9, COL.orange)\n // fireball\n const nf = n(70 * s)\n for (let i = 0; i < nf; i++) {\n const th = rnd() * Math.PI * 2\n const ph = Math.acos(rnd() * 0.9)\n const sp = (4 + rnd() * 9) * s\n const vx = Math.cos(th) * Math.sin(ph) * sp\n const vz = Math.sin(th) * Math.sin(ph) * sp\n const vy = Math.cos(ph) * sp * 0.9 + 2\n add.spawn(x + rs(0.6), y + 0.6, z + rs(0.6), vx, vy, vz, 0.45 + rnd() * 0.5, 1.8 * s, 3.8 * s, COL.yellow, COL.red, 0.55, 4.5, -2.5, 1.6)\n }\n // sparks\n const ns = n(46 * s)\n for (let i = 0; i < ns; i++) {\n const th = rnd() * Math.PI * 2\n const sp = (9 + rnd() * 16) * s\n add.spawn(x, y + 0.8, z, Math.cos(th) * sp * 0.7, (6 + rnd() * 14) * s, Math.sin(th) * sp * 0.7, 0.7 + rnd() * 0.9, 0.35, 0.15, COL.spark, COL.ember, 1, 0.8, 16, 1.5)\n }\n // smoke column\n const nk = n(40 * s)\n for (let i = 0; i < nk; i++) {\n const th = rnd() * Math.PI * 2\n const sp = (1 + rnd() * 4) * s\n alpha.spawn(x + rs(1.2 * s), y + 0.8 + rnd() * 2 * s, z + rs(1.2 * s), Math.cos(th) * sp, 2.5 + rnd() * 4, Math.sin(th) * sp, 2.0 + rnd() * 2.2, 2.4 * s, 6.5 * s, COL.smoke, COL.smokeLight, 0.62, 1.4, -0.6)\n }\n if (kind === 'terrain' || kind === 'obstacle') {\n // dirt burst\n const nd = n(48 * s)\n const dc = kind === 'obstacle' ? COL.smokeLight : COL.dirt\n for (let i = 0; i < nd; i++) {\n const th = rnd() * Math.PI * 2\n const sp = (2 + rnd() * 6) * s\n alpha.spawn(x, y + 0.3, z, Math.cos(th) * sp, (8 + rnd() * 12) * s, Math.sin(th) * sp, 0.9 + rnd() * 0.7, 1.0 * s, 2.2 * s, dc, COL.dirtLight, 0.95, 0.6, 18)\n }\n spawnDebris(x, y, z, Math.round((quality === 'low' ? 8 : 16) * s), 13 * s, kind === 'obstacle' ? lin('#8b8680') : COL.dirt, 1.1)\n } else if (kind === 'tank') {\n spawnDebris(x, y, z, quality === 'low' ? 6 : 12, 14, lin('#3a3633'), 0.9, true)\n }\n }\n\n function pop(x, y, z) {\n flash(x, y, z, 5, COL.yellow, 0.18)\n lightFlash(x, y, z, 2.5, 30, 10)\n const c = n(30)\n for (let i = 0; i < c; i++) {\n const th = rnd() * Math.PI * 2\n const ph = rnd() * Math.PI\n const sp = 5 + rnd() * 6\n add.spawn(x, y, z, Math.cos(th) * Math.sin(ph) * sp, Math.cos(ph) * sp, Math.sin(th) * Math.sin(ph) * sp, 0.3 + rnd() * 0.3, 0.6, 0.2, COL.spark, COL.orange, 1, 2, 4, 1)\n }\n for (let i = 0; i < n(8); i++) alpha.spawn(x, y, z, rs(1), rs(1), rs(1), 1 + rnd(), 1, 3, COL.smokeLight, COL.smoke, 0.4, 1, -0.3)\n }\n\n function outPuff(x, y, z) {\n for (let i = 0; i < n(10); i++) alpha.spawn(x, y, z, rs(1.5), rs(1), rs(1.5), 0.8 + rnd(), 1, 3, COL.smokeLight, COL.smoke, 0.35, 1, 0)\n }\n\n function hitSparks(x, y, z) {\n flash(x, y, z, 7, COL.white, 0.18)\n for (let i = 0; i < n(40); i++) {\n const th = rnd() * Math.PI * 2\n const sp = 10 + rnd() * 14\n add.spawn(x, y, z, Math.cos(th) * sp, 4 + rnd() * 12, Math.sin(th) * sp, 0.5 + rnd() * 0.5, 0.35, 0.12, COL.white, COL.ember, 1, 1.2, 18, 2)\n }\n }\n\n function bigExplosion(x, y, z) {\n explosion(x, y + 0.8, z, 10, 'tank')\n flash(x, y + 3, z, 15, COL.orange, 0.4)\n lightFlash(x, y + 4, z, 7, 80, 2.2)\n ring(x, y, z, 32, 1.0, COL.orange)\n spawnDebris(x, y + 1, z, quality === 'low' ? 10 : 20, 18, lin('#2f2b29'), 1.3, true)\n for (let i = 0; i < n(60); i++) {\n const th = rnd() * Math.PI * 2\n const sp = 2 + rnd() * 5\n alpha.spawn(x + rs(2), y + 2 + rnd() * 4, z + rs(2), Math.cos(th) * sp, 4 + rnd() * 6, Math.sin(th) * sp, 3 + rnd() * 2.5, 3, 9, COL.smokeDark, COL.smoke, 0.7, 1, -0.7)\n }\n }\n\n // Persistent damage smoke / fire from a world point (called every frame with dt).\n function emitDamage(x, y, z, dt, level, accObj) {\n accObj.smokeAcc += dt * (level >= 2 ? 16 : 7) * (quality === 'low' ? 0.5 : 1)\n while (accObj.smokeAcc >= 1) {\n accObj.smokeAcc -= 1\n const dark = level >= 2\n alpha.spawn(x + rs(0.5), y, z + rs(0.5), rs(0.4), 2.2 + rnd() * 1.6, rs(0.4), 2.6 + rnd() * 1.8, 1.0, dark ? 6 : 4, dark ? COL.smokeDark : COL.smoke, COL.smokeLight, dark ? 0.55 : 0.36, 0.5, -0.35)\n if (dark) {\n add.spawn(x + rs(0.6), y - 0.2, z + rs(0.6), rs(0.6), 2 + rnd() * 2, rs(0.6), 0.45 + rnd() * 0.35, 1.6, 0.7, COL.yellow, COL.red, 0.8, 1.5, -1, 1.5)\n }\n }\n }\n\n function exhaust(x, y, z) {\n alpha.spawn(x, y, z, rs(0.4), 0.8 + rnd() * 0.6, rs(0.4), 0.9 + rnd() * 0.5, 0.4, 1.4, COL.exhaust, COL.smoke, 0.4, 1.5, -0.2)\n }\n\n function dust(x, y, z, strength = 1) {\n alpha.spawn(x + rs(0.4), y + 0.1, z + rs(0.4), rs(1.2), 0.6 + rnd() * 0.9, rs(1.2), 1.0 + rnd() * 0.8, 0.8, 2.8 * strength, COL.dust, COL.dirtLight, 0.42, 1.8, 0.2)\n }\n\n function firework(x, y, z, color) {\n flash(x, y, z, 6, color, 0.3)\n const c = n(70)\n for (let i = 0; i < c; i++) {\n const th = rnd() * Math.PI * 2\n const ph = Math.acos(rnd() * 2 - 1)\n const sp = 7 + rnd() * 2\n add.spawn(x, y, z, Math.cos(th) * Math.sin(ph) * sp, Math.cos(ph) * sp, Math.sin(th) * Math.sin(ph) * sp, 1.1 + rnd() * 0.6, 1.1, 0.35, COL.white, color, 1, 1.6, 3.5, 1.2)\n }\n }\n\n // ------------------------------------------------------------ projectiles\n function projShow(i, x, y, z, big) {\n const p = projs[i]\n p.active = true\n p.has = false\n p.mesh.visible = true\n p.glow.visible = true\n p.glow.scale.setScalar(big ? 3.6 : 2.6)\n p.mesh.scale.setScalar(big ? 1.3 : 0.9)\n projMove(i, x, y, z)\n }\n function projMove(i, x, y, z) {\n const p = projs[i]\n if (p.has) {\n tmp.set(x, y, z)\n if (Math.abs(x - p.px) + Math.abs(y - p.py) + Math.abs(z - p.pz) > 1e-4) {\n p.mesh.lookAt(tmp)\n p.mesh.rotateY(-Math.PI / 2)\n trail(p.px, p.py, p.pz, x, y, z, p.mesh.scale.x > 1)\n }\n }\n p.mesh.position.set(x, y, z)\n p.glow.position.set(x, y, z)\n p.px = x\n p.py = y\n p.pz = z\n p.has = true\n }\n function projHide(i) {\n const p = projs[i]\n p.active = false\n p.mesh.visible = false\n p.glow.visible = false\n }\n\n // ------------------------------------------------------------ preview\n function setPreview(points) {\n pvSrc = points && points.length >= 6 ? points : null\n if (!pvSrc) {\n preview.visible = false\n marker.visible = false\n pvCount = 0\n return\n }\n // resample by arc length every ~1.6 m\n const step = 1.6\n let travelled = 0\n let next = step\n pvPos[0] = pvSrc[0]; pvPos[1] = pvSrc[1]; pvPos[2] = pvSrc[2]\n let k = 1\n for (let i = 3; i + 2 < pvSrc.length && k < PREVIEW_MAX; i += 3) {\n const x0 = pvSrc[i - 3], y0 = pvSrc[i - 2], z0 = pvSrc[i - 1]\n const x1 = pvSrc[i], y1 = pvSrc[i + 1], z1 = pvSrc[i + 2]\n const L = Math.hypot(x1 - x0, y1 - y0, z1 - z0)\n while (L > 0 && next <= travelled + L && k < PREVIEW_MAX) {\n const f = (next - travelled) / L\n pvPos[k * 3] = x0 + (x1 - x0) * f\n pvPos[k * 3 + 1] = y0 + (y1 - y0) * f\n pvPos[k * 3 + 2] = z0 + (z1 - z0) * f\n k++\n next += step\n }\n travelled += L\n }\n pvCount = k\n const ex = pvSrc[pvSrc.length - 3]\n const ey = pvSrc[pvSrc.length - 2]\n const ez = pvSrc[pvSrc.length - 1]\n marker.position.set(ex, ey + 0.3, ez)\n marker.scale.setScalar(5)\n marker.visible = true\n preview.visible = true\n writePreview()\n }\n function writePreview() {\n for (let i = 0; i < pvCount; i++) {\n const f = i / Math.max(1, pvCount - 1)\n const wave = 0.55 + 0.45 * Math.cos((i * 0.55 - pvTime * 7))\n pvCol[i * 4] = pvColor.r * (1.4 - f * 0.3)\n pvCol[i * 4 + 1] = pvColor.g * (1.3 - f * 0.4)\n pvCol[i * 4 + 2] = pvColor.b * (1.1 - f * 0.5)\n pvCol[i * 4 + 3] = (0.35 + 0.65 * wave) * (1 - f * 0.45)\n pvSize[i] = 0.55 + 0.25 * wave\n }\n pvGeo.setDrawRange(0, pvCount)\n pvGeo.attributes.position.needsUpdate = true\n pvGeo.attributes.aColor.needsUpdate = true\n pvGeo.attributes.aSize.needsUpdate = true\n }\n\n // ------------------------------------------------------------ update\n function update(dt, camera, renderer, animatePreview) {\n // point scale: pixels per meter at distance 1\n scaleU.value = renderer.getDrawingBufferSize(tmp).y * 0.5 * camera.projectionMatrix.elements[5]\n pvMax.value = 11 * renderer.getPixelRatio()\n let busy = false\n if (add.update(dt)) busy = true\n if (alpha.update(dt)) busy = true\n\n if (lightLevel > 0.01) {\n lightLevel *= Math.exp(-lightDecay * dt)\n light.intensity = lightLevel\n busy = true\n } else if (light.intensity !== 0) {\n lightLevel = 0\n light.intensity = 0\n }\n\n for (const f of flashes) {\n if (!f.s.visible) continue\n f.t += dt\n const k = f.t / f.dur\n if (k >= 1) {\n f.s.visible = false\n continue\n }\n busy = true\n f.s.scale.setScalar(f.size * (0.6 + 0.6 * k))\n f.s.material.opacity = 1 - k * k\n }\n\n for (const g of rings) {\n if (!g.m.visible) continue\n g.t += dt\n const k = g.t / g.dur\n if (k >= 1) {\n g.m.visible = false\n continue\n }\n busy = true\n const e = 1 - (1 - k) * (1 - k) * (1 - k)\n g.m.scale.setScalar(Math.max(0.1, g.r * e))\n g.m.material.opacity = (1 - k) * 0.9\n }\n\n for (const p of projs) if (p.active) busy = true\n\n // debris physics with terrain bounce\n if (debrisAlive > 0) {\n debrisAlive = 0\n for (let i = 0; i < MAX_DEBRIS; i++) {\n const b = bodies[i]\n if (!b.alive) continue\n b.life -= dt\n if (b.life <= 0) {\n b.alive = false\n dummy.scale.setScalar(0)\n dummy.updateMatrix()\n debris.setMatrixAt(i, dummy.matrix)\n continue\n }\n debrisAlive++\n if (!b.rest) {\n b.v.y -= 22 * dt\n b.p.addScaledVector(b.v, dt)\n b.r.addScaledVector(b.w, dt)\n const gy = heightAt(b.p.x, b.p.z) + 0.15 * b.s\n if (b.p.y < gy) {\n b.p.y = gy\n if (b.v.y < -2) {\n b.v.y *= -0.32\n b.v.x *= 0.55\n b.v.z *= 0.55\n b.w.multiplyScalar(0.6)\n } else {\n b.rest = true\n }\n }\n if (b.smoke) {\n b.acc += dt * 22\n while (b.acc >= 1) {\n b.acc -= 1\n alpha.spawn(b.p.x, b.p.y, b.p.z, 0, 0.4, 0, 0.7, 0.35, 1.4, COL.smoke, COL.smokeLight, 0.4, 1, -0.2)\n }\n }\n }\n const fade = Math.min(1, b.life / 0.5)\n dummy.position.copy(b.p)\n dummy.rotation.set(b.r.x, b.r.y, b.r.z)\n dummy.scale.setScalar(b.s * fade)\n dummy.updateMatrix()\n debris.setMatrixAt(i, dummy.matrix)\n }\n debris.instanceMatrix.needsUpdate = true\n if (debrisAlive > 0) busy = true\n }\n\n if (pvCount > 0 && animatePreview) {\n pvTime += dt\n writePreview()\n marker.material.opacity = 0.7 + 0.3 * Math.sin(pvTime * 5)\n marker.rotation.y += dt * 0.8\n }\n return busy\n }\n\n function clear() {\n add.clear()\n alpha.clear()\n for (let i = 0; i < MAX_PROJ; i++) projHide(i)\n for (const f of flashes) f.s.visible = false\n for (const g of rings) g.m.visible = false\n for (const b of bodies) b.alive = false\n dummy.scale.setScalar(0)\n dummy.updateMatrix()\n for (let i = 0; i < MAX_DEBRIS; i++) debris.setMatrixAt(i, dummy.matrix)\n debris.instanceMatrix.needsUpdate = true\n lightLevel = 0\n light.intensity = 0\n }\n\n return {\n muzzle,\n trail,\n explosion,\n bigExplosion,\n pop,\n outPuff,\n hitSparks,\n emitDamage,\n exhaust,\n dust,\n firework,\n flash,\n lightFlash,\n ring,\n projShow,\n projMove,\n projHide,\n setPreview,\n update,\n clear,\n setQuality,\n setWind(w) {\n alpha.setWind(w)\n },\n get particleCount() {\n return add.count + alpha.count\n },\n get hasPreview() {\n return pvCount > 0\n },\n dispose() {\n add.dispose()\n alpha.dispose()\n shellGeo.dispose()\n shellMat.dispose()\n for (const p of projs) p.glow.material.dispose()\n for (const f of flashes) f.s.material.dispose()\n ringGeo.dispose()\n for (const g of rings) g.m.material.dispose()\n debris.dispose()\n debrisGeo.dispose()\n debrisMat.dispose()\n pvGeo.dispose()\n pvMat.dispose()\n markerMat.dispose()\n texGlow.dispose()\n texSmoke.dispose()\n texRing.dispose()\n light.dispose && light.dispose()\n },\n }\n}\n"],"mappings":"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"}