@minicode-dev/chat 0.1.11 → 0.1.13

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 (33) hide show
  1. package/README.md +102 -6
  2. package/assets/sounds/effects/avalanche.mp3 +0 -0
  3. package/dist/chunks/{TanksGameCard-B47ZQcSr.js → TanksGameCard-GrqmdwJ7.js} +2 -2
  4. package/dist/chunks/{TanksGameCard-B47ZQcSr.js.map → TanksGameCard-GrqmdwJ7.js.map} +1 -1
  5. package/dist/chunks/TanksLiveGameCard-DSmQcUMh.js +1225 -0
  6. package/dist/chunks/TanksLiveGameCard-DSmQcUMh.js.map +1 -0
  7. package/dist/chunks/{WebRtcLab-lijo_Rta.js → WebRtcLab-ClRSYt4E.js} +2 -2
  8. package/dist/chunks/{WebRtcLab-lijo_Rta.js.map → WebRtcLab-ClRSYt4E.js.map} +1 -1
  9. package/dist/chunks/avalancheScene3d-Dnl2E3EA.js +1878 -0
  10. package/dist/chunks/avalancheScene3d-Dnl2E3EA.js.map +1 -0
  11. package/dist/chunks/createLiveScene-819NWv84.js +365 -0
  12. package/dist/chunks/createLiveScene-819NWv84.js.map +1 -0
  13. package/dist/chunks/createPeerLink-DBVs_yvQ.js +1136 -0
  14. package/dist/chunks/createPeerLink-DBVs_yvQ.js.map +1 -0
  15. package/dist/chunks/{createTankScene-CV7Brxmt.js → createTankScene-6asWHKFf.js} +120 -119
  16. package/dist/chunks/{createTankScene-CV7Brxmt.js.map → createTankScene-6asWHKFf.js.map} +1 -1
  17. package/dist/chunks/fx-BNJvJYOu.js +871 -0
  18. package/dist/chunks/fx-BNJvJYOu.js.map +1 -0
  19. package/dist/chunks/tank-DIn6Jyt8.js +605 -0
  20. package/dist/chunks/tank-DIn6Jyt8.js.map +1 -0
  21. package/dist/index.js +1581 -1184
  22. package/dist/index.js.map +1 -1
  23. package/dist/styles.css +1 -1
  24. package/index.d.ts +23 -3
  25. package/package.json +1 -1
  26. package/dist/chunks/TanksLiveGameCard-BNJqWt1z.js +0 -915
  27. package/dist/chunks/TanksLiveGameCard-BNJqWt1z.js.map +0 -1
  28. package/dist/chunks/createLiveScene-CJQtq54t.js +0 -364
  29. package/dist/chunks/createLiveScene-CJQtq54t.js.map +0 -1
  30. package/dist/chunks/createPeerLink-CL7VZuHS.js +0 -480
  31. package/dist/chunks/createPeerLink-CL7VZuHS.js.map +0 -1
  32. package/dist/chunks/fx-BHsl4S_J.js +0 -1470
  33. package/dist/chunks/fx-BHsl4S_J.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"TanksLiveGameCard-BNJqWt1z.js","names":["_Fragment","useChatGames","GameSoundControls","decodeSignal","createPeerLink","encodeSignal","ChatContext","stopAllTanksLoops","startTanksSounds","handleSceneEvent","playOutcome","getTanksSoundManager","__defProp","__exportAll","target","name","all","no_symbols","connectionDiagnostics","net","connectionHint","RULES","clamp","lo","hi","n","angleDelta","b","a","createArena","x","z","r","i","createTank","id","index","validPosition","arena","radius","o","moveTank","tank","throttle","input","steer","dt","segmentCircle","dx","bx","ax","dz","bz","az","length","t","cx","cz","advanceShell","shell","first","tanks","interpolatePose","fraction","finite","idValid","createLiveMatch","selfId","game","ids","turnConfigured","iceServers","server","url","peerId","shells","events","time","sendAt","round","sequence","status","winner","destroyed","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","s","peerFactory","signaling","signal","text","scoped","frame","listener","previousPhase","state","resumed","next","dtMs","renderTime","remaining","hz","hit","out","RAD_TO_DEG","num","value","fallback","arenaBounds","withSize","w","d","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","h","scale","ox","oz","resize","dpr","ro","nx","ny","obstacle","TanksLiveGameCard_exports","TanksLiveGameCard_default","act","type","stopInput","TanksLiveGameCard","rtcOptions","useContext","gameKey","suspendedRef","useRef","suspended","stage","match","renderer","view","setView","useState","error","setError","prefer2d","setPrefer2d","mode","setMode","active","setArena","useEffect","disposed","scene","options","createLiveScene","published","outcome","tracker","keys","session","currentUserId","clear","down","up","host","visibility","tick","now","paused","sound","nextOutcome","guest","over","aim","rect","ground","hold","field","onMinimize","onDismiss","Fragment","memo"],"sources":["../../src/games/tanks-live/net/connectionDiagnostics.js","../../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":["// Deliberately excludes SDP, ICE addresses, account IDs and TURN credentials.\nexport function connectionDiagnostics(net = {}) {\n return {\n phase: net.phase ?? 'idle', ice: net.ice ?? 'new',\n connection: net.connection ?? 'new', gathering: net.gathering ?? 'new',\n signaling: {\n sent: net.signals?.sent ?? 0, received: net.signals?.received ?? 0,\n sendFailures: net.signals?.sendFailures ?? 0,\n ignored: net.signals?.ignored ?? 0, invalid: net.signals?.invalid ?? 0,\n retransmits: net.signals?.retransmits ?? 0,\n },\n turnConfigured: Boolean(net.turnConfigured),\n route: net.route?.label ?? null,\n movesSent: net.move?.sent ?? 0, movesReceived: net.move?.received ?? 0,\n error: net.error ? (/^[a-z_]+$/.test(net.error) ? net.error : 'negotiation_error') : null,\n };\n}\n\nexport function connectionHint(net = {}) {\n if (net.phase === 'connected') return '';\n if (net.signals?.sendFailures) return 'No se pudieron enviar señales por el chat. Revisa la conexión WebSocket y reintenta.';\n if (net.ice === 'checking' || net.ice === 'failed') return net.turnConfigured\n ? 'WebRTC aún no encuentra una ruta entre los jugadores. Revisa el servicio TURN y la red.'\n : 'WebRTC aún no encuentra una ruta entre los jugadores. Algunas redes necesitan un servidor TURN; esta partida no tiene uno configurado.';\n if (net.phase === 'listening') return 'Esperando la conexión del rival. Ambos deben mantener abierta la partida y usar la misma versión del chat.';\n if (net.phase === 'failed') return 'No se pudo conectar. Revisa el diagnóstico de ambos jugadores y reintenta.';\n return 'Intercambiando señales de conexión por el chat. El combate empieza cuando conecta WebRTC.';\n}\n","// 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' }; }\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 => Math.hypot(x - o.x, z - o.z) < o.r + radius);\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}\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) { const t = segmentCircle(shell.x, shell.z, x, z, o.x, o.z, o.r); if (t !== null && (!first || t < first.t)) first = { t, kind: 'obstacle' }; }\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: [] }, 0) || shell.age > 3 ? { kind: 'terrain' } : 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 turnConfigured = (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 = []; 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({ 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 } }; events = []; return out; },\n reconnect() { if (!destroyed && status !== 'over') 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 { 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 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 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 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 || 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\">{view?.net?.phase || 'Conectando WebRTC…'} {view?.net?.route?.label || (typeof view?.net?.route === 'string' ? view.net.route : '')} {Number.isFinite(view?.net?.rtt) ? `${Math.round(view.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 && !over && view?.net?.phase !== 'connected' && <div className=\"tl-connection\">\n <p role=\"status\">{connectionHint(view?.net)}</p>\n <button type=\"button\" onClick={() => match.current?.reconnect()}>Reintentar conexión</button>\n </div>}\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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"}
@@ -1,364 +0,0 @@
1
- import { a as e, c as t, i as n, l as r, n as i, o as a, r as o, s } from "./TanksLiveGameCard-BNJqWt1z.js";
2
- import { _ as c, a as l, c as u, d, f, h as p, i as m, l as ee, m as te, n as h, o as ne, p as re, r as ie, s as ae, t as oe, u as se } from "./fx-BHsl4S_J.js";
3
- import { ACESFilmicToneMapping as ce, DirectionalLight as le, DynamicDrawUsage as ue, Fog as de, Group as fe, HemisphereLight as pe, InstancedMesh as me, Matrix4 as he, MeshBasicMaterial as ge, MeshLambertMaterial as _e, MeshStandardMaterial as ve, PCFSoftShadowMap as ye, PerspectiveCamera as be, Plane as xe, PlaneGeometry as Se, Raycaster as Ce, Scene as we, Vector2 as Te, Vector3 as g, WebGLRenderer as Ee, sRGBEncoding as De } from "three";
4
- // src/games/tanks-live/scene/createLiveScene.js
5
- var _ = 4, Oe = 8, v = 14, ke = 2, Ae = 1 / 15, je = new g(.62, .42, .66).normalize(), Me = {
6
- green: "green",
7
- red: "red"
8
- }, Ne = {
9
- green: p("#22c55e"),
10
- red: p("#ef4444"),
11
- gold: p("#fbbf24")
12
- };
13
- function Pe(e, t, n) {
14
- let r = c(n), i = [
15
- r() * 6.28,
16
- r() * 6.28,
17
- r() * 6.28,
18
- r() * 6.28
19
- ], a = new Float32Array(e * e), o = t / (e - 1);
20
- for (let t = 0; t < e; t++) for (let n = 0; n < e; n++) {
21
- let r = n * o, s = t * o;
22
- a[t * e + n] = 2 + .45 * Math.sin(r * .07 + i[0]) * Math.cos(s * .06 + i[1]) + .3 * Math.sin(r * .16 + s * .11 + i[2]) + .18 * Math.cos(r * .23 - s * .19 + i[3]);
23
- }
24
- return a;
25
- }
26
- function y(y, { arena: Fe, lowPower: b = !1, reducedMotion: x = !1, onEvent: Ie } = {}) {
27
- if (!y) throw Error("createLiveScene: container element required");
28
- let Le = (e) => {
29
- try {
30
- Ie?.(e);
31
- } catch {}
32
- }, S = b ? "low" : "high", C = o(Fe), w = Math.ceil((Math.max(C.width, C.depth) + 28) / ke) * ke, T = v - C.minX, E = v - C.minZ, D = !1, Re = typeof window < "u" && window.devicePixelRatio || 1, O = new Ee({
33
- antialias: !b || Re < 2,
34
- alpha: !1,
35
- stencil: !1,
36
- powerPreference: "high-performance"
37
- });
38
- O.outputEncoding = De, O.toneMapping = ce, O.toneMappingExposure = 1.05, O.shadowMap.enabled = !b, O.shadowMap.type = ye, O.setPixelRatio(Math.min(Re, b ? 1.25 : 1.75)), O.setClearColor(ae.horizon, 1);
39
- let k = O.domElement;
40
- k.style.display = "block", k.style.width = "100%", k.style.height = "100%", k.style.outline = "none", y.appendChild(k);
41
- let A = Math.max(1, y.clientWidth), j = Math.max(1, y.clientHeight);
42
- O.setSize(A, j, !1);
43
- let ze = !1, Be = (e) => {
44
- e?.preventDefault?.(), ze = !0, Le({ type: "context_lost" });
45
- };
46
- k.addEventListener("webglcontextlost", Be);
47
- let M = new we();
48
- M.fog = new de(ae.fog.clone(), 70, 320);
49
- let N = new be(55, A / j, .5, 1400), P = new fe();
50
- M.add(P);
51
- let Ve = new pe(p("#ffd2b0"), p("#33402f"), b ? .8 : .6), F = new le(p("#ffbe7a"), 1.9);
52
- if (!b) {
53
- F.castShadow = !0, F.shadow.mapSize.set(1024, 1024), F.shadow.bias = -6e-4, F.shadow.normalBias = .04;
54
- let e = F.shadow.camera;
55
- e.left = -42, e.right = 42, e.top = 42, e.bottom = -42, e.near = 20, e.far = 320, e.updateProjectionMatrix();
56
- }
57
- M.add(Ve, F, F.target);
58
- let I = new g(w / 2, 0, w / 2), He = ee(je);
59
- M.add(He.mesh);
60
- let Ue = u(I, je);
61
- M.add(Ue.mesh);
62
- let L = se(), We = w / ke + 1;
63
- L.setHeights({
64
- heights: Pe(We, w, Number(Fe?.seed) || 7),
65
- grid: We,
66
- size: w
67
- }), P.add(L.mesh);
68
- let R = ne();
69
- R.setQuality(S), R.setShadows(!b);
70
- let Ge = n(Fe), Ke = [], qe = [];
71
- for (let e of Ge) {
72
- let t = e.x + T, n = e.z + E;
73
- e.kind === "tree" ? Ke.push({
74
- kind: "tree",
75
- x: t,
76
- z: n,
77
- scale: re(e.r / 1.3, .7, 2.2)
78
- }) : qe.push({
79
- kind: "rock",
80
- x: t,
81
- z: n,
82
- w: e.r * 2,
83
- d: e.r * 2,
84
- h: e.r * 1.2
85
- });
86
- }
87
- {
88
- let e = c(31), t = b ? 40 : 90;
89
- for (let n = 0; n < t; n++) {
90
- let t = n % 4, r = e() * w, i = 2 + e() * 9, a = t === 0 ? i : t === 1 ? w - i : r, o = t === 2 ? i : t === 3 ? w - i : r;
91
- Ke.push({
92
- kind: "tree",
93
- x: a,
94
- z: o,
95
- scale: .8 + e() * .7
96
- });
97
- }
98
- }
99
- R.build(P, {
100
- decor: Ke,
101
- obstacles: qe
102
- }, L);
103
- let Je = [];
104
- {
105
- let e = c(53), t = b ? 7 : 4.5, n = (n, r, i, a) => {
106
- let o = Math.hypot(i - n, a - r), s = Math.max(1, Math.round(o / t));
107
- for (let t = 0; t <= s; t++) {
108
- let o = t / s;
109
- Je.push({
110
- kind: "rock",
111
- x: n + (i - n) * o,
112
- z: r + (a - r) * o,
113
- scale: .45 + e() * .35
114
- });
115
- }
116
- }, r = v + C.width + 1, i = v + C.depth + 1;
117
- n(13, 13, r, 13), n(r, 13, r, i), n(r, i, 13, i), n(13, i, 13, 13);
118
- }
119
- let Ye = ne();
120
- Ye.setQuality(S), Ye.build(P, {
121
- decor: Je,
122
- obstacles: []
123
- }, L);
124
- let z = oe(M, {
125
- quality: S,
126
- reducedMotion: x,
127
- heightAt: L.heightAt
128
- }), Xe = m(), B = l();
129
- B.wheelMat = b ? new _e({ vertexColors: !0 }) : new ve({
130
- vertexColors: !0,
131
- roughness: .7,
132
- metalness: .25
133
- });
134
- let V = new me(Xe.wheel, B.wheelMat, _ * h.length);
135
- V.instanceMatrix.setUsage(ue), V.frustumCulled = !1, V.count = 0, P.add(V);
136
- let Ze = f(64), Qe = new Se(1, 1);
137
- Qe.rotateX(-Math.PI / 2);
138
- let $e = new ge({
139
- map: Ze,
140
- transparent: !0,
141
- depthWrite: !1,
142
- polygonOffset: !0,
143
- polygonOffsetFactor: -2,
144
- polygonOffsetUnits: -2
145
- }), H = new me(Qe, $e, _);
146
- H.frustumCulled = !1, H.count = 0, H.renderOrder = 2, P.add(H);
147
- let U = /* @__PURE__ */ new Map(), W = new g(), G = new g(), et = new he(), tt = new g();
148
- function nt(e, t) {
149
- let n = String(e.id), r = U.get(n);
150
- if (r && r.alive === !1 && e.alive !== !1 && (rt(n), r = null), r) return r;
151
- let i = Me[e.color] || (t === 0 ? "green" : "red"), a = ie(Xe, B, {
152
- id: n,
153
- color: i,
154
- quality: S
155
- });
156
- return a.setShadows(!b), P.add(a.root), a.state.pitch = 4, r = {
157
- t: a,
158
- color: i,
159
- alive: !0,
160
- last: null,
161
- dustAcc: 0,
162
- exhaustAcc: 0,
163
- seen: !0
164
- }, U.set(n, r), r;
165
- }
166
- function rt(e) {
167
- let t = U.get(e);
168
- t && (t.t.state.blown && t.t.turret.removeFromParent(), t.t.dispose(), U.delete(e));
169
- }
170
- function it(e, t) {
171
- let n = e.state;
172
- if (n.blown) return;
173
- if (P.attach(e.turret), !t) {
174
- let t = (n.hullYaw + 120) * d, r = n.x + Math.cos(t) * 4.5, i = n.z + Math.sin(t) * 4.5;
175
- e.turret.position.set(r, L.heightAt(r, i) + .2, i), e.turret.rotation.set(.5, t, 2.6), n.blown = {
176
- p: e.turret.position.clone(),
177
- v: new g(),
178
- w: new g(),
179
- landed: !0
180
- };
181
- return;
182
- }
183
- let r = Math.random() * Math.PI * 2;
184
- n.blown = {
185
- p: e.turret.position.clone(),
186
- v: new g(Math.cos(r) * 3.5, 15, Math.sin(r) * 3.5),
187
- w: new g((Math.random() - .5) * 6, (Math.random() - .5) * 5, (Math.random() - .5) * 6),
188
- landed: !1
189
- };
190
- }
191
- function at(e, t) {
192
- let n = e.state.blown;
193
- if (!n || n.landed) return;
194
- n.v.y -= 20 * t, n.p.addScaledVector(n.v, t), e.turret.rotation.x += n.w.x * t, e.turret.rotation.y += n.w.y * t, e.turret.rotation.z += n.w.z * t;
195
- let r = L.heightAt(n.p.x, n.p.z) + .25;
196
- n.p.y < r && n.v.y < 0 && (n.p.y = r, n.v.y < -5 ? (n.v.y *= -.25, n.v.x *= .5, n.v.z *= .5, n.w.multiplyScalar(.4), z.dust(n.p.x, r, n.p.z, 2)) : n.landed = !0), e.turret.position.copy(n.p);
197
- }
198
- let K = /* @__PURE__ */ new Map(), ot = Array.from({ length: Oe }, (e, t) => t);
199
- function st(e) {
200
- let t = /* @__PURE__ */ new Set();
201
- for (let n of e || []) {
202
- let e = String(n.id);
203
- t.add(e);
204
- let r = n.x + T, i = n.z + E, a = Number.isFinite(n.y) ? n.y + ct : L.heightAt(r, i) + 1.8, o = K.get(e);
205
- if (o == null) {
206
- if (!ot.length) continue;
207
- o = ot.pop(), K.set(e, o), z.projShow(o, r, a, i, !1);
208
- } else z.projMove(o, r, a, i);
209
- }
210
- for (let [e, n] of K) t.has(e) || (z.projHide(n), K.delete(e), ot.push(n));
211
- }
212
- let ct = 2, q = {
213
- pos: new g(),
214
- target: new g(),
215
- yaw: 0,
216
- snap: !0,
217
- shake: 0,
218
- orbit: 0
219
- }, J = !1;
220
- function lt() {
221
- let e = A / j;
222
- J = e < .85, N.fov = J ? 68 : e < 1.25 ? 60 : 52, N.aspect = e, N.updateProjectionMatrix();
223
- }
224
- lt();
225
- function Y(e) {
226
- x || (q.shake = Math.max(q.shake, e));
227
- }
228
- function ut(e, t) {
229
- if (!t) q.pos.set(I.x, 70, I.z + w * .55), q.target.set(I.x, 2, I.z);
230
- else {
231
- let n = t.t.state, i = J ? 19 : 15, a = J ? 15 : 10.5, o = J ? 14 : 12;
232
- if (t.alive) {
233
- let t = r(n.hullYaw * d - q.yaw);
234
- q.yaw += t * (q.snap ? 1 : te(2.6, e));
235
- let s = Math.cos(q.yaw), c = Math.sin(q.yaw);
236
- W.set(n.x - s * i, n.y + a, n.z - c * i), G.set(n.x + s * o, n.y + 1, n.z + c * o);
237
- } else q.orbit += e * (x ? 0 : .3), W.set(n.x + Math.cos(q.orbit) * 20, n.y + 9, n.z + Math.sin(q.orbit) * 20), G.set(n.x, n.y + 2, n.z);
238
- let s = L.heightAt(W.x, W.z) + 2.5;
239
- W.y < s && (W.y = s), q.snap ? (q.pos.copy(W), q.target.copy(G), q.orbit = Math.atan2(q.pos.z - n.z, q.pos.x - n.x)) : (q.pos.lerp(W, te(6, e)), q.target.lerp(G, te(8, e))), q.snap = !1;
240
- }
241
- if (N.position.copy(q.pos), q.shake > .002) {
242
- let t = q.shake;
243
- N.position.x += (Math.random() - .5) * t, N.position.y += (Math.random() - .5) * t, N.position.z += (Math.random() - .5) * t, q.shake *= Math.exp(-7 * e);
244
- } else q.shake = 0;
245
- N.lookAt(q.target), b || (F.target.position.copy(q.target), F.position.copy(q.target).addScaledVector(je, 200));
246
- }
247
- let X = null;
248
- function dt(e, n) {
249
- let r = a(e);
250
- if (r === "fire") {
251
- let t = s(e, n), r = t ? U.get(String(t.id)) : null;
252
- if (!r) return;
253
- r.t.state.recoil = 1, r.t.muzzleWorld(W), r.t.gunDirWorld(G), z.muzzle(W, G), t.self && Y(.18);
254
- } else if (r === "impact") {
255
- if (!Number.isFinite(e.x) || !Number.isFinite(e.z)) return;
256
- let t = e.x + T, n = e.z + E, r = L.heightAt(t, n);
257
- z.explosion(t, r, n, 3, e.kind === "obstacle" ? "obstacle" : "terrain"), L.crater(t, n, 2.2, 0), R.blast(L, t, n, 2.5);
258
- } else if (r === "hit") {
259
- let r = t(n, e.target), i = r ? U.get(String(r.id)) : null, a = Number.isFinite(e.x) ? e.x + T : i?.t.state.x, o = Number.isFinite(e.z) ? e.z + E : i?.t.state.z;
260
- if (a == null) return;
261
- let s = (i ? i.t.state.y : L.heightAt(a, o)) + 1.6;
262
- z.hitSparks(a, s, o), z.explosion(a, s, o, 2.6, "tank"), i && (i.t.state.hitFlash = 1), Y(r?.self ? .9 : .25);
263
- } else if (r === "destroyed") {
264
- let r = t(n, e.target), i = r ? U.get(String(r.id)) : null;
265
- if (!i) return;
266
- let a = i.t.state;
267
- z.bigExplosion(a.x, a.y, a.z), R.blast(L, a.x, a.z, 6), L.crater(a.x, a.z, 4, 0), i.t.setCharred(!0), it(i.t, !x), i.alive = !1, Y(r.self ? 1.4 : .6);
268
- } else r === "over" && (X = {
269
- id: e.winner == null ? null : String(e.winner),
270
- t: 0,
271
- next: .2
272
- });
273
- }
274
- let ft = {
275
- tanks: 0,
276
- shells: 0,
277
- particles: 0,
278
- calls: 0,
279
- triangles: 0
280
- }, Z = null;
281
- function pt(t, n = 16) {
282
- if (D || ze) return;
283
- let a = re((Number(n) || 16) / 1e3, .001, Ae), o = t && t.tanks || [];
284
- for (let e of U.values()) e.seen = !1;
285
- let s = 0, c = 0;
286
- Z = null, o.forEach((t, n) => {
287
- if (!Number.isFinite(t.x) || !Number.isFinite(t.z)) return;
288
- let o = nt(t, n);
289
- o.seen = !0;
290
- let l = o.t, u = l.state, f = t.x + T, p = t.z + E, m = (t.yaw ?? 0) * i;
291
- if (o.last) {
292
- let e = f - o.last.x, t = p - o.last.z, n = e * Math.cos(m * d) + t * Math.sin(m * d), i = r((m - o.last.yaw) * d) * 1.4;
293
- (Math.abs(n) > 1e-4 || Math.abs(i) > 1e-4) && l.scrollTracks(Math.abs(n) > 1e-4 ? n : i);
294
- let s = Math.hypot(e, t) / a;
295
- if (s > 1 && o.alive) for (o.dustAcc += a * s * (b ? .5 : 1); o.dustAcc > 1.4;) o.dustAcc -= 1.4, l.localToWorld(W, -2.6, 0, (Math.random() - .5) * 2.6), z.dust(W.x, L.heightAt(W.x, W.z), W.z, .9);
296
- }
297
- if (o.last = {
298
- x: f,
299
- z: p,
300
- yaw: m
301
- }, o.alive && t.alive !== !1) for (o.exhaustAcc += a * (b ? 3 : 6); o.exhaustAcc > 1;) --o.exhaustAcc, l.localToWorld(W, -2.9, 1.3, .8), z.exhaust(W.x, W.y, W.z);
302
- u.x = f, u.z = p, u.y = L.heightAt(f, p), u.hullYaw = m, u.yaw = (t.turretYaw ?? t.yaw ?? 0) * i, u.hp = t.hp ?? u.hp, t.alive === !1 && o.alive && (o.alive = !1, l.setCharred(!0), it(l, !1)), u.recoil > 0 && (u.recoil = Math.max(0, u.recoil - a * 4)), u.hitFlash > 0 && (u.hitFlash = Math.max(0, u.hitFlash - a * 3), l.setFlash(u.hitFlash)), l.place(L, a), at(l, a);
303
- let ee = e(t.hp ?? 100, o.alive);
304
- ee > 0 && (l.localToWorld(W, -.6, 2.2, 0), z.emitDamage(W.x, W.y, W.z, a, ee, u)), s + h.length <= _ * h.length && (l.writeWheels(V, s), s += h.length), b && c < _ && (tt.set(8, 1, 6), et.makeRotationY(-m * d).scale(tt).setPosition(f, u.y + .05, p), H.setMatrixAt(c++, et)), t.self && (Z = o);
305
- });
306
- for (let [e, t] of U) t.seen || rt(e);
307
- V.count = s, V.instanceMatrix.needsUpdate = !0, H.count = c, c && (H.instanceMatrix.needsUpdate = !0), !Z && o.length && (Z = U.get(String(o[0].id)) || null);
308
- for (let e of t && t.events || []) dt(e, o);
309
- if (st(t && t.shells), X) {
310
- X.t += a;
311
- let e = X.id == null ? null : U.get(X.id);
312
- if (e && X.t < 4 && X.t >= X.next && !x) {
313
- X.next += .45;
314
- let t = e.t.state;
315
- z.firework(t.x + (Math.random() - .5) * 8, t.y + 9 + Math.random() * 4, t.z + (Math.random() - .5) * 8, Math.random() < .5 && Ne[e.color] || Ne.gold);
316
- }
317
- X.t > 4 && (X = null);
318
- }
319
- ut(a, Z), z.update(a, N, O, !1), O.render(M, N);
320
- let l = O.info.render;
321
- ft = {
322
- tanks: U.size,
323
- shells: K.size,
324
- particles: z.particleCount,
325
- calls: l.calls,
326
- triangles: l.triangles
327
- };
328
- }
329
- let mt = new Ce(), ht = new Te(), gt = new xe(new g(0, 1, 0), 0), _t = new g();
330
- function vt(e, t) {
331
- if (D) return null;
332
- ht.set(e, t), mt.setFromCamera(ht, N);
333
- let n = Z ? Z.t.state.y + 1 : 2;
334
- return gt.constant = -n, mt.ray.intersectPlane(gt, _t) ? {
335
- x: _t.x - T,
336
- z: _t.z - E
337
- } : null;
338
- }
339
- function Q() {
340
- if (D) return;
341
- let e = y.clientWidth, t = y.clientHeight;
342
- e && t && (A = e, j = t, O.setSize(e, t, !1), lt());
343
- }
344
- let $ = typeof ResizeObserver < "u" ? new ResizeObserver(Q) : null;
345
- return $ ? $.observe(y) : typeof window < "u" && window.addEventListener("resize", Q), {
346
- kind: "3d",
347
- render: pt,
348
- screenToGround: vt,
349
- resize: Q,
350
- getStats() {
351
- return { ...ft };
352
- },
353
- dispose() {
354
- if (!D) {
355
- D = !0, $ ? $.disconnect() : typeof window < "u" && window.removeEventListener("resize", Q), k.removeEventListener("webglcontextlost", Be);
356
- for (let e of Array.from(U.keys())) rt(e);
357
- V.dispose(), B.wheelMat.dispose(), B.dispose(), Xe.dispose(), H.dispose(), Qe.dispose(), $e.dispose(), Ze.dispose(), z.dispose(), R.dispose(), Ye.dispose(), L.dispose(), He.dispose(), Ue.dispose(), F.shadow && F.shadow.map && F.shadow.map.dispose(), M.clear(), O.dispose(), O.forceContextLoss(), k.parentNode && k.parentNode.removeChild(k);
358
- }
359
- }
360
- };
361
- }
362
- export { y as createLiveScene, y as default };
363
-
364
- //# sourceMappingURL=createLiveScene-CJQtq54t.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createLiveScene-CJQtq54t.js","names":["damageLevel","tankById","arenaObstacles","wrapAngle","RAD_TO_DEG","eventKind","arenaBounds","rng","createTankShared","createHills","lin","createTankGeometries","createSky","dampK","WHEELS","createDecor","clamp","createTank","SKY","createFx","createTerrain","MAX_TANKS","MAX_SHELLS","MARGIN","CELL","MAX_DT","SUN_DIR","Vector3","COLORS","FIREWORK","makeHeights","seed","p","h","n","cell","size","iz","ix","x","z","createLiveScene","container","emit","quality","lowPower","bounds","arena","ox","oz","disposed","dpr","renderer","WebGLRenderer","sRGBEncoding","ACESFilmicToneMapping","PCFSoftShadowMap","canvas","width","height","contextLost","onContextLost","scene","Scene","Fog","camera","PerspectiveCamera","world","Group","hemi","HemisphereLight","sun","DirectionalLight","sc","center","sky","hills","terrain","grid","decor","obstacles","decorList","rockList","o","r","count","i","side","t","inset","borderRocks","step","edge","len","x1","x0","z1","z0","bx","bz","borderDecor","fx","tankGeos","tankShared","MeshLambertMaterial","MeshStandardMaterial","wheels","InstancedMesh","DynamicDrawUsage","blobTex","blobTexture","blobGeo","PlaneGeometry","blobMat","MeshBasicMaterial","blobs","tanks","v1","v2","mtx","Matrix4","scl","ensureTank","key","rt","entry","removeTank","color","index","blowTurret","s","animate","a","DEG","updateBlown","b","dt","g","shellSlots","freeSlots","syncShells","seen","list","id","y","terrainBase","slot","cam","portrait","updateFov","aspect","shake","reducedMotion","amount","updateCamera","focus","back","up","ahead","diff","dx","dz","k","celebrate","handleEvent","kind","shooterOf","lastStats","render","dtMs","state","wheelCount","blobCount","hullYaw","fwd","turn","moved","level","w","info","raycaster","Raycaster","ndc","Vector2","ground","Plane","hit","screenToGround","nx","ny","resize","ro"],"sources":["../../src/games/tanks-live/scene/createLiveScene.js"],"sourcesContent":["// TANQUES LIVE 3D — real-time arena scene (three >=0.134 <0.138). Framework-agnostic.\n//\n// createLiveScene(container, { arena, lowPower, reducedMotion, onEvent }) → {\n// render(renderState, dtMs), screenToGround(nx, ny), resize(), getStats(), dispose()\n// }\n// Reuses the turn-based Tanks look (terrain, tank model, decor, FX) through their modules.\n// The host drives every frame (no internal loop): render() draws once. World meters 1:1;\n// render-state yaw is radians, forward = (cos, sin) on x/z.\nimport {\n ACESFilmicToneMapping,\n DirectionalLight,\n DynamicDrawUsage,\n Fog,\n Group,\n HemisphereLight,\n InstancedMesh,\n Matrix4,\n MeshBasicMaterial,\n MeshLambertMaterial,\n MeshStandardMaterial,\n PCFSoftShadowMap,\n PerspectiveCamera,\n Plane,\n PlaneGeometry,\n Raycaster,\n Scene,\n sRGBEncoding,\n Vector2,\n Vector3,\n WebGLRenderer,\n} from 'three'\nimport { createTerrain, createSky, createHills, SKY } from '../../tanks/scene/terrain.js'\nimport { createDecor } from '../../tanks/scene/decor.js'\nimport { createTank, createTankGeometries, createTankShared, WHEELS } from '../../tanks/scene/tank.js'\nimport { createFx } from '../../tanks/scene/fx.js'\nimport { blobTexture, clamp, dampK, DEG, lin, rng } from '../../tanks/scene/util.js'\nimport { arenaBounds, arenaObstacles, damageLevel, eventKind, RAD_TO_DEG, shooterOf, tankById, wrapAngle } from './liveView.js'\n\nconst MAX_TANKS = 4\nconst MAX_SHELLS = 8 // fx projectile pool\nconst MARGIN = 14 // decorative ground around the arena\nconst CELL = 2\nconst MAX_DT = 1 / 15\nconst SUN_DIR = new Vector3(0.62, 0.42, 0.66).normalize()\nconst COLORS = { green: 'green', red: 'red' }\nconst FIREWORK = { green: lin('#22c55e'), red: lin('#ef4444'), gold: lin('#fbbf24') }\n\n// Gentle rolling ground: tanks drive on a 2D plane, so relief stays under ~1 m.\nfunction makeHeights(n, size, seed) {\n const r = rng(seed)\n const p = [r() * 6.28, r() * 6.28, r() * 6.28, r() * 6.28]\n const h = new Float32Array(n * n)\n const cell = size / (n - 1)\n for (let iz = 0; iz < n; iz++) {\n for (let ix = 0; ix < n; ix++) {\n const x = ix * cell\n const z = iz * cell\n h[iz * n + ix] = 2 +\n 0.45 * Math.sin(x * 0.07 + p[0]) * Math.cos(z * 0.06 + p[1]) +\n 0.3 * Math.sin(x * 0.16 + z * 0.11 + p[2]) +\n 0.18 * Math.cos(x * 0.23 - z * 0.19 + p[3])\n }\n }\n return h\n}\n\nexport function createLiveScene(container, { arena, lowPower = false, reducedMotion = false, onEvent } = {}) {\n if (!container) throw new Error('createLiveScene: container element required')\n const emit = (e) => {\n try { onEvent?.(e) } catch { /* listener errors must never break rendering */ }\n }\n const quality = lowPower ? 'low' : 'high'\n const bounds = arenaBounds(arena)\n const size = Math.ceil((Math.max(bounds.width, bounds.depth) + MARGIN * 2) / CELL) * CELL\n // logical (arena) → scene coordinates\n const ox = MARGIN - bounds.minX\n const oz = MARGIN - bounds.minZ\n let disposed = false\n\n // ------------------------------------------------------------------ renderer\n const dpr = (typeof window !== 'undefined' && window.devicePixelRatio) || 1\n const renderer = new WebGLRenderer({ antialias: !lowPower || dpr < 2, alpha: false, stencil: false, powerPreference: 'high-performance' })\n renderer.outputEncoding = sRGBEncoding\n renderer.toneMapping = ACESFilmicToneMapping\n renderer.toneMappingExposure = 1.05\n renderer.shadowMap.enabled = !lowPower\n renderer.shadowMap.type = PCFSoftShadowMap\n renderer.setPixelRatio(Math.min(dpr, lowPower ? 1.25 : 1.75))\n renderer.setClearColor(SKY.horizon, 1)\n const canvas = renderer.domElement\n canvas.style.display = 'block'\n canvas.style.width = '100%'\n canvas.style.height = '100%'\n canvas.style.outline = 'none'\n container.appendChild(canvas)\n let width = Math.max(1, container.clientWidth)\n let height = Math.max(1, container.clientHeight)\n renderer.setSize(width, height, false)\n\n let contextLost = false\n const onContextLost = (e) => {\n e?.preventDefault?.()\n contextLost = true\n emit({ type: 'context_lost' })\n }\n canvas.addEventListener('webglcontextlost', onContextLost)\n\n // ------------------------------------------------------------------ scene\n const scene = new Scene()\n scene.fog = new Fog(SKY.fog.clone(), 70, 320)\n const camera = new PerspectiveCamera(55, width / height, 0.5, 1400)\n const world = new Group()\n scene.add(world)\n\n const hemi = new HemisphereLight(lin('#ffd2b0'), lin('#33402f'), lowPower ? 0.8 : 0.6)\n const sun = new DirectionalLight(lin('#ffbe7a'), 1.9)\n if (!lowPower) {\n sun.castShadow = true\n sun.shadow.mapSize.set(1024, 1024)\n sun.shadow.bias = -0.0006\n sun.shadow.normalBias = 0.04\n const sc = sun.shadow.camera\n sc.left = -42\n sc.right = 42\n sc.top = 42\n sc.bottom = -42\n sc.near = 20\n sc.far = 320\n sc.updateProjectionMatrix()\n }\n scene.add(hemi, sun, sun.target)\n\n const center = new Vector3(size / 2, 0, size / 2)\n const sky = createSky(SUN_DIR)\n scene.add(sky.mesh)\n const hills = createHills(center, SUN_DIR)\n scene.add(hills.mesh)\n\n const terrain = createTerrain()\n const grid = size / CELL + 1\n terrain.setHeights({ heights: makeHeights(grid, size, Number(arena?.seed) || 7), grid, size })\n world.add(terrain.mesh)\n\n // Obstacles: trees block as trees, everything else as rocks; plus decorative trees outside the arena.\n const decor = createDecor()\n decor.setQuality(quality)\n decor.setShadows(!lowPower)\n const obstacles = arenaObstacles(arena)\n const decorList = []\n const rockList = []\n for (const o of obstacles) {\n const x = o.x + ox\n const z = o.z + oz\n if (o.kind === 'tree') decorList.push({ kind: 'tree', x, z, scale: clamp(o.r / 1.3, 0.7, 2.2) })\n else rockList.push({ kind: 'rock', x, z, w: o.r * 2, d: o.r * 2, h: o.r * 1.2 })\n }\n {\n const r = rng(31)\n const count = lowPower ? 40 : 90\n for (let i = 0; i < count; i++) {\n const side = i % 4\n const t = r() * size\n const inset = 2 + r() * (MARGIN - 5)\n const x = side === 0 ? inset : side === 1 ? size - inset : t\n const z = side === 2 ? inset : side === 3 ? size - inset : t\n decorList.push({ kind: 'tree', x, z, scale: 0.8 + r() * 0.7 })\n }\n }\n decor.build(world, { decor: decorList, obstacles: rockList }, terrain)\n\n // Arena border: a low line of stones marking the playable area.\n const borderRocks = []\n {\n const r = rng(53)\n const step = lowPower ? 7 : 4.5\n const edge = (x0, z0, x1, z1) => {\n const len = Math.hypot(x1 - x0, z1 - z0)\n const n = Math.max(1, Math.round(len / step))\n for (let i = 0; i <= n; i++) {\n const t = i / n\n borderRocks.push({ kind: 'rock', x: x0 + (x1 - x0) * t, z: z0 + (z1 - z0) * t, scale: 0.45 + r() * 0.35 })\n }\n }\n const a = MARGIN - 1\n const bx = MARGIN + bounds.width + 1\n const bz = MARGIN + bounds.depth + 1\n edge(a, a, bx, a)\n edge(bx, a, bx, bz)\n edge(bx, bz, a, bz)\n edge(a, bz, a, a)\n }\n const borderDecor = createDecor()\n borderDecor.setQuality(quality)\n borderDecor.build(world, { decor: borderRocks, obstacles: [] }, terrain)\n\n const fx = createFx(scene, { quality, reducedMotion, heightAt: terrain.heightAt })\n\n // ------------------------------------------------------------------ tanks\n const tankGeos = createTankGeometries()\n const tankShared = createTankShared()\n tankShared.wheelMat = lowPower\n ? new MeshLambertMaterial({ vertexColors: true })\n : new MeshStandardMaterial({ vertexColors: true, roughness: 0.7, metalness: 0.25 })\n const wheels = new InstancedMesh(tankGeos.wheel, tankShared.wheelMat, MAX_TANKS * WHEELS.length)\n wheels.instanceMatrix.setUsage(DynamicDrawUsage)\n wheels.frustumCulled = false\n wheels.count = 0\n world.add(wheels)\n\n const blobTex = blobTexture(64)\n const blobGeo = new PlaneGeometry(1, 1)\n blobGeo.rotateX(-Math.PI / 2)\n const blobMat = new MeshBasicMaterial({ map: blobTex, transparent: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -2, polygonOffsetUnits: -2 })\n const blobs = new InstancedMesh(blobGeo, blobMat, MAX_TANKS)\n blobs.frustumCulled = false\n blobs.count = 0\n blobs.renderOrder = 2\n world.add(blobs)\n\n const tanks = new Map() // id → { t, alive, last:{x,z}, dust, exhaust }\n const v1 = new Vector3()\n const v2 = new Vector3()\n const mtx = new Matrix4()\n const scl = new Vector3()\n\n function ensureTank(rt, index) {\n const key = String(rt.id)\n let entry = tanks.get(key)\n if (entry && entry.alive === false && rt.alive !== false) {\n // revived (rematch): rebuild cleanly\n removeTank(key)\n entry = null\n }\n if (entry) return entry\n const color = COLORS[rt.color] || (index === 0 ? 'green' : 'red')\n const t = createTank(tankGeos, tankShared, { id: key, color, quality })\n t.setShadows(!lowPower)\n world.add(t.root)\n t.state.pitch = 4\n entry = { t, color, alive: true, last: null, dustAcc: 0, exhaustAcc: 0, seen: true }\n tanks.set(key, entry)\n return entry\n }\n\n function removeTank(key) {\n const entry = tanks.get(key)\n if (!entry) return\n if (entry.t.state.blown) entry.t.turret.removeFromParent()\n entry.t.dispose()\n tanks.delete(key)\n }\n\n function blowTurret(t, animate) {\n const s = t.state\n if (s.blown) return\n world.attach(t.turret)\n if (!animate) {\n const a = (s.hullYaw + 120) * DEG\n const x = s.x + Math.cos(a) * 4.5\n const z = s.z + Math.sin(a) * 4.5\n t.turret.position.set(x, terrain.heightAt(x, z) + 0.2, z)\n t.turret.rotation.set(0.5, a, 2.6)\n s.blown = { p: t.turret.position.clone(), v: new Vector3(), w: new Vector3(), landed: true }\n return\n }\n const a = Math.random() * Math.PI * 2\n s.blown = {\n p: t.turret.position.clone(),\n v: new Vector3(Math.cos(a) * 3.5, 15, Math.sin(a) * 3.5),\n w: new Vector3((Math.random() - 0.5) * 6, (Math.random() - 0.5) * 5, (Math.random() - 0.5) * 6),\n landed: false,\n }\n }\n\n function updateBlown(t, dt) {\n const b = t.state.blown\n if (!b || b.landed) return\n b.v.y -= 20 * dt\n b.p.addScaledVector(b.v, dt)\n t.turret.rotation.x += b.w.x * dt\n t.turret.rotation.y += b.w.y * dt\n t.turret.rotation.z += b.w.z * dt\n const g = terrain.heightAt(b.p.x, b.p.z) + 0.25\n if (b.p.y < g && b.v.y < 0) {\n b.p.y = g\n if (b.v.y < -5) {\n b.v.y *= -0.25\n b.v.x *= 0.5\n b.v.z *= 0.5\n b.w.multiplyScalar(0.4)\n fx.dust(b.p.x, g, b.p.z, 2)\n } else b.landed = true\n }\n t.turret.position.copy(b.p)\n }\n\n // ------------------------------------------------------------------ shells\n const shellSlots = new Map() // shell id → fx slot\n const freeSlots = Array.from({ length: MAX_SHELLS }, (_, i) => i)\n\n function syncShells(list) {\n const seen = new Set()\n for (const s of list || []) {\n const id = String(s.id)\n seen.add(id)\n const x = s.x + ox\n const z = s.z + oz\n const y = Number.isFinite(s.y) ? s.y + terrainBase : terrain.heightAt(x, z) + 1.8\n let slot = shellSlots.get(id)\n if (slot == null) {\n if (!freeSlots.length) continue\n slot = freeSlots.pop()\n shellSlots.set(id, slot)\n fx.projShow(slot, x, y, z, false)\n } else fx.projMove(slot, x, y, z)\n }\n for (const [id, slot] of shellSlots) {\n if (seen.has(id)) continue\n fx.projHide(slot)\n shellSlots.delete(id)\n freeSlots.push(slot)\n }\n }\n\n // Shell heights in the render state are relative to a flat ground at 0; the terrain sits ~2 m up.\n const terrainBase = 2\n\n // ------------------------------------------------------------------ camera\n const cam = { pos: new Vector3(), target: new Vector3(), yaw: 0, snap: true, shake: 0, orbit: 0 }\n let portrait = false\n function updateFov() {\n const aspect = width / height\n portrait = aspect < 0.85\n camera.fov = portrait ? 68 : aspect < 1.25 ? 60 : 52\n camera.aspect = aspect\n camera.updateProjectionMatrix()\n }\n updateFov()\n\n function shake(amount) {\n if (reducedMotion) return\n cam.shake = Math.max(cam.shake, amount)\n }\n\n function updateCamera(dt, focus) {\n if (!focus) {\n cam.pos.set(center.x, 70, center.z + size * 0.55)\n cam.target.set(center.x, 2, center.z)\n } else {\n const s = focus.t.state\n const back = portrait ? 19 : 15\n const up = portrait ? 15 : 10.5\n const ahead = portrait ? 14 : 12\n if (focus.alive) {\n let diff = wrapAngle(s.hullYaw * DEG - cam.yaw)\n cam.yaw += diff * (cam.snap ? 1 : dampK(2.6, dt))\n const dx = Math.cos(cam.yaw)\n const dz = Math.sin(cam.yaw)\n v1.set(s.x - dx * back, s.y + up, s.z - dz * back)\n v2.set(s.x + dx * ahead, s.y + 1, s.z + dz * ahead)\n } else {\n // own wreck: slow orbit\n cam.orbit += dt * (reducedMotion ? 0 : 0.3)\n v1.set(s.x + Math.cos(cam.orbit) * 20, s.y + 9, s.z + Math.sin(cam.orbit) * 20)\n v2.set(s.x, s.y + 2, s.z)\n }\n const g = terrain.heightAt(v1.x, v1.z) + 2.5\n if (v1.y < g) v1.y = g\n if (cam.snap) {\n cam.pos.copy(v1)\n cam.target.copy(v2)\n cam.orbit = Math.atan2(cam.pos.z - s.z, cam.pos.x - s.x)\n } else {\n cam.pos.lerp(v1, dampK(6, dt))\n cam.target.lerp(v2, dampK(8, dt))\n }\n cam.snap = false\n }\n camera.position.copy(cam.pos)\n if (cam.shake > 0.002) {\n const k = cam.shake\n camera.position.x += (Math.random() - 0.5) * k\n camera.position.y += (Math.random() - 0.5) * k\n camera.position.z += (Math.random() - 0.5) * k\n cam.shake *= Math.exp(-7 * dt)\n } else cam.shake = 0\n camera.lookAt(cam.target)\n if (!lowPower) {\n sun.target.position.copy(cam.target)\n sun.position.copy(cam.target).addScaledVector(SUN_DIR, 200)\n }\n }\n\n // ------------------------------------------------------------------ events\n let celebrate = null\n function handleEvent(e, list) {\n const kind = eventKind(e)\n if (kind === 'fire') {\n const rt = shooterOf(e, list)\n const entry = rt ? tanks.get(String(rt.id)) : null\n if (!entry) return\n entry.t.state.recoil = 1\n entry.t.muzzleWorld(v1)\n entry.t.gunDirWorld(v2)\n fx.muzzle(v1, v2)\n if (rt.self) shake(0.18)\n } else if (kind === 'impact') {\n if (!Number.isFinite(e.x) || !Number.isFinite(e.z)) return\n const x = e.x + ox\n const z = e.z + oz\n const y = terrain.heightAt(x, z)\n fx.explosion(x, y, z, 3, e.kind === 'obstacle' ? 'obstacle' : 'terrain')\n terrain.crater(x, z, 2.2, 0)\n decor.blast(terrain, x, z, 2.5)\n } else if (kind === 'hit') {\n const rt = tankById(list, e.target)\n const entry = rt ? tanks.get(String(rt.id)) : null\n const x = Number.isFinite(e.x) ? e.x + ox : entry?.t.state.x\n const z = Number.isFinite(e.z) ? e.z + oz : entry?.t.state.z\n if (x == null) return\n const y = (entry ? entry.t.state.y : terrain.heightAt(x, z)) + 1.6\n fx.hitSparks(x, y, z)\n fx.explosion(x, y, z, 2.6, 'tank')\n if (entry) entry.t.state.hitFlash = 1\n shake(rt?.self ? 0.9 : 0.25)\n } else if (kind === 'destroyed') {\n const rt = tankById(list, e.target)\n const entry = rt ? tanks.get(String(rt.id)) : null\n if (!entry) return\n const s = entry.t.state\n fx.bigExplosion(s.x, s.y, s.z)\n decor.blast(terrain, s.x, s.z, 6)\n terrain.crater(s.x, s.z, 4, 0)\n entry.t.setCharred(true)\n blowTurret(entry.t, !reducedMotion)\n entry.alive = false\n shake(rt.self ? 1.4 : 0.6)\n } else if (kind === 'over') {\n celebrate = { id: e.winner != null ? String(e.winner) : null, t: 0, next: 0.2 }\n }\n }\n\n // ------------------------------------------------------------------ frame\n let lastStats = { tanks: 0, shells: 0, particles: 0, calls: 0, triangles: 0 }\n let focus = null\n\n function render(state, dtMs = 16) {\n if (disposed || contextLost) return\n const dt = clamp((Number(dtMs) || 16) / 1000, 0.001, MAX_DT)\n const list = (state && state.tanks) || []\n\n // tanks\n for (const entry of tanks.values()) entry.seen = false\n let wheelCount = 0\n let blobCount = 0\n focus = null\n list.forEach((rt, index) => {\n if (!Number.isFinite(rt.x) || !Number.isFinite(rt.z)) return\n const entry = ensureTank(rt, index)\n entry.seen = true\n const t = entry.t\n const s = t.state\n const x = rt.x + ox\n const z = rt.z + oz\n const hullYaw = (rt.yaw ?? 0) * RAD_TO_DEG\n if (entry.last) {\n const dx = x - entry.last.x\n const dz = z - entry.last.z\n const fwd = dx * Math.cos(hullYaw * DEG) + dz * Math.sin(hullYaw * DEG)\n const turn = wrapAngle((hullYaw - entry.last.yaw) * DEG) * 1.4\n if (Math.abs(fwd) > 1e-4 || Math.abs(turn) > 1e-4) t.scrollTracks(Math.abs(fwd) > 1e-4 ? fwd : turn)\n const moved = Math.hypot(dx, dz) / dt\n if (moved > 1 && entry.alive) {\n entry.dustAcc += dt * moved * (lowPower ? 0.5 : 1)\n while (entry.dustAcc > 1.4) {\n entry.dustAcc -= 1.4\n t.localToWorld(v1, -2.6, 0, (Math.random() - 0.5) * 2.6)\n fx.dust(v1.x, terrain.heightAt(v1.x, v1.z), v1.z, 0.9)\n }\n }\n }\n entry.last = { x, z, yaw: hullYaw }\n if (entry.alive && rt.alive !== false) {\n entry.exhaustAcc += dt * (lowPower ? 3 : 6)\n while (entry.exhaustAcc > 1) {\n entry.exhaustAcc -= 1\n t.localToWorld(v1, -2.9, 1.3, 0.8)\n fx.exhaust(v1.x, v1.y, v1.z)\n }\n }\n s.x = x\n s.z = z\n s.y = terrain.heightAt(x, z)\n s.hullYaw = hullYaw\n s.yaw = (rt.turretYaw ?? rt.yaw ?? 0) * RAD_TO_DEG\n s.hp = rt.hp ?? s.hp\n if (rt.alive === false && entry.alive) {\n // dead without a destroyed event (late join / resync): show the wreck as is\n entry.alive = false\n t.setCharred(true)\n blowTurret(t, false)\n }\n if (s.recoil > 0) s.recoil = Math.max(0, s.recoil - dt * 4)\n if (s.hitFlash > 0) {\n s.hitFlash = Math.max(0, s.hitFlash - dt * 3)\n t.setFlash(s.hitFlash)\n }\n t.place(terrain, dt)\n updateBlown(t, dt)\n const level = damageLevel(rt.hp ?? 100, entry.alive)\n if (level > 0) {\n t.localToWorld(v1, -0.6, 2.2, 0)\n fx.emitDamage(v1.x, v1.y, v1.z, dt, level, s)\n }\n if (wheelCount + WHEELS.length <= MAX_TANKS * WHEELS.length) {\n t.writeWheels(wheels, wheelCount)\n wheelCount += WHEELS.length\n }\n if (lowPower && blobCount < MAX_TANKS) {\n scl.set(8, 1, 6)\n mtx.makeRotationY(-hullYaw * DEG).scale(scl).setPosition(x, s.y + 0.05, z)\n blobs.setMatrixAt(blobCount++, mtx)\n }\n if (rt.self) focus = entry\n })\n for (const [key, entry] of tanks) if (!entry.seen) removeTank(key)\n wheels.count = wheelCount\n wheels.instanceMatrix.needsUpdate = true\n blobs.count = blobCount\n if (blobCount) blobs.instanceMatrix.needsUpdate = true\n if (!focus && list.length) focus = tanks.get(String(list[0].id)) || null\n\n // events after tank poses so muzzle positions are current\n for (const e of (state && state.events) || []) handleEvent(e, list)\n syncShells(state && state.shells)\n\n if (celebrate) {\n celebrate.t += dt\n const w = celebrate.id != null ? tanks.get(celebrate.id) : null\n if (w && celebrate.t < 4 && celebrate.t >= celebrate.next && !reducedMotion) {\n celebrate.next += 0.45\n const s = w.t.state\n fx.firework(s.x + (Math.random() - 0.5) * 8, s.y + 9 + Math.random() * 4, s.z + (Math.random() - 0.5) * 8,\n Math.random() < 0.5 ? FIREWORK[w.color] || FIREWORK.gold : FIREWORK.gold)\n }\n if (celebrate.t > 4) celebrate = null\n }\n\n updateCamera(dt, focus)\n fx.update(dt, camera, renderer, false)\n renderer.render(scene, camera)\n const info = renderer.info.render\n lastStats = { tanks: tanks.size, shells: shellSlots.size, particles: fx.particleCount, calls: info.calls, triangles: info.triangles }\n }\n\n // ------------------------------------------------------------------ picking\n const raycaster = new Raycaster()\n const ndc = new Vector2()\n const ground = new Plane(new Vector3(0, 1, 0), 0)\n const hit = new Vector3()\n /** Normalized device coords (-1..1, y up) → arena ground point { x, z } or null. */\n function screenToGround(nx, ny) {\n if (disposed) return null\n ndc.set(nx, ny)\n raycaster.setFromCamera(ndc, camera)\n const y = focus ? focus.t.state.y + 1 : terrainBase\n ground.constant = -y\n if (!raycaster.ray.intersectPlane(ground, hit)) return null\n return { x: hit.x - ox, z: hit.z - oz }\n }\n\n // ------------------------------------------------------------------ resize\n function resize() {\n if (disposed) return\n const w = container.clientWidth\n const h = container.clientHeight\n if (!w || !h) return\n width = w\n height = h\n renderer.setSize(w, h, false)\n updateFov()\n }\n const ro = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(resize) : null\n if (ro) ro.observe(container)\n else if (typeof window !== 'undefined') window.addEventListener('resize', resize)\n\n return {\n kind: '3d',\n render,\n screenToGround,\n resize,\n getStats() {\n return { ...lastStats }\n },\n dispose() {\n if (disposed) return\n disposed = true\n if (ro) ro.disconnect()\n else if (typeof window !== 'undefined') window.removeEventListener('resize', resize)\n canvas.removeEventListener('webglcontextlost', onContextLost)\n for (const key of Array.from(tanks.keys())) removeTank(key)\n wheels.dispose()\n tankShared.wheelMat.dispose()\n tankShared.dispose()\n tankGeos.dispose()\n blobs.dispose()\n blobGeo.dispose()\n blobMat.dispose()\n blobTex.dispose()\n fx.dispose()\n decor.dispose()\n borderDecor.dispose()\n terrain.dispose()\n sky.dispose()\n hills.dispose()\n if (sun.shadow && sun.shadow.map) sun.shadow.map.dispose()\n scene.clear()\n renderer.dispose()\n renderer.forceContextLoss()\n if (canvas.parentNode) canvas.parentNode.removeChild(canvas)\n },\n }\n}\n\nexport default createLiveScene\n"],"mappings":"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"}