@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,248 @@
1
+ import { AdditiveBlending as e, BufferAttribute as t, BufferGeometry as n, CanvasTexture as r, Color as i, DynamicDrawUsage as a, Group as o, NormalBlending as s, Points as c, ShaderMaterial as l, Sprite as u, SpriteMaterial as d, Vector2 as f } from "three";
2
+ // src/effects/avalanche/fx.js
3
+ var p = 22, m = 0, h = 1, g = 2, _ = 3, v = 4, y = 5, b = 6, x = 7, S = 8, C = 9, w = 10, T = 11, E = 12, D = 13, O = 14, k = 15, A = 16, j = 17, M = 18, N = 19, P = 20, F = 21, I = {
4
+ dust: new i("#e6d6b8"),
5
+ dustGrey: new i("#a39b90"),
6
+ smokeDark: new i("#3a3432"),
7
+ smoke: new i("#76706b"),
8
+ fireCore: new i("#fff3b0"),
9
+ fire: new i("#ffc23a"),
10
+ fireRed: new i("#e8471c"),
11
+ spark: new i("#fff6cf"),
12
+ ember: new i("#ff8a2a"),
13
+ glintWhite: new i("#fffbe8"),
14
+ gold: new i("#ffc53a"),
15
+ flash: new i("#ffe2a6")
16
+ }, L = "\nuniform float uScale;\nattribute vec4 aColor;\nattribute float aSize;\nattribute float aRot;\nvarying vec4 vColor;\nvarying vec2 vRot;\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), 1024.0) : 0.0;\n vColor = aColor;\n vRot = vec2(cos(aRot), sin(aRot));\n}\n", R = "\nuniform sampler2D uMap;\nvarying vec4 vColor;\nvarying vec2 vRot;\nvoid main() {\n vec2 uv = gl_PointCoord - 0.5;\n uv = vec2(vRot.x * uv.x - vRot.y * uv.y, vRot.y * uv.x + vRot.x * uv.y) + 0.5;\n float a = texture2D(uMap, uv).a * vColor.a;\n if (a < 0.004) discard;\n gl_FragColor = vec4(vColor.rgb, a);\n #include <encodings_fragment>\n}\n", z = (e, t) => e + Math.random() * (t - e), B = (e) => Number.isFinite(e) ? Math.min(2.5, Math.max(.2, e)) : 1;
17
+ function V(e) {
18
+ let t = document.createElement("canvas");
19
+ return t.width = e, t.height = e, {
20
+ canvas: t,
21
+ ctx: t.getContext("2d")
22
+ };
23
+ }
24
+ function H(e = 64) {
25
+ let { canvas: t, ctx: n } = V(e), i = e / 2, a = n.createRadialGradient(i, i, 0, i, i, i);
26
+ return a.addColorStop(0, "rgba(255,255,255,1)"), a.addColorStop(.35, "rgba(255,255,255,.6)"), a.addColorStop(1, "rgba(255,255,255,0)"), n.fillStyle = a, n.fillRect(0, 0, e, e), new r(t);
27
+ }
28
+ function U(e = 64) {
29
+ let { canvas: t, ctx: n } = V(e), i = e / 2, a = 11, o = () => (a = a * 16807 % 2147483647, a / 2147483647);
30
+ for (let t = 0; t < 7; t += 1) {
31
+ let t = o() * Math.PI * 2, r = o() * i * .3, a = i + Math.cos(t) * r, s = i + Math.sin(t) * r, c = i * (.45 + o() * .22), l = n.createRadialGradient(a, s, 0, a, s, c);
32
+ l.addColorStop(0, "rgba(255,255,255,.55)"), l.addColorStop(.6, "rgba(255,255,255,.25)"), l.addColorStop(1, "rgba(255,255,255,0)"), n.fillStyle = l, n.fillRect(0, 0, e, e);
33
+ }
34
+ return new r(t);
35
+ }
36
+ function W(e = 64) {
37
+ let { canvas: t, ctx: n } = V(e), i = e / 2;
38
+ n.globalCompositeOperation = "lighter";
39
+ let a = n.createRadialGradient(i, i, 0, i, i, i * .42);
40
+ a.addColorStop(0, "rgba(255,255,255,1)"), a.addColorStop(.3, "rgba(255,255,255,.55)"), a.addColorStop(1, "rgba(255,255,255,0)"), n.fillStyle = a, n.fillRect(0, 0, e, e);
41
+ let o = (e, t, r) => {
42
+ n.save(), n.translate(i, i), n.rotate(e);
43
+ let a = n.createLinearGradient(-t, 0, t, 0);
44
+ a.addColorStop(0, "rgba(255,255,255,0)"), a.addColorStop(.5, "rgba(255,255,255,1)"), a.addColorStop(1, "rgba(255,255,255,0)"), n.fillStyle = a, n.beginPath(), n.moveTo(-t, 0), n.lineTo(0, -r), n.lineTo(t, 0), n.lineTo(0, r), n.closePath(), n.fill(), n.restore();
45
+ };
46
+ return o(0, i * .94, e * .05), o(Math.PI / 2, i * .94, e * .05), o(Math.PI / 4, i * .5, e * .03), o(-Math.PI / 4, i * .5, e * .03), new r(t);
47
+ }
48
+ var G = {
49
+ x: 0,
50
+ y: 0,
51
+ z: 0,
52
+ vx: 0,
53
+ vy: 0,
54
+ vz: 0,
55
+ life: 1,
56
+ delay: 0,
57
+ s0: 1,
58
+ s1: 1,
59
+ c0: I.dust,
60
+ c1: I.dust,
61
+ shade: 1,
62
+ alpha: 1,
63
+ drag: 0,
64
+ grav: 0,
65
+ hot: 0,
66
+ rot: 0,
67
+ spin: 0,
68
+ twinkle: 0
69
+ };
70
+ function K(e, t, n) {
71
+ return G.x = e, G.y = t, G.z = n, G.vx = 0, G.vy = 0, G.vz = 0, G.life = 1, G.delay = 0, G.s0 = 1, G.s1 = 1, G.shade = 1, G.alpha = 1, G.drag = 0, G.grav = 0, G.hot = 0, G.rot = Math.random() * Math.PI * 2, G.spin = 0, G.twinkle = 0, G;
72
+ }
73
+ function q(r, { map: i, additive: o, scale: u, renderOrder: d, fadeIn: f }) {
74
+ let I = new Float32Array(r * p), z = new Float32Array(r), B = new Float32Array(r * 3), V = new Float32Array(r * 4), H = new Float32Array(r), U = new Float32Array(r), W = new n(), G = (e, n) => new t(e, n).setUsage(a);
75
+ W.setAttribute("position", G(B, 3)), W.setAttribute("aColor", G(V, 4)), W.setAttribute("aSize", G(H, 1)), W.setAttribute("aRot", G(U, 1)), W.setDrawRange(0, 0);
76
+ let K = new l({
77
+ uniforms: {
78
+ uScale: u,
79
+ uMap: { value: i }
80
+ },
81
+ vertexShader: L,
82
+ fragmentShader: R,
83
+ transparent: !0,
84
+ depthWrite: !1,
85
+ blending: o ? e : s
86
+ }), q = new c(W, K);
87
+ q.frustumCulled = !1, q.visible = !1, q.renderOrder = d;
88
+ let J = [
89
+ W.attributes.position,
90
+ W.attributes.aColor,
91
+ W.attributes.aSize,
92
+ W.attributes.aRot
93
+ ], Y = J.map((e) => e.itemSize), X = 0, Z = 0;
94
+ return {
95
+ points: q,
96
+ emit(e) {
97
+ let t;
98
+ X < r ? (t = X, X += 1) : (t = Z, Z = (Z + 1) % r);
99
+ let n = t * p;
100
+ I[n + m] = e.x, I[n + h] = e.y, I[n + g] = e.z, I[n + _] = e.vx, I[n + v] = e.vy, I[n + y] = e.vz, I[n + b] = -e.delay, I[n + x] = e.life, I[n + S] = e.s0, I[n + C] = e.s1, I[n + w] = e.c0.r * e.shade, I[n + T] = e.c0.g * e.shade, I[n + E] = e.c0.b * e.shade, I[n + D] = e.c1.r * e.shade, I[n + O] = e.c1.g * e.shade, I[n + k] = e.c1.b * e.shade, I[n + A] = e.alpha, I[n + j] = e.drag, I[n + M] = e.grav, I[n + N] = e.hot, I[n + P] = e.spin, I[n + F] = e.twinkle, z[t] = Math.random() * Math.PI * 2, U[t] = e.rot, V[t * 4 + 3] = 0;
101
+ },
102
+ update(e) {
103
+ let t = 0;
104
+ for (; t < X;) {
105
+ let n = t * p, r = I[n + b] + e, i = I[n + x];
106
+ if (r >= i) {
107
+ --X, t !== X && (I.copyWithin(n, X * p, X * p + p), z[t] = z[X], U[t] = U[X]);
108
+ continue;
109
+ }
110
+ I[n + b] = r;
111
+ let a = t * 3, o = t * 4;
112
+ if (r < 0) {
113
+ B[a] = I[n + m], B[a + 1] = I[n + h], B[a + 2] = I[n + g], V[o + 3] = 0, H[t] = 0, t += 1;
114
+ continue;
115
+ }
116
+ let s = Math.exp(-I[n + j] * e);
117
+ I[n + _] *= s, I[n + v] = I[n + v] * s - I[n + M] * e, I[n + y] *= s, I[n + m] += I[n + _] * e, I[n + h] += I[n + v] * e, I[n + g] += I[n + y] * e, U[t] += I[n + P] * e;
118
+ let c = r / i, l = c < .7 ? c / .7 : 1, u = l * l * (3 - 2 * l), d = 1 - c, L = 1 + I[n + N] * d * d * d;
119
+ B[a] = I[n + m], B[a + 1] = I[n + h], B[a + 2] = I[n + g], V[o] = (I[n + w] + (I[n + D] - I[n + w]) * u) * L, V[o + 1] = (I[n + T] + (I[n + O] - I[n + T]) * u) * L, V[o + 2] = (I[n + E] + (I[n + k] - I[n + E]) * u) * L;
120
+ let R = c < f ? c / f : 1, W = c > .5 ? d * 2 : 1, G = I[n + F] > 0 ? .35 + .65 * (.5 + .5 * Math.sin(r * I[n + F] + z[t])) : 1;
121
+ V[o + 3] = I[n + A] * R * W * G, H[t] = I[n + S] + (I[n + C] - I[n + S]) * (1 - d * d), t += 1;
122
+ }
123
+ if (W.setDrawRange(0, X), q.visible = X > 0, X > 0) for (let e = 0; e < J.length; e += 1) J[e].updateRange.offset = 0, J[e].updateRange.count = X * Y[e], J[e].needsUpdate = !0;
124
+ },
125
+ dispose() {
126
+ W.dispose(), K.dispose();
127
+ }
128
+ };
129
+ }
130
+ function J(t, { lowPower: n = !1 } = {}) {
131
+ let r = n ? .5 : 1, i = (e, t, n = 1) => Math.max(n, Math.round(e * t * r)), a = H(64), s = U(64), c = W(64), l = { value: 600 }, p = new f(), m = (e, t, n) => {
132
+ e.getDrawingBufferSize(p), l.value = p.y * .5 * n.projectionMatrix.elements[5];
133
+ }, h = q(Math.round(360 * r), {
134
+ map: s,
135
+ additive: !1,
136
+ scale: l,
137
+ renderOrder: 20,
138
+ fadeIn: .12
139
+ }), g = q(Math.round(260 * r), {
140
+ map: a,
141
+ additive: !0,
142
+ scale: l,
143
+ renderOrder: 21,
144
+ fadeIn: .05
145
+ }), _ = q(Math.round(240 * r), {
146
+ map: c,
147
+ additive: !0,
148
+ scale: l,
149
+ renderOrder: 22,
150
+ fadeIn: .08
151
+ }), v = [
152
+ h,
153
+ g,
154
+ _
155
+ ], y = new o();
156
+ y.name = "avalanche-fx", v.forEach((e) => {
157
+ e.points.onBeforeRender = m, y.add(e.points);
158
+ });
159
+ let b = Array.from({ length: n ? 2 : 4 }, () => {
160
+ let t = new u(new d({
161
+ map: a,
162
+ color: I.flash,
163
+ blending: e,
164
+ transparent: !0,
165
+ depthWrite: !1
166
+ }));
167
+ return t.visible = !1, t.renderOrder = 23, t.frustumCulled = !1, y.add(t), {
168
+ sprite: t,
169
+ t: 0,
170
+ dur: .2,
171
+ size: 1
172
+ };
173
+ }), x = 0;
174
+ t.add(y);
175
+ let S = !1;
176
+ function C(e, t, n, r, i) {
177
+ let a = b[x];
178
+ x = (x + 1) % b.length, a.t = 0, a.dur = i, a.size = r, a.sprite.position.set(e, t, n), a.sprite.scale.setScalar(r * .55), a.sprite.material.opacity = 1, a.sprite.visible = !0;
179
+ }
180
+ function w(e, t, n, r = 1) {
181
+ if (S) return;
182
+ let a = B(r), o = .7 + .3 * a, s = i(18, a, 4);
183
+ for (let r = 0; r < s; r += 1) {
184
+ let i = r / s * Math.PI * 2 + z(-.15, .15), a = Math.cos(i), c = Math.sin(i), l = .3 * o, u = z(2.2, 3.8) * o, d = K(e + a * l, t + z(.05, .2), n + c * l * .6);
185
+ d.vx = a * u, d.vy = z(.3, 1.1), d.vz = c * u * .6, d.life = z(.45, .7), d.s0 = z(.3, .5) * o, d.s1 = z(1.1, 1.6) * o, d.c0 = I.dust, d.c1 = I.dustGrey, d.shade = z(.88, 1.06), d.alpha = z(.45, .6), d.drag = 3.6, d.grav = -.6, d.spin = z(-1.5, 1.5), h.emit(d);
186
+ }
187
+ let c = i(5, a, 1);
188
+ for (let r = 0; r < c; r += 1) {
189
+ let r = K(e + z(-.35, .35) * o, t + .15, n + z(-.2, .2));
190
+ r.vx = z(-.5, .5), r.vy = z(1, 1.8) * o, r.vz = z(-.3, .3), r.life = z(.5, .65), r.s0 = .5 * o, r.s1 = z(1.3, 1.8) * o, r.c0 = I.dust, r.c1 = I.dustGrey, r.shade = z(.9, 1.04), r.alpha = .42, r.drag = 2.4, r.grav = -.4, r.spin = z(-1, 1), h.emit(r);
191
+ }
192
+ }
193
+ function T(e, t, n, r = 1) {
194
+ if (S) return;
195
+ let a = B(r), o = i(10, a, 2);
196
+ for (let r = 0; r < o; r += 1) {
197
+ let r = K(e + z(-.3, .3), t + z(-.2, .3), n + z(-.2, .3)), i = Math.random() * Math.PI * 2, o = z(1.5, 3.5) * (.6 + .4 * a);
198
+ r.vx = Math.cos(i) * o, r.vy = Math.sin(i) * o * .8 + 1.2, r.vz = z(-1, 1) * o * .5, r.life = z(.35, .6), r.delay = z(0, .08), r.s0 = z(.35, .6), r.s1 = .08, r.c0 = I.glintWhite, r.c1 = I.gold, r.alpha = 1, r.hot = .4, r.drag = 2.6, r.grav = 2.5, r.spin = z(-6, 6), r.twinkle = z(24, 40), _.emit(r);
199
+ }
200
+ let s = K(e, t + .1, n + .2);
201
+ s.life = .28, s.s0 = .9 * (.7 + .3 * a), s.s1 = .25, s.c0 = I.glintWhite, s.c1 = I.gold, s.alpha = 1, s.rot = 0, s.spin = 3, _.emit(s);
202
+ }
203
+ function E(e, t, n, r = 1) {
204
+ if (S) return;
205
+ let a = B(r);
206
+ C(e, t + .5 * a, n + .4, 3.4 * a, .2);
207
+ let o = i(26, a, 6);
208
+ for (let r = 0; r < o; r += 1) {
209
+ let r = Math.random() * Math.PI * 2, i = Math.acos(Math.random() * .9), o = z(2.5, 6) * a, s = K(e + z(-.3, .3), t + .3, n + z(-.3, .3));
210
+ s.vx = Math.cos(r) * Math.sin(i) * o, s.vy = Math.cos(i) * o * .9 + 1.5, s.vz = Math.sin(r) * Math.sin(i) * o * .6, s.life = z(.35, .6), s.s0 = z(.5, .75) * a, s.s1 = z(1.2, 1.6) * a, s.c0 = Math.random() < .3 ? I.fireCore : I.fire, s.c1 = I.fireRed, s.alpha = .9, s.drag = 4, s.grav = -1, s.hot = 1.4, s.spin = z(-2, 2), g.emit(s);
211
+ }
212
+ let s = i(12, a, 3);
213
+ for (let r = 0; r < s; r += 1) {
214
+ let r = Math.random() * Math.PI * 2, i = z(6, 11) * a, o = K(e, t + .4, n);
215
+ o.vx = Math.cos(r) * i * .7, o.vy = z(4, 9) * a, o.vz = Math.sin(r) * i * .4, o.life = z(.4, .7), o.s0 = .2, o.s1 = .06, o.c0 = I.spark, o.c1 = I.ember, o.alpha = 1, o.drag = 1, o.grav = 14, o.hot = 1, g.emit(o);
216
+ }
217
+ let c = i(14, a, 4);
218
+ for (let r = 0; r < c; r += 1) {
219
+ let r = K(e + z(-.6, .6) * a, t + z(.3, .9) * a, n + z(-.4, .4));
220
+ r.vx = z(-1, 1) * a, r.vy = z(1.6, 3) * a, r.vz = z(-.5, .5), r.life = z(.75, 1), r.delay = z(.02, .12), r.s0 = z(.6, .8) * a, r.s1 = z(1.9, 2.5) * a, r.c0 = I.smokeDark, r.c1 = I.smoke, r.shade = z(.85, 1.1), r.alpha = z(.55, .7), r.drag = 1.3, r.grav = -.5, r.spin = z(-1.2, 1.2), h.emit(r);
221
+ }
222
+ }
223
+ function D(e) {
224
+ if (S) return;
225
+ let t = Math.min(Math.max(e || 0, 0), .1);
226
+ for (let e = 0; e < v.length; e += 1) v[e].update(t);
227
+ for (let e = 0; e < b.length; e += 1) {
228
+ let n = b[e];
229
+ if (!n.sprite.visible) continue;
230
+ n.t += t;
231
+ let r = n.t / n.dur;
232
+ r >= 1 ? n.sprite.visible = !1 : (n.sprite.material.opacity = (1 - r) * (1 - r), n.sprite.scale.setScalar(n.size * (.55 + .65 * r)));
233
+ }
234
+ }
235
+ function O() {
236
+ S || (S = !0, t.remove(y), v.forEach((e) => e.dispose()), b.forEach(({ sprite: e }) => e.material.dispose()), y.clear(), a.dispose(), s.dispose(), c.dispose());
237
+ }
238
+ return {
239
+ puff: w,
240
+ sparkle: T,
241
+ blast: E,
242
+ update: D,
243
+ dispose: O
244
+ };
245
+ }
246
+ export { J as t };
247
+
248
+ //# sourceMappingURL=fx-DhXerGyt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fx-DhXerGyt.js","names":["STRIDE","PX","PY","PZ","VX","VY","VZ","AGE","LIFE","S0","S1","R0","G0","B0","R1","G1","B1","A0","DRAG","GRAV","HOT","SPIN","TW","COL","Color","VERT","FRAG","rand","min","max","clampPower","power","makeCanvas","canvas","size","softDot","c","gradient","ctx","CanvasTexture","smokeBlob","seed","next","i","angle","offset","x","y","radius","glint","core","ray","length","width","spec","particle","z","createBatch","data","cap","phase","pos","col","rot","geometry","BufferGeometry","attribute","BufferAttribute","array","itemSize","DynamicDrawUsage","material","ShaderMaterial","scale","map","additive","AdditiveBlending","NormalBlending","points","Points","renderOrder","attributes","itemSizes","entry","count","cursor","o","p","age","dt","life","p3","p4","damp","k","t","blend","inv","hot","fin","fadeIn","fout","tw","a","createAvalancheFx","lowPower","n","base","dot","blob","star","bufferSize","Vector2","syncScale","renderer","camera","smoke","fire","glints","batches","group","Group","batch","flashes","sprite","Sprite","SpriteMaterial","flashCursor","disposed","flash","dur","puff","grow","ring","cos","sin","r0","speed","s","billows","sparkle","blast","fireCount","theta","phi","sparkCount","smokeCount","update","step","b","f","dispose","scene"],"sources":["../../src/effects/avalanche/fx.js"],"sourcesContent":["// Avalancha FX: landing dust, coin glints and mini tank blasts.\n// Three pooled Points batches (smoke, fire, glint) + a few flash sprites. Every GPU resource and\n// buffer is created once; update() does no allocations. Textures are generated CanvasTextures.\nimport {\n AdditiveBlending, BufferAttribute, BufferGeometry, CanvasTexture, Color, DynamicDrawUsage, Group,\n NormalBlending, Points, ShaderMaterial, Sprite, SpriteMaterial, Vector2,\n} from 'three';\n\n// Per-particle record layout (Float32Array, STRIDE floats each).\nconst STRIDE = 22;\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;\nconst HOT = 19, SPIN = 20, TW = 21;\n// Rotation and twinkle phase live in their own arrays (rotation is also a vertex attribute).\n\nconst COL = {\n dust: new Color('#e6d6b8'),\n dustGrey: new Color('#a39b90'),\n smokeDark: new Color('#3a3432'),\n smoke: new Color('#76706b'),\n fireCore: new Color('#fff3b0'),\n fire: new Color('#ffc23a'),\n fireRed: new Color('#e8471c'),\n spark: new Color('#fff6cf'),\n ember: new Color('#ff8a2a'),\n glintWhite: new Color('#fffbe8'),\n gold: new Color('#ffc53a'),\n flash: new Color('#ffe2a6'),\n};\n\n// Point size is a world-space diameter: pixels = size * uScale / depth (uScale synced per frame).\nconst VERT = /* glsl */ `\nuniform float uScale;\nattribute vec4 aColor;\nattribute float aSize;\nattribute float aRot;\nvarying vec4 vColor;\nvarying vec2 vRot;\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), 1024.0) : 0.0;\n vColor = aColor;\n vRot = vec2(cos(aRot), sin(aRot));\n}\n`;\nconst FRAG = /* glsl */ `\nuniform sampler2D uMap;\nvarying vec4 vColor;\nvarying vec2 vRot;\nvoid main() {\n vec2 uv = gl_PointCoord - 0.5;\n uv = vec2(vRot.x * uv.x - vRot.y * uv.y, vRot.y * uv.x + vRot.x * uv.y) + 0.5;\n float a = texture2D(uMap, uv).a * vColor.a;\n if (a < 0.004) discard;\n gl_FragColor = vec4(vColor.rgb, a);\n #include <encodings_fragment>\n}\n`;\n\nconst rand = (min, max) => min + Math.random() * (max - min);\nconst clampPower = (power) => (Number.isFinite(power) ? Math.min(2.5, Math.max(0.2, power)) : 1);\n\nfunction makeCanvas(size) {\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n return { canvas, ctx: canvas.getContext('2d') };\n}\n\n// Soft round dot (fire, flash).\nfunction softDot(size = 64) {\n const { canvas, ctx } = makeCanvas(size);\n const c = size / 2;\n const gradient = ctx.createRadialGradient(c, c, 0, c, c, c);\n gradient.addColorStop(0, 'rgba(255,255,255,1)');\n gradient.addColorStop(0.35, 'rgba(255,255,255,.6)');\n gradient.addColorStop(1, 'rgba(255,255,255,0)');\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, size, size);\n return new CanvasTexture(canvas);\n}\n\n// Puffy smoke blob: overlapping soft circles from a fixed seed.\nfunction smokeBlob(size = 64) {\n const { canvas, ctx } = makeCanvas(size);\n const c = size / 2;\n let seed = 11;\n const next = () => { seed = (seed * 16807) % 2147483647; return seed / 2147483647; };\n for (let i = 0; i < 7; i += 1) {\n const angle = next() * Math.PI * 2;\n const offset = next() * c * 0.3;\n const x = c + Math.cos(angle) * offset;\n const y = c + Math.sin(angle) * offset;\n const radius = c * (0.45 + next() * 0.22);\n const gradient = ctx.createRadialGradient(x, y, 0, x, y, radius);\n gradient.addColorStop(0, 'rgba(255,255,255,.55)');\n gradient.addColorStop(0.6, 'rgba(255,255,255,.25)');\n gradient.addColorStop(1, 'rgba(255,255,255,0)');\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, size, size);\n }\n return new CanvasTexture(canvas);\n}\n\n// Four-point star glint: soft core + tapered cross + short diagonals (stays inside the inscribed circle).\nfunction glint(size = 64) {\n const { canvas, ctx } = makeCanvas(size);\n const c = size / 2;\n ctx.globalCompositeOperation = 'lighter';\n const core = ctx.createRadialGradient(c, c, 0, c, c, c * 0.42);\n core.addColorStop(0, 'rgba(255,255,255,1)');\n core.addColorStop(0.3, 'rgba(255,255,255,.55)');\n core.addColorStop(1, 'rgba(255,255,255,0)');\n ctx.fillStyle = core;\n ctx.fillRect(0, 0, size, size);\n const ray = (angle, length, width) => {\n ctx.save();\n ctx.translate(c, c);\n ctx.rotate(angle);\n const gradient = ctx.createLinearGradient(-length, 0, length, 0);\n gradient.addColorStop(0, 'rgba(255,255,255,0)');\n gradient.addColorStop(0.5, 'rgba(255,255,255,1)');\n gradient.addColorStop(1, 'rgba(255,255,255,0)');\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.moveTo(-length, 0);\n ctx.lineTo(0, -width);\n ctx.lineTo(length, 0);\n ctx.lineTo(0, width);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n };\n ray(0, c * 0.94, size * 0.05);\n ray(Math.PI / 2, c * 0.94, size * 0.05);\n ray(Math.PI / 4, c * 0.5, size * 0.03);\n ray(-Math.PI / 4, c * 0.5, size * 0.03);\n return new CanvasTexture(canvas);\n}\n\n// Reusable emit spec: emitters mutate it, batch.emit() copies it into the pool.\nconst spec = {\n x: 0, y: 0, z: 0, vx: 0, vy: 0, vz: 0, life: 1, delay: 0, s0: 1, s1: 1, c0: COL.dust, c1: COL.dust,\n shade: 1, alpha: 1, drag: 0, grav: 0, hot: 0, rot: 0, spin: 0, twinkle: 0,\n};\nfunction particle(x, y, z) {\n spec.x = x; spec.y = y; spec.z = z;\n spec.vx = 0; spec.vy = 0; spec.vz = 0;\n spec.life = 1; spec.delay = 0; spec.s0 = 1; spec.s1 = 1;\n spec.shade = 1; spec.alpha = 1; spec.drag = 0; spec.grav = 0; spec.hot = 0;\n spec.rot = Math.random() * Math.PI * 2; spec.spin = 0; spec.twinkle = 0;\n return spec;\n}\n\n/** Fixed-capacity Points pool; when full the oldest slot (ring cursor) is overwritten. */\nfunction createBatch(cap, { map, additive, scale, renderOrder, fadeIn }) {\n const data = new Float32Array(cap * STRIDE);\n const phase = new Float32Array(cap);\n const pos = new Float32Array(cap * 3);\n const col = new Float32Array(cap * 4);\n const size = new Float32Array(cap);\n const rot = new Float32Array(cap);\n const geometry = new BufferGeometry();\n const attribute = (array, itemSize) => new BufferAttribute(array, itemSize).setUsage(DynamicDrawUsage);\n geometry.setAttribute('position', attribute(pos, 3));\n geometry.setAttribute('aColor', attribute(col, 4));\n geometry.setAttribute('aSize', attribute(size, 1));\n geometry.setAttribute('aRot', attribute(rot, 1));\n geometry.setDrawRange(0, 0);\n const material = new ShaderMaterial({\n uniforms: { uScale: scale, uMap: { value: map } },\n vertexShader: VERT,\n fragmentShader: FRAG,\n transparent: true,\n depthWrite: false,\n blending: additive ? AdditiveBlending : NormalBlending,\n });\n const points = new Points(geometry, material);\n points.frustumCulled = false;\n points.visible = false;\n points.renderOrder = renderOrder;\n const attributes = [geometry.attributes.position, geometry.attributes.aColor, geometry.attributes.aSize, geometry.attributes.aRot];\n const itemSizes = attributes.map((entry) => entry.itemSize);\n let count = 0;\n let cursor = 0;\n\n return {\n points,\n emit(p) {\n let i;\n if (count < cap) { i = count; count += 1; } else { i = cursor; cursor = (cursor + 1) % cap; }\n const o = i * STRIDE;\n data[o + PX] = p.x; data[o + PY] = p.y; data[o + PZ] = p.z;\n data[o + VX] = p.vx; data[o + VY] = p.vy; data[o + VZ] = p.vz;\n data[o + AGE] = -p.delay; data[o + LIFE] = p.life;\n data[o + S0] = p.s0; data[o + S1] = p.s1;\n data[o + R0] = p.c0.r * p.shade; data[o + G0] = p.c0.g * p.shade; data[o + B0] = p.c0.b * p.shade;\n data[o + R1] = p.c1.r * p.shade; data[o + G1] = p.c1.g * p.shade; data[o + B1] = p.c1.b * p.shade;\n data[o + A0] = p.alpha; data[o + DRAG] = p.drag; data[o + GRAV] = p.grav;\n data[o + HOT] = p.hot; data[o + SPIN] = p.spin; data[o + TW] = p.twinkle;\n phase[i] = Math.random() * Math.PI * 2;\n rot[i] = p.rot;\n // Hidden until the first update positions it.\n col[i * 4 + 3] = 0;\n },\n update(dt) {\n let i = 0;\n while (i < count) {\n const o = i * STRIDE;\n const age = data[o + AGE] + dt;\n const life = data[o + LIFE];\n if (age >= life) {\n // Swap-remove keeps the live range dense.\n count -= 1;\n if (i !== count) {\n data.copyWithin(o, count * STRIDE, count * STRIDE + STRIDE);\n phase[i] = phase[count];\n rot[i] = rot[count];\n }\n continue;\n }\n data[o + AGE] = age;\n const p3 = i * 3;\n const p4 = i * 4;\n if (age < 0) {\n // Delayed spawn: parked and invisible.\n pos[p3] = data[o + PX]; pos[p3 + 1] = data[o + PY]; pos[p3 + 2] = data[o + PZ];\n col[p4 + 3] = 0;\n size[i] = 0;\n i += 1;\n continue;\n }\n const damp = Math.exp(-data[o + DRAG] * dt);\n data[o + VX] *= damp;\n data[o + VY] = data[o + VY] * damp - data[o + GRAV] * dt;\n data[o + VZ] *= damp;\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 rot[i] += data[o + SPIN] * dt;\n\n const k = age / life;\n const t = k < 0.7 ? k / 0.7 : 1;\n const blend = t * t * (3 - 2 * t);\n const inv = 1 - k;\n const hot = 1 + data[o + HOT] * inv * inv * inv;\n pos[p3] = data[o + PX]; pos[p3 + 1] = data[o + PY]; pos[p3 + 2] = data[o + PZ];\n col[p4] = (data[o + R0] + (data[o + R1] - data[o + R0]) * blend) * hot;\n col[p4 + 1] = (data[o + G0] + (data[o + G1] - data[o + G0]) * blend) * hot;\n col[p4 + 2] = (data[o + B0] + (data[o + B1] - data[o + B0]) * blend) * hot;\n const fin = k < fadeIn ? k / fadeIn : 1;\n const fout = k > 0.5 ? inv * 2 : 1;\n const tw = data[o + TW] > 0 ? 0.35 + 0.65 * (0.5 + 0.5 * Math.sin(age * data[o + TW] + phase[i])) : 1;\n col[p4 + 3] = data[o + A0] * fin * fout * tw;\n size[i] = data[o + S0] + (data[o + S1] - data[o + S0]) * (1 - inv * inv);\n i += 1;\n }\n geometry.setDrawRange(0, count);\n points.visible = count > 0;\n if (count > 0) {\n for (let a = 0; a < attributes.length; a += 1) {\n attributes[a].updateRange.offset = 0;\n attributes[a].updateRange.count = count * itemSizes[a];\n attributes[a].needsUpdate = true;\n }\n }\n },\n dispose() {\n geometry.dispose();\n material.dispose();\n },\n };\n}\n\nexport function createAvalancheFx(scene, { lowPower = false } = {}) {\n const k = lowPower ? 0.5 : 1;\n const n = (base, power, min = 1) => Math.max(min, Math.round(base * power * k));\n\n const dot = softDot(64);\n const blob = smokeBlob(64);\n const star = glint(64);\n\n // Shared world-to-pixel factor: drawingBufferHeight / 2 * projection[5].\n const scale = { value: 600 };\n const bufferSize = new Vector2();\n const syncScale = (renderer, _scene, camera) => {\n renderer.getDrawingBufferSize(bufferSize);\n scale.value = bufferSize.y * 0.5 * camera.projectionMatrix.elements[5];\n };\n\n const smoke = createBatch(Math.round(360 * k), { map: blob, additive: false, scale, renderOrder: 20, fadeIn: 0.12 });\n const fire = createBatch(Math.round(260 * k), { map: dot, additive: true, scale, renderOrder: 21, fadeIn: 0.05 });\n const glints = createBatch(Math.round(240 * k), { map: star, additive: true, scale, renderOrder: 22, fadeIn: 0.08 });\n const batches = [smoke, fire, glints];\n const group = new Group();\n group.name = 'avalanche-fx';\n batches.forEach((batch) => {\n batch.points.onBeforeRender = syncScale;\n group.add(batch.points);\n });\n\n // Flash sprites: short additive pops (Sprite geometry is shared by three, never disposed here).\n const flashes = Array.from({ length: lowPower ? 2 : 4 }, () => {\n const sprite = new Sprite(new SpriteMaterial({\n map: dot, color: COL.flash, blending: AdditiveBlending, transparent: true, depthWrite: false,\n }));\n sprite.visible = false;\n sprite.renderOrder = 23;\n sprite.frustumCulled = false;\n group.add(sprite);\n return { sprite, t: 0, dur: 0.2, size: 1 };\n });\n let flashCursor = 0;\n scene.add(group);\n let disposed = false;\n\n function flash(x, y, z, size, dur) {\n const entry = flashes[flashCursor];\n flashCursor = (flashCursor + 1) % flashes.length;\n entry.t = 0;\n entry.dur = dur;\n entry.size = size;\n entry.sprite.position.set(x, y, z);\n entry.sprite.scale.setScalar(size * 0.55);\n entry.sprite.material.opacity = 1;\n entry.sprite.visible = true;\n }\n\n // Ground dust ring for a landing car/tank (~0.6 s).\n function puff(x, y, z, power = 1) {\n if (disposed) return;\n const p = clampPower(power);\n const grow = 0.7 + 0.3 * p;\n const ring = n(18, p, 4);\n for (let i = 0; i < ring; i += 1) {\n const angle = (i / ring) * Math.PI * 2 + rand(-0.15, 0.15);\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const r0 = 0.3 * grow;\n const speed = rand(2.2, 3.8) * grow;\n const s = particle(x + cos * r0, y + rand(0.05, 0.2), z + sin * r0 * 0.6);\n s.vx = cos * speed; s.vy = rand(0.3, 1.1); s.vz = sin * speed * 0.6;\n s.life = rand(0.45, 0.7);\n s.s0 = rand(0.3, 0.5) * grow; s.s1 = rand(1.1, 1.6) * grow;\n s.c0 = COL.dust; s.c1 = COL.dustGrey; s.shade = rand(0.88, 1.06);\n s.alpha = rand(0.45, 0.6); s.drag = 3.6; s.grav = -0.6; s.spin = rand(-1.5, 1.5);\n smoke.emit(s);\n }\n // A few slower billows rising from the center.\n const billows = n(5, p, 1);\n for (let i = 0; i < billows; i += 1) {\n const s = particle(x + rand(-0.35, 0.35) * grow, y + 0.15, z + rand(-0.2, 0.2));\n s.vx = rand(-0.5, 0.5); s.vy = rand(1, 1.8) * grow; s.vz = rand(-0.3, 0.3);\n s.life = rand(0.5, 0.65);\n s.s0 = 0.5 * grow; s.s1 = rand(1.3, 1.8) * grow;\n s.c0 = COL.dust; s.c1 = COL.dustGrey; s.shade = rand(0.9, 1.04);\n s.alpha = 0.42; s.drag = 2.4; s.grav = -0.4; s.spin = rand(-1, 1);\n smoke.emit(s);\n }\n }\n\n // Golden twinkling glints for coins/money (~0.5 s).\n function sparkle(x, y, z, power = 1) {\n if (disposed) return;\n const p = clampPower(power);\n const count = n(10, p, 2);\n for (let i = 0; i < count; i += 1) {\n const s = particle(x + rand(-0.3, 0.3), y + rand(-0.2, 0.3), z + rand(-0.2, 0.3));\n const angle = Math.random() * Math.PI * 2;\n const speed = rand(1.5, 3.5) * (0.6 + 0.4 * p);\n s.vx = Math.cos(angle) * speed; s.vy = Math.sin(angle) * speed * 0.8 + 1.2; s.vz = rand(-1, 1) * speed * 0.5;\n s.life = rand(0.35, 0.6); s.delay = rand(0, 0.08);\n s.s0 = rand(0.35, 0.6); s.s1 = 0.08;\n s.c0 = COL.glintWhite; s.c1 = COL.gold; s.alpha = 1; s.hot = 0.4;\n s.drag = 2.6; s.grav = 2.5; s.spin = rand(-6, 6); s.twinkle = rand(24, 40);\n glints.emit(s);\n }\n // Central \"ping\" star.\n const s = particle(x, y + 0.1, z + 0.2);\n s.life = 0.28; s.s0 = 0.9 * (0.7 + 0.3 * p); s.s1 = 0.25;\n s.c0 = COL.glintWhite; s.c1 = COL.gold; s.alpha = 1; s.rot = 0; s.spin = 3;\n glints.emit(s);\n }\n\n // Mini cartoon explosion: flash + fireball + sparks + dark smoke column (~1 s).\n function blast(x, y, z, power = 1) {\n if (disposed) return;\n const p = clampPower(power);\n flash(x, y + 0.5 * p, z + 0.4, 3.4 * p, 0.2);\n const fireCount = n(26, p, 6);\n for (let i = 0; i < fireCount; i += 1) {\n const theta = Math.random() * Math.PI * 2;\n const phi = Math.acos(Math.random() * 0.9);\n const speed = rand(2.5, 6) * p;\n const s = particle(x + rand(-0.3, 0.3), y + 0.3, z + rand(-0.3, 0.3));\n s.vx = Math.cos(theta) * Math.sin(phi) * speed;\n s.vy = Math.cos(phi) * speed * 0.9 + 1.5;\n s.vz = Math.sin(theta) * Math.sin(phi) * speed * 0.6;\n s.life = rand(0.35, 0.6);\n s.s0 = rand(0.5, 0.75) * p; s.s1 = rand(1.2, 1.6) * p;\n s.c0 = Math.random() < 0.3 ? COL.fireCore : COL.fire; s.c1 = COL.fireRed;\n s.alpha = 0.9; s.drag = 4; s.grav = -1; s.hot = 1.4; s.spin = rand(-2, 2);\n fire.emit(s);\n }\n const sparkCount = n(12, p, 3);\n for (let i = 0; i < sparkCount; i += 1) {\n const theta = Math.random() * Math.PI * 2;\n const speed = rand(6, 11) * p;\n const s = particle(x, y + 0.4, z);\n s.vx = Math.cos(theta) * speed * 0.7; s.vy = rand(4, 9) * p; s.vz = Math.sin(theta) * speed * 0.4;\n s.life = rand(0.4, 0.7);\n s.s0 = 0.2; s.s1 = 0.06;\n s.c0 = COL.spark; s.c1 = COL.ember; s.alpha = 1; s.drag = 1; s.grav = 14; s.hot = 1;\n fire.emit(s);\n }\n const smokeCount = n(14, p, 4);\n for (let i = 0; i < smokeCount; i += 1) {\n const s = particle(x + rand(-0.6, 0.6) * p, y + rand(0.3, 0.9) * p, z + rand(-0.4, 0.4));\n s.vx = rand(-1, 1) * p; s.vy = rand(1.6, 3) * p; s.vz = rand(-0.5, 0.5);\n s.life = rand(0.75, 1); s.delay = rand(0.02, 0.12);\n s.s0 = rand(0.6, 0.8) * p; s.s1 = rand(1.9, 2.5) * p;\n s.c0 = COL.smokeDark; s.c1 = COL.smoke; s.shade = rand(0.85, 1.1);\n s.alpha = rand(0.55, 0.7); s.drag = 1.3; s.grav = -0.5; s.spin = rand(-1.2, 1.2);\n smoke.emit(s);\n }\n }\n\n function update(dt) {\n if (disposed) return;\n const step = Math.min(Math.max(dt || 0, 0), 0.1);\n for (let b = 0; b < batches.length; b += 1) batches[b].update(step);\n for (let f = 0; f < flashes.length; f += 1) {\n const entry = flashes[f];\n if (!entry.sprite.visible) continue;\n entry.t += step;\n const t = entry.t / entry.dur;\n if (t >= 1) { entry.sprite.visible = false; continue; }\n entry.sprite.material.opacity = (1 - t) * (1 - t);\n entry.sprite.scale.setScalar(entry.size * (0.55 + 0.65 * t));\n }\n }\n\n function dispose() {\n if (disposed) return;\n disposed = true;\n scene.remove(group);\n batches.forEach((batch) => batch.dispose());\n flashes.forEach(({ sprite }) => sprite.material.dispose());\n group.clear();\n dot.dispose();\n blob.dispose();\n star.dispose();\n }\n\n return { puff, sparkle, blast, update, dispose };\n}\n"],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ // src/games/shared/gameStatus.js
2
+ var e = (e, t) => e != null && t != null && String(e) === String(t), t = (e) => [
3
+ "won",
4
+ "draw",
5
+ "declined",
6
+ "closed"
7
+ ].includes(e?.status), n = (e) => !!e && ([
8
+ "invited",
9
+ "placement",
10
+ "seeding",
11
+ "active",
12
+ "conflict"
13
+ ].includes(e.status) || !!e.pendingEvent), r = (e) => e?.game === "battleship", i = (e) => e?.game === "tanks", a = {
14
+ connect4: "Conecta 4",
15
+ battleship: "Batalla Naval",
16
+ tanks: "Tanques de guerra",
17
+ tanks_live: "Tanques LIVE 3D",
18
+ racing_live: "Carreras LIVE 🏎️"
19
+ }, o = (e) => a[e?.game] ?? "Conecta 4", s = {
20
+ ok: "Partida verificada",
21
+ mismatch: "Resultados inconsistentes del rival",
22
+ pending: "Verificando…"
23
+ }, c = (e) => s[e?.verification] || "";
24
+ function l(t, n) {
25
+ let r = e(n, t.turnId);
26
+ return t.status === "placement" ? t.myReady ? t.opponentReady ? "Iniciando batalla…" : "Esperando a que el rival coloque su flota" : "Coloca tu flota" : t.status === "active" ? t.pendingShot ? "Esperando resultado…" : r ? "Tu turno · elige una casilla" : "Turno del rival" : t.status === "won" ? e(n, t.winnerId) ? "¡Ganaste!" : "Tu rival ganó" : null;
27
+ }
28
+ function u(t, n) {
29
+ if (t.status === "seeding") return "Preparando el campo de batalla…";
30
+ if (t.status === "active") return e(n, t.turnId) ? "Tu turno · apunta y dispara" : "Turno del rival";
31
+ if (t.status === "won") {
32
+ let r = e(n, t.winnerId), i = t.logic?.reason;
33
+ return i === "resign" ? r ? "¡Victoria! Tu rival se rindió" : "Te rendiste" : i === "timeout" ? r ? "¡Victoria! Tu rival dejó pasar sus turnos" : "Perdiste por inactividad" : i === "max_shots" ? r ? "¡Victoria por vida restante!" : "Tu rival terminó con más vida" : r ? "¡Victoria! Destruiste al rival" : "Tu tanque fue destruido";
34
+ }
35
+ return t.status === "draw" ? t.logic?.reason === "max_shots" ? "Empate · misma vida al agotar los disparos" : "Empate · ambos tanques destruidos" : null;
36
+ }
37
+ function d(t, n) {
38
+ if (t?.game === "racing_live" && t.status === "active") return "Invitación aceptada · carrera en desarrollo";
39
+ if (t?.game === "tanks_live" && t.status === "active") return "Combate en vivo · conduce, apunta y dispara";
40
+ if (r(t)) {
41
+ let e = l(t, n);
42
+ if (e) return e;
43
+ }
44
+ if (i(t)) {
45
+ let e = u(t, n);
46
+ if (e) return e;
47
+ }
48
+ let a = t.status === "active" && e(n, t.turnId);
49
+ return t.status === "invited" ? e(n, t.guestId) ? "Te han invitado a jugar" : "Esperando respuesta a la invitación" : t.status === "active" ? a ? "Tu turno · elige una columna" : "Turno de tu rival" : t.status === "won" ? e(n, t.winnerId) ? "¡Ganaste la partida!" : "Tu rival ganó la partida" : t.status === "draw" ? "Empate · tablero completo" : t.status === "declined" ? "Invitación rechazada" : t.status === "closed" ? "Partida finalizada" : t.status === "conflict" ? "Partida pausada por un conflicto de sincronización" : "Esperando respuesta a la invitación";
50
+ }
51
+ function f(t, n) {
52
+ if (t?.game === "racing_live" && t.status === "active") return "Carrera en desarrollo";
53
+ if (t?.game === "tanks_live" && t.status === "active") return "Combate LIVE";
54
+ if (r(t)) {
55
+ if (t.status === "placement") return t.myReady ? "Esperando al rival" : "Coloca tu flota";
56
+ if (t.status === "active" && t.pendingShot) return "Esperando resultado…";
57
+ }
58
+ return i(t) && t.status === "seeding" ? "Preparando…" : t.status === "active" ? e(n, t.turnId) ? "Tu turno" : "Turno del rival" : t.status === "invited" ? e(n, t.guestId) ? "Invitación recibida" : "Invitación enviada" : t.status === "conflict" ? t.sync?.status === "requesting" ? "Sincronizando…" : "Sin sincronizar" : d(t, n);
59
+ }
60
+ export { r as a, t as c, c as i, e as l, o as n, n as o, f as r, i as s, d as t };
61
+
62
+ //# sourceMappingURL=gameStatus-BChd29yI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gameStatus-BChd29yI.js","names":["sameUser","left","right","isTerminalGame","game","isLiveGame","isBattleshipGame","isTanksGame","GAME_TITLES","getGameTitle","VERIFICATION_LABELS","getVerificationLabel","getBattleshipStatus","myTurn","currentUserId","getTanksStatus","won","reason","getGameStatus","status","getShortGameStatus"],"sources":["../../src/games/shared/gameStatus.js"],"sourcesContent":["export const sameUser = (left, right) => left != null && right != null && String(left) === String(right);\nexport const isTerminalGame = (game) => ['won', 'draw', 'declined', 'closed'].includes(game?.status);\nexport const isLiveGame = (game) => Boolean(game) && (['invited', 'placement', 'seeding', 'active', 'conflict'].includes(game.status) || Boolean(game.pendingEvent));\nexport const isBattleshipGame = (game) => game?.game === 'battleship';\nexport const isTanksGame = (game) => game?.game === 'tanks';\nconst GAME_TITLES = { connect4: 'Conecta 4', battleship: 'Batalla Naval', tanks: 'Tanques de guerra', tanks_live: 'Tanques LIVE 3D', racing_live: 'Carreras LIVE 🏎️' };\nexport const getGameTitle = (game) => GAME_TITLES[game?.game] ?? 'Conecta 4';\n\nconst VERIFICATION_LABELS = { ok: 'Partida verificada', mismatch: 'Resultados inconsistentes del rival', pending: 'Verificando…' };\nexport const getVerificationLabel = (game) => VERIFICATION_LABELS[game?.verification] || '';\n\nfunction getBattleshipStatus(game, currentUserId) {\n const myTurn = sameUser(currentUserId, game.turnId);\n if (game.status === 'placement') {\n if (!game.myReady) return 'Coloca tu flota';\n return game.opponentReady ? 'Iniciando batalla…' : 'Esperando a que el rival coloque su flota';\n }\n if (game.status === 'active') {\n if (game.pendingShot) return 'Esperando resultado…';\n return myTurn ? 'Tu turno · elige una casilla' : 'Turno del rival';\n }\n if (game.status === 'won') return sameUser(currentUserId, game.winnerId) ? '¡Ganaste!' : 'Tu rival ganó';\n return null;\n}\n\nfunction getTanksStatus(game, currentUserId) {\n if (game.status === 'seeding') return 'Preparando el campo de batalla…';\n if (game.status === 'active') return sameUser(currentUserId, game.turnId) ? 'Tu turno · apunta y dispara' : 'Turno del rival';\n if (game.status === 'won') {\n const won = sameUser(currentUserId, game.winnerId);\n const reason = game.logic?.reason;\n if (reason === 'resign') return won ? '¡Victoria! Tu rival se rindió' : 'Te rendiste';\n if (reason === 'timeout') return won ? '¡Victoria! Tu rival dejó pasar sus turnos' : 'Perdiste por inactividad';\n if (reason === 'max_shots') return won ? '¡Victoria por vida restante!' : 'Tu rival terminó con más vida';\n return won ? '¡Victoria! Destruiste al rival' : 'Tu tanque fue destruido';\n }\n if (game.status === 'draw') return game.logic?.reason === 'max_shots' ? 'Empate · misma vida al agotar los disparos' : 'Empate · ambos tanques destruidos';\n return null;\n}\n\nexport function getGameStatus(game, currentUserId) {\n if (game?.game === 'racing_live' && game.status === 'active') return 'Invitación aceptada · carrera en desarrollo';\n if (game?.game === 'tanks_live' && game.status === 'active') return 'Combate en vivo · conduce, apunta y dispara';\n if (isBattleshipGame(game)) {\n const status = getBattleshipStatus(game, currentUserId);\n if (status) return status;\n }\n if (isTanksGame(game)) {\n const status = getTanksStatus(game, currentUserId);\n if (status) return status;\n }\n const myTurn = game.status === 'active' && sameUser(currentUserId, game.turnId);\n if (game.status === 'invited') return sameUser(currentUserId, game.guestId) ? 'Te han invitado a jugar' : 'Esperando respuesta a la invitación';\n if (game.status === 'active') return myTurn ? 'Tu turno · elige una columna' : 'Turno de tu rival';\n if (game.status === 'won') return sameUser(currentUserId, game.winnerId) ? '¡Ganaste la partida!' : 'Tu rival ganó la partida';\n if (game.status === 'draw') return 'Empate · tablero completo';\n if (game.status === 'declined') return 'Invitación rechazada';\n if (game.status === 'closed') return 'Partida finalizada';\n if (game.status === 'conflict') return 'Partida pausada por un conflicto de sincronización';\n return 'Esperando respuesta a la invitación';\n}\n\n// Short label for the minimized bar and the timeline placeholder.\nexport function getShortGameStatus(game, currentUserId) {\n if (game?.game === 'racing_live' && game.status === 'active') return 'Carrera en desarrollo';\n if (game?.game === 'tanks_live' && game.status === 'active') return 'Combate LIVE';\n if (isBattleshipGame(game)) {\n if (game.status === 'placement') return game.myReady ? 'Esperando al rival' : 'Coloca tu flota';\n if (game.status === 'active' && game.pendingShot) return 'Esperando resultado…';\n }\n if (isTanksGame(game) && game.status === 'seeding') return 'Preparando…';\n if (game.status === 'active') return sameUser(currentUserId, game.turnId) ? 'Tu turno' : 'Turno del rival';\n if (game.status === 'invited') return sameUser(currentUserId, game.guestId) ? 'Invitación recibida' : 'Invitación enviada';\n if (game.status === 'conflict') return game.sync?.status === 'requesting' ? 'Sincronizando…' : 'Sin sincronizar';\n return getGameStatus(game, currentUserId);\n}\n"],"mappings":"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"}