@minicode-dev/chat 0.1.13 → 0.1.14

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 (110) hide show
  1. package/CHANGELOG.md +112 -5
  2. package/README.md +401 -312
  3. package/assets/sounds/effects/avalanche.mp3 +0 -0
  4. package/assets/sounds/racing/car_boost.mp3 +0 -0
  5. package/assets/sounds/racing/car_boost.ogg +0 -0
  6. package/assets/sounds/racing/car_bump.mp3 +0 -0
  7. package/assets/sounds/racing/car_bump.ogg +0 -0
  8. package/assets/sounds/racing/car_drift_loop.mp3 +0 -0
  9. package/assets/sounds/racing/car_drift_loop.ogg +0 -0
  10. package/assets/sounds/racing/car_engine_loop.mp3 +0 -0
  11. package/assets/sounds/racing/car_engine_loop.ogg +0 -0
  12. package/assets/sounds/racing/car_engine_start.mp3 +0 -0
  13. package/assets/sounds/racing/car_engine_start.ogg +0 -0
  14. package/assets/sounds/racing/countdown_beep.mp3 +0 -0
  15. package/assets/sounds/racing/countdown_beep.ogg +0 -0
  16. package/assets/sounds/racing/countdown_go.mp3 +0 -0
  17. package/assets/sounds/racing/countdown_go.ogg +0 -0
  18. package/assets/sounds/racing/final_lap.mp3 +0 -0
  19. package/assets/sounds/racing/final_lap.ogg +0 -0
  20. package/assets/sounds/racing/finish_line.mp3 +0 -0
  21. package/assets/sounds/racing/finish_line.ogg +0 -0
  22. package/assets/sounds/racing/lap_complete.mp3 +0 -0
  23. package/assets/sounds/racing/lap_complete.ogg +0 -0
  24. package/assets/sounds/racing/music_circuit.mp3 +0 -0
  25. package/assets/sounds/racing/music_circuit.ogg +0 -0
  26. package/assets/sounds/racing/music_final_lap.mp3 +0 -0
  27. package/assets/sounds/racing/music_final_lap.ogg +0 -0
  28. package/assets/sounds/racing/race_defeat.mp3 +0 -0
  29. package/assets/sounds/racing/race_defeat.ogg +0 -0
  30. package/assets/sounds/racing/race_victory.mp3 +0 -0
  31. package/assets/sounds/racing/race_victory.ogg +0 -0
  32. package/assets/sounds/tanks/barrel_explode.mp3 +0 -0
  33. package/assets/sounds/tanks/barrel_explode.ogg +0 -0
  34. package/assets/sounds/tanks/crate_break.mp3 +0 -0
  35. package/assets/sounds/tanks/crate_break.ogg +0 -0
  36. package/assets/sounds/tanks/health_pickup.mp3 +0 -0
  37. package/assets/sounds/tanks/health_pickup.ogg +0 -0
  38. package/assets/sounds/tanks/last_life.mp3 +0 -0
  39. package/assets/sounds/tanks/last_life.ogg +0 -0
  40. package/assets/sounds/tanks/life_lost.mp3 +0 -0
  41. package/assets/sounds/tanks/life_lost.ogg +0 -0
  42. package/assets/sounds/tanks/respawn.mp3 +0 -0
  43. package/assets/sounds/tanks/respawn.ogg +0 -0
  44. package/assets/sounds/tanks/shield_end.mp3 +0 -0
  45. package/assets/sounds/tanks/shield_end.ogg +0 -0
  46. package/assets/sounds/tanks/shield_loop.mp3 +0 -0
  47. package/assets/sounds/tanks/shield_loop.ogg +0 -0
  48. package/assets/sounds/tanks/wall_hit.mp3 +0 -0
  49. package/assets/sounds/tanks/wall_hit.ogg +0 -0
  50. package/dist/chunks/{BattleshipGameCard-iRk8d4vR.js → BattleshipGameCard-B-B4r7lK.js} +146 -144
  51. package/dist/chunks/{BattleshipGameCard-iRk8d4vR.js.map → BattleshipGameCard-B-B4r7lK.js.map} +1 -1
  52. package/dist/chunks/{ChatContext-DjIEifGY.js → ChatContext-DQtKsR6Z.js} +2 -2
  53. package/dist/chunks/{ChatContext-DjIEifGY.js.map → ChatContext-DQtKsR6Z.js.map} +1 -1
  54. package/dist/chunks/RacingLiveGameCard-c1G7uoDI.js +1654 -0
  55. package/dist/chunks/RacingLiveGameCard-c1G7uoDI.js.map +1 -0
  56. package/dist/chunks/{TanksGameCard-GrqmdwJ7.js → TanksGameCard-CvTaF7tu.js} +164 -162
  57. package/dist/chunks/{TanksGameCard-GrqmdwJ7.js.map → TanksGameCard-CvTaF7tu.js.map} +1 -1
  58. package/dist/chunks/TanksLiveGameCard-COr9Oay5.js +1011 -0
  59. package/dist/chunks/TanksLiveGameCard-COr9Oay5.js.map +1 -0
  60. package/dist/chunks/avalancheScene3d-Z5QyZIid.js +1299 -0
  61. package/dist/chunks/avalancheScene3d-Z5QyZIid.js.map +1 -0
  62. package/dist/chunks/connect4Sounds-DmD-E9kX.js +235 -0
  63. package/dist/chunks/connect4Sounds-DmD-E9kX.js.map +1 -0
  64. package/dist/chunks/connectionStore-DwgIUl30.js +13 -0
  65. package/dist/chunks/connectionStore-DwgIUl30.js.map +1 -0
  66. package/dist/chunks/createLiveScene-CWBunxPi.js +367 -0
  67. package/dist/chunks/{createLiveScene-819NWv84.js.map → createLiveScene-CWBunxPi.js.map} +1 -1
  68. package/dist/chunks/createRaceScene-C7Rw89kj.js +305 -0
  69. package/dist/chunks/createRaceScene-C7Rw89kj.js.map +1 -0
  70. package/dist/chunks/{createTankScene-6asWHKFf.js → createTankScene-yhX6la27.js} +125 -123
  71. package/dist/chunks/{createTankScene-6asWHKFf.js.map → createTankScene-yhX6la27.js.map} +1 -1
  72. package/dist/chunks/decor-CyyCnmct.js +418 -0
  73. package/dist/chunks/decor-CyyCnmct.js.map +1 -0
  74. package/dist/chunks/fx-1ZwzmPWj.js +458 -0
  75. package/dist/chunks/fx-1ZwzmPWj.js.map +1 -0
  76. package/dist/chunks/fx-UZwhOmdl.js +584 -0
  77. package/dist/chunks/fx-UZwhOmdl.js.map +1 -0
  78. package/dist/chunks/gameStatus-BChd29yI.js +62 -0
  79. package/dist/chunks/gameStatus-BChd29yI.js.map +1 -0
  80. package/dist/chunks/{connect4Sounds-Cv0q31VW.js → games-BvYTWgaR.js} +814 -951
  81. package/dist/chunks/games-BvYTWgaR.js.map +1 -0
  82. package/dist/chunks/rolldown-runtime-CGnMp29N.js +10 -0
  83. package/dist/chunks/tank-DjEQ4FXF.js +553 -0
  84. package/dist/chunks/tank-DjEQ4FXF.js.map +1 -0
  85. package/dist/chunks/tanks-live-BcKmrhnV.js +261 -0
  86. package/dist/chunks/tanks-live-BcKmrhnV.js.map +1 -0
  87. package/dist/chunks/{tanksSounds-CUNDIOal.js → tanksSounds-DwjfSp3W.js} +43 -11
  88. package/dist/chunks/tanksSounds-DwjfSp3W.js.map +1 -0
  89. package/dist/chunks/track-BcnnpnAm.js +259 -0
  90. package/dist/chunks/track-BcnnpnAm.js.map +1 -0
  91. package/dist/chunks/util-DwI9bfS7.js +57 -0
  92. package/dist/chunks/util-DwI9bfS7.js.map +1 -0
  93. package/dist/index.js +812 -625
  94. package/dist/index.js.map +1 -1
  95. package/dist/styles.css +1 -1
  96. package/index.d.ts +3 -1
  97. package/package.json +1 -1
  98. package/dist/chunks/TanksLiveGameCard-DSmQcUMh.js +0 -1225
  99. package/dist/chunks/TanksLiveGameCard-DSmQcUMh.js.map +0 -1
  100. package/dist/chunks/avalancheScene3d-Dnl2E3EA.js +0 -1878
  101. package/dist/chunks/avalancheScene3d-Dnl2E3EA.js.map +0 -1
  102. package/dist/chunks/connect4Sounds-Cv0q31VW.js.map +0 -1
  103. package/dist/chunks/createLiveScene-819NWv84.js +0 -365
  104. package/dist/chunks/fx-BNJvJYOu.js +0 -871
  105. package/dist/chunks/fx-BNJvJYOu.js.map +0 -1
  106. package/dist/chunks/gameStatus-Cu1Z8un9.js +0 -69
  107. package/dist/chunks/gameStatus-Cu1Z8un9.js.map +0 -1
  108. package/dist/chunks/tank-DIn6Jyt8.js +0 -605
  109. package/dist/chunks/tank-DIn6Jyt8.js.map +0 -1
  110. package/dist/chunks/tanksSounds-CUNDIOal.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TanksLiveGameCard-COr9Oay5.js","names":["_Fragment","__exportAll","useChatGames","decodeSignal","encodeSignal","ChatContext","connectionHint","ManualTurnDialog","connectionDiagnostics","stopAllTanksLoops","startTanksSounds","handleSceneEvent","playOutcome","getTanksSoundManager","RULES","clamp","lo","hi","n","angleDelta","b","a","createArena","x","z","r","i","createTank","id","index","isDestructibleAlive","d","toLocal","dx","o","dz","c","s","circleHitsShape","radius","lx","lz","hw","hd","validPosition","arena","moveTank","tank","throttle","input","steer","target","dt","segmentCircle","bx","ax","bz","az","length","t","cx","cz","segmentRect","alx","alz","blx","blz","h","t1","t2","segmentShape","advanceShell","shell","first","tanks","interpolatePose","fraction","finite","idValid","createLiveMatch","selfId","game","createPeerLink","ids","initialTurnConfigured","iceServers","server","url","peerId","shells","events","time","sendAt","round","sequence","status","winner","destroyed","net","wasConnected","pendingResign","endReason","poses","lastPoseAt","lastPose","lastFire","seen","wantsRematch","me","other","notify","onChange","emit","send","link","e","remember","key","snapshot","reset","finish","force","fire","owner","shot","broadcast","receiveMove","data","yaw","turretYaw","speed","elapsed","previous","pose","receiveEvent","isHost","hp","validPlaying","validOver","maybeRematch","peerFactory","signaling","signal","text","scoped","frame","listener","previousPhase","state","resumed","next","dtMs","renderTime","remaining","hz","hit","out","config","options","RAD_TO_DEG","num","value","fallback","arenaBounds","withSize","w","box","arenaObstacles","eventKind","event","shooterOf","list","found","best","bestD","tankById","selfTank","damageLevel","alive","wrapAngle","v","createSelfTracker","last","moving","turning","moveIdle","turnIdle","hull","turret","isMoving","moveSpeed","turnSpeed","holdMs","isTurning","soundEventsFor","outcomeFor","render","createLiveScene2d","canvas","container","ctx","bounds","scale","ox","oz","resize","dpr","ro","nx","ny","obstacle","TanksLiveGameCard_exports","TanksLiveGameCard_default","act","type","stopInput","connectionText","manual","prolonged","TanksLiveGameCard","rtcOptions","useContext","gameKey","suspendedRef","useRef","suspended","stage","match","renderer","view","setView","useState","error","setError","prefer2d","setPrefer2d","mode","setMode","turnOpen","setTurnOpen","waitingMs","setWaitingMs","connected","useEffect","started","timer","active","setArena","disposed","scene","createLiveScene","published","outcome","tracker","keys","session","currentUserId","clear","down","up","host","visibility","tick","now","paused","sound","nextOutcome","guest","over","configuring","connectionProblem","routeText","applyTurn","json","aim","rect","ground","hold","field","GameSoundControls","onMinimize","onDismiss","CheckCircle2","AlertTriangle","Loader2","Settings2","Link2","Fragment","memo"],"sources":["../../src/games/tanks-live/logic/simulation.js","../../src/games/tanks-live/net/createLiveMatch.js","../../src/games/tanks-live/scene/liveView.js","../../src/games/tanks-live/scene/createLiveScene2d.js","../../src/games/tanks-live/TanksLiveGameCard.jsx"],"sourcesContent":["// Deterministic arcade simulation. Angles are radians, forward is +x.\nexport const RULES = Object.freeze({ speed: 16, reverse: 9, turn: 1.8, acceleration: 28, radius: 2, reloadMs: 1500, shellSpeed: 60, damage: 25 });\nexport const clamp = (n, lo, hi) => Math.max(lo, Math.min(hi, n));\nexport const angleDelta = (a, b) => Math.atan2(Math.sin(b - a), Math.cos(b - a));\nexport function createArena() {\n return { size: 120, bounds: { minX: 0, maxX: 120, minZ: 0, maxZ: 120 }, obstacles: [\n [42, 35, 4], [78, 85, 4], [60, 30, 3], [60, 90, 3], [35, 65, 3], [85, 55, 3], [60, 60, 5],\n ].map(([x, z, r], i) => ({ x, z, r, kind: i % 2 ? 'tree' : 'rock' })) };\n}\nexport function createTank(id, index) { return { id: String(id), x: index ? 102 : 18, z: 60, yaw: index ? Math.PI : 0, turretYaw: index ? Math.PI : 0, speed: 0, hp: 100, alive: true, color: index ? '#d7463f' : '#54a34a' }; }\n// Map shapes (contract §8): obstacles without `shape` are circles (legacy). `rect` = oriented box centred at (x,z),\n// width `w` along its local +x, depth `d` along local +z, rotated by `rot` like yaw: local (1,0) → world (cos rot, sin rot).\n// Every rect blocks tanks and shells, `kind:'low'` included (low cover only leaves the view open).\n// Destructibles block tanks and shells while alive (hp > 0 and alive !== false).\nexport const BLAST = Object.freeze({ radius: 6, damage: 20 });\nexport const isDestructibleAlive = d => !!d && d.alive !== false && (d.hp === undefined || d.hp > 0);\nfunction toLocal(o, x, z) {\n const dx = x - o.x, dz = z - o.z, c = Math.cos(o.rot || 0), s = Math.sin(o.rot || 0);\n return [dx * c + dz * s, -dx * s + dz * c];\n}\nexport function circleHitsShape(x, z, radius, o) {\n if (o.shape !== 'rect') return Math.hypot(x - o.x, z - o.z) < o.r + radius;\n const [lx, lz] = toLocal(o, x, z), hw = o.w / 2, hd = o.d / 2;\n return Math.hypot(lx - clamp(lx, -hw, hw), lz - clamp(lz, -hd, hd)) < radius || (Math.abs(lx) <= hw && Math.abs(lz) <= hd);\n}\nexport function validPosition(x, z, arena, radius = RULES.radius) {\n const b = arena.bounds;\n return x >= b.minX + radius && x <= b.maxX - radius && z >= b.minZ + radius && z <= b.maxZ - radius\n && !arena.obstacles.some(o => circleHitsShape(x, z, radius, o))\n && !(arena.destructibles || []).some(d => isDestructibleAlive(d) && circleHitsShape(x, z, radius, d));\n}\nexport function moveTank(tank, input, dt, arena) {\n if (!tank.alive) return;\n const throttle = clamp(Number(input.throttle) || 0, -1, 1), steer = clamp(Number(input.steer) || 0, -1, 1);\n const target = throttle * (throttle < 0 ? RULES.reverse : RULES.speed);\n tank.speed += clamp(target - tank.speed, -RULES.acceleration * dt, RULES.acceleration * dt);\n tank.yaw += steer * RULES.turn * dt;\n if (Number.isFinite(input.turretYaw)) tank.turretYaw = input.turretYaw;\n const x = tank.x + Math.cos(tank.yaw) * tank.speed * dt, z = tank.z + Math.sin(tank.yaw) * tank.speed * dt;\n if (validPosition(x, tank.z, arena)) tank.x = x; else tank.speed = 0;\n if (validPosition(tank.x, z, arena)) tank.z = z; else tank.speed = 0;\n}\nexport function segmentCircle(ax, az, bx, bz, cx, cz, radius) {\n const dx = bx - ax, dz = bz - az, length = dx * dx + dz * dz;\n const t = length ? clamp(((cx - ax) * dx + (cz - az) * dz) / length, 0, 1) : 0;\n return Math.hypot(ax + dx * t - cx, az + dz * t - cz) <= radius ? t : null;\n}\n// Segment vs oriented box (slab test in box space) → fraction t in [0,1] of first contact, or null.\nexport function segmentRect(ax, az, bx, bz, o) {\n const [alx, alz] = toLocal(o, ax, az), [blx, blz] = toLocal(o, bx, bz), d = [blx - alx, blz - alz], a = [alx, alz], h = [o.w / 2, o.d / 2];\n let lo = 0, hi = 1;\n for (let i = 0; i < 2; i++) {\n if (Math.abs(d[i]) < 1e-12) { if (Math.abs(a[i]) > h[i]) return null; continue; }\n let t1 = (-h[i] - a[i]) / d[i], t2 = (h[i] - a[i]) / d[i];\n if (t1 > t2) [t1, t2] = [t2, t1];\n lo = Math.max(lo, t1); hi = Math.min(hi, t2);\n if (lo > hi) return null;\n }\n return lo;\n}\nconst segmentShape = (ax, az, bx, bz, o) => o.shape === 'rect' ? segmentRect(ax, az, bx, bz, o) : segmentCircle(ax, az, bx, bz, o.x, o.z, o.r);\nexport function advanceShell(shell, dt, arena, tanks) {\n const x = shell.x + Math.cos(shell.yaw) * RULES.shellSpeed * dt, z = shell.z + Math.sin(shell.yaw) * RULES.shellSpeed * dt;\n let first = null;\n for (const o of arena.obstacles) {\n const t = segmentShape(shell.x, shell.z, x, z, o);\n if (t !== null && (!first || t < first.t)) first = o.shape === 'rect' ? { t, kind: 'obstacle', shape: 'rect', id: o.id, obstacleKind: o.kind } : { t, kind: 'obstacle' };\n }\n for (const d of arena.destructibles || []) {\n if (!isDestructibleAlive(d)) continue;\n const t = segmentShape(shell.x, shell.z, x, z, d);\n if (t !== null && (!first || t < first.t)) first = { t, kind: 'destructible', id: d.id, destructibleKind: d.kind };\n }\n for (const tank of tanks) { if (!tank.alive || tank.id === shell.owner) continue; const t = segmentCircle(shell.x, shell.z, x, z, tank.x, tank.z, RULES.radius); if (t !== null && (!first || t < first.t)) first = { t, kind: 'tank', target: tank.id }; }\n if (first) { shell.x += (x - shell.x) * first.t; shell.z += (z - shell.z) * first.t; return first; }\n shell.x = x; shell.z = z; shell.age += dt;\n return !validPosition(x, z, { ...arena, obstacles: [], destructibles: [] }, 0) || shell.age > 3 ? { kind: 'terrain' } : null;\n}\n// Host-side: apply `dmg` hits to a destructible. Mutates it; returns { destroyed, kind, hp } (destroyed only on the killing hit).\nexport function damageDestructible(map, id, dmg = 1) {\n const d = (map?.destructibles || []).find(item => item.id === id);\n if (!isDestructibleAlive(d)) return { destroyed: false, kind: d?.kind ?? null, hp: 0 };\n d.hp = Math.max(0, (d.hp ?? 1) - Math.max(0, Number(dmg) || 0));\n if (d.hp === 0) d.alive = false;\n return { destroyed: d.hp === 0, kind: d.kind, hp: d.hp };\n}\n// Area damage around (x,z): every living tank within BLAST.radius takes BLAST.damage. Pure: returns [{ id, dmg }].\nexport function barrelBlast(tanks, x, z, radius = BLAST.radius, damage = BLAST.damage) {\n return tanks.filter(t => t.alive !== false && Math.hypot(t.x - x, t.z - z) <= radius).map(t => ({ id: t.id, dmg: damage }));\n}\n// Host-side barrel explosion (call after damageDestructible destroyed a barrel). Chains into at most ONE other living\n// barrel inside the radius (the nearest), which is destroyed and blasts too; no further chaining. Damage is summed per tank.\nexport function explodeBarrel(map, id, tanks) {\n const barrel = (map?.destructibles || []).find(d => d.id === id);\n if (!barrel) return { hits: [], chained: null };\n const blasts = [barrel];\n const next = (map.destructibles || []).filter(d => d !== barrel && d.kind === 'barrel' && isDestructibleAlive(d) && Math.hypot(d.x - barrel.x, d.z - barrel.z) <= BLAST.radius)\n .sort((a, b) => Math.hypot(a.x - barrel.x, a.z - barrel.z) - Math.hypot(b.x - barrel.x, b.z - barrel.z))[0];\n if (next) { next.hp = 0; next.alive = false; blasts.push(next); }\n const total = new Map();\n for (const b of blasts) for (const hit of barrelBlast(tanks, b.x, b.z)) total.set(hit.id, (total.get(hit.id) || 0) + hit.dmg);\n return { hits: [...total].map(([tankId, dmg]) => ({ id: tankId, dmg })), chained: next ? { id: next.id, x: next.x, z: next.z } : null };\n}\nexport function interpolatePose(a, b, fraction) {\n const t = clamp(fraction, 0, 1);\n return { ...b, x: a.x + (b.x - a.x) * t, z: a.z + (b.z - a.z) * t, yaw: a.yaw + angleDelta(a.yaw, b.yaw) * t, turretYaw: a.turretYaw + angleDelta(a.turretYaw, b.turretYaw) * t };\n}\n","import { decodeSignal, encodeSignal } from '../../../net/webrtc/protocol.js';\nimport { createPeerLink } from '../../../net/webrtc/createPeerLink.js';\nimport { RULES, createArena, createTank, moveTank, advanceShell, validPosition, interpolatePose } from '../logic/simulation.js';\n\nconst finite = n => typeof n === 'number' && Number.isFinite(n);\nconst idValid = id => typeof id === 'string' && id.length > 0 && id.length < 160;\nexport function createLiveMatch({ game, selfId, isHost = String(selfId) === String(game.hostId), signaling, onChange = () => {}, peerFactory = createPeerLink, iceServers, iceTransportPolicy, RTCPeerConnectionImpl } = {}) {\n selfId = String(selfId);\n const ids = [String(game.hostId), String(game.guestId)];\n if (!ids.includes(selfId) || ids[0] === ids[1]) throw new Error('Invalid live match players');\n const initialTurnConfigured = (iceServers || []).some(server => [server.urls].flat().some(url => /^turns?:/i.test(String(url))));\n const peerId = ids.find(id => id !== selfId), arena = createArena();\n let tanks = ids.map(createTank), shells = [], events = [], input = {}, time = 0, sendAt = 0, round = 0, sequence = 0;\n let status = 'connecting', winner = null, destroyed = false, net = { phase: 'idle', rtt: null, route: null }, wasConnected = false, pendingResign = false, endReason = null;\n let poses = [], lastPoseAt = null, lastPose = null, lastFire = new Map(), seen = new Set(), wantsRematch = new Set();\n const me = () => tanks.find(t => t.id === selfId), other = () => tanks.find(t => t.id === peerId);\n const notify = () => { if (!destroyed) onChange({ status, winner, net }); };\n const emit = e => { events.push(e); if (events.length > 200) events.shift(); };\n const send = e => link.sendEvent({ ...e, g: game.gameId, r: round });\n const remember = key => { seen.add(key); if (seen.size > 2048) seen.delete(seen.values().next().value); };\n const snapshot = () => ({ k: 'snapshot', hp: tanks.map(t => t.hp), status, winner, reason: endReason });\n function reset() {\n tanks = ids.map(createTank); shells = []; poses = []; lastPoseAt = null; lastPose = null; lastFire.clear(); seen.clear(); wantsRematch.clear(); pendingResign = false; endReason = null; winner = null; status = net.phase === 'connected' ? 'playing' : 'connecting'; emit({ k: 'rematch' }); notify();\n }\n function finish(id, force = false) { if (status === 'over' && (!force || winner === id)) return; status = 'over'; winner = id; shells = []; link.clearManualTurn?.(); emit({ k: 'over', winner }); notify(); }\n function fire(owner, e, broadcast) {\n if (status !== 'playing' || !idValid(e.id) || seen.has(e.id)) return false;\n const tank = tanks.find(t => t.id === owner);\n if (!tank?.alive || time - (lastFire.get(owner) ?? -Infinity) < RULES.reloadMs - 20) return false;\n if (![e.x, e.z, e.yaw].every(finite) || Math.hypot(e.x - (owner === peerId && lastPose ? lastPose.x : tank.x), e.z - (owner === peerId && lastPose ? lastPose.z : tank.z)) > 6) return false;\n remember(e.id);\n lastFire.set(owner, time);\n const shot = { ...e, k: 'fire', owner, x: e.x + Math.cos(e.yaw) * 2.8, z: e.z + Math.sin(e.yaw) * 2.8, y: 1.4, age: 0 };\n shells.push(shot); emit(shot); if (broadcast) send({ ...e, k: 'fire' }); return true;\n }\n function receiveMove(data) {\n if (destroyed || status !== 'playing' || data?.g !== game.gameId || data.r !== round || !Array.isArray(data.p) || data.p.length !== 5 || !data.p.every(finite)) return;\n const [x, z, yaw, turretYaw, speed] = data.p;\n if (!validPosition(x, z, arena) || Math.abs(speed) > RULES.speed + 0.1 || Math.abs(yaw) > 1e6 || Math.abs(turretYaw) > 1e6) return;\n const elapsed = lastPoseAt === null ? 0.1 : Math.max(0, (time - lastPoseAt) / 1000);\n const previous = lastPose || other();\n if (Math.hypot(x - previous.x, z - previous.z) > RULES.speed * elapsed + 3) return;\n const pose = { ...other(), x, z, yaw, turretYaw, speed };\n lastPose = pose; lastPoseAt = time; poses.push({ time, pose }); if (poses.length > 30) poses.shift();\n }\n function receiveEvent(e) {\n if (destroyed || !e || e.g !== game.gameId || !Number.isInteger(e.r)) return;\n if (e.k === 'round' && !isHost && status === 'over' && wantsRematch.has(selfId) && e.r === round + 1) { round = e.r; reset(); return; }\n if (e.r !== round) return;\n if (e.k === 'sync' && isHost) { send(snapshot()); return; }\n if (e.k === 'snapshot' && !isHost && Array.isArray(e.hp) && e.hp.length === 2 && e.hp.every(hp => Number.isInteger(hp) && hp >= 0 && hp <= 100)) {\n const validPlaying = e.status === 'playing' && e.winner === null && e.hp.every(hp => hp > 0);\n const validOver = e.status === 'over' && ids.includes(e.winner) && (e.hp[1 - ids.indexOf(e.winner)] === 0 || e.reason === 'resigned');\n if (!validPlaying && !validOver) return;\n tanks.forEach((t, i) => { t.hp = e.hp[i]; t.alive = t.hp > 0; });\n if (validOver) { pendingResign = false; endReason = e.reason; finish(e.winner, true); }\n return;\n }\n if (e.k === 'resign') { endReason = 'resigned'; finish(selfId, isHost); if (isHost) send(snapshot()); return; }\n if (e.k === 'rematch' && status === 'over') { wantsRematch.add(peerId); maybeRematch(); return; }\n if (status !== 'playing') return;\n if (e.k === 'fire') fire(peerId, e, false);\n if (!isHost && e.k === 'hit' && idValid(e.id) && !seen.has(`hit:${e.id}`) && ids.includes(e.target) && Array.isArray(e.hp) && e.hp.length === 2 && e.hp.every((hp, i) => Number.isInteger(hp) && hp >= 0 && hp <= tanks[i].hp) && [e.x, e.z].every(finite)) {\n remember(`hit:${e.id}`); tanks.forEach((tank, i) => { tank.hp = e.hp[i]; tank.alive = tank.hp > 0; }); shells = shells.filter(s => s.id !== e.id); emit(e);\n }\n if (!isHost && e.k === 'destroyed' && ids.includes(e.target) && !seen.has(`destroyed:${e.target}`) && tanks.find(t => t.id === e.target).hp === 0) { remember(`destroyed:${e.target}`); emit(e); }\n if (!isHost && e.k === 'over' && ids.includes(e.winner) && tanks.find(t => t.id !== e.winner).hp === 0) finish(e.winner);\n }\n // Scope negotiation itself: a finished card must never answer another game's hello.\n const scopedSignaling = signaling && {\n send(text) { const signal = decodeSignal(text); if (!signal) return Promise.reject(new Error('Invalid live signal')); const scoped = encodeSignal({ ...signal, liveGame: game.gameId }); return scoped ? signaling.send(scoped) : Promise.reject(new Error('Live signal too large')); },\n subscribe(listener) { return signaling.subscribe(frame => { const signal = decodeSignal(frame?.text); if (signal?.liveGame === game.gameId) listener(frame); }); },\n };\n const link = peerFactory({ configurationAuthority: isHost, signaling: scopedSignaling, selfId, peerId, roomId: game.roomId, iceServers, iceTransportPolicy, RTCPeerConnectionImpl, onMove: receiveMove, onEvent: receiveEvent, onChange(state) {\n const previousPhase = net.phase; net = state;\n if (state.phase === 'connected') { const resumed = wasConnected; wasConnected = true; if (status !== 'over') status = 'playing'; if (previousPhase !== 'connected') queueMicrotask(() => { if (!destroyed) { if (pendingResign) send({ k: 'resign' }); if (isHost && resumed) send(snapshot()); else if (!isHost) send({ k: 'sync' }); } }); }\n else if (status !== 'over') status = wasConnected ? 'disconnected' : 'connecting';\n notify();\n } });\n function maybeRematch() { if (isHost && wantsRematch.size === 2) { round++; send({ k: 'round' }); reset(); } }\n if (isHost) link.connect(); else link.setListening(true);\n return {\n setInput(next) { input = { ...next }; },\n step(dtMs) {\n if (destroyed) return;\n const elapsed = Math.max(0, Math.min(Number(dtMs) || 0, 100)); time += elapsed;\n if (status !== 'playing') return;\n const dt = elapsed / 1000;\n const renderTime = time - 100;\n while (poses.length > 1 && poses[1].time <= renderTime) poses.shift();\n if (poses.length) { const a = poses[0], b = poses[1] || a; const pose = interpolatePose(a.pose, b.pose, b.time === a.time ? 1 : (renderTime - a.time) / (b.time - a.time)); for (const key of ['x', 'z', 'yaw', 'turretYaw', 'speed']) other()[key] = pose[key]; }\n for (let remaining = dt; remaining > 0; remaining -= 0.016) moveTank(me(), input, Math.min(remaining, 0.016), arena);\n if (input.fire) fire(selfId, { id: `${selfId}:${round}:${++sequence}`, x: me().x, z: me().z, yaw: me().turretYaw, t: time }, true);\n const hz = net.rtt > 250 || net.move?.lossPct > 15 ? 10 : net.rtt > 100 ? 15 : 20;\n if (time >= sendAt) { sendAt = time + 1000 / hz; const t = me(); link.sendMove({ g: game.gameId, r: round, p: [t.x, t.z, t.yaw, t.turretYaw, t.speed], t: time }); }\n shells = shells.filter(shell => {\n const hit = advanceShell(shell, dt, arena, tanks);\n if (!hit) return true;\n if (isHost && hit.target && status === 'playing') {\n const tank = tanks.find(t => t.id === hit.target); tank.hp = Math.max(0, tank.hp - RULES.damage); tank.alive = tank.hp > 0;\n const e = { k: 'hit', id: shell.id, target: tank.id, dmg: RULES.damage, hp: tanks.map(t => t.hp), x: shell.x, z: shell.z }; send(e); emit(e);\n if (!tank.alive) { const e = { k: 'destroyed', target: tank.id }; send(e); emit(e); send({ k: 'over', winner: shell.owner }); finish(shell.owner); }\n } else emit({ k: 'impact', kind: hit.kind, x: shell.x, z: shell.z });\n return false;\n });\n },\n getRender() { const out = { arena, tanks: tanks.map(t => ({ ...t, self: t.id === selfId, reload: Math.min(1, (time - (lastFire.get(t.id) ?? -Infinity)) / RULES.reloadMs) })), shells: shells.map(s => ({ ...s })), events, status, winner, net: { ...net, turnConfigured: net.turnConfigured ?? initialTurnConfigured } }; events = []; return out; },\n configureTurn(config, options) {\n if (destroyed || status === 'over') return Promise.reject(new Error('La partida ya terminó.'));\n return link.configureTurn(config, options);\n },\n reconnect() { if (!destroyed && status !== 'over') { if (link.requestReconnect) link.requestReconnect(); else link.connect(); } },\n rematch() { if (!destroyed && status === 'over') { wantsRematch.add(selfId); send({ k: 'rematch' }); maybeRematch(); } },\n resign() { if (!destroyed && status !== 'over') { pendingResign = true; endReason = 'resigned'; send({ k: 'resign' }); finish(peerId); } },\n destroy() { if (destroyed) return; destroyed = true; link.destroy(); shells = []; poses = []; events = []; },\n };\n}\n","// Pure helpers shared by the live 3D/2D scenes and the card (no three, no DOM).\n// Render-state yaw is radians with forward = (cos yaw, sin yaw) on the x/z plane.\n\nexport const DEFAULT_ARENA_SIZE = 120;\nexport const RAD_TO_DEG = 180 / Math.PI;\n\nconst num = (value, fallback) => (Number.isFinite(value) ? value : fallback);\n\n/** Arena rectangle in world meters: explicit bounds, or `size` (corner origin unless `centered`). */\nexport function arenaBounds(arena) {\n const a = arena || {};\n const b = a.bounds || a;\n if (Number.isFinite(b.minX) && Number.isFinite(b.maxX) && Number.isFinite(b.minZ) && Number.isFinite(b.maxZ)) {\n return withSize({ minX: b.minX, minZ: b.minZ, maxX: b.maxX, maxZ: b.maxZ });\n }\n const w = num(a.width, num(a.size, DEFAULT_ARENA_SIZE));\n const d = num(a.depth, num(a.height, num(a.size, w)));\n const centered = a.centered === true || a.origin === 'center';\n return withSize(centered\n ? { minX: -w / 2, minZ: -d / 2, maxX: w / 2, maxZ: d / 2 }\n : { minX: 0, minZ: 0, maxX: w, maxZ: d });\n}\n\nfunction withSize(box) {\n return { ...box, width: box.maxX - box.minX, depth: box.maxZ - box.minZ, cx: (box.minX + box.maxX) / 2, cz: (box.minZ + box.maxZ) / 2 };\n}\n\n/** Circular obstacles [{ x, z, r, kind: 'tree'|'rock' }]. */\nexport function arenaObstacles(arena) {\n const list = arena?.obstacles || [];\n return list\n .filter((o) => Number.isFinite(o?.x) && Number.isFinite(o?.z))\n .map((o) => ({ x: o.x, z: o.z, r: num(o.r, num(o.radius, 1.5)), kind: o.kind === 'tree' ? 'tree' : 'rock' }));\n}\n\nexport const eventKind = (event) => (event ? event.k ?? event.type ?? null : null);\n\n/** Tank that fired: explicit owner field, else the tank nearest to the shot origin. */\nexport function shooterOf(event, tanks) {\n const list = tanks || [];\n const owner = event?.tank ?? event?.by ?? event?.owner ?? event?.from;\n if (owner != null) {\n const found = list.find((t) => String(t.id) === String(owner));\n if (found) return found;\n }\n if (!Number.isFinite(event?.x) || !Number.isFinite(event?.z)) return null;\n let best = null;\n let bestD = Infinity;\n for (const t of list) {\n const d = (t.x - event.x) ** 2 + (t.z - event.z) ** 2;\n if (d < bestD) { bestD = d; best = t; }\n }\n return best;\n}\n\nexport const tankById = (tanks, id) => (id == null ? null : (tanks || []).find((t) => String(t.id) === String(id)) || null);\nexport const selfTank = (tanks) => (tanks || []).find((t) => t.self) || null;\n\n/** 0 healthy, 1 smoking, 2 burning (also wrecks). */\nexport const damageLevel = (hp, alive = true) => (!alive || hp <= 25 ? 2 : hp <= 50 ? 1 : 0);\n\nexport const wrapAngle = (a) => {\n let v = a % (Math.PI * 2);\n if (v > Math.PI) v -= Math.PI * 2;\n if (v < -Math.PI) v += Math.PI * 2;\n return v;\n};\n\n/**\n * Tracks the own tank between frames to drive the engine/tracks/turret loops.\n * update(tank, dtMs) → scene-style sound events (move_start/move_end/turret_start/turret_end).\n */\nexport function createSelfTracker({ moveSpeed = 0.6, turnSpeed = 0.35, holdMs = 160 } = {}) {\n let last = null;\n let moving = false;\n let turning = false;\n let moveIdle = 0;\n let turnIdle = 0;\n return {\n update(tank, dtMs) {\n const out = [];\n if (!tank || tank.alive === false) {\n if (moving) out.push({ type: 'move_end' });\n if (turning) out.push({ type: 'turret_end' });\n moving = turning = false;\n last = null;\n return out;\n }\n const dt = Math.max(1, dtMs) / 1000;\n if (last) {\n const speed = Math.hypot(tank.x - last.x, tank.z - last.z) / dt;\n const hull = Math.abs(wrapAngle((tank.yaw ?? 0) - last.yaw)) / dt;\n const turret = Math.abs(wrapAngle((tank.turretYaw ?? 0) - (tank.yaw ?? 0) - last.rel)) / dt;\n const isMoving = speed > moveSpeed || hull > turnSpeed;\n moveIdle = isMoving ? 0 : moveIdle + dtMs;\n if (isMoving && !moving) { moving = true; out.push({ type: 'move_start' }); }\n else if (!isMoving && moving && moveIdle >= holdMs) { moving = false; out.push({ type: 'move_end' }); }\n const isTurning = turret > turnSpeed;\n turnIdle = isTurning ? 0 : turnIdle + dtMs;\n if (isTurning && !turning) { turning = true; out.push({ type: 'turret_start' }); }\n else if (!isTurning && turning && turnIdle >= holdMs) { turning = false; out.push({ type: 'turret_end' }); }\n }\n last = { x: tank.x, z: tank.z, yaw: tank.yaw ?? 0, rel: wrapAngle((tank.turretYaw ?? 0) - (tank.yaw ?? 0)) };\n return out;\n },\n reset() {\n last = null;\n moving = turning = false;\n moveIdle = turnIdle = 0;\n },\n get moving() { return moving; },\n get turning() { return turning; },\n };\n}\n\n/** Render events → scene-style sound events (sound/cues.js vocabulary). */\nexport function soundEventsFor(event) {\n switch (eventKind(event)) {\n case 'fire': return [{ type: 'fire' }, { type: 'projectile_start' }];\n case 'impact': return [{ type: 'impact', kind: event.kind === 'obstacle' ? 'obstacle' : 'terrain' }];\n case 'hit': return [{ type: 'tank_hit' }];\n case 'destroyed': return [{ type: 'destroyed' }];\n default: return [];\n }\n}\n\n/** 'victory' | 'defeat' | null for the own player once the match is over. */\nexport function outcomeFor(render) {\n if (!render || render.status !== 'over') return null;\n const me = selfTank(render.tanks);\n if (!me || render.winner == null) return null;\n return String(render.winner) === String(me.id) ? 'victory' : 'defeat';\n}\n\n/** Own reload progress 0..1 (1 = ready): the tank's own field when given, else from the last own fire. */\nexport function reloadProgress(tank, lastFireAt, now, reloadMs = 1500) {\n if (!tank) return 1;\n if (Number.isFinite(tank.reload)) return Math.max(0, Math.min(1, tank.reload));\n if (Number.isFinite(tank.reloadMs)) return Math.max(0, Math.min(1, 1 - tank.reloadMs / reloadMs));\n if (!Number.isFinite(lastFireAt)) return 1;\n return Math.max(0, Math.min(1, (now - lastFireAt) / reloadMs));\n}\n","import { arenaBounds, arenaObstacles } from './liveView.js';\n\n/** Lightweight top-down fallback, with the same render/picking lifecycle as WebGL. */\nexport function createLiveScene2d(container, { arena } = {}) {\n const canvas = document.createElement('canvas');\n canvas.style.cssText = 'width:100%;height:100%;display:block';\n container.appendChild(canvas);\n const ctx = canvas.getContext('2d');\n if (!ctx) { canvas.remove(); throw new Error('Canvas 2D unavailable'); }\n const bounds = arenaBounds(arena);\n let w = 1; let h = 1; let scale = 1; let ox = 0; let oz = 0;\n function resize() {\n w = Math.max(1, container.clientWidth); h = Math.max(1, container.clientHeight);\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n canvas.width = w * dpr; canvas.height = h * dpr;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n scale = Math.min(w / bounds.width, h / bounds.depth);\n ox = (w - bounds.width * scale) / 2; oz = (h - bounds.depth * scale) / 2;\n }\n resize();\n const ro = typeof ResizeObserver === 'function' ? new ResizeObserver(resize) : null;\n ro?.observe(container);\n return {\n kind: '2d', resize,\n screenToGround(nx, ny) { return { x: ((nx + 1) * w / 2 - ox) / scale + bounds.minX, z: ((1 - ny) * h / 2 - oz) / scale + bounds.minZ }; },\n render(state) {\n ctx.fillStyle = '#152519'; ctx.fillRect(0, 0, w, h);\n ctx.save(); ctx.translate(ox, oz); ctx.scale(scale, scale); ctx.translate(-bounds.minX, -bounds.minZ);\n ctx.fillStyle = '#526348'; ctx.fillRect(bounds.minX, bounds.minZ, bounds.width, bounds.depth);\n for (const obstacle of arenaObstacles(arena)) { ctx.fillStyle = obstacle.kind === 'tree' ? '#24472d' : '#929285'; ctx.beginPath(); ctx.arc(obstacle.x, obstacle.z, obstacle.r, 0, Math.PI * 2); ctx.fill(); }\n for (const tank of state.tanks || []) {\n ctx.save(); ctx.translate(tank.x, tank.z); ctx.rotate(tank.yaw);\n ctx.fillStyle = tank.alive === false ? '#333' : tank.color || '#73ce68';\n ctx.fillRect(-3, -1.8, 6, 3.6); ctx.restore();\n ctx.save(); ctx.translate(tank.x, tank.z); ctx.rotate(tank.turretYaw); ctx.strokeStyle = '#dce8cf'; ctx.lineWidth = 0.8; ctx.beginPath(); ctx.moveTo(0, 0); ctx.lineTo(5, 0); ctx.stroke(); ctx.restore();\n if (tank.self) { ctx.strokeStyle = '#fff'; ctx.lineWidth = 0.3; ctx.beginPath(); ctx.arc(tank.x, tank.z, 4, 0, Math.PI * 2); ctx.stroke(); }\n }\n ctx.fillStyle = '#ffe097';\n for (const shell of state.shells || []) { ctx.beginPath(); ctx.arc(shell.x, shell.z, 0.7, 0, Math.PI * 2); ctx.fill(); }\n ctx.restore();\n },\n dispose() { ro?.disconnect(); canvas.remove(); },\n };\n}\n","/* eslint-disable react/prop-types */\nimport { memo, useContext, useEffect, useRef, useState } from 'react';\nimport { AlertTriangle, CheckCircle2, Link2, Loader2, Settings2 } from 'lucide-react';\nimport ManualTurnDialog from './ManualTurnDialog.jsx';\nimport { ChatContext } from '../../provider/ChatContext.js';\nimport useChatGames from '../shared/useChatGames.js';\nimport GameSoundControls from '../shared/GameSoundControls.jsx';\nimport { connectionDiagnostics, connectionHint } from './net/connectionDiagnostics.js';\nimport { createLiveMatch } from './net/createLiveMatch.js';\nimport { createLiveScene2d } from './scene/createLiveScene2d.js';\nimport { createSelfTracker, outcomeFor, selfTank, soundEventsFor } from './scene/liveView.js';\nimport { getTanksSoundManager, startTanksSounds, handleSceneEvent, playOutcome, stopAllTanksLoops } from '../tanks/sound/tanksSounds.js';\nimport '../connect4/games.css';\nimport './tanks-live.css';\n\nconst act = (key, type) => { void useChatGames.getState().act(key, type).catch(() => {}); };\nconst stopInput = (input) => { input.throttle = 0; input.steer = 0; input.fire = false; };\nfunction connectionText(net, prolonged) {\n const manual = net?.manualTurn;\n if (manual?.status === 'applying') return 'Aplicando configuración…';\n if (manual?.status === 'sharing') return 'Sincronizando con el otro jugador…';\n if (manual?.status === 'waiting_peer') return 'Esperando al otro jugador para compartir la configuración…';\n if (net?.phase === 'connected') return '¡Conexión establecida!';\n if (manual?.status === 'failed' || net?.phase === 'failed' || net?.ice === 'failed') return 'No pudimos conectar. Puedes reintentar.';\n if (prolonged) return 'La conexión está tardando más de lo esperado';\n if (net?.phase === 'restarting' || net?.phase === 'reconnecting') return 'Reconectando…';\n if (net?.phase === 'listening') return 'Esperando la conexión del otro jugador…';\n if (net?.phase === 'calling') return 'Buscando al otro jugador…';\n if (net?.phase === 'negotiating') return 'Buscando una conexión entre los jugadores…';\n return 'Preparando partida…';\n}\n\nfunction TanksLiveGameCard({ gameKey, currentUserId, onMinimize, onDismiss, suspended = false }) {\n const rtcOptions = useContext(ChatContext)?.config?.webrtc;\n const game = useChatGames((state) => state.games[gameKey]);\n const suspendedRef = useRef(suspended);\n suspendedRef.current = suspended;\n const stage = useRef(null); const match = useRef(null); const renderer = useRef(null);\n const input = useRef({ throttle: 0, steer: 0, fire: false });\n const [view, setView] = useState(null); const [error, setError] = useState(''); const [prefer2d, setPrefer2d] = useState(false);\n const [mode, setMode] = useState('loading');\n const [turnOpen, setTurnOpen] = useState(false);\n const [waitingMs, setWaitingMs] = useState(0);\n const connected = view?.net?.phase === 'connected';\n useEffect(() => {\n if (!game || game.status !== 'active' || connected) { setWaitingMs(0); return undefined; }\n const started = Date.now();\n const timer = setInterval(() => setWaitingMs(Date.now() - started), 1000);\n return () => clearInterval(timer);\n }, [gameKey, game?.status, connected]);\n useEffect(() => { setTurnOpen(false); }, [gameKey, game?.status]);\n\n useEffect(() => {\n if (suspended) { stopInput(input.current); stopAllTanksLoops(); }\n else renderer.current?.resize();\n }, [suspended]);\n const active = ['active', 'won'].includes(game?.status);\n const [arena, setArena] = useState(null);\n useEffect(() => {\n if (!active || !arena || !stage.current) return undefined;\n let disposed = false; let scene = null;\n const options = { arena, lowPower: matchMedia('(pointer: coarse)').matches, reducedMotion: matchMedia('(prefers-reduced-motion: reduce)').matches, onEvent: (event) => { if (event.type === 'context_lost') setPrefer2d(true); } };\n const fallback = () => { if (!disposed) { scene = createLiveScene2d(stage.current, options); renderer.current = scene; setMode('2d'); } };\n if (prefer2d) fallback();\n else import('./scene/createLiveScene.js').then(({ createLiveScene }) => { if (!disposed) { try { scene = createLiveScene(stage.current, options); renderer.current = scene; setMode('3d'); } catch { fallback(); } } }).catch(fallback);\n return () => { disposed = true; scene?.dispose(); if (renderer.current === scene) renderer.current = null; };\n }, [active, arena, prefer2d]);\n useEffect(() => {\n if (!active || game.status !== 'active' || !stage.current) return undefined;\n let disposed = false; let frame = 0; let last = performance.now(); let published = 0; let outcome = null;\n const tracker = createSelfTracker(); const keys = new Set();\n startTanksSounds();\n let session;\n try {\n const signaling = useChatGames.getState().createLiveSignaling(gameKey);\n session = createLiveMatch({ iceServers: rtcOptions?.iceServers, iceTransportPolicy: rtcOptions?.iceTransportPolicy, game, selfId: String(currentUserId), isHost: String(game.hostId) === String(currentUserId), signaling });\n match.current = session;\n } catch (e) { setError(e.message || 'No se pudo iniciar WebRTC'); return undefined; }\n setArena(session.getRender().arena);\n function clear() { keys.clear(); stopInput(input.current); stopAllTanksLoops(); }\n function key(event, down) {\n if (/^(INPUT|TEXTAREA|SELECT)$/.test(event.target?.tagName)) return;\n if (!['KeyW', 'KeyA', 'KeyS', 'KeyD', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Space'].includes(event.code)) return;\n event.preventDefault(); if (down) keys.add(event.code); else keys.delete(event.code);\n input.current.throttle = Number(keys.has('KeyW') || keys.has('ArrowUp')) - Number(keys.has('KeyS') || keys.has('ArrowDown'));\n input.current.steer = Number(keys.has('KeyD') || keys.has('ArrowRight')) - Number(keys.has('KeyA') || keys.has('ArrowLeft'));\n input.current.fire = keys.has('Space');\n }\n const down = (e) => key(e, true); const up = (e) => key(e, false);\n const host = stage.current;\n host.addEventListener('keydown', down); host.addEventListener('keyup', up); host.addEventListener('blur', clear);\n const visibility = () => { if (document.hidden) clear(); };\n document.addEventListener('visibilitychange', visibility);\n handleSceneEvent({ type: 'engine_start' }, gameKey);\n function tick(now) {\n if (disposed) return;\n const dt = Math.min(80, now - last); last = now;\n const paused = suspendedRef.current || document.hidden;\n session.setInput(paused ? { throttle: 0, steer: 0, fire: false } : input.current);\n session.step(dt); const state = session.getRender();\n if (!paused) renderer.current?.render(state, dt);\n if (paused) { keys.clear(); tracker.reset(); stopAllTanksLoops(); }\n if (!paused) for (const event of state.events || []) for (const sound of soundEventsFor(event)) handleSceneEvent(sound, event.id);\n if (!paused) for (const event of tracker.update(selfTank(state.tanks), dt)) handleSceneEvent(event);\n const nextOutcome = outcomeFor(state);\n if (nextOutcome && !outcome) { setView(state); outcome = nextOutcome; if (!paused) playOutcome(outcome, gameKey); useChatGames.getState().liveFinish?.(gameKey, state.winner); }\n if (now - published > 100) { published = now; setView(state); }\n frame = requestAnimationFrame(tick);\n }\n frame = requestAnimationFrame(tick);\n return () => {\n disposed = true; cancelAnimationFrame(frame); clear(); session.destroy(); match.current = null;\n host.removeEventListener('keydown', down); host.removeEventListener('keyup', up); host.removeEventListener('blur', clear); document.removeEventListener('visibilitychange', visibility);\n };\n }, [active, gameKey, currentUserId]);\n if (!game) return null;\n const guest = String(currentUserId) === String(game.guestId);\n const over = view?.status === 'over' || game.status === 'won';\n const net = view?.net;\n const manual = net?.manualTurn;\n const configuring = ['waiting_peer', 'sharing', 'applying'].includes(manual?.status);\n const connectionProblem = !connected && (waitingMs >= 12000 || net?.phase === 'failed' || net?.ice === 'failed' || manual?.status === 'failed' || Boolean(error));\n const routeText = connected ? (net?.route?.relay === true ? 'TURN Relay' : net?.route?.relay === false ? 'P2P' : null) : null;\n const applyTurn = async (json, options) => {\n if (!match.current?.configureTurn) throw new Error('La partida aún no está preparada. Espera un momento y vuelve a intentarlo.');\n await match.current.configureTurn(json, options);\n };\n\n function aim(event) {\n const rect = stage.current?.getBoundingClientRect(); const me = selfTank(view?.tanks);\n if (!rect || !me) return;\n const ground = renderer.current?.screenToGround((event.clientX - rect.left) / rect.width * 2 - 1, 1 - (event.clientY - rect.top) / rect.height * 2);\n if (ground) input.current.turretYaw = Math.atan2(ground.z - me.z, ground.x - me.x);\n }\n const hold = (field, value) => ({ onPointerDown: (e) => { e.preventDefault(); e.currentTarget.setPointerCapture(e.pointerId); input.current[field] = value; }, onPointerUp: () => { input.current[field] = field === 'fire' ? false : 0; }, onPointerCancel: () => { input.current[field] = field === 'fire' ? false : 0; }, onLostPointerCapture: () => { input.current[field] = field === 'fire' ? false : 0; } });\n return <section className={`chat-game-card tl-card${active ? ' tl-card--active' : ''}`} aria-label=\"Tanques LIVE 3D\">\n <header className=\"tl-header\"><strong>Tanques LIVE 3D</strong><div className=\"tl-header-actions\"><GameSoundControls manager={getTanksSoundManager()} />{onMinimize && <button onClick={onMinimize} aria-label=\"Minimizar\">−</button>}{onDismiss && <button onClick={onDismiss} aria-label=\"Ocultar\">×</button>}</div></header>\n {game.status === 'invited' && <div className=\"tl-invite\"><span className=\"tl-invite-icon\" aria-hidden=\"true\">🪖</span><strong>{guest ? '¿Listo para combatir?' : 'Invitación enviada'}</strong><p>{guest ? 'Te invitaron a un combate en tiempo real.' : 'Esperando que el rival acepte…'}</p>{guest && <div className=\"tl-invite-actions\"><button className=\"tl-button-primary\" onClick={() => act(gameKey, 'game_accept')}>Aceptar combate</button><button onClick={() => act(gameKey, 'game_decline')}>Rechazar</button></div>}</div>}\n {active && !over && <div className={`tl-connection tl-connection--${connected ? 'connected' : connectionProblem ? 'problem' : 'pending'}`}>\n <div className=\"tl-connection-heading\">{connected ? <CheckCircle2 size={18} aria-hidden=\"true\" /> : connectionProblem ? <AlertTriangle size={18} aria-hidden=\"true\" /> : <Loader2 size={18} className=\"tl-connection-spinner\" aria-hidden=\"true\" />}<div><strong>{connectionProblem ? 'Problemas de conexión' : connectionText(net, false)}</strong>{connectionProblem && <p>No pudimos establecer una conexión con el otro jugador. Puedes configurar una conexión alternativa para continuar.</p>}</div>{routeText && <span className=\"tl-route-badge\">{routeText}</span>}</div>\n {!connected && <p className=\"tl-connection-message\" role=\"status\">{connectionProblem ? connectionText(net, waitingMs >= 12000) : connectionHint(net)}</p>}\n {manual?.status === 'synchronized' && <p className=\"tl-connection-shared\" role=\"status\">{manual.received ? 'Configuración recibida del otro jugador y aplicada en ambos.' : 'Configuración compartida y aplicada en ambos jugadores.'}</p>}\n {manual?.expiresAt != null && manual.expiresAt <= Date.now() && <p className=\"tl-connection-expired\" role=\"status\">La validez indicada para las credenciales terminó. Introduce una configuración nueva si necesitas reconectar.</p>}\n <div className=\"tl-connection-actions\"><button type=\"button\" className={connectionProblem ? 'tl-button-primary' : ''} onClick={() => setTurnOpen(true)}><Settings2 size={15} aria-hidden=\"true\" />Configurar conexión alternativa</button>{!connected && <button type=\"button\" disabled={configuring} onClick={() => match.current?.reconnect()}><Link2 size={15} aria-hidden=\"true\" />Reintentar conexión</button>}</div>\n </div>}\n <ManualTurnDialog open={turnOpen && active && !over} onClose={() => setTurnOpen(false)} onApply={applyTurn} manualTurn={manual} />\n {(active || view) && <><div className=\"tl-hud\">{(view?.tanks || []).map((tank) => <span key={tank.id}>{tank.self ? 'Tú' : 'Rival'} <meter min=\"0\" max=\"100\" value={tank.hp} aria-label={tank.self ? 'Tu vida' : 'Vida del rival'} /> {tank.hp} HP</span>)}<span role=\"status\">{connected ? routeText || 'Conectado' : connectionText(net, waitingMs >= 12000)} {Number.isFinite(net?.rtt) ? `· ${Math.round(net.rtt)} ms` : ''}</span></div>\n <div className=\"tl-stage\" ref={stage} tabIndex={0} aria-label=\"Arena. WASD o flechas para conducir, ratón para apuntar, clic o espacio para disparar\" onPointerMove={aim} onPointerDown={(e) => { aim(e); if (e.pointerType === 'mouse') { e.currentTarget.focus(); e.currentTarget.setPointerCapture(e.pointerId); aim(e); input.current.fire = true; } }} onPointerUp={() => { input.current.fire = false; }} onPointerCancel={() => { stopInput(input.current); }} onLostPointerCapture={() => { input.current.fire = false; }} />\n <div className=\"tl-controls\"><div className=\"tl-joystick\" role=\"group\" aria-label=\"Joystick de conducción\" onPointerDown={(e) => { e.preventDefault(); e.currentTarget.setPointerCapture(e.pointerId); const r = e.currentTarget.getBoundingClientRect(); input.current.steer = Math.max(-1, Math.min(1, (e.clientX - r.left - r.width / 2) / (r.width / 2))); input.current.throttle = Math.max(-1, Math.min(1, -(e.clientY - r.top - r.height / 2) / (r.height / 2))); }} onPointerMove={(e) => { if (!e.currentTarget.hasPointerCapture(e.pointerId)) return; const r = e.currentTarget.getBoundingClientRect(); input.current.steer = Math.max(-1, Math.min(1, (e.clientX - r.left - r.width / 2) / (r.width / 2))); input.current.throttle = Math.max(-1, Math.min(1, -(e.clientY - r.top - r.height / 2) / (r.height / 2))); }} onPointerUp={() => stopInput(input.current)} onPointerCancel={() => stopInput(input.current)} onLostPointerCapture={() => stopInput(input.current)}>✥</div><div className=\"tl-drive\" aria-label=\"Controles de conducción\"><button aria-label=\"Avanzar\" {...hold('throttle', 1)}>▲</button><button aria-label=\"Girar izquierda\" {...hold('steer', -1)}>◀</button><button aria-label=\"Retroceder\" {...hold('throttle', -1)}>▼</button><button aria-label=\"Girar derecha\" {...hold('steer', 1)}>▶</button></div><button className=\"tl-fire\" {...hold('fire', true)}>Disparar</button></div>\n <div className=\"tl-reload\"><label>Recarga <progress max=\"1\" value={selfTank(view?.tanks)?.reload ?? 1} /> {(selfTank(view?.tanks)?.reload ?? 1) >= 1 ? 'Listo' : 'Recargando…'}</label></div>\n <small>WASD / flechas · ratón o toca la arena para apuntar · espacio / clic para disparar</small><button onClick={() => setPrefer2d((v) => !v)}>{mode === '2d' ? 'Probar 3D' : 'Vista 2D'}</button>\n </>}\n {over && <p role=\"status\">{String(view?.winner ?? game.winnerId) === String(currentUserId) ? '¡Victoria!' : 'Fin del combate'} <button onClick={() => { void Promise.resolve(useChatGames.getState().liveRematch?.(gameKey)).catch(() => {}); }}>Revancha</button></p>}\n {active && <details className=\"tl-diagnostics\"><summary>Diagnóstico de conexión</summary><pre>{JSON.stringify(connectionDiagnostics(view?.net), null, 2)}</pre></details>}\n {active && !over && <button onClick={() => match.current?.resign()}>Rendirse</button>}\n {game.pending && <p role=\"status\">Enviando…</p>}{game.pendingEvent && game.error && <button onClick={() => { void useChatGames.getState().retry(gameKey).catch(() => {}); }}>Reintentar envío</button>}\n {error && <p role=\"alert\">{error}</p>}{game.error && <p role=\"alert\">{game.error}</p>}\n {!['closed', 'declined'].includes(game.status) && <footer className=\"tl-footer\"><button onClick={() => act(gameKey, 'game_end')}>Cerrar partida</button></footer>}\n </section>;\n}\nexport default memo(TanksLiveGameCard);\n"],"mappings":"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"}