@minicode-dev/chat 0.1.9 → 0.1.11

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 (27) hide show
  1. package/README.md +16 -0
  2. package/dist/chunks/{BattleshipGameCard-BFqA0cjT.js → BattleshipGameCard-iRk8d4vR.js} +2 -2
  3. package/dist/chunks/{BattleshipGameCard-BFqA0cjT.js.map → BattleshipGameCard-iRk8d4vR.js.map} +1 -1
  4. package/dist/chunks/{ChatContext-dty_KPDX.js → ChatContext-DjIEifGY.js} +2 -2
  5. package/dist/chunks/{ChatContext-dty_KPDX.js.map → ChatContext-DjIEifGY.js.map} +1 -1
  6. package/dist/chunks/{TanksGameCard-D0n-lzTs.js → TanksGameCard-B47ZQcSr.js} +4 -4
  7. package/dist/chunks/{TanksGameCard-D0n-lzTs.js.map → TanksGameCard-B47ZQcSr.js.map} +1 -1
  8. package/dist/chunks/{TanksLiveGameCard-BmNRXP66.js → TanksLiveGameCard-BNJqWt1z.js} +303 -237
  9. package/dist/chunks/TanksLiveGameCard-BNJqWt1z.js.map +1 -0
  10. package/dist/chunks/{WebRtcLab-B7xBlJy1.js → WebRtcLab-lijo_Rta.js} +2 -2
  11. package/dist/chunks/{WebRtcLab-B7xBlJy1.js.map → WebRtcLab-lijo_Rta.js.map} +1 -1
  12. package/dist/chunks/{connect4Sounds-BN7d_TM2.js → connect4Sounds-Cv0q31VW.js} +527 -517
  13. package/dist/chunks/connect4Sounds-Cv0q31VW.js.map +1 -0
  14. package/dist/chunks/{createLiveScene-CtYPcOPo.js → createLiveScene-CJQtq54t.js} +2 -2
  15. package/dist/chunks/{createLiveScene-CtYPcOPo.js.map → createLiveScene-CJQtq54t.js.map} +1 -1
  16. package/dist/chunks/{createPeerLink-qei05vpV.js → createPeerLink-CL7VZuHS.js} +5 -3
  17. package/dist/chunks/createPeerLink-CL7VZuHS.js.map +1 -0
  18. package/dist/chunks/{tanksSounds-C99OD2xD.js → tanksSounds-CUNDIOal.js} +3 -3
  19. package/dist/chunks/{tanksSounds-C99OD2xD.js.map → tanksSounds-CUNDIOal.js.map} +1 -1
  20. package/dist/index.js +1688 -1455
  21. package/dist/index.js.map +1 -1
  22. package/dist/styles.css +1 -1
  23. package/index.d.ts +3 -3
  24. package/package.json +1 -1
  25. package/dist/chunks/TanksLiveGameCard-BmNRXP66.js.map +0 -1
  26. package/dist/chunks/connect4Sounds-BN7d_TM2.js.map +0 -1
  27. package/dist/chunks/createPeerLink-qei05vpV.js.map +0 -1
@@ -1,7 +1,7 @@
1
- import { d as e, o as t } from "./connect4Sounds-BN7d_TM2.js";
2
- import { a as n, n as r, o as i } from "./createPeerLink-qei05vpV.js";
3
- import { t as a } from "./ChatContext-dty_KPDX.js";
4
- import { a as o, i as s, n as c, r as l, t as u } from "./tanksSounds-C99OD2xD.js";
1
+ import { d as e, o as t } from "./connect4Sounds-Cv0q31VW.js";
2
+ import { a as n, n as r, o as i } from "./createPeerLink-CL7VZuHS.js";
3
+ import { t as a } from "./ChatContext-DjIEifGY.js";
4
+ import { a as o, i as s, n as c, r as l, t as u } from "./tanksSounds-CUNDIOal.js";
5
5
  import { memo as d, useContext as f, useEffect as p, useRef as m, useState as h } from "react";
6
6
  import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
7
7
  // \0rolldown/runtime.js
@@ -12,7 +12,34 @@ var y = Object.defineProperty, b = (e, t) => {
12
12
  enumerable: !0
13
13
  });
14
14
  return t || y(n, Symbol.toStringTag, { value: "Module" }), n;
15
- }, x = Object.freeze({
15
+ };
16
+ // src/games/tanks-live/net/connectionDiagnostics.js
17
+ function x(e = {}) {
18
+ return {
19
+ phase: e.phase ?? "idle",
20
+ ice: e.ice ?? "new",
21
+ connection: e.connection ?? "new",
22
+ gathering: e.gathering ?? "new",
23
+ signaling: {
24
+ sent: e.signals?.sent ?? 0,
25
+ received: e.signals?.received ?? 0,
26
+ sendFailures: e.signals?.sendFailures ?? 0,
27
+ ignored: e.signals?.ignored ?? 0,
28
+ invalid: e.signals?.invalid ?? 0,
29
+ retransmits: e.signals?.retransmits ?? 0
30
+ },
31
+ turnConfigured: !!e.turnConfigured,
32
+ route: e.route?.label ?? null,
33
+ movesSent: e.move?.sent ?? 0,
34
+ movesReceived: e.move?.received ?? 0,
35
+ error: e.error ? /^[a-z_]+$/.test(e.error) ? e.error : "negotiation_error" : null
36
+ };
37
+ }
38
+ function S(e = {}) {
39
+ return e.phase === "connected" ? "" : e.signals?.sendFailures ? "No se pudieron enviar señales por el chat. Revisa la conexión WebSocket y reintenta." : e.ice === "checking" || e.ice === "failed" ? e.turnConfigured ? "WebRTC aún no encuentra una ruta entre los jugadores. Revisa el servicio TURN y la red." : "WebRTC aún no encuentra una ruta entre los jugadores. Algunas redes necesitan un servidor TURN; esta partida no tiene uno configurado." : e.phase === "listening" ? "Esperando la conexión del rival. Ambos deben mantener abierta la partida y usar la misma versión del chat." : e.phase === "failed" ? "No se pudo conectar. Revisa el diagnóstico de ambos jugadores y reintenta." : "Intercambiando señales de conexión por el chat. El combate empieza cuando conecta WebRTC.";
40
+ }
41
+ // src/games/tanks-live/logic/simulation.js
42
+ var C = Object.freeze({
16
43
  speed: 16,
17
44
  reverse: 9,
18
45
  turn: 1.8,
@@ -21,8 +48,8 @@ var y = Object.defineProperty, b = (e, t) => {
21
48
  reloadMs: 1500,
22
49
  shellSpeed: 60,
23
50
  damage: 25
24
- }), S = (e, t, n) => Math.max(t, Math.min(n, e)), C = (e, t) => Math.atan2(Math.sin(t - e), Math.cos(t - e));
25
- function w() {
51
+ }), w = (e, t, n) => Math.max(t, Math.min(n, e)), T = (e, t) => Math.atan2(Math.sin(t - e), Math.cos(t - e));
52
+ function E() {
26
53
  return {
27
54
  size: 120,
28
55
  bounds: {
@@ -75,7 +102,7 @@ function w() {
75
102
  }))
76
103
  };
77
104
  }
78
- function T(e, t) {
105
+ function D(e, t) {
79
106
  return {
80
107
  id: String(e),
81
108
  x: t ? 102 : 18,
@@ -88,25 +115,25 @@ function T(e, t) {
88
115
  color: t ? "#d7463f" : "#54a34a"
89
116
  };
90
117
  }
91
- function E(e, t, n, r = x.radius) {
118
+ function O(e, t, n, r = C.radius) {
92
119
  let i = n.bounds;
93
120
  return e >= i.minX + r && e <= i.maxX - r && t >= i.minZ + r && t <= i.maxZ - r && !n.obstacles.some((n) => Math.hypot(e - n.x, t - n.z) < n.r + r);
94
121
  }
95
- function D(e, t, n, r) {
122
+ function k(e, t, n, r) {
96
123
  if (!e.alive) return;
97
- let i = S(Number(t.throttle) || 0, -1, 1), a = S(Number(t.steer) || 0, -1, 1), o = i * (i < 0 ? x.reverse : x.speed);
98
- e.speed += S(o - e.speed, -x.acceleration * n, x.acceleration * n), e.yaw += a * x.turn * n, Number.isFinite(t.turretYaw) && (e.turretYaw = t.turretYaw);
124
+ let i = w(Number(t.throttle) || 0, -1, 1), a = w(Number(t.steer) || 0, -1, 1), o = i * (i < 0 ? C.reverse : C.speed);
125
+ e.speed += w(o - e.speed, -C.acceleration * n, C.acceleration * n), e.yaw += a * C.turn * n, Number.isFinite(t.turretYaw) && (e.turretYaw = t.turretYaw);
99
126
  let s = e.x + Math.cos(e.yaw) * e.speed * n, c = e.z + Math.sin(e.yaw) * e.speed * n;
100
- E(s, e.z, r) ? e.x = s : e.speed = 0, E(e.x, c, r) ? e.z = c : e.speed = 0;
127
+ O(s, e.z, r) ? e.x = s : e.speed = 0, O(e.x, c, r) ? e.z = c : e.speed = 0;
101
128
  }
102
- function O(e, t, n, r, i, a, o) {
103
- let s = n - e, c = r - t, l = s * s + c * c, u = l ? S(((i - e) * s + (a - t) * c) / l, 0, 1) : 0;
129
+ function A(e, t, n, r, i, a, o) {
130
+ let s = n - e, c = r - t, l = s * s + c * c, u = l ? w(((i - e) * s + (a - t) * c) / l, 0, 1) : 0;
104
131
  return Math.hypot(e + s * u - i, t + c * u - a) <= o ? u : null;
105
132
  }
106
- function k(e, t, n, r) {
107
- let i = e.x + Math.cos(e.yaw) * x.shellSpeed * t, a = e.z + Math.sin(e.yaw) * x.shellSpeed * t, o = null;
133
+ function ee(e, t, n, r) {
134
+ let i = e.x + Math.cos(e.yaw) * C.shellSpeed * t, a = e.z + Math.sin(e.yaw) * C.shellSpeed * t, o = null;
108
135
  for (let t of n.obstacles) {
109
- let n = O(e.x, e.z, i, a, t.x, t.z, t.r);
136
+ let n = A(e.x, e.z, i, a, t.x, t.z, t.r);
110
137
  n !== null && (!o || n < o.t) && (o = {
111
138
  t: n,
112
139
  kind: "obstacle"
@@ -114,77 +141,77 @@ function k(e, t, n, r) {
114
141
  }
115
142
  for (let t of r) {
116
143
  if (!t.alive || t.id === e.owner) continue;
117
- let n = O(e.x, e.z, i, a, t.x, t.z, x.radius);
144
+ let n = A(e.x, e.z, i, a, t.x, t.z, C.radius);
118
145
  n !== null && (!o || n < o.t) && (o = {
119
146
  t: n,
120
147
  kind: "tank",
121
148
  target: t.id
122
149
  });
123
150
  }
124
- return o ? (e.x += (i - e.x) * o.t, e.z += (a - e.z) * o.t, o) : (e.x = i, e.z = a, e.age += t, !E(i, a, {
151
+ return o ? (e.x += (i - e.x) * o.t, e.z += (a - e.z) * o.t, o) : (e.x = i, e.z = a, e.age += t, !O(i, a, {
125
152
  ...n,
126
153
  obstacles: []
127
154
  }, 0) || e.age > 3 ? { kind: "terrain" } : null);
128
155
  }
129
- function ee(e, t, n) {
130
- let r = S(n, 0, 1);
156
+ function te(e, t, n) {
157
+ let r = w(n, 0, 1);
131
158
  return {
132
159
  ...t,
133
160
  x: e.x + (t.x - e.x) * r,
134
161
  z: e.z + (t.z - e.z) * r,
135
- yaw: e.yaw + C(e.yaw, t.yaw) * r,
136
- turretYaw: e.turretYaw + C(e.turretYaw, t.turretYaw) * r
162
+ yaw: e.yaw + T(e.yaw, t.yaw) * r,
163
+ turretYaw: e.turretYaw + T(e.turretYaw, t.turretYaw) * r
137
164
  };
138
165
  }
139
166
  // src/games/tanks-live/net/createLiveMatch.js
140
- var A = (e) => typeof e == "number" && Number.isFinite(e), j = (e) => typeof e == "string" && e.length > 0 && e.length < 160;
141
- function M({ game: e, selfId: t, isHost: a = String(t) === String(e.hostId), signaling: o, onChange: s = () => {}, peerFactory: c = r, iceServers: l, iceTransportPolicy: u, RTCPeerConnectionImpl: d } = {}) {
167
+ var j = (e) => typeof e == "number" && Number.isFinite(e), M = (e) => typeof e == "string" && e.length > 0 && e.length < 160;
168
+ function N({ game: e, selfId: t, isHost: a = String(t) === String(e.hostId), signaling: o, onChange: s = () => {}, peerFactory: c = r, iceServers: l, iceTransportPolicy: u, RTCPeerConnectionImpl: d } = {}) {
142
169
  t = String(t);
143
170
  let f = [String(e.hostId), String(e.guestId)];
144
171
  if (!f.includes(t) || f[0] === f[1]) throw Error("Invalid live match players");
145
- let p = f.find((e) => e !== t), m = w(), h = f.map(T), g = [], _ = [], v = {}, y = 0, b = 0, S = 0, C = 0, O = "connecting", M = null, N = !1, P = {
172
+ let p = (l || []).some((e) => [e.urls].flat().some((e) => /^turns?:/i.test(String(e)))), m = f.find((e) => e !== t), h = E(), g = f.map(D), _ = [], v = [], y = {}, b = 0, x = 0, S = 0, w = 0, T = "connecting", A = null, N = !1, P = {
146
173
  phase: "idle",
147
174
  rtt: null,
148
175
  route: null
149
- }, F = !1, I = !1, L = null, R = [], z = null, B = null, V = /* @__PURE__ */ new Map(), H = /* @__PURE__ */ new Set(), U = /* @__PURE__ */ new Set(), W = () => h.find((e) => e.id === t), G = () => h.find((e) => e.id === p), K = () => {
176
+ }, F = !1, I = !1, L = null, R = [], z = null, B = null, V = /* @__PURE__ */ new Map(), H = /* @__PURE__ */ new Set(), U = /* @__PURE__ */ new Set(), W = () => g.find((e) => e.id === t), ne = () => g.find((e) => e.id === m), G = () => {
150
177
  N || s({
151
- status: O,
152
- winner: M,
178
+ status: T,
179
+ winner: A,
153
180
  net: P
154
181
  });
155
- }, q = (e) => {
156
- _.push(e), _.length > 200 && _.shift();
157
- }, J = (t) => $.sendEvent({
182
+ }, K = (e) => {
183
+ v.push(e), v.length > 200 && v.shift();
184
+ }, q = (t) => $.sendEvent({
158
185
  ...t,
159
186
  g: e.gameId,
160
187
  r: S
161
- }), Y = (e) => {
188
+ }), J = (e) => {
162
189
  H.add(e), H.size > 2048 && H.delete(H.values().next().value);
163
- }, X = () => ({
190
+ }, Y = () => ({
164
191
  k: "snapshot",
165
- hp: h.map((e) => e.hp),
166
- status: O,
167
- winner: M,
192
+ hp: g.map((e) => e.hp),
193
+ status: T,
194
+ winner: A,
168
195
  reason: L
169
196
  });
170
- function Z() {
171
- h = f.map(T), g = [], R = [], z = null, B = null, V.clear(), H.clear(), U.clear(), I = !1, L = null, M = null, O = P.phase === "connected" ? "playing" : "connecting", q({ k: "rematch" }), K();
197
+ function X() {
198
+ g = f.map(D), _ = [], R = [], z = null, B = null, V.clear(), H.clear(), U.clear(), I = !1, L = null, A = null, T = P.phase === "connected" ? "playing" : "connecting", K({ k: "rematch" }), G();
172
199
  }
173
- function Q(e, t = !1) {
174
- (O !== "over" || t && M !== e) && (O = "over", M = e, g = [], q({
200
+ function Z(e, t = !1) {
201
+ (T !== "over" || t && A !== e) && (T = "over", A = e, _ = [], K({
175
202
  k: "over",
176
- winner: M
177
- }), K());
203
+ winner: A
204
+ }), G());
178
205
  }
179
- function te(e, t, n) {
180
- if (O !== "playing" || !j(t.id) || H.has(t.id)) return !1;
181
- let r = h.find((t) => t.id === e);
182
- if (!r?.alive || y - (V.get(e) ?? -Infinity) < x.reloadMs - 20 || ![
206
+ function Q(e, t, n) {
207
+ if (T !== "playing" || !M(t.id) || H.has(t.id)) return !1;
208
+ let r = g.find((t) => t.id === e);
209
+ if (!r?.alive || b - (V.get(e) ?? -Infinity) < C.reloadMs - 20 || ![
183
210
  t.x,
184
211
  t.z,
185
212
  t.yaw
186
- ].every(A) || Math.hypot(t.x - (e === p && B ? B.x : r.x), t.z - (e === p && B ? B.z : r.z)) > 6) return !1;
187
- Y(t.id), V.set(e, y);
213
+ ].every(j) || Math.hypot(t.x - (e === m && B ? B.x : r.x), t.z - (e === m && B ? B.z : r.z)) > 6) return !1;
214
+ J(t.id), V.set(e, b);
188
215
  let i = {
189
216
  ...t,
190
217
  k: "fire",
@@ -194,44 +221,44 @@ function M({ game: e, selfId: t, isHost: a = String(t) === String(e.hostId), sig
194
221
  y: 1.4,
195
222
  age: 0
196
223
  };
197
- return g.push(i), q(i), n && J({
224
+ return _.push(i), K(i), n && q({
198
225
  ...t,
199
226
  k: "fire"
200
227
  }), !0;
201
228
  }
202
- function ne(t) {
203
- if (N || O !== "playing" || t?.g !== e.gameId || t.r !== S || !Array.isArray(t.p) || t.p.length !== 5 || !t.p.every(A)) return;
229
+ function re(t) {
230
+ if (N || T !== "playing" || t?.g !== e.gameId || t.r !== S || !Array.isArray(t.p) || t.p.length !== 5 || !t.p.every(j)) return;
204
231
  let [n, r, i, a, o] = t.p;
205
- if (!E(n, r, m) || Math.abs(o) > x.speed + .1 || Math.abs(i) > 1e6 || Math.abs(a) > 1e6) return;
206
- let s = z === null ? .1 : Math.max(0, (y - z) / 1e3), c = B || G();
207
- if (Math.hypot(n - c.x, r - c.z) > x.speed * s + 3) return;
232
+ if (!O(n, r, h) || Math.abs(o) > C.speed + .1 || Math.abs(i) > 1e6 || Math.abs(a) > 1e6) return;
233
+ let s = z === null ? .1 : Math.max(0, (b - z) / 1e3), c = B || ne();
234
+ if (Math.hypot(n - c.x, r - c.z) > C.speed * s + 3) return;
208
235
  let l = {
209
- ...G(),
236
+ ...ne(),
210
237
  x: n,
211
238
  z: r,
212
239
  yaw: i,
213
240
  turretYaw: a,
214
241
  speed: o
215
242
  };
216
- B = l, z = y, R.push({
217
- time: y,
243
+ B = l, z = b, R.push({
244
+ time: b,
218
245
  pose: l
219
246
  }), R.length > 30 && R.shift();
220
247
  }
221
- function re(n) {
248
+ function ie(n) {
222
249
  if (!N && n && n.g === e.gameId && Number.isInteger(n.r)) {
223
- if (n.k === "round" && !a && O === "over" && U.has(t) && n.r === S + 1) S = n.r, Z();
250
+ if (n.k === "round" && !a && T === "over" && U.has(t) && n.r === S + 1) S = n.r, X();
224
251
  else if (n.r === S) {
225
- if (n.k === "sync" && a) J(X());
252
+ if (n.k === "sync" && a) q(Y());
226
253
  else if (n.k === "snapshot" && !a && Array.isArray(n.hp) && n.hp.length === 2 && n.hp.every((e) => Number.isInteger(e) && e >= 0 && e <= 100)) {
227
254
  let e = n.status === "playing" && n.winner === null && n.hp.every((e) => e > 0), t = n.status === "over" && f.includes(n.winner) && (n.hp[1 - f.indexOf(n.winner)] === 0 || n.reason === "resigned");
228
255
  if (!e && !t) return;
229
- h.forEach((e, t) => {
256
+ g.forEach((e, t) => {
230
257
  e.hp = n.hp[t], e.alive = e.hp > 0;
231
- }), t && (I = !1, L = n.reason, Q(n.winner, !0));
232
- } else n.k === "resign" ? (L = "resigned", Q(t, a), a && J(X())) : n.k === "rematch" && O === "over" ? (U.add(p), ie()) : O === "playing" && (n.k === "fire" && te(p, n, !1), !a && n.k === "hit" && j(n.id) && !H.has(`hit:${n.id}`) && f.includes(n.target) && Array.isArray(n.hp) && n.hp.length === 2 && n.hp.every((e, t) => Number.isInteger(e) && e >= 0 && e <= h[t].hp) && [n.x, n.z].every(A) && (Y(`hit:${n.id}`), h.forEach((e, t) => {
258
+ }), t && (I = !1, L = n.reason, Z(n.winner, !0));
259
+ } else n.k === "resign" ? (L = "resigned", Z(t, a), a && q(Y())) : n.k === "rematch" && T === "over" ? (U.add(m), ae()) : T === "playing" && (n.k === "fire" && Q(m, n, !1), !a && n.k === "hit" && M(n.id) && !H.has(`hit:${n.id}`) && f.includes(n.target) && Array.isArray(n.hp) && n.hp.length === 2 && n.hp.every((e, t) => Number.isInteger(e) && e >= 0 && e <= g[t].hp) && [n.x, n.z].every(j) && (J(`hit:${n.id}`), g.forEach((e, t) => {
233
260
  e.hp = n.hp[t], e.alive = e.hp > 0;
234
- }), g = g.filter((e) => e.id !== n.id), q(n)), !a && n.k === "destroyed" && f.includes(n.target) && !H.has(`destroyed:${n.target}`) && h.find((e) => e.id === n.target).hp === 0 && (Y(`destroyed:${n.target}`), q(n)), !a && n.k === "over" && f.includes(n.winner) && h.find((e) => e.id !== n.winner).hp === 0 && Q(n.winner));
261
+ }), _ = _.filter((e) => e.id !== n.id), K(n)), !a && n.k === "destroyed" && f.includes(n.target) && !H.has(`destroyed:${n.target}`) && g.find((e) => e.id === n.target).hp === 0 && (J(`destroyed:${n.target}`), K(n)), !a && n.k === "over" && f.includes(n.winner) && g.find((e) => e.id !== n.winner).hp === 0 && Z(n.winner));
235
262
  }
236
263
  }
237
264
  }
@@ -253,58 +280,58 @@ function M({ game: e, selfId: t, isHost: a = String(t) === String(e.hostId), sig
253
280
  }
254
281
  },
255
282
  selfId: t,
256
- peerId: p,
283
+ peerId: m,
257
284
  roomId: e.roomId,
258
285
  iceServers: l,
259
286
  iceTransportPolicy: u,
260
287
  RTCPeerConnectionImpl: d,
261
- onMove: ne,
262
- onEvent: re,
288
+ onMove: re,
289
+ onEvent: ie,
263
290
  onChange(e) {
264
291
  let t = P.phase;
265
292
  if (P = e, e.phase === "connected") {
266
293
  let e = F;
267
- F = !0, O !== "over" && (O = "playing"), t !== "connected" && queueMicrotask(() => {
268
- N || (I && J({ k: "resign" }), a && e ? J(X()) : a || J({ k: "sync" }));
294
+ F = !0, T !== "over" && (T = "playing"), t !== "connected" && queueMicrotask(() => {
295
+ N || (I && q({ k: "resign" }), a && e ? q(Y()) : a || q({ k: "sync" }));
269
296
  });
270
- } else O !== "over" && (O = F ? "disconnected" : "connecting");
271
- K();
297
+ } else T !== "over" && (T = F ? "disconnected" : "connecting");
298
+ G();
272
299
  }
273
300
  });
274
- function ie() {
275
- a && U.size === 2 && (S++, J({ k: "round" }), Z());
301
+ function ae() {
302
+ a && U.size === 2 && (S++, q({ k: "round" }), X());
276
303
  }
277
304
  return a ? $.connect() : $.setListening(!0), {
278
305
  setInput(e) {
279
- v = { ...e };
306
+ y = { ...e };
280
307
  },
281
308
  step(n) {
282
309
  if (N) return;
283
310
  let r = Math.max(0, Math.min(Number(n) || 0, 100));
284
- if (y += r, O !== "playing") return;
285
- let i = r / 1e3, o = y - 100;
311
+ if (b += r, T !== "playing") return;
312
+ let i = r / 1e3, o = b - 100;
286
313
  for (; R.length > 1 && R[1].time <= o;) R.shift();
287
314
  if (R.length) {
288
- let e = R[0], t = R[1] || e, n = ee(e.pose, t.pose, t.time === e.time ? 1 : (o - e.time) / (t.time - e.time));
315
+ let e = R[0], t = R[1] || e, n = te(e.pose, t.pose, t.time === e.time ? 1 : (o - e.time) / (t.time - e.time));
289
316
  for (let e of [
290
317
  "x",
291
318
  "z",
292
319
  "yaw",
293
320
  "turretYaw",
294
321
  "speed"
295
- ]) G()[e] = n[e];
322
+ ]) ne()[e] = n[e];
296
323
  }
297
- for (let e = i; e > 0; e -= .016) D(W(), v, Math.min(e, .016), m);
298
- v.fire && te(t, {
299
- id: `${t}:${S}:${++C}`,
324
+ for (let e = i; e > 0; e -= .016) k(W(), y, Math.min(e, .016), h);
325
+ y.fire && Q(t, {
326
+ id: `${t}:${S}:${++w}`,
300
327
  x: W().x,
301
328
  z: W().z,
302
329
  yaw: W().turretYaw,
303
- t: y
330
+ t: b
304
331
  }, !0);
305
332
  let s = P.rtt > 250 || P.move?.lossPct > 15 ? 10 : P.rtt > 100 ? 15 : 20;
306
- if (y >= b) {
307
- b = y + 1e3 / s;
333
+ if (b >= x) {
334
+ x = b + 1e3 / s;
308
335
  let t = W();
309
336
  $.sendMove({
310
337
  g: e.gameId,
@@ -316,35 +343,35 @@ function M({ game: e, selfId: t, isHost: a = String(t) === String(e.hostId), sig
316
343
  t.turretYaw,
317
344
  t.speed
318
345
  ],
319
- t: y
346
+ t: b
320
347
  });
321
348
  }
322
- g = g.filter((e) => {
323
- let t = k(e, i, m, h);
349
+ _ = _.filter((e) => {
350
+ let t = ee(e, i, h, g);
324
351
  if (!t) return !0;
325
- if (a && t.target && O === "playing") {
326
- let n = h.find((e) => e.id === t.target);
327
- n.hp = Math.max(0, n.hp - x.damage), n.alive = n.hp > 0;
352
+ if (a && t.target && T === "playing") {
353
+ let n = g.find((e) => e.id === t.target);
354
+ n.hp = Math.max(0, n.hp - C.damage), n.alive = n.hp > 0;
328
355
  let r = {
329
356
  k: "hit",
330
357
  id: e.id,
331
358
  target: n.id,
332
- dmg: x.damage,
333
- hp: h.map((e) => e.hp),
359
+ dmg: C.damage,
360
+ hp: g.map((e) => e.hp),
334
361
  x: e.x,
335
362
  z: e.z
336
363
  };
337
- if (J(r), q(r), !n.alive) {
364
+ if (q(r), K(r), !n.alive) {
338
365
  let t = {
339
366
  k: "destroyed",
340
367
  target: n.id
341
368
  };
342
- J(t), q(t), J({
369
+ q(t), K(t), q({
343
370
  k: "over",
344
371
  winner: e.owner
345
- }), Q(e.owner);
372
+ }), Z(e.owner);
346
373
  }
347
- } else q({
374
+ } else K({
348
375
  k: "impact",
349
376
  kind: t.kind,
350
377
  x: e.x,
@@ -355,42 +382,48 @@ function M({ game: e, selfId: t, isHost: a = String(t) === String(e.hostId), sig
355
382
  },
356
383
  getRender() {
357
384
  let e = {
358
- arena: m,
359
- tanks: h.map((e) => ({
385
+ arena: h,
386
+ tanks: g.map((e) => ({
360
387
  ...e,
361
388
  self: e.id === t,
362
- reload: Math.min(1, (y - (V.get(e.id) ?? -Infinity)) / x.reloadMs)
389
+ reload: Math.min(1, (b - (V.get(e.id) ?? -Infinity)) / C.reloadMs)
363
390
  })),
364
- shells: g.map((e) => ({ ...e })),
365
- events: _,
366
- status: O,
367
- winner: M,
368
- net: P
391
+ shells: _.map((e) => ({ ...e })),
392
+ events: v,
393
+ status: T,
394
+ winner: A,
395
+ net: {
396
+ ...P,
397
+ turnConfigured: p
398
+ }
369
399
  };
370
- return _ = [], e;
400
+ return v = [], e;
401
+ },
402
+ reconnect() {
403
+ !N && T !== "over" && $.connect();
371
404
  },
372
405
  rematch() {
373
- !N && O === "over" && (U.add(t), J({ k: "rematch" }), ie());
406
+ !N && T === "over" && (U.add(t), q({ k: "rematch" }), ae());
374
407
  },
375
408
  resign() {
376
- !N && O !== "over" && (I = !0, L = "resigned", J({ k: "resign" }), Q(p));
409
+ !N && T !== "over" && (I = !0, L = "resigned", q({ k: "resign" }), Z(m));
377
410
  },
378
411
  destroy() {
379
- N || (N = !0, $.destroy(), g = [], R = [], _ = []);
412
+ N || (N = !0, $.destroy(), _ = [], R = [], v = []);
380
413
  }
381
414
  };
382
415
  }
383
- var N = 180 / Math.PI, P = (e, t) => Number.isFinite(e) ? e : t;
384
- function F(e) {
416
+ var P = 180 / Math.PI, F = (e, t) => Number.isFinite(e) ? e : t;
417
+ function I(e) {
385
418
  let t = e || {}, n = t.bounds || t;
386
- if (Number.isFinite(n.minX) && Number.isFinite(n.maxX) && Number.isFinite(n.minZ) && Number.isFinite(n.maxZ)) return I({
419
+ if (Number.isFinite(n.minX) && Number.isFinite(n.maxX) && Number.isFinite(n.minZ) && Number.isFinite(n.maxZ)) return L({
387
420
  minX: n.minX,
388
421
  minZ: n.minZ,
389
422
  maxX: n.maxX,
390
423
  maxZ: n.maxZ
391
424
  });
392
- let r = P(t.width, P(t.size, 120)), i = P(t.depth, P(t.height, P(t.size, r)));
393
- return I(t.centered === !0 || t.origin === "center" ? {
425
+ let r = F(t.width, F(t.size, 120)), i = F(t.depth, F(t.height, F(t.size, r)));
426
+ return L(t.centered === !0 || t.origin === "center" ? {
394
427
  minX: -r / 2,
395
428
  minZ: -i / 2,
396
429
  maxX: r / 2,
@@ -402,7 +435,7 @@ function F(e) {
402
435
  maxZ: i
403
436
  });
404
437
  }
405
- function I(e) {
438
+ function L(e) {
406
439
  return {
407
440
  ...e,
408
441
  width: e.maxX - e.minX,
@@ -411,16 +444,16 @@ function I(e) {
411
444
  cz: (e.minZ + e.maxZ) / 2
412
445
  };
413
446
  }
414
- function L(e) {
447
+ function R(e) {
415
448
  return (e?.obstacles || []).filter((e) => Number.isFinite(e?.x) && Number.isFinite(e?.z)).map((e) => ({
416
449
  x: e.x,
417
450
  z: e.z,
418
- r: P(e.r, P(e.radius, 1.5)),
451
+ r: F(e.r, F(e.radius, 1.5)),
419
452
  kind: e.kind === "tree" ? "tree" : "rock"
420
453
  }));
421
454
  }
422
- var R = (e) => e ? e.k ?? e.type ?? null : null;
423
- function z(e, t) {
455
+ var z = (e) => e ? e.k ?? e.type ?? null : null;
456
+ function B(e, t) {
424
457
  let n = t || [], r = e?.tank ?? e?.by ?? e?.owner ?? e?.from;
425
458
  if (r != null) {
426
459
  let e = n.find((e) => String(e.id) === String(r));
@@ -434,11 +467,11 @@ function z(e, t) {
434
467
  }
435
468
  return i;
436
469
  }
437
- var B = (e, t) => t == null ? null : (e || []).find((e) => String(e.id) === String(t)) || null, V = (e) => (e || []).find((e) => e.self) || null, H = (e, t = !0) => !t || e <= 25 ? 2 : +(e <= 50), U = (e) => {
470
+ var V = (e, t) => t == null ? null : (e || []).find((e) => String(e.id) === String(t)) || null, H = (e) => (e || []).find((e) => e.self) || null, U = (e, t = !0) => !t || e <= 25 ? 2 : +(e <= 50), W = (e) => {
438
471
  let t = e % (Math.PI * 2);
439
472
  return t > Math.PI && (t -= Math.PI * 2), t < -Math.PI && (t += Math.PI * 2), t;
440
473
  };
441
- function W({ moveSpeed: e = .6, turnSpeed: t = .35, holdMs: n = 160 } = {}) {
474
+ function ne({ moveSpeed: e = .6, turnSpeed: t = .35, holdMs: n = 160 } = {}) {
442
475
  let r = null, i = !1, a = !1, o = 0, s = 0;
443
476
  return {
444
477
  update(c, l) {
@@ -446,7 +479,7 @@ function W({ moveSpeed: e = .6, turnSpeed: t = .35, holdMs: n = 160 } = {}) {
446
479
  if (!c || c.alive === !1) return i && u.push({ type: "move_end" }), a && u.push({ type: "turret_end" }), i = a = !1, r = null, u;
447
480
  let d = Math.max(1, l) / 1e3;
448
481
  if (r) {
449
- let f = Math.hypot(c.x - r.x, c.z - r.z) / d, p = Math.abs(U((c.yaw ?? 0) - r.yaw)) / d, m = Math.abs(U((c.turretYaw ?? 0) - (c.yaw ?? 0) - r.rel)) / d, h = f > e || p > t;
482
+ let f = Math.hypot(c.x - r.x, c.z - r.z) / d, p = Math.abs(W((c.yaw ?? 0) - r.yaw)) / d, m = Math.abs(W((c.turretYaw ?? 0) - (c.yaw ?? 0) - r.rel)) / d, h = f > e || p > t;
450
483
  o = h ? 0 : o + l, h && !i ? (i = !0, u.push({ type: "move_start" })) : !h && i && o >= n && (i = !1, u.push({ type: "move_end" }));
451
484
  let g = m > t;
452
485
  s = g ? 0 : s + l, g && !a ? (a = !0, u.push({ type: "turret_start" })) : !g && a && s >= n && (a = !1, u.push({ type: "turret_end" }));
@@ -455,7 +488,7 @@ function W({ moveSpeed: e = .6, turnSpeed: t = .35, holdMs: n = 160 } = {}) {
455
488
  x: c.x,
456
489
  z: c.z,
457
490
  yaw: c.yaw ?? 0,
458
- rel: U((c.turretYaw ?? 0) - (c.yaw ?? 0))
491
+ rel: W((c.turretYaw ?? 0) - (c.yaw ?? 0))
459
492
  }, u;
460
493
  },
461
494
  reset() {
@@ -470,7 +503,7 @@ function W({ moveSpeed: e = .6, turnSpeed: t = .35, holdMs: n = 160 } = {}) {
470
503
  };
471
504
  }
472
505
  function G(e) {
473
- switch (R(e)) {
506
+ switch (z(e)) {
474
507
  case "fire": return [{ type: "fire" }, { type: "projectile_start" }];
475
508
  case "impact": return [{
476
509
  type: "impact",
@@ -483,7 +516,7 @@ function G(e) {
483
516
  }
484
517
  function K(e) {
485
518
  if (!e || e.status !== "over") return null;
486
- let t = V(e.tanks);
519
+ let t = H(e.tanks);
487
520
  return !t || e.winner == null ? null : String(e.winner) === String(t.id) ? "victory" : "defeat";
488
521
  }
489
522
  // src/games/tanks-live/scene/createLiveScene2d.js
@@ -492,7 +525,7 @@ function q(e, { arena: t } = {}) {
492
525
  n.style.cssText = "width:100%;height:100%;display:block", e.appendChild(n);
493
526
  let r = n.getContext("2d");
494
527
  if (!r) throw n.remove(), Error("Canvas 2D unavailable");
495
- let i = F(t), a = 1, o = 1, s = 1, c = 0, l = 0;
528
+ let i = I(t), a = 1, o = 1, s = 1, c = 0, l = 0;
496
529
  function u() {
497
530
  a = Math.max(1, e.clientWidth), o = Math.max(1, e.clientHeight);
498
531
  let t = Math.min(window.devicePixelRatio || 1, 2);
@@ -511,7 +544,7 @@ function q(e, { arena: t } = {}) {
511
544
  },
512
545
  render(e) {
513
546
  r.fillStyle = "#152519", r.fillRect(0, 0, a, o), r.save(), r.translate(c, l), r.scale(s, s), r.translate(-i.minX, -i.minZ), r.fillStyle = "#526348", r.fillRect(i.minX, i.minZ, i.width, i.depth);
514
- for (let e of L(t)) r.fillStyle = e.kind === "tree" ? "#24472d" : "#929285", r.beginPath(), r.arc(e.x, e.z, e.r, 0, Math.PI * 2), r.fill();
547
+ for (let e of R(t)) r.fillStyle = e.kind === "tree" ? "#24472d" : "#929285", r.beginPath(), r.arc(e.x, e.z, e.r, 0, Math.PI * 2), r.fill();
515
548
  for (let t of e.tanks || []) r.save(), r.translate(t.x, t.z), r.rotate(t.yaw), r.fillStyle = t.alive === !1 ? "#333" : t.color || "#73ce68", r.fillRect(-3, -1.8, 6, 3.6), r.restore(), r.save(), r.translate(t.x, t.z), r.rotate(t.turretYaw), r.strokeStyle = "#dce8cf", r.lineWidth = .8, r.beginPath(), r.moveTo(0, 0), r.lineTo(5, 0), r.stroke(), r.restore(), t.self && (r.strokeStyle = "#fff", r.lineWidth = .3, r.beginPath(), r.arc(t.x, t.z, 4, 0, Math.PI * 2), r.stroke());
516
549
  r.fillStyle = "#ffe097";
517
550
  for (let t of e.shells || []) r.beginPath(), r.arc(t.x, t.z, .7, 0, Math.PI * 2), r.fill();
@@ -529,64 +562,64 @@ var J = /* @__PURE__ */ b({ default: () => Q }), Y = (t, n) => {
529
562
  e.throttle = 0, e.steer = 0, e.fire = !1;
530
563
  };
531
564
  function Z({ gameKey: n, currentUserId: r, onMinimize: i, onDismiss: d, suspended: y = !1 }) {
532
- let b = f(a)?.config?.webrtc, x = e((e) => e.games[n]), S = m(y);
533
- S.current = y;
534
- let C = m(null), w = m(null), T = m(null), E = m({
565
+ let b = f(a)?.config?.webrtc, C = e((e) => e.games[n]), w = m(y);
566
+ w.current = y;
567
+ let T = m(null), E = m(null), D = m(null), O = m({
535
568
  throttle: 0,
536
569
  steer: 0,
537
570
  fire: !1
538
- }), [D, O] = h(null), [k, ee] = h(""), [A, j] = h(!1), [N, P] = h("loading");
571
+ }), [k, A] = h(null), [ee, te] = h(""), [j, M] = h(!1), [P, F] = h("loading");
539
572
  p(() => {
540
- y ? (X(E.current), o()) : T.current?.resize();
573
+ y ? (X(O.current), o()) : D.current?.resize();
541
574
  }, [y]);
542
- let F = ["active", "won"].includes(x?.status), [I, L] = h(null);
575
+ let I = ["active", "won"].includes(C?.status), [L, R] = h(null);
543
576
  if (p(() => {
544
- if (!F || !I || !C.current) return;
577
+ if (!I || !L || !T.current) return;
545
578
  let e = !1, t = null, n = {
546
- arena: I,
579
+ arena: L,
547
580
  lowPower: matchMedia("(pointer: coarse)").matches,
548
581
  reducedMotion: matchMedia("(prefers-reduced-motion: reduce)").matches,
549
582
  onEvent: (e) => {
550
- e.type === "context_lost" && j(!0);
583
+ e.type === "context_lost" && M(!0);
551
584
  }
552
585
  }, r = () => {
553
- e || (t = q(C.current, n), T.current = t, P("2d"));
586
+ e || (t = q(T.current, n), D.current = t, F("2d"));
554
587
  };
555
- return A ? r() : import("./createLiveScene-CtYPcOPo.js").then(({ createLiveScene: i }) => {
588
+ return j ? r() : import("./createLiveScene-CJQtq54t.js").then(({ createLiveScene: i }) => {
556
589
  if (!e) try {
557
- t = i(C.current, n), T.current = t, P("3d");
590
+ t = i(T.current, n), D.current = t, F("3d");
558
591
  } catch {
559
592
  r();
560
593
  }
561
594
  }).catch(r), () => {
562
- e = !0, t?.dispose(), T.current === t && (T.current = null);
595
+ e = !0, t?.dispose(), D.current === t && (D.current = null);
563
596
  };
564
597
  }, [
565
- F,
566
598
  I,
567
- A
599
+ L,
600
+ j
568
601
  ]), p(() => {
569
- if (!F || x.status !== "active" || !C.current) return;
570
- let t = !1, i = 0, a = performance.now(), u = 0, d = null, f = W(), p = /* @__PURE__ */ new Set();
602
+ if (!I || C.status !== "active" || !T.current) return;
603
+ let t = !1, i = 0, a = performance.now(), u = 0, d = null, f = ne(), p = /* @__PURE__ */ new Set();
571
604
  s();
572
605
  let m;
573
606
  try {
574
607
  let t = e.getState().createLiveSignaling(n);
575
- m = M({
608
+ m = N({
576
609
  iceServers: b?.iceServers,
577
610
  iceTransportPolicy: b?.iceTransportPolicy,
578
- game: x,
611
+ game: C,
579
612
  selfId: String(r),
580
- isHost: String(x.hostId) === String(r),
613
+ isHost: String(C.hostId) === String(r),
581
614
  signaling: t
582
- }), w.current = m;
615
+ }), E.current = m;
583
616
  } catch (e) {
584
- ee(e.message || "No se pudo iniciar WebRTC");
617
+ te(e.message || "No se pudo iniciar WebRTC");
585
618
  return;
586
619
  }
587
- L(m.getRender().arena);
620
+ R(m.getRender().arena);
588
621
  function h() {
589
- p.clear(), X(E.current), o();
622
+ p.clear(), X(O.current), o();
590
623
  }
591
624
  function g(e, t) {
592
625
  /^(INPUT|TEXTAREA|SELECT)$/.test(e.target?.tagName) || [
@@ -599,94 +632,109 @@ function Z({ gameKey: n, currentUserId: r, onMinimize: i, onDismiss: d, suspende
599
632
  "ArrowLeft",
600
633
  "ArrowRight",
601
634
  "Space"
602
- ].includes(e.code) && (e.preventDefault(), t ? p.add(e.code) : p.delete(e.code), E.current.throttle = Number(p.has("KeyW") || p.has("ArrowUp")) - Number(p.has("KeyS") || p.has("ArrowDown")), E.current.steer = Number(p.has("KeyD") || p.has("ArrowRight")) - Number(p.has("KeyA") || p.has("ArrowLeft")), E.current.fire = p.has("Space"));
635
+ ].includes(e.code) && (e.preventDefault(), t ? p.add(e.code) : p.delete(e.code), O.current.throttle = Number(p.has("KeyW") || p.has("ArrowUp")) - Number(p.has("KeyS") || p.has("ArrowDown")), O.current.steer = Number(p.has("KeyD") || p.has("ArrowRight")) - Number(p.has("KeyA") || p.has("ArrowLeft")), O.current.fire = p.has("Space"));
603
636
  }
604
- let _ = (e) => g(e, !0), v = (e) => g(e, !1), y = C.current;
637
+ let _ = (e) => g(e, !0), v = (e) => g(e, !1), y = T.current;
605
638
  y.addEventListener("keydown", _), y.addEventListener("keyup", v), y.addEventListener("blur", h);
606
- let D = () => {
639
+ let x = () => {
607
640
  document.hidden && h();
608
641
  };
609
- document.addEventListener("visibilitychange", D), c({ type: "engine_start" }, n);
610
- function k(r) {
642
+ document.addEventListener("visibilitychange", x), c({ type: "engine_start" }, n);
643
+ function S(r) {
611
644
  if (t) return;
612
645
  let s = Math.min(80, r - a);
613
646
  a = r;
614
- let h = S.current || document.hidden;
647
+ let h = w.current || document.hidden;
615
648
  m.setInput(h ? {
616
649
  throttle: 0,
617
650
  steer: 0,
618
651
  fire: !1
619
- } : E.current), m.step(s);
652
+ } : O.current), m.step(s);
620
653
  let g = m.getRender();
621
- if (h || T.current?.render(g, s), h && (p.clear(), f.reset(), o()), !h) for (let e of g.events || []) for (let t of G(e)) c(t, e.id);
622
- if (!h) for (let e of f.update(V(g.tanks), s)) c(e);
654
+ if (h || D.current?.render(g, s), h && (p.clear(), f.reset(), o()), !h) for (let e of g.events || []) for (let t of G(e)) c(t, e.id);
655
+ if (!h) for (let e of f.update(H(g.tanks), s)) c(e);
623
656
  let _ = K(g);
624
- _ && !d && (O(g), d = _, h || l(d, n), e.getState().liveFinish?.(n, g.winner)), r - u > 100 && (u = r, O(g)), i = requestAnimationFrame(k);
657
+ _ && !d && (A(g), d = _, h || l(d, n), e.getState().liveFinish?.(n, g.winner)), r - u > 100 && (u = r, A(g)), i = requestAnimationFrame(S);
625
658
  }
626
- return i = requestAnimationFrame(k), () => {
627
- t = !0, cancelAnimationFrame(i), h(), m.destroy(), w.current = null, y.removeEventListener("keydown", _), y.removeEventListener("keyup", v), y.removeEventListener("blur", h), document.removeEventListener("visibilitychange", D);
659
+ return i = requestAnimationFrame(S), () => {
660
+ t = !0, cancelAnimationFrame(i), h(), m.destroy(), E.current = null, y.removeEventListener("keydown", _), y.removeEventListener("keyup", v), y.removeEventListener("blur", h), document.removeEventListener("visibilitychange", x);
628
661
  };
629
662
  }, [
630
- F,
663
+ I,
631
664
  n,
632
665
  r
633
- ]), !x) return null;
634
- let R = String(r) === String(x.guestId), z = D?.status === "over" || x.status === "won";
635
- function B(e) {
636
- let t = C.current?.getBoundingClientRect(), n = V(D?.tanks);
666
+ ]), !C) return null;
667
+ let z = String(r) === String(C.guestId), B = k?.status === "over" || C.status === "won";
668
+ function V(e) {
669
+ let t = T.current?.getBoundingClientRect(), n = H(k?.tanks);
637
670
  if (!t || !n) return;
638
- let r = T.current?.screenToGround((e.clientX - t.left) / t.width * 2 - 1, 1 - (e.clientY - t.top) / t.height * 2);
639
- r && (E.current.turretYaw = Math.atan2(r.z - n.z, r.x - n.x));
671
+ let r = D.current?.screenToGround((e.clientX - t.left) / t.width * 2 - 1, 1 - (e.clientY - t.top) / t.height * 2);
672
+ r && (O.current.turretYaw = Math.atan2(r.z - n.z, r.x - n.x));
640
673
  }
641
- let H = (e, t) => ({
674
+ let U = (e, t) => ({
642
675
  onPointerDown: (n) => {
643
- n.preventDefault(), n.currentTarget.setPointerCapture(n.pointerId), E.current[e] = t;
676
+ n.preventDefault(), n.currentTarget.setPointerCapture(n.pointerId), O.current[e] = t;
644
677
  },
645
678
  onPointerUp: () => {
646
- E.current[e] = e !== "fire" && 0;
679
+ O.current[e] = e !== "fire" && 0;
647
680
  },
648
681
  onPointerCancel: () => {
649
- E.current[e] = e !== "fire" && 0;
682
+ O.current[e] = e !== "fire" && 0;
650
683
  },
651
684
  onLostPointerCapture: () => {
652
- E.current[e] = e !== "fire" && 0;
685
+ O.current[e] = e !== "fire" && 0;
653
686
  }
654
687
  });
655
688
  return /* @__PURE__ */ v("section", {
656
- className: "chat-game-card tl-card",
689
+ className: `chat-game-card tl-card${I ? " tl-card--active" : ""}`,
657
690
  "aria-label": "Tanques LIVE 3D",
658
691
  children: [
659
692
  /* @__PURE__ */ v("header", {
660
693
  className: "tl-header",
694
+ children: [/* @__PURE__ */ _("strong", { children: "Tanques LIVE 3D" }), /* @__PURE__ */ v("div", {
695
+ className: "tl-header-actions",
696
+ children: [
697
+ /* @__PURE__ */ _(t, { manager: u() }),
698
+ i && /* @__PURE__ */ _("button", {
699
+ onClick: i,
700
+ "aria-label": "Minimizar",
701
+ children: "−"
702
+ }),
703
+ d && /* @__PURE__ */ _("button", {
704
+ onClick: d,
705
+ "aria-label": "Ocultar",
706
+ children: "×"
707
+ })
708
+ ]
709
+ })]
710
+ }),
711
+ C.status === "invited" && /* @__PURE__ */ v("div", {
712
+ className: "tl-invite",
661
713
  children: [
662
- /* @__PURE__ */ _("strong", { children: "Tanques LIVE 3D" }),
663
- /* @__PURE__ */ _(t, { manager: u() }),
664
- i && /* @__PURE__ */ _("button", {
665
- onClick: i,
666
- "aria-label": "Minimizar",
667
- children: "−"
714
+ /* @__PURE__ */ _("span", {
715
+ className: "tl-invite-icon",
716
+ "aria-hidden": "true",
717
+ children: "🪖"
668
718
  }),
669
- d && /* @__PURE__ */ _("button", {
670
- onClick: d,
671
- "aria-label": "Ocultar",
672
- children: "×"
719
+ /* @__PURE__ */ _("strong", { children: z ? "¿Listo para combatir?" : "Invitación enviada" }),
720
+ /* @__PURE__ */ _("p", { children: z ? "Te invitaron a un combate en tiempo real." : "Esperando que el rival acepte…" }),
721
+ z && /* @__PURE__ */ v("div", {
722
+ className: "tl-invite-actions",
723
+ children: [/* @__PURE__ */ _("button", {
724
+ className: "tl-button-primary",
725
+ onClick: () => Y(n, "game_accept"),
726
+ children: "Aceptar combate"
727
+ }), /* @__PURE__ */ _("button", {
728
+ onClick: () => Y(n, "game_decline"),
729
+ children: "Rechazar"
730
+ })]
673
731
  })
674
732
  ]
675
733
  }),
676
- x.status === "invited" && /* @__PURE__ */ v("div", {
677
- className: "tl-invite",
678
- children: [/* @__PURE__ */ _("p", { children: R ? "Te invitaron a un combate en tiempo real." : "Esperando que el rival acepte…" }), R && /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _("button", {
679
- onClick: () => Y(n, "game_accept"),
680
- children: "Aceptar"
681
- }), /* @__PURE__ */ _("button", {
682
- onClick: () => Y(n, "game_decline"),
683
- children: "Rechazar"
684
- })] })]
685
- }),
686
- (F || D) && /* @__PURE__ */ v(g, { children: [
734
+ (I || k) && /* @__PURE__ */ v(g, { children: [
687
735
  /* @__PURE__ */ v("div", {
688
736
  className: "tl-hud",
689
- children: [(D?.tanks || []).map((e) => /* @__PURE__ */ v("span", { children: [
737
+ children: [(k?.tanks || []).map((e) => /* @__PURE__ */ v("span", { children: [
690
738
  e.self ? "Tú" : "Rival",
691
739
  " ",
692
740
  /* @__PURE__ */ _("meter", {
@@ -701,31 +749,31 @@ function Z({ gameKey: n, currentUserId: r, onMinimize: i, onDismiss: d, suspende
701
749
  ] }, e.id)), /* @__PURE__ */ v("span", {
702
750
  role: "status",
703
751
  children: [
704
- D?.net?.phase || "Conectando WebRTC…",
752
+ k?.net?.phase || "Conectando WebRTC…",
705
753
  " ",
706
- D?.net?.route?.label || (typeof D?.net?.route == "string" ? D.net.route : ""),
754
+ k?.net?.route?.label || (typeof k?.net?.route == "string" ? k.net.route : ""),
707
755
  " ",
708
- Number.isFinite(D?.net?.rtt) ? `${Math.round(D.net.rtt)} ms` : ""
756
+ Number.isFinite(k?.net?.rtt) ? `${Math.round(k.net.rtt)} ms` : ""
709
757
  ]
710
758
  })]
711
759
  }),
712
760
  /* @__PURE__ */ _("div", {
713
761
  className: "tl-stage",
714
- ref: C,
762
+ ref: T,
715
763
  tabIndex: 0,
716
764
  "aria-label": "Arena. WASD o flechas para conducir, ratón para apuntar, clic o espacio para disparar",
717
- onPointerMove: B,
765
+ onPointerMove: V,
718
766
  onPointerDown: (e) => {
719
- B(e), e.pointerType === "mouse" && (e.currentTarget.focus(), e.currentTarget.setPointerCapture(e.pointerId), B(e), E.current.fire = !0);
767
+ V(e), e.pointerType === "mouse" && (e.currentTarget.focus(), e.currentTarget.setPointerCapture(e.pointerId), V(e), O.current.fire = !0);
720
768
  },
721
769
  onPointerUp: () => {
722
- E.current.fire = !1;
770
+ O.current.fire = !1;
723
771
  },
724
772
  onPointerCancel: () => {
725
- X(E.current);
773
+ X(O.current);
726
774
  },
727
775
  onLostPointerCapture: () => {
728
- E.current.fire = !1;
776
+ O.current.fire = !1;
729
777
  }
730
778
  }),
731
779
  /* @__PURE__ */ v("div", {
@@ -738,16 +786,16 @@ function Z({ gameKey: n, currentUserId: r, onMinimize: i, onDismiss: d, suspende
738
786
  onPointerDown: (e) => {
739
787
  e.preventDefault(), e.currentTarget.setPointerCapture(e.pointerId);
740
788
  let t = e.currentTarget.getBoundingClientRect();
741
- E.current.steer = Math.max(-1, Math.min(1, (e.clientX - t.left - t.width / 2) / (t.width / 2))), E.current.throttle = Math.max(-1, Math.min(1, -(e.clientY - t.top - t.height / 2) / (t.height / 2)));
789
+ O.current.steer = Math.max(-1, Math.min(1, (e.clientX - t.left - t.width / 2) / (t.width / 2))), O.current.throttle = Math.max(-1, Math.min(1, -(e.clientY - t.top - t.height / 2) / (t.height / 2)));
742
790
  },
743
791
  onPointerMove: (e) => {
744
792
  if (!e.currentTarget.hasPointerCapture(e.pointerId)) return;
745
793
  let t = e.currentTarget.getBoundingClientRect();
746
- E.current.steer = Math.max(-1, Math.min(1, (e.clientX - t.left - t.width / 2) / (t.width / 2))), E.current.throttle = Math.max(-1, Math.min(1, -(e.clientY - t.top - t.height / 2) / (t.height / 2)));
794
+ O.current.steer = Math.max(-1, Math.min(1, (e.clientX - t.left - t.width / 2) / (t.width / 2))), O.current.throttle = Math.max(-1, Math.min(1, -(e.clientY - t.top - t.height / 2) / (t.height / 2)));
747
795
  },
748
- onPointerUp: () => X(E.current),
749
- onPointerCancel: () => X(E.current),
750
- onLostPointerCapture: () => X(E.current),
796
+ onPointerUp: () => X(O.current),
797
+ onPointerCancel: () => X(O.current),
798
+ onLostPointerCapture: () => X(O.current),
751
799
  children: "✥"
752
800
  }),
753
801
  /* @__PURE__ */ v("div", {
@@ -756,29 +804,29 @@ function Z({ gameKey: n, currentUserId: r, onMinimize: i, onDismiss: d, suspende
756
804
  children: [
757
805
  /* @__PURE__ */ _("button", {
758
806
  "aria-label": "Avanzar",
759
- ...H("throttle", 1),
807
+ ...U("throttle", 1),
760
808
  children: "▲"
761
809
  }),
762
810
  /* @__PURE__ */ _("button", {
763
811
  "aria-label": "Girar izquierda",
764
- ...H("steer", -1),
812
+ ...U("steer", -1),
765
813
  children: "◀"
766
814
  }),
767
815
  /* @__PURE__ */ _("button", {
768
816
  "aria-label": "Retroceder",
769
- ...H("throttle", -1),
817
+ ...U("throttle", -1),
770
818
  children: "▼"
771
819
  }),
772
820
  /* @__PURE__ */ _("button", {
773
821
  "aria-label": "Girar derecha",
774
- ...H("steer", 1),
822
+ ...U("steer", 1),
775
823
  children: "▶"
776
824
  })
777
825
  ]
778
826
  }),
779
827
  /* @__PURE__ */ _("button", {
780
828
  className: "tl-fire",
781
- ...H("fire", !0),
829
+ ...U("fire", !0),
782
830
  children: "Disparar"
783
831
  })
784
832
  ]
@@ -789,22 +837,22 @@ function Z({ gameKey: n, currentUserId: r, onMinimize: i, onDismiss: d, suspende
789
837
  "Recarga ",
790
838
  /* @__PURE__ */ _("progress", {
791
839
  max: "1",
792
- value: V(D?.tanks)?.reload ?? 1
840
+ value: H(k?.tanks)?.reload ?? 1
793
841
  }),
794
842
  " ",
795
- (V(D?.tanks)?.reload ?? 1) >= 1 ? "Listo" : "Recargando…"
843
+ (H(k?.tanks)?.reload ?? 1) >= 1 ? "Listo" : "Recargando…"
796
844
  ] })
797
845
  }),
798
846
  /* @__PURE__ */ _("small", { children: "WASD / flechas · ratón o toca la arena para apuntar · espacio / clic para disparar" }),
799
847
  /* @__PURE__ */ _("button", {
800
- onClick: () => j((e) => !e),
801
- children: N === "2d" ? "Probar 3D" : "Vista 2D"
848
+ onClick: () => M((e) => !e),
849
+ children: P === "2d" ? "Probar 3D" : "Vista 2D"
802
850
  })
803
851
  ] }),
804
- z && /* @__PURE__ */ v("p", {
852
+ B && /* @__PURE__ */ v("p", {
805
853
  role: "status",
806
854
  children: [
807
- String(D?.winner ?? x.winnerId) === String(r) ? "¡Victoria!" : "Fin del combate",
855
+ String(k?.winner ?? C.winnerId) === String(r) ? "¡Victoria!" : "Fin del combate",
808
856
  " ",
809
857
  /* @__PURE__ */ _("button", {
810
858
  onClick: () => {
@@ -814,36 +862,54 @@ function Z({ gameKey: n, currentUserId: r, onMinimize: i, onDismiss: d, suspende
814
862
  })
815
863
  ]
816
864
  }),
817
- F && !z && /* @__PURE__ */ _("button", {
818
- onClick: () => w.current?.resign(),
865
+ I && !B && k?.net?.phase !== "connected" && /* @__PURE__ */ v("div", {
866
+ className: "tl-connection",
867
+ children: [/* @__PURE__ */ _("p", {
868
+ role: "status",
869
+ children: S(k?.net)
870
+ }), /* @__PURE__ */ _("button", {
871
+ type: "button",
872
+ onClick: () => E.current?.reconnect(),
873
+ children: "Reintentar conexión"
874
+ })]
875
+ }),
876
+ I && /* @__PURE__ */ v("details", {
877
+ className: "tl-diagnostics",
878
+ children: [/* @__PURE__ */ _("summary", { children: "Diagnóstico de conexión" }), /* @__PURE__ */ _("pre", { children: JSON.stringify(x(k?.net), null, 2) })]
879
+ }),
880
+ I && !B && /* @__PURE__ */ _("button", {
881
+ onClick: () => E.current?.resign(),
819
882
  children: "Rendirse"
820
883
  }),
821
- x.pending && /* @__PURE__ */ _("p", {
884
+ C.pending && /* @__PURE__ */ _("p", {
822
885
  role: "status",
823
886
  children: "Enviando…"
824
887
  }),
825
- x.pendingEvent && x.error && /* @__PURE__ */ _("button", {
888
+ C.pendingEvent && C.error && /* @__PURE__ */ _("button", {
826
889
  onClick: () => {
827
890
  e.getState().retry(n).catch(() => {});
828
891
  },
829
892
  children: "Reintentar envío"
830
893
  }),
831
- k && /* @__PURE__ */ _("p", {
894
+ ee && /* @__PURE__ */ _("p", {
832
895
  role: "alert",
833
- children: k
896
+ children: ee
834
897
  }),
835
- x.error && /* @__PURE__ */ _("p", {
898
+ C.error && /* @__PURE__ */ _("p", {
836
899
  role: "alert",
837
- children: x.error
900
+ children: C.error
838
901
  }),
839
- !["closed", "declined"].includes(x.status) && /* @__PURE__ */ _("button", {
840
- onClick: () => Y(n, "game_end"),
841
- children: "Cerrar partida"
902
+ !["closed", "declined"].includes(C.status) && /* @__PURE__ */ _("footer", {
903
+ className: "tl-footer",
904
+ children: /* @__PURE__ */ _("button", {
905
+ onClick: () => Y(n, "game_end"),
906
+ children: "Cerrar partida"
907
+ })
842
908
  })
843
909
  ]
844
910
  });
845
911
  }
846
912
  var Q = d(Z);
847
- export { H as a, B as c, Q as default, L as i, U as l, N as n, R as o, F as r, z as s, J as t };
913
+ export { U as a, V as c, Q as default, R as i, W as l, P as n, z as o, I as r, B as s, J as t };
848
914
 
849
- //# sourceMappingURL=TanksLiveGameCard-BmNRXP66.js.map
915
+ //# sourceMappingURL=TanksLiveGameCard-BNJqWt1z.js.map