@minicode-dev/chat 0.1.14 → 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/dist/chunks/{BattleshipGameCard-B-B4r7lK.js → BattleshipGameCard-DwNzgH5G.js} +199 -199
- package/dist/chunks/{BattleshipGameCard-B-B4r7lK.js.map → BattleshipGameCard-DwNzgH5G.js.map} +1 -1
- package/dist/chunks/{BattleshipPrototype-CmQd5AUO.js → BattleshipPrototype-CSQxQJt5.js} +52 -52
- package/dist/chunks/{BattleshipPrototype-CmQd5AUO.js.map → BattleshipPrototype-CSQxQJt5.js.map} +1 -1
- package/dist/chunks/{ChatContext-DQtKsR6Z.js → ChatContext-D5rqvt5D.js} +2 -2
- package/dist/chunks/{ChatContext-DQtKsR6Z.js.map → ChatContext-D5rqvt5D.js.map} +1 -1
- package/dist/chunks/RacingLiveGameCard-_wvhDRlG.js +1873 -0
- package/dist/chunks/RacingLiveGameCard-_wvhDRlG.js.map +1 -0
- package/dist/chunks/{TanksGameCard-CvTaF7tu.js → TanksGameCard-B-gtDYYg.js} +144 -144
- package/dist/chunks/{TanksGameCard-CvTaF7tu.js.map → TanksGameCard-B-gtDYYg.js.map} +1 -1
- package/dist/chunks/TanksLiveGameCard-DXgd1J2Y.js +1274 -0
- package/dist/chunks/TanksLiveGameCard-DXgd1J2Y.js.map +1 -0
- package/dist/chunks/{avalancheScene3d-Z5QyZIid.js → avalancheScene3d-CNbQyGUd.js} +51 -50
- package/dist/chunks/{avalancheScene3d-Z5QyZIid.js.map → avalancheScene3d-CNbQyGUd.js.map} +1 -1
- package/dist/chunks/cars-D1PM7mVD.js +340 -0
- package/dist/chunks/cars-D1PM7mVD.js.map +1 -0
- package/dist/chunks/{connect4Sounds-DmD-E9kX.js → connect4Sounds-3a6h7gUC.js} +8 -8
- package/dist/chunks/{connect4Sounds-DmD-E9kX.js.map → connect4Sounds-3a6h7gUC.js.map} +1 -1
- package/dist/chunks/createLiveScene-jrzyQogh.js +756 -0
- package/dist/chunks/createLiveScene-jrzyQogh.js.map +1 -0
- package/dist/chunks/createRaceScene-C-aw0dlX.js +291 -0
- package/dist/chunks/createRaceScene-C-aw0dlX.js.map +1 -0
- package/dist/chunks/{createTankScene-yhX6la27.js → createTankScene-6asWHKFf.js} +123 -125
- package/dist/chunks/{createTankScene-yhX6la27.js.map → createTankScene-6asWHKFf.js.map} +1 -1
- package/dist/chunks/fx-BNJvJYOu.js +871 -0
- package/dist/chunks/fx-BNJvJYOu.js.map +1 -0
- package/dist/chunks/fx-DhXerGyt.js +248 -0
- package/dist/chunks/fx-DhXerGyt.js.map +1 -0
- package/dist/chunks/{games-BvYTWgaR.js → games-D_9SiSBT.js} +1261 -677
- package/dist/chunks/games-D_9SiSBT.js.map +1 -0
- package/dist/chunks/tank-DIn6Jyt8.js +605 -0
- package/dist/chunks/tank-DIn6Jyt8.js.map +1 -0
- package/dist/chunks/{tanks-live-BcKmrhnV.js → tanks-live-BRhYW4MG.js} +36 -36
- package/dist/chunks/{tanks-live-BcKmrhnV.js.map → tanks-live-BRhYW4MG.js.map} +1 -1
- package/dist/chunks/{tanksSounds-DwjfSp3W.js → tanksSounds-tYPzje61.js} +5 -5
- package/dist/chunks/{tanksSounds-DwjfSp3W.js.map → tanksSounds-tYPzje61.js.map} +1 -1
- package/dist/chunks/track-C1TWWT19.js +557 -0
- package/dist/chunks/track-C1TWWT19.js.map +1 -0
- package/dist/index.js +4244 -4028
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/index.d.ts +2 -0
- package/package.json +1 -1
- package/dist/chunks/RacingLiveGameCard-c1G7uoDI.js +0 -1654
- package/dist/chunks/RacingLiveGameCard-c1G7uoDI.js.map +0 -1
- package/dist/chunks/TanksLiveGameCard-COr9Oay5.js +0 -1011
- package/dist/chunks/TanksLiveGameCard-COr9Oay5.js.map +0 -1
- package/dist/chunks/createLiveScene-CWBunxPi.js +0 -367
- package/dist/chunks/createLiveScene-CWBunxPi.js.map +0 -1
- package/dist/chunks/createRaceScene-C7Rw89kj.js +0 -305
- package/dist/chunks/createRaceScene-C7Rw89kj.js.map +0 -1
- package/dist/chunks/decor-CyyCnmct.js +0 -418
- package/dist/chunks/decor-CyyCnmct.js.map +0 -1
- package/dist/chunks/fx-1ZwzmPWj.js +0 -458
- package/dist/chunks/fx-1ZwzmPWj.js.map +0 -1
- package/dist/chunks/fx-UZwhOmdl.js +0 -584
- package/dist/chunks/fx-UZwhOmdl.js.map +0 -1
- package/dist/chunks/games-BvYTWgaR.js.map +0 -1
- package/dist/chunks/rolldown-runtime-CGnMp29N.js +0 -10
- package/dist/chunks/tank-DjEQ4FXF.js +0 -553
- package/dist/chunks/tank-DjEQ4FXF.js.map +0 -1
- package/dist/chunks/track-BcnnpnAm.js +0 -259
- package/dist/chunks/track-BcnnpnAm.js.map +0 -1
- package/dist/chunks/util-DwI9bfS7.js +0 -57
- package/dist/chunks/util-DwI9bfS7.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
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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"}
|
|
@@ -1,367 +0,0 @@
|
|
|
1
|
-
import { a as e, c as t, n, r, t as i, u as a } from "./util-DwI9bfS7.js";
|
|
2
|
-
import { a as o, i as s, o as c, s as l } from "./tank-DjEQ4FXF.js";
|
|
3
|
-
import { a as u, i as d, n as f, r as ee, t as te } from "./decor-CyyCnmct.js";
|
|
4
|
-
import { a as ne, c as re, i as ie, l as ae, n as oe, o as se, r as ce, s as le } from "./TanksLiveGameCard-COr9Oay5.js";
|
|
5
|
-
import { t as ue } from "./fx-1ZwzmPWj.js";
|
|
6
|
-
import { ACESFilmicToneMapping as de, DirectionalLight as fe, DynamicDrawUsage as pe, Fog as me, Group as he, HemisphereLight as ge, InstancedMesh as _e, Matrix4 as ve, MeshBasicMaterial as ye, MeshLambertMaterial as be, MeshStandardMaterial as xe, PCFSoftShadowMap as Se, PerspectiveCamera as Ce, Plane as we, PlaneGeometry as Te, Raycaster as Ee, Scene as De, Vector2 as Oe, Vector3 as p, WebGLRenderer as ke, sRGBEncoding as Ae } from "three";
|
|
7
|
-
// src/games/tanks-live/scene/createLiveScene.js
|
|
8
|
-
var m = 4, je = 8, h = 14, Me = 2, Ne = 1 / 15, g = new p(.62, .42, .66).normalize(), Pe = {
|
|
9
|
-
green: "green",
|
|
10
|
-
red: "red"
|
|
11
|
-
}, Fe = {
|
|
12
|
-
green: t("#22c55e"),
|
|
13
|
-
red: t("#ef4444"),
|
|
14
|
-
gold: t("#fbbf24")
|
|
15
|
-
};
|
|
16
|
-
function Ie(e, t, n) {
|
|
17
|
-
let r = a(n), i = [
|
|
18
|
-
r() * 6.28,
|
|
19
|
-
r() * 6.28,
|
|
20
|
-
r() * 6.28,
|
|
21
|
-
r() * 6.28
|
|
22
|
-
], o = new Float32Array(e * e), s = t / (e - 1);
|
|
23
|
-
for (let t = 0; t < e; t++) for (let n = 0; n < e; n++) {
|
|
24
|
-
let r = n * s, a = t * s;
|
|
25
|
-
o[t * e + n] = 2 + .45 * Math.sin(r * .07 + i[0]) * Math.cos(a * .06 + i[1]) + .3 * Math.sin(r * .16 + a * .11 + i[2]) + .18 * Math.cos(r * .23 - a * .19 + i[3]);
|
|
26
|
-
}
|
|
27
|
-
return o;
|
|
28
|
-
}
|
|
29
|
-
function _(_, { arena: v, lowPower: y = !1, reducedMotion: b = !1, onEvent: Le } = {}) {
|
|
30
|
-
if (!_) throw Error("createLiveScene: container element required");
|
|
31
|
-
let Re = (e) => {
|
|
32
|
-
try {
|
|
33
|
-
Le?.(e);
|
|
34
|
-
} catch {}
|
|
35
|
-
}, x = y ? "low" : "high", S = ce(v), C = Math.ceil((Math.max(S.width, S.depth) + 28) / Me) * Me, w = h - S.minX, T = h - S.minZ, E = !1, ze = typeof window < "u" && window.devicePixelRatio || 1, D = new ke({
|
|
36
|
-
antialias: !y || ze < 2,
|
|
37
|
-
alpha: !1,
|
|
38
|
-
stencil: !1,
|
|
39
|
-
powerPreference: "high-performance"
|
|
40
|
-
});
|
|
41
|
-
D.outputEncoding = Ae, D.toneMapping = de, D.toneMappingExposure = 1.05, D.shadowMap.enabled = !y, D.shadowMap.type = Se, D.setPixelRatio(Math.min(ze, y ? 1.25 : 1.75)), D.setClearColor(f.horizon, 1);
|
|
42
|
-
let O = D.domElement;
|
|
43
|
-
O.style.display = "block", O.style.width = "100%", O.style.height = "100%", O.style.outline = "none", _.appendChild(O);
|
|
44
|
-
let k = Math.max(1, _.clientWidth), A = Math.max(1, _.clientHeight);
|
|
45
|
-
D.setSize(k, A, !1);
|
|
46
|
-
let Be = !1, Ve = (e) => {
|
|
47
|
-
e?.preventDefault?.(), Be = !0, Re({ type: "context_lost" });
|
|
48
|
-
};
|
|
49
|
-
O.addEventListener("webglcontextlost", Ve);
|
|
50
|
-
let j = new De();
|
|
51
|
-
j.fog = new me(f.fog.clone(), 70, 320);
|
|
52
|
-
let M = new Ce(55, k / A, .5, 1400), N = new he();
|
|
53
|
-
j.add(N);
|
|
54
|
-
let He = new ge(t("#ffd2b0"), t("#33402f"), y ? .8 : .6), P = new fe(t("#ffbe7a"), 1.9);
|
|
55
|
-
if (!y) {
|
|
56
|
-
P.castShadow = !0, P.shadow.mapSize.set(1024, 1024), P.shadow.bias = -6e-4, P.shadow.normalBias = .04;
|
|
57
|
-
let e = P.shadow.camera;
|
|
58
|
-
e.left = -42, e.right = 42, e.top = 42, e.bottom = -42, e.near = 20, e.far = 320, e.updateProjectionMatrix();
|
|
59
|
-
}
|
|
60
|
-
j.add(He, P, P.target);
|
|
61
|
-
let F = new p(C / 2, 0, C / 2), Ue = d(g);
|
|
62
|
-
j.add(Ue.mesh);
|
|
63
|
-
let We = ee(F, g);
|
|
64
|
-
j.add(We.mesh);
|
|
65
|
-
let I = u(), Ge = C / Me + 1;
|
|
66
|
-
I.setHeights({
|
|
67
|
-
heights: Ie(Ge, C, Number(v?.seed) || 7),
|
|
68
|
-
grid: Ge,
|
|
69
|
-
size: C
|
|
70
|
-
}), N.add(I.mesh);
|
|
71
|
-
let L = te();
|
|
72
|
-
L.setQuality(x), L.setShadows(!y);
|
|
73
|
-
let Ke = ie(v), R = [], qe = [];
|
|
74
|
-
for (let e of Ke) {
|
|
75
|
-
let t = e.x + w, n = e.z + T;
|
|
76
|
-
e.kind === "tree" ? R.push({
|
|
77
|
-
kind: "tree",
|
|
78
|
-
x: t,
|
|
79
|
-
z: n,
|
|
80
|
-
scale: r(e.r / 1.3, .7, 2.2)
|
|
81
|
-
}) : qe.push({
|
|
82
|
-
kind: "rock",
|
|
83
|
-
x: t,
|
|
84
|
-
z: n,
|
|
85
|
-
w: e.r * 2,
|
|
86
|
-
d: e.r * 2,
|
|
87
|
-
h: e.r * 1.2
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
{
|
|
91
|
-
let e = a(31), t = y ? 40 : 90;
|
|
92
|
-
for (let n = 0; n < t; n++) {
|
|
93
|
-
let t = n % 4, r = e() * C, i = 2 + e() * 9, a = t === 0 ? i : t === 1 ? C - i : r, o = t === 2 ? i : t === 3 ? C - i : r;
|
|
94
|
-
R.push({
|
|
95
|
-
kind: "tree",
|
|
96
|
-
x: a,
|
|
97
|
-
z: o,
|
|
98
|
-
scale: .8 + e() * .7
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
L.build(N, {
|
|
103
|
-
decor: R,
|
|
104
|
-
obstacles: qe
|
|
105
|
-
}, I);
|
|
106
|
-
let Je = [];
|
|
107
|
-
{
|
|
108
|
-
let e = a(53), t = y ? 7 : 4.5, n = (n, r, i, a) => {
|
|
109
|
-
let o = Math.hypot(i - n, a - r), s = Math.max(1, Math.round(o / t));
|
|
110
|
-
for (let t = 0; t <= s; t++) {
|
|
111
|
-
let o = t / s;
|
|
112
|
-
Je.push({
|
|
113
|
-
kind: "rock",
|
|
114
|
-
x: n + (i - n) * o,
|
|
115
|
-
z: r + (a - r) * o,
|
|
116
|
-
scale: .45 + e() * .35
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
}, r = h + S.width + 1, i = h + S.depth + 1;
|
|
120
|
-
n(13, 13, r, 13), n(r, 13, r, i), n(r, i, 13, i), n(13, i, 13, 13);
|
|
121
|
-
}
|
|
122
|
-
let z = te();
|
|
123
|
-
z.setQuality(x), z.build(N, {
|
|
124
|
-
decor: Je,
|
|
125
|
-
obstacles: []
|
|
126
|
-
}, I);
|
|
127
|
-
let B = ue(j, {
|
|
128
|
-
quality: x,
|
|
129
|
-
reducedMotion: b,
|
|
130
|
-
heightAt: I.heightAt
|
|
131
|
-
}), Ye = c(), V = l();
|
|
132
|
-
V.wheelMat = y ? new be({ vertexColors: !0 }) : new xe({
|
|
133
|
-
vertexColors: !0,
|
|
134
|
-
roughness: .7,
|
|
135
|
-
metalness: .25
|
|
136
|
-
});
|
|
137
|
-
let H = new _e(Ye.wheel, V.wheelMat, m * s.length);
|
|
138
|
-
H.instanceMatrix.setUsage(pe), H.frustumCulled = !1, H.count = 0, N.add(H);
|
|
139
|
-
let Xe = n(64), Ze = new Te(1, 1);
|
|
140
|
-
Ze.rotateX(-Math.PI / 2);
|
|
141
|
-
let Qe = new ye({
|
|
142
|
-
map: Xe,
|
|
143
|
-
transparent: !0,
|
|
144
|
-
depthWrite: !1,
|
|
145
|
-
polygonOffset: !0,
|
|
146
|
-
polygonOffsetFactor: -2,
|
|
147
|
-
polygonOffsetUnits: -2
|
|
148
|
-
}), U = new _e(Ze, Qe, m);
|
|
149
|
-
U.frustumCulled = !1, U.count = 0, U.renderOrder = 2, N.add(U);
|
|
150
|
-
let W = /* @__PURE__ */ new Map(), G = new p(), K = new p(), $e = new ve(), et = new p();
|
|
151
|
-
function tt(e, t) {
|
|
152
|
-
let n = String(e.id), r = W.get(n);
|
|
153
|
-
if (r && r.alive === !1 && e.alive !== !1 && (nt(n), r = null), r) return r;
|
|
154
|
-
let i = Pe[e.color] || (t === 0 ? "green" : "red"), a = o(Ye, V, {
|
|
155
|
-
id: n,
|
|
156
|
-
color: i,
|
|
157
|
-
quality: x
|
|
158
|
-
});
|
|
159
|
-
return a.setShadows(!y), N.add(a.root), a.state.pitch = 4, r = {
|
|
160
|
-
t: a,
|
|
161
|
-
color: i,
|
|
162
|
-
alive: !0,
|
|
163
|
-
last: null,
|
|
164
|
-
dustAcc: 0,
|
|
165
|
-
exhaustAcc: 0,
|
|
166
|
-
seen: !0
|
|
167
|
-
}, W.set(n, r), r;
|
|
168
|
-
}
|
|
169
|
-
function nt(e) {
|
|
170
|
-
let t = W.get(e);
|
|
171
|
-
t && (t.t.state.blown && t.t.turret.removeFromParent(), t.t.dispose(), W.delete(e));
|
|
172
|
-
}
|
|
173
|
-
function rt(e, t) {
|
|
174
|
-
let n = e.state;
|
|
175
|
-
if (n.blown) return;
|
|
176
|
-
if (N.attach(e.turret), !t) {
|
|
177
|
-
let t = (n.hullYaw + 120) * i, r = n.x + Math.cos(t) * 4.5, a = n.z + Math.sin(t) * 4.5;
|
|
178
|
-
e.turret.position.set(r, I.heightAt(r, a) + .2, a), e.turret.rotation.set(.5, t, 2.6), n.blown = {
|
|
179
|
-
p: e.turret.position.clone(),
|
|
180
|
-
v: new p(),
|
|
181
|
-
w: new p(),
|
|
182
|
-
landed: !0
|
|
183
|
-
};
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
let r = Math.random() * Math.PI * 2;
|
|
187
|
-
n.blown = {
|
|
188
|
-
p: e.turret.position.clone(),
|
|
189
|
-
v: new p(Math.cos(r) * 3.5, 15, Math.sin(r) * 3.5),
|
|
190
|
-
w: new p((Math.random() - .5) * 6, (Math.random() - .5) * 5, (Math.random() - .5) * 6),
|
|
191
|
-
landed: !1
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
function it(e, t) {
|
|
195
|
-
let n = e.state.blown;
|
|
196
|
-
if (!n || n.landed) return;
|
|
197
|
-
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;
|
|
198
|
-
let r = I.heightAt(n.p.x, n.p.z) + .25;
|
|
199
|
-
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), B.dust(n.p.x, r, n.p.z, 2)) : n.landed = !0), e.turret.position.copy(n.p);
|
|
200
|
-
}
|
|
201
|
-
let q = /* @__PURE__ */ new Map(), at = Array.from({ length: je }, (e, t) => t);
|
|
202
|
-
function ot(e) {
|
|
203
|
-
let t = /* @__PURE__ */ new Set();
|
|
204
|
-
for (let n of e || []) {
|
|
205
|
-
let e = String(n.id);
|
|
206
|
-
t.add(e);
|
|
207
|
-
let r = n.x + w, i = n.z + T, a = Number.isFinite(n.y) ? n.y + st : I.heightAt(r, i) + 1.8, o = q.get(e);
|
|
208
|
-
if (o == null) {
|
|
209
|
-
if (!at.length) continue;
|
|
210
|
-
o = at.pop(), q.set(e, o), B.projShow(o, r, a, i, !1);
|
|
211
|
-
} else B.projMove(o, r, a, i);
|
|
212
|
-
}
|
|
213
|
-
for (let [e, n] of q) t.has(e) || (B.projHide(n), q.delete(e), at.push(n));
|
|
214
|
-
}
|
|
215
|
-
let st = 2, J = {
|
|
216
|
-
pos: new p(),
|
|
217
|
-
target: new p(),
|
|
218
|
-
yaw: 0,
|
|
219
|
-
snap: !0,
|
|
220
|
-
shake: 0,
|
|
221
|
-
orbit: 0
|
|
222
|
-
}, Y = !1;
|
|
223
|
-
function ct() {
|
|
224
|
-
let e = k / A;
|
|
225
|
-
Y = e < .85, M.fov = Y ? 68 : e < 1.25 ? 60 : 52, M.aspect = e, M.updateProjectionMatrix();
|
|
226
|
-
}
|
|
227
|
-
ct();
|
|
228
|
-
function lt(e) {
|
|
229
|
-
b || (J.shake = Math.max(J.shake, e));
|
|
230
|
-
}
|
|
231
|
-
function ut(t, n) {
|
|
232
|
-
if (!n) J.pos.set(F.x, 70, F.z + C * .55), J.target.set(F.x, 2, F.z);
|
|
233
|
-
else {
|
|
234
|
-
let r = n.t.state, a = Y ? 19 : 15, o = Y ? 15 : 10.5, s = Y ? 14 : 12;
|
|
235
|
-
if (n.alive) {
|
|
236
|
-
let n = ae(r.hullYaw * i - J.yaw);
|
|
237
|
-
J.yaw += n * (J.snap ? 1 : e(2.6, t));
|
|
238
|
-
let c = Math.cos(J.yaw), l = Math.sin(J.yaw);
|
|
239
|
-
G.set(r.x - c * a, r.y + o, r.z - l * a), K.set(r.x + c * s, r.y + 1, r.z + l * s);
|
|
240
|
-
} else J.orbit += t * (b ? 0 : .3), G.set(r.x + Math.cos(J.orbit) * 20, r.y + 9, r.z + Math.sin(J.orbit) * 20), K.set(r.x, r.y + 2, r.z);
|
|
241
|
-
let c = I.heightAt(G.x, G.z) + 2.5;
|
|
242
|
-
G.y < c && (G.y = c), J.snap ? (J.pos.copy(G), J.target.copy(K), J.orbit = Math.atan2(J.pos.z - r.z, J.pos.x - r.x)) : (J.pos.lerp(G, e(6, t)), J.target.lerp(K, e(8, t))), J.snap = !1;
|
|
243
|
-
}
|
|
244
|
-
if (M.position.copy(J.pos), J.shake > .002) {
|
|
245
|
-
let e = J.shake;
|
|
246
|
-
M.position.x += (Math.random() - .5) * e, M.position.y += (Math.random() - .5) * e, M.position.z += (Math.random() - .5) * e, J.shake *= Math.exp(-7 * t);
|
|
247
|
-
} else J.shake = 0;
|
|
248
|
-
M.lookAt(J.target), y || (P.target.position.copy(J.target), P.position.copy(J.target).addScaledVector(g, 200));
|
|
249
|
-
}
|
|
250
|
-
let X = null;
|
|
251
|
-
function dt(e, t) {
|
|
252
|
-
let n = se(e);
|
|
253
|
-
if (n === "fire") {
|
|
254
|
-
let n = le(e, t), r = n ? W.get(String(n.id)) : null;
|
|
255
|
-
if (!r) return;
|
|
256
|
-
r.t.state.recoil = 1, r.t.muzzleWorld(G), r.t.gunDirWorld(K), B.muzzle(G, K), n.self && lt(.18);
|
|
257
|
-
} else if (n === "impact") {
|
|
258
|
-
if (!Number.isFinite(e.x) || !Number.isFinite(e.z)) return;
|
|
259
|
-
let t = e.x + w, n = e.z + T, r = I.heightAt(t, n);
|
|
260
|
-
B.explosion(t, r, n, 3, e.kind === "obstacle" ? "obstacle" : "terrain"), I.crater(t, n, 2.2, 0), L.blast(I, t, n, 2.5);
|
|
261
|
-
} else if (n === "hit") {
|
|
262
|
-
let n = re(t, e.target), r = n ? W.get(String(n.id)) : null, i = Number.isFinite(e.x) ? e.x + w : r?.t.state.x, a = Number.isFinite(e.z) ? e.z + T : r?.t.state.z;
|
|
263
|
-
if (i == null) return;
|
|
264
|
-
let o = (r ? r.t.state.y : I.heightAt(i, a)) + 1.6;
|
|
265
|
-
B.hitSparks(i, o, a), B.explosion(i, o, a, 2.6, "tank"), r && (r.t.state.hitFlash = 1), lt(n?.self ? .9 : .25);
|
|
266
|
-
} else if (n === "destroyed") {
|
|
267
|
-
let n = re(t, e.target), r = n ? W.get(String(n.id)) : null;
|
|
268
|
-
if (!r) return;
|
|
269
|
-
let i = r.t.state;
|
|
270
|
-
B.bigExplosion(i.x, i.y, i.z), L.blast(I, i.x, i.z, 6), I.crater(i.x, i.z, 4, 0), r.t.setCharred(!0), rt(r.t, !b), r.alive = !1, lt(n.self ? 1.4 : .6);
|
|
271
|
-
} else n === "over" && (X = {
|
|
272
|
-
id: e.winner == null ? null : String(e.winner),
|
|
273
|
-
t: 0,
|
|
274
|
-
next: .2
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
|
-
let ft = {
|
|
278
|
-
tanks: 0,
|
|
279
|
-
shells: 0,
|
|
280
|
-
particles: 0,
|
|
281
|
-
calls: 0,
|
|
282
|
-
triangles: 0
|
|
283
|
-
}, Z = null;
|
|
284
|
-
function pt(e, t = 16) {
|
|
285
|
-
if (E || Be) return;
|
|
286
|
-
let n = r((Number(t) || 16) / 1e3, .001, Ne), a = e && e.tanks || [];
|
|
287
|
-
for (let e of W.values()) e.seen = !1;
|
|
288
|
-
let o = 0, c = 0;
|
|
289
|
-
Z = null, a.forEach((e, t) => {
|
|
290
|
-
if (!Number.isFinite(e.x) || !Number.isFinite(e.z)) return;
|
|
291
|
-
let r = tt(e, t);
|
|
292
|
-
r.seen = !0;
|
|
293
|
-
let a = r.t, l = a.state, u = e.x + w, d = e.z + T, f = (e.yaw ?? 0) * oe;
|
|
294
|
-
if (r.last) {
|
|
295
|
-
let e = u - r.last.x, t = d - r.last.z, o = e * Math.cos(f * i) + t * Math.sin(f * i), s = ae((f - r.last.yaw) * i) * 1.4;
|
|
296
|
-
(Math.abs(o) > 1e-4 || Math.abs(s) > 1e-4) && a.scrollTracks(Math.abs(o) > 1e-4 ? o : s);
|
|
297
|
-
let c = Math.hypot(e, t) / n;
|
|
298
|
-
if (c > 1 && r.alive) for (r.dustAcc += n * c * (y ? .5 : 1); r.dustAcc > 1.4;) r.dustAcc -= 1.4, a.localToWorld(G, -2.6, 0, (Math.random() - .5) * 2.6), B.dust(G.x, I.heightAt(G.x, G.z), G.z, .9);
|
|
299
|
-
}
|
|
300
|
-
if (r.last = {
|
|
301
|
-
x: u,
|
|
302
|
-
z: d,
|
|
303
|
-
yaw: f
|
|
304
|
-
}, r.alive && e.alive !== !1) for (r.exhaustAcc += n * (y ? 3 : 6); r.exhaustAcc > 1;) --r.exhaustAcc, a.localToWorld(G, -2.9, 1.3, .8), B.exhaust(G.x, G.y, G.z);
|
|
305
|
-
l.x = u, l.z = d, l.y = I.heightAt(u, d), l.hullYaw = f, l.yaw = (e.turretYaw ?? e.yaw ?? 0) * oe, l.hp = e.hp ?? l.hp, e.alive === !1 && r.alive && (r.alive = !1, a.setCharred(!0), rt(a, !1)), l.recoil > 0 && (l.recoil = Math.max(0, l.recoil - n * 4)), l.hitFlash > 0 && (l.hitFlash = Math.max(0, l.hitFlash - n * 3), a.setFlash(l.hitFlash)), a.place(I, n), it(a, n);
|
|
306
|
-
let ee = ne(e.hp ?? 100, r.alive);
|
|
307
|
-
ee > 0 && (a.localToWorld(G, -.6, 2.2, 0), B.emitDamage(G.x, G.y, G.z, n, ee, l)), o + s.length <= m * s.length && (a.writeWheels(H, o), o += s.length), y && c < m && (et.set(8, 1, 6), $e.makeRotationY(-f * i).scale(et).setPosition(u, l.y + .05, d), U.setMatrixAt(c++, $e)), e.self && (Z = r);
|
|
308
|
-
});
|
|
309
|
-
for (let [e, t] of W) t.seen || nt(e);
|
|
310
|
-
H.count = o, H.instanceMatrix.needsUpdate = !0, U.count = c, c && (U.instanceMatrix.needsUpdate = !0), !Z && a.length && (Z = W.get(String(a[0].id)) || null);
|
|
311
|
-
for (let t of e && e.events || []) dt(t, a);
|
|
312
|
-
if (ot(e && e.shells), X) {
|
|
313
|
-
X.t += n;
|
|
314
|
-
let e = X.id == null ? null : W.get(X.id);
|
|
315
|
-
if (e && X.t < 4 && X.t >= X.next && !b) {
|
|
316
|
-
X.next += .45;
|
|
317
|
-
let t = e.t.state;
|
|
318
|
-
B.firework(t.x + (Math.random() - .5) * 8, t.y + 9 + Math.random() * 4, t.z + (Math.random() - .5) * 8, Math.random() < .5 && Fe[e.color] || Fe.gold);
|
|
319
|
-
}
|
|
320
|
-
X.t > 4 && (X = null);
|
|
321
|
-
}
|
|
322
|
-
ut(n, Z), B.update(n, M, D, !1), D.render(j, M);
|
|
323
|
-
let l = D.info.render;
|
|
324
|
-
ft = {
|
|
325
|
-
tanks: W.size,
|
|
326
|
-
shells: q.size,
|
|
327
|
-
particles: B.particleCount,
|
|
328
|
-
calls: l.calls,
|
|
329
|
-
triangles: l.triangles
|
|
330
|
-
};
|
|
331
|
-
}
|
|
332
|
-
let mt = new Ee(), ht = new Oe(), gt = new we(new p(0, 1, 0), 0), _t = new p();
|
|
333
|
-
function vt(e, t) {
|
|
334
|
-
if (E) return null;
|
|
335
|
-
ht.set(e, t), mt.setFromCamera(ht, M);
|
|
336
|
-
let n = Z ? Z.t.state.y + 1 : 2;
|
|
337
|
-
return gt.constant = -n, mt.ray.intersectPlane(gt, _t) ? {
|
|
338
|
-
x: _t.x - w,
|
|
339
|
-
z: _t.z - T
|
|
340
|
-
} : null;
|
|
341
|
-
}
|
|
342
|
-
function Q() {
|
|
343
|
-
if (E) return;
|
|
344
|
-
let e = _.clientWidth, t = _.clientHeight;
|
|
345
|
-
e && t && (k = e, A = t, D.setSize(e, t, !1), ct());
|
|
346
|
-
}
|
|
347
|
-
let $ = typeof ResizeObserver < "u" ? new ResizeObserver(Q) : null;
|
|
348
|
-
return $ ? $.observe(_) : typeof window < "u" && window.addEventListener("resize", Q), {
|
|
349
|
-
kind: "3d",
|
|
350
|
-
render: pt,
|
|
351
|
-
screenToGround: vt,
|
|
352
|
-
resize: Q,
|
|
353
|
-
getStats() {
|
|
354
|
-
return { ...ft };
|
|
355
|
-
},
|
|
356
|
-
dispose() {
|
|
357
|
-
if (!E) {
|
|
358
|
-
E = !0, $ ? $.disconnect() : typeof window < "u" && window.removeEventListener("resize", Q), O.removeEventListener("webglcontextlost", Ve);
|
|
359
|
-
for (let e of Array.from(W.keys())) nt(e);
|
|
360
|
-
H.dispose(), V.wheelMat.dispose(), V.dispose(), Ye.dispose(), U.dispose(), Ze.dispose(), Qe.dispose(), Xe.dispose(), B.dispose(), L.dispose(), z.dispose(), I.dispose(), Ue.dispose(), We.dispose(), P.shadow && P.shadow.map && P.shadow.map.dispose(), j.clear(), D.dispose(), D.forceContextLoss(), O.parentNode && O.parentNode.removeChild(O);
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
};
|
|
364
|
-
}
|
|
365
|
-
export { _ as createLiveScene, _ as default };
|
|
366
|
-
|
|
367
|
-
//# sourceMappingURL=createLiveScene-CWBunxPi.js.map
|