@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.
- package/CHANGELOG.md +112 -5
- package/README.md +401 -312
- package/assets/sounds/effects/avalanche.mp3 +0 -0
- package/assets/sounds/racing/car_boost.mp3 +0 -0
- package/assets/sounds/racing/car_boost.ogg +0 -0
- package/assets/sounds/racing/car_bump.mp3 +0 -0
- package/assets/sounds/racing/car_bump.ogg +0 -0
- package/assets/sounds/racing/car_drift_loop.mp3 +0 -0
- package/assets/sounds/racing/car_drift_loop.ogg +0 -0
- package/assets/sounds/racing/car_engine_loop.mp3 +0 -0
- package/assets/sounds/racing/car_engine_loop.ogg +0 -0
- package/assets/sounds/racing/car_engine_start.mp3 +0 -0
- package/assets/sounds/racing/car_engine_start.ogg +0 -0
- package/assets/sounds/racing/countdown_beep.mp3 +0 -0
- package/assets/sounds/racing/countdown_beep.ogg +0 -0
- package/assets/sounds/racing/countdown_go.mp3 +0 -0
- package/assets/sounds/racing/countdown_go.ogg +0 -0
- package/assets/sounds/racing/final_lap.mp3 +0 -0
- package/assets/sounds/racing/final_lap.ogg +0 -0
- package/assets/sounds/racing/finish_line.mp3 +0 -0
- package/assets/sounds/racing/finish_line.ogg +0 -0
- package/assets/sounds/racing/lap_complete.mp3 +0 -0
- package/assets/sounds/racing/lap_complete.ogg +0 -0
- package/assets/sounds/racing/music_circuit.mp3 +0 -0
- package/assets/sounds/racing/music_circuit.ogg +0 -0
- package/assets/sounds/racing/music_final_lap.mp3 +0 -0
- package/assets/sounds/racing/music_final_lap.ogg +0 -0
- package/assets/sounds/racing/race_defeat.mp3 +0 -0
- package/assets/sounds/racing/race_defeat.ogg +0 -0
- package/assets/sounds/racing/race_victory.mp3 +0 -0
- package/assets/sounds/racing/race_victory.ogg +0 -0
- package/assets/sounds/tanks/barrel_explode.mp3 +0 -0
- package/assets/sounds/tanks/barrel_explode.ogg +0 -0
- package/assets/sounds/tanks/crate_break.mp3 +0 -0
- package/assets/sounds/tanks/crate_break.ogg +0 -0
- package/assets/sounds/tanks/health_pickup.mp3 +0 -0
- package/assets/sounds/tanks/health_pickup.ogg +0 -0
- package/assets/sounds/tanks/last_life.mp3 +0 -0
- package/assets/sounds/tanks/last_life.ogg +0 -0
- package/assets/sounds/tanks/life_lost.mp3 +0 -0
- package/assets/sounds/tanks/life_lost.ogg +0 -0
- package/assets/sounds/tanks/respawn.mp3 +0 -0
- package/assets/sounds/tanks/respawn.ogg +0 -0
- package/assets/sounds/tanks/shield_end.mp3 +0 -0
- package/assets/sounds/tanks/shield_end.ogg +0 -0
- package/assets/sounds/tanks/shield_loop.mp3 +0 -0
- package/assets/sounds/tanks/shield_loop.ogg +0 -0
- package/assets/sounds/tanks/wall_hit.mp3 +0 -0
- package/assets/sounds/tanks/wall_hit.ogg +0 -0
- package/dist/chunks/{BattleshipGameCard-iRk8d4vR.js → BattleshipGameCard-8H-sBCsv.js} +146 -144
- package/dist/chunks/{BattleshipGameCard-iRk8d4vR.js.map → BattleshipGameCard-8H-sBCsv.js.map} +1 -1
- package/dist/chunks/{ChatContext-DjIEifGY.js → ChatContext-CVW58bzC.js} +2 -2
- package/dist/chunks/{ChatContext-DjIEifGY.js.map → ChatContext-CVW58bzC.js.map} +1 -1
- package/dist/chunks/RacingLiveGameCard-8j9QLnxW.js +1654 -0
- package/dist/chunks/RacingLiveGameCard-8j9QLnxW.js.map +1 -0
- package/dist/chunks/{TanksGameCard-GrqmdwJ7.js → TanksGameCard-DnCufSH6.js} +168 -166
- package/dist/chunks/{TanksGameCard-GrqmdwJ7.js.map → TanksGameCard-DnCufSH6.js.map} +1 -1
- package/dist/chunks/TanksLiveGameCard-D_27Jomp.js +1274 -0
- package/dist/chunks/TanksLiveGameCard-D_27Jomp.js.map +1 -0
- package/dist/chunks/avalancheScene3d-CIE2WKQn.js +1300 -0
- package/dist/chunks/avalancheScene3d-CIE2WKQn.js.map +1 -0
- package/dist/chunks/cars-D1PM7mVD.js +340 -0
- package/dist/chunks/cars-D1PM7mVD.js.map +1 -0
- package/dist/chunks/connect4Sounds-BqEHULjv.js +235 -0
- package/dist/chunks/connect4Sounds-BqEHULjv.js.map +1 -0
- package/dist/chunks/connectionStore-DwgIUl30.js +13 -0
- package/dist/chunks/connectionStore-DwgIUl30.js.map +1 -0
- package/dist/chunks/createLiveScene-MTGRv8rx.js +758 -0
- package/dist/chunks/createLiveScene-MTGRv8rx.js.map +1 -0
- package/dist/chunks/createRaceScene-BiEtQsVs.js +306 -0
- package/dist/chunks/createRaceScene-BiEtQsVs.js.map +1 -0
- package/dist/chunks/{createTankScene-6asWHKFf.js → createTankScene-yhX6la27.js} +125 -123
- package/dist/chunks/{createTankScene-6asWHKFf.js.map → createTankScene-yhX6la27.js.map} +1 -1
- package/dist/chunks/decor-CyyCnmct.js +418 -0
- package/dist/chunks/decor-CyyCnmct.js.map +1 -0
- package/dist/chunks/fx-1ZwzmPWj.js +458 -0
- package/dist/chunks/fx-1ZwzmPWj.js.map +1 -0
- package/dist/chunks/fx-DhXerGyt.js +248 -0
- package/dist/chunks/fx-DhXerGyt.js.map +1 -0
- package/dist/chunks/gameStatus-BChd29yI.js +62 -0
- package/dist/chunks/gameStatus-BChd29yI.js.map +1 -0
- package/dist/chunks/games-Bl_8raG6.js +3681 -0
- package/dist/chunks/games-Bl_8raG6.js.map +1 -0
- package/dist/chunks/rolldown-runtime-CGnMp29N.js +10 -0
- package/dist/chunks/tank-DjEQ4FXF.js +553 -0
- package/dist/chunks/tank-DjEQ4FXF.js.map +1 -0
- package/dist/chunks/tanks-live-BcKmrhnV.js +261 -0
- package/dist/chunks/tanks-live-BcKmrhnV.js.map +1 -0
- package/dist/chunks/{tanksSounds-CUNDIOal.js → tanksSounds-DTnidbiq.js} +44 -12
- package/dist/chunks/tanksSounds-DTnidbiq.js.map +1 -0
- package/dist/chunks/track-BcnnpnAm.js +259 -0
- package/dist/chunks/track-BcnnpnAm.js.map +1 -0
- package/dist/chunks/util-DwI9bfS7.js +57 -0
- package/dist/chunks/util-DwI9bfS7.js.map +1 -0
- package/dist/index.js +822 -635
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/index.d.ts +3 -1
- package/package.json +1 -1
- package/dist/chunks/TanksLiveGameCard-DSmQcUMh.js +0 -1225
- package/dist/chunks/TanksLiveGameCard-DSmQcUMh.js.map +0 -1
- package/dist/chunks/avalancheScene3d-Dnl2E3EA.js +0 -1878
- package/dist/chunks/avalancheScene3d-Dnl2E3EA.js.map +0 -1
- package/dist/chunks/connect4Sounds-Cv0q31VW.js +0 -3245
- package/dist/chunks/connect4Sounds-Cv0q31VW.js.map +0 -1
- package/dist/chunks/createLiveScene-819NWv84.js +0 -365
- package/dist/chunks/createLiveScene-819NWv84.js.map +0 -1
- package/dist/chunks/fx-BNJvJYOu.js +0 -871
- package/dist/chunks/fx-BNJvJYOu.js.map +0 -1
- package/dist/chunks/gameStatus-Cu1Z8un9.js +0 -69
- package/dist/chunks/gameStatus-Cu1Z8un9.js.map +0 -1
- package/dist/chunks/tank-DIn6Jyt8.js +0 -605
- package/dist/chunks/tank-DIn6Jyt8.js.map +0 -1
- 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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"}
|