@minicode-dev/chat 0.1.15 → 0.1.17
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 +12 -0
- package/README.md +2 -0
- package/dist/chunks/{BattleshipGameCard-8H-sBCsv.js → BattleshipGameCard-DwNzgH5G.js} +199 -199
- package/dist/chunks/{BattleshipGameCard-8H-sBCsv.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-CVW58bzC.js → ChatContext-D5rqvt5D.js} +2 -2
- package/dist/chunks/{ChatContext-CVW58bzC.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-DnCufSH6.js → TanksGameCard-B-gtDYYg.js} +137 -137
- package/dist/chunks/{TanksGameCard-DnCufSH6.js.map → TanksGameCard-B-gtDYYg.js.map} +1 -1
- package/dist/chunks/{TanksLiveGameCard-D_27Jomp.js → TanksLiveGameCard-DXgd1J2Y.js} +392 -392
- package/dist/chunks/{TanksLiveGameCard-D_27Jomp.js.map → TanksLiveGameCard-DXgd1J2Y.js.map} +1 -1
- package/dist/chunks/{avalancheScene3d-CIE2WKQn.js → avalancheScene3d-CNbQyGUd.js} +2 -2
- package/dist/chunks/{avalancheScene3d-CIE2WKQn.js.map → avalancheScene3d-CNbQyGUd.js.map} +1 -1
- package/dist/chunks/{connect4Sounds-BqEHULjv.js → connect4Sounds-3a6h7gUC.js} +8 -8
- package/dist/chunks/{connect4Sounds-BqEHULjv.js.map → connect4Sounds-3a6h7gUC.js.map} +1 -1
- package/dist/chunks/createLiveScene-jrzyQogh.js +756 -0
- package/dist/chunks/{createLiveScene-MTGRv8rx.js.map → createLiveScene-jrzyQogh.js.map} +1 -1
- 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/{games-Bl_8raG6.js → games-D_9SiSBT.js} +708 -697
- 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-DTnidbiq.js → tanksSounds-tYPzje61.js} +4 -4
- package/dist/chunks/{tanksSounds-DTnidbiq.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 +4236 -4020
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/index.d.ts +3 -1
- package/package.json +1 -1
- package/dist/chunks/RacingLiveGameCard-8j9QLnxW.js +0 -1654
- package/dist/chunks/RacingLiveGameCard-8j9QLnxW.js.map +0 -1
- package/dist/chunks/createLiveScene-MTGRv8rx.js +0 -758
- package/dist/chunks/createRaceScene-BiEtQsVs.js +0 -306
- package/dist/chunks/createRaceScene-BiEtQsVs.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/games-Bl_8raG6.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":"games-Bl_8raG6.js","names":["clamp","generateMap","uuid","id","record","keysOnly","uint32","generateMap","UUID","HEX32","isRecord","isId","isUuid","isPly","isLogEntry","isId","isId","createGame","createBoard","ENDED","SYNC_LOST","MISSING_ACCEPT","conflict","createBoard","toHex","createGame","publicLog","compareLogs","adoptLog","logCovers","withLogSeen","PREFIX","MAX_AGE_MS","keyOf","storage","prune","isLogEntry","publicLog","adoptLog","compareLogs","logCovers","withLogSeen","tanks.publicLog","tanks.adoptLog","tanks.compareLogs","tanks.logCovers","tanks.withLogSeen","tanks.createTanksGame","tanks.applyTanksEvent","tanks.createSeedSecret","tanks.commitSeed","tanks.buildTurn","tanks.canAct","tanks.snapshotOf","LEGACY_RACE","getRaceClass","DEFAULT_RACE_CLASS","generateTrack","isFleetComplete","removeShip","isCell","createBoard$1","fireShot","placeShip","FLEET","randomUuid","cryptoApi","bytes","i","hex","byte","RULES","clamp$1","lo","hi","n","angleDelta","b","a","createArena","x","z","r","createTank","id","index","BLAST","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","damageDestructible","map","item","dmg","barrelBlast","damage","explodeBarrel","barrel","blasts","next","total","hit","tankId","interpolatePose","fraction","TANKS_LIVE_MAP_IDS","GENERATED","SIZE","C","MARGIN","SAFE","GAP","TANK_R","SPAWNS","DESTRUCTIBLE","mulberry32","seed","r1","range","rng","pick","list","weighted","items","circle","rect","w","rots","AXIS","TEMPLATES","extent","mirror","blocksTank","insideBounds","e","fits","spawns","placed","p","surfaceDistance","pathExists","solid","obstacles","destructibles","free","seen","queue","nx","nz","placePairs","out","tries","maxTries","makeItem","m","all","layout","template","dlo","dhi","kind","makeDecor","count","kinds","num","mapHash","parts","str","generateMap$1","mapId","base","result","attempt","uuid$1","value","id$1","record$1","keysOnly$1","data","keys","key","uint32$1","hashValid","LIVE_LIVES","LIVE_MAPS","hashCache","liveMapHash","mapFields","isValidLiveEvent","event","randomLiveSeed","createLiveInviteData","legacy","opponentId","rematchOf","lives","extra","createLiveGame","liveConfig","applyLiveEvent","game","author","uuid","record","keysOnly","trackHash","uint32","isValidRaceEvent","createRaceInviteData","raceClass","speedClass","createRaceGame","applyRaceEvent","listeners","rtcSignals","frame","listener","createChatSignaling","send","roomId","text","UUID$1","HEX16","HEX32$1","HEX64","isRecord$1","isId$3","isUuid$1","isInt","min","max","AMMO_IDS","isPly$1","isTurnInput","isLogEntry$1","entry","isTanksLog","isValidTanksEvent","GAME_PREFIX","MAX_MESSAGE_LENGTH","UUID","isRecord","isId$2","isUuid","isMoves","moves","move","isHistory","SHIP_IDS","isCoord","isCommitment","isPly","isSunk","sunk","cell","isFleet","fleet","ship","isLogEntry","last","isBattleshipLog","commit","isValidBattleshipEvent","isGameMessage","isValidConnect4Event","VALIDATORS","GAME_IDS","isValidGameEvent","parseGameMessage","encodeGameEvent","message","createGameEvent","createBoard","directions","getWinningCells","row","column","player","board","dr","dc","cells","step","getWinner","isBoardFull","dropPiece","playerId","winningCells","winner","isId$1","createGame$1","players","gameId","firstPlayerId","battleshipReducer","state","action","playerIndex","outcome","boards","ready","playing","targetIndex","TOTAL_SHIP_CELLS","sum","HEX32","ENDED$1","SYNC_LOST$1","MISSING_ACCEPT$1","INVALID_RESULT","FLEET_MISSING","emptyMatrix","setCell","matrix","line","col","countHits","countShots","attackerFor","ply","otherPlayer","commitField","conflict$1","cellKey","byCell","sameCells","left","right","createBattleshipGame","canEditFleet","canFire","shipCopy","placementOf","normalizePlacement","boardFromFleet","placement","toRevealFleet","shipId","fromRevealFleet","isFleetReady","ownBoard","placeFleetShip","removeFleetShip","secureRandomInt","limit","buffer","randomFleet","randomInt","randomizeFleet","toHex$1","createSalt","canonicalFleet","sorted","salt","computeCommitment","digest","buildResult","shot","sunkShip","definition","horizontal","vertical","checkReportedResult","defeated","shots","hits","taken","sunkCount","checkOwnResult","expected","applyCommit","field","commitment","ships","stored","applyFire","attacker","eventId","applyResult","mine","defender","checked","receiveFire","previous","receiveResult","applyReveal","applyBattleshipEvent","ctx","replayMatches","fleets","real","verifyReveal","reveal","enemy","actual","own","encodeShot","start","publicLog$1","log","compareLogs$1","localAccept","local","remoteAccept","remote","marks","theirs","ours","position","mergeLogs","accept","adoptLog$1","commits","ownIndex","offset","logCovers$1","withLogSeen$1","PREFIX$1","MAX_AGE_MS$1","keyOf$1","scope","storage$1","isSecret","prune$1","now","store","saveFleet","loadFleet","U","MAP_SIZE","CELL","MAX_HEIGHT","TANK_CENTER_Y","MUZZLE_Y","BARREL","MOVE_UNIT","MOVE_STEP","MAX_FUEL","SPAWN_FLAT","LIMITS","AMMO","BOMBLET","BOMBLET_OFFSETS","START_AMMO","SIN_TABLE","TRIG_SCALE","sinDeg","deg","cosDeg","mulTrig","scaled","isSeed","createRng","randInt","windFor","clamp","v","lerp","f","span","heightAt","ix","iz","fx","fz","heights","lattice","values","sampleLattice","at","smooth","flatten","r1sq","r2sq","r2","d2","k","halfStep","minM2","maxM2","near","insideBox","box","pad","generateMap","coarse","medium","fine","spawn","obstacleCount","reach","corners","sx","sz","y","decor","decorCount","scale","applyCrater","depth","decorSurvives","craters","muzzleSpeed","power","ammo","launchState","cp","pitch","sp","cy","yaw","sy","barrelH","v0","vh","inSphere","px","dy","py","pz","trace","samples","tick","maxTicks","prevVy","vy","wind","vx","vz","impact","ground","split","shotOf","path","blast","fireShots","shooter","world","carrier","remaining","dvx","dvy","dvz","damageFrom","maxDmg","cratersFrom","simulateMove","sign","wanted","steps","stop","others","ny","isId","fail","inRange","createGame","validateCommon","validateTurn","common","cost","simulateTurn","other","moved","tankAfter","amounts","finish","winnerIndex","applyTurn","sim","crater","pos","dead","tanksReducer","skips","fnvByte","nlo","carry","fnvInt","stateHash","K","rotr","bits","sha256Hex","padded","view","hash","words","s0","s1","g","word","SYNC_LOST","MISSING_ACCEPT","BAD_SEED","DIVERGED","ENDED","conflict","toHex","createSeedSecret","commitSeed","seedA","deriveSeed","seedB","createTanksGame","playersOf","currentPlayer","canAct","entryOf","type","sameEntry","actionOf","logic","finished","seedEventId","applyTanksEvent","buildTurn","publicLog","compareLogs","shared","rank","adoptLog","logCovers","withLogSeen","snapshotOf","PREFIX","MAX_AGE_MS","MAX_ITEMS","keyOf","storage","entries","prune","alive","saveTanks","loadTanks","patch","listTanks","GAME_TYPES","gameTypeOf","isBattleship","isTanks","isRealtimeGame","BS_EFFECT_DELAY","terminal","keyFor","retainGames","games","applyEvent","RESYNC_TIMEOUT","idleSync","isResync","historyOf","rebuild","acceptEventId","used","compareHistories","pendingMoveId","connect4Sync","pendingId","createBattleshipSync","secretFor","tanksSync","createConnect4Game","resyncEvent","createChatGamesStore","transport","secrets","effectTimers","verifying","earlyEvents","resyncTimers","battleshipSync","tankSeeds","seedFor","GAME_ADAPTERS","ownId","get","adapterFor","syncFor","createStore","timer","set","options","scopeOrOptions","ownIdArgument","body","normalized","members","adapter","guestId","competing","queued","gameType","eventData","change","current","verification","mayReveal","restored","snapshot","onlyGameId","rebuilt","activeTransport","winnerId","prior","config","newMap","sendingTransport","update","requireCurrent","error","put","sync","isState","relation","resolved","reply","deliversPending","merged","union","replies","replyEvent","auto","offer","chatGamesStore","useChatGames","useStore","selector","DEFAULT_BASE_URL","baseUrl","trimTrailingSlash","url","setChatAssetsBaseUrl","getChatAssetsBaseUrl","chatSoundUrl","relativePath"],"sources":["../../src/core/ids/randomUuid.js","../../src/games/tanks-live/logic/simulation.js","../../src/games/tanks-live/logic/maps.js","../../src/games/tanks-live/session.js","../../src/games/racing-live/session.js","../../src/net/webrtc/rtcSignals.js","../../src/games/tanks/net/protocol.js","../../src/games/shared/protocol.js","../../src/games/connect4/connect4.js","../../src/games/battleship/logic/game.js","../../src/games/battleship/net/session.js","../../src/games/battleship/net/fleetStorage.js","../../src/games/tanks/logic/constants.js","../../src/games/tanks/logic/rng.js","../../src/games/tanks/logic/terrain.js","../../src/games/tanks/logic/ballistics.js","../../src/games/tanks/logic/movement.js","../../src/games/tanks/logic/game.js","../../src/games/tanks/net/sha256.js","../../src/games/tanks/net/session.js","../../src/games/tanks/net/tankStorage.js","../../src/games/shared/useChatGames.js","../../src/assets/chatAssets.js"],"sourcesContent":["// Identifiers for chat requests and game events (never credentials or secrets).\n// randomUUID is HTTPS-only; getRandomValues also works on local HTTP network URLs.\nexport function randomUuid(cryptoApi = globalThis.crypto) {\n if (typeof cryptoApi?.randomUUID === 'function') return cryptoApi.randomUUID();\n const bytes = new Uint8Array(16);\n if (typeof cryptoApi?.getRandomValues === 'function') cryptoApi.getRandomValues(bytes);\n else for (let i = 0; i < bytes.length; i += 1) bytes[i] = Math.floor(Math.random() * 256);\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\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' }; }\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","// Seeded map generator for Tanques LIVE. Both peers call generateMap(mapId, seed) and compare map.hash.\n// Layouts are point-symmetric around the arena center (60,60) so both spawns are equivalent.\nimport { createArena } from './simulation.js';\n\nexport const TANKS_LIVE_MAP_IDS = Object.freeze(['meadow', 'forest', 'desert', 'ruins', 'arctic', 'random']);\nconst GENERATED = ['forest', 'desert', 'ruins', 'arctic'];\nconst SIZE = 120, C = SIZE / 2, MARGIN = 4, SAFE = 12, GAP = 1.5, TANK_R = 2;\nconst SPAWNS = () => [{ x: 18, z: 60, yaw: 0 }, { x: 102, z: 60, yaw: Math.PI }];\nconst DESTRUCTIBLE = { crate: { r: 1.2, hp: 2 }, barrel: { r: 0.9, hp: 1 } };\n\nfunction mulberry32(seed) {\n let a = seed >>> 0;\n return () => { a = (a + 0x6D2B79F5) >>> 0; let t = a; t = Math.imul(t ^ (t >>> 15), t | 1); t ^= t + Math.imul(t ^ (t >>> 7), t | 61); return ((t ^ (t >>> 14)) >>> 0) / 4294967296; };\n}\nconst r1 = n => Math.round(n * 10) / 10;\nconst range = (rng, lo, hi) => lo + rng() * (hi - lo);\nconst pick = (rng, list) => list[Math.floor(rng() * list.length) % list.length];\nfunction weighted(rng, items) {\n let n = rng() * items.reduce((s, i) => s + i.w, 0);\n for (const item of items) { n -= item.w; if (n < 0) return item; }\n return items[items.length - 1];\n}\n\nconst circle = (kind, lo, hi) => ({ kind, make: rng => ({ shape: 'circle', kind, r: r1(range(rng, lo, hi)) }) });\nconst rect = (kind, w, d, rots) => ({ kind, make: rng => ({ shape: 'rect', kind, w: r1(range(rng, ...w)), d: r1(range(rng, ...d)), rot: rots ? pick(rng, rots) : r1(range(rng, 0, Math.PI)) }) });\nconst AXIS = [0, Math.PI / 2];\nconst TEMPLATES = {\n forest: { count: [18, 25], destructibles: [2, 4], decor: ['grass', 'flower', 'bush', 'pebble'], items: [\n { w: 6, ...circle('tree', 2, 3.2) }, { w: 2, ...circle('log', 1.6, 2.2) }, { w: 1, ...circle('rock', 2, 3) }] },\n desert: { count: [12, 15], destructibles: [2, 4], decor: ['pebble', 'dry_grass', 'cactus', 'bones'], items: [\n { w: 3, ...circle('rock', 5, 7) }, { w: 2, ...rect('low', [8, 12], [1.8, 2.4]) }] },\n ruins: { count: [16, 22], destructibles: [4, 6], decor: ['rubble', 'pebble', 'weed'], items: [\n { w: 4, ...rect('wall', [8, 14], [1.1, 1.4], AXIS) }, { w: 2, ...rect('house', [7, 9], [6, 8], AXIS) },\n { w: 2, ...rect('car', [4.2, 4.6], [2, 2.3]) }, { w: 1, ...circle('rock', 2, 3) }] },\n arctic: { count: [14, 20], destructibles: [2, 4], decor: ['snow', 'ice_shard', 'pebble'], items: [\n { w: 3, ...rect('ice_block', [3, 5], [3, 5]) }, { w: 2, ...circle('ice', 2.5, 4) }, { w: 2, ...circle('tree', 2, 3) }] },\n};\n\nconst extent = o => o.shape === 'rect' ? Math.hypot(o.w, o.d) / 2 : o.r;\nconst mirror = o => ({ ...o, x: r1(SIZE - o.x), z: r1(SIZE - o.z) });\nconst blocksTank = o => !(o.shape === 'rect' && o.kind === 'low');\nfunction insideBounds(o) { const e = extent(o); return o.x - e >= MARGIN && o.x + e <= SIZE - MARGIN && o.z - e >= MARGIN && o.z + e <= SIZE - MARGIN; }\nfunction fits(o, placed, spawns) {\n const e = extent(o);\n if (!insideBounds(o)) return false;\n if (spawns.some(s => Math.hypot(o.x - s.x, o.z - s.z) - e < SAFE)) return false;\n return placed.every(p => Math.hypot(o.x - p.x, o.z - p.z) >= e + extent(p) + GAP);\n}\n\n// Distance from point to obstacle surface (<0 inside).\nfunction surfaceDistance(x, z, o) {\n if (o.shape !== 'rect') return Math.hypot(x - o.x, z - o.z) - o.r;\n const c = Math.cos(-o.rot), s = Math.sin(-o.rot), dx = x - o.x, dz = z - o.z;\n const lx = Math.abs(dx * c - dz * s) - o.w / 2, lz = Math.abs(dx * s + dz * c) - o.d / 2;\n return Math.hypot(Math.max(lx, 0), Math.max(lz, 0)) + Math.min(Math.max(lx, lz), 0);\n}\n// Grid BFS (1 m) for a tank-sized body; destructibles count as blocking (conservative).\nfunction pathExists(obstacles, destructibles, spawns, radius = TANK_R) {\n const solid = [...obstacles.filter(blocksTank), ...destructibles];\n const free = (x, z) => x >= radius && x <= SIZE - radius && z >= radius && z <= SIZE - radius && solid.every(o => surfaceDistance(x, z, o) >= radius);\n const N = SIZE + 1, seen = new Uint8Array(N * N);\n const [a, b] = spawns.map(s => [Math.round(s.x), Math.round(s.z)]);\n const queue = [a]; seen[a[0] * N + a[1]] = 1;\n for (let i = 0; i < queue.length; i++) {\n const [x, z] = queue[i];\n if (x === b[0] && z === b[1]) return true;\n for (const [dx, dz] of [[1, 0], [-1, 0], [0, 1], [0, -1]]) {\n const nx = x + dx, nz = z + dz;\n if (nx < 0 || nz < 0 || nx >= N || nz >= N || seen[nx * N + nz] || !free(nx, nz)) continue;\n seen[nx * N + nz] = 1; queue.push([nx, nz]);\n }\n }\n return false;\n}\n\nfunction placePairs(rng, makeItem, target, placed, spawns, maxTries = 1500) {\n const out = [];\n for (let tries = 0; out.length < target && tries < maxTries; tries++) {\n const o = makeItem();\n const e = extent(o);\n o.x = r1(range(rng, MARGIN + e, SIZE - MARGIN - e)); o.z = r1(range(rng, MARGIN + e, SIZE - MARGIN - e));\n const m = mirror(o);\n if (Math.hypot(o.x - m.x, o.z - m.z) < 2 * e + GAP) continue;\n const all = [...placed, ...out];\n if (!fits(o, all, spawns) || !fits(m, [...all, o], spawns)) continue;\n out.push(o, m);\n }\n return out;\n}\n\nfunction layout(template, rng, spawns) {\n const [lo, hi] = template.count;\n const total = lo + Math.floor(rng() * (hi - lo + 1));\n const obstacles = [];\n if (total % 2) { // self-symmetric centerpiece keeps odd counts symmetric\n const c = weighted(rng, template.items).make(rng); c.x = C; c.z = C;\n if (fits(c, [], spawns)) obstacles.push(c);\n }\n obstacles.push(...placePairs(rng, () => weighted(rng, template.items).make(rng), total - obstacles.length, obstacles, spawns));\n const [dlo, dhi] = template.destructibles;\n const dTarget = 2 * (dlo / 2 + Math.floor(rng() * ((dhi - dlo) / 2 + 1)));\n const destructibles = placePairs(rng, () => { const kind = rng() < 0.5 ? 'crate' : 'barrel'; return { shape: 'circle', kind, ...DESTRUCTIBLE[kind] }; }, dTarget, obstacles, spawns);\n // Guarantee a path: drop the latest pairs until spawns are connected.\n while (!pathExists(obstacles, destructibles, spawns)) {\n if (destructibles.length > 2) destructibles.splice(-2);\n else if (obstacles.length > lo) obstacles.splice(-2);\n else return null;\n }\n if (obstacles.length < lo || obstacles.length > 25 || destructibles.length < 2 || destructibles.length > 6) return null;\n return { obstacles, destructibles };\n}\n\nfunction makeDecor(rng, kinds, count) {\n return Array.from({ length: count }, (_, i) => ({ id: `c${i}`, kind: pick(rng, kinds), x: r1(range(rng, 2, SIZE - 2)), z: r1(range(rng, 2, SIZE - 2)), s: r1(range(rng, 0.5, 1.5)), rot: r1(range(rng, 0, Math.PI * 2)) }));\n}\n\nconst num = n => (Math.round(n * 100) / 100).toFixed(2);\nexport function mapHash(map) {\n const parts = [map.id, map.size];\n for (const o of [...(map.obstacles || []), ...(map.destructibles || [])]) {\n parts.push(o.shape === 'rect' ? `${o.id}:R:${o.kind}:${num(o.x)}:${num(o.z)}:${num(o.w)}:${num(o.d)}:${num(o.rot)}` : `${o.id}:C:${o.kind}:${num(o.x)}:${num(o.z)}:${num(o.r)}${o.hp != null ? `:${o.hp}` : ''}`);\n }\n for (const s of map.spawns || []) parts.push(`S:${num(s.x)}:${num(s.z)}:${num(s.yaw)}`);\n const str = parts.join('|');\n let h = 0x811c9dc5;\n for (let i = 0; i < str.length; i++) { h ^= str.charCodeAt(i); h = Math.imul(h, 0x01000193) >>> 0; }\n return h.toString(16).padStart(8, '0');\n}\n\nexport function generateMap(mapId = 'meadow', seed = 0) {\n seed = Number(seed) >>> 0;\n let id = TANKS_LIVE_MAP_IDS.includes(mapId) ? mapId : 'meadow';\n if (id === 'random') id = GENERATED[Math.floor(mulberry32(seed ^ 0x9E3779B9)() * GENERATED.length)];\n const spawns = SPAWNS();\n const base = { id, seed, size: SIZE, bounds: { minX: 0, maxX: SIZE, minZ: 0, maxZ: SIZE }, spawns };\n let map;\n if (id === 'meadow') {\n const arena = createArena();\n map = { ...base, obstacles: arena.obstacles.map((o, i) => ({ id: `o${i}`, shape: 'circle', ...o })), destructibles: [], decor: makeDecor(mulberry32(seed ^ 0xDEC0), ['grass', 'flower', 'pebble'], 40) };\n } else {\n const template = TEMPLATES[id], rng = mulberry32(seed);\n let result = null;\n for (let attempt = 0; !result && attempt < 20; attempt++) result = layout(template, rng, spawns);\n if (!result) result = { obstacles: [], destructibles: [] }; // unreachable in practice; keeps the game playable\n map = { ...base,\n obstacles: result.obstacles.map((o, i) => ({ id: `o${i}`, ...o })),\n destructibles: result.destructibles.map((o, i) => ({ id: `d${i}`, ...o })),\n decor: makeDecor(mulberry32(seed ^ 0xDEC0), template.decor, 50) };\n }\n map.hash = mapHash(map);\n return map;\n}\n","import { generateMap, TANKS_LIVE_MAP_IDS } from './logic/maps.js';\n\n// Chat carries only match lifecycle. Simulation and results travel over DataChannel.\n// rules_version 1 = legacy invitation (meadow arena, 1 life). rules_version 2 adds map_id, seed, map_hash and lives,\n// so clients without map support reject it instead of playing a different arena.\nconst uuid = (value) => typeof value === 'string' && /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);\nconst id = (value) => typeof value === 'string' && value.length > 0 && value.length <= 256 && value.trim() === value;\nconst record = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);\nconst keysOnly = (data, keys) => Object.keys(data).every((key) => keys.includes(key));\nconst uint32 = (value) => Number.isInteger(value) && value >= 0 && value <= 0xffffffff;\nconst hashValid = (value) => typeof value === 'string' && /^[0-9a-f]{8}$/.test(value);\nexport const LIVE_LIVES = Object.freeze([1, 3, 5]);\nexport const LIVE_MAPS = Object.freeze(TANKS_LIVE_MAP_IDS.filter((mapId) => mapId !== 'random'));\nexport const DEFAULT_LIVE_LIVES = 3;\n\n// Map generation costs a few ms; validators run several times per frame (encode, parse, ingest).\nconst hashCache = new Map();\nexport function liveMapHash(mapId, seed) {\n const key = `${mapId}:${seed}`;\n if (!hashCache.has(key)) { hashCache.set(key, generateMap(mapId, seed).hash); if (hashCache.size > 32) hashCache.delete(hashCache.keys().next().value); }\n return hashCache.get(key);\n}\nconst mapFields = ['map_id', 'seed', 'map_hash', 'lives'];\n\nexport function isValidLiveEvent(event) {\n const data = event?.data;\n if (!record(data)) return false;\n switch (event.type) {\n case 'game_invite': {\n if (!keysOnly(data, ['opponent_id', 'rules_version', 'rematch_of', ...mapFields]) || !id(data.opponent_id)\n || (data.rematch_of !== undefined && !uuid(data.rematch_of))) return false;\n if (data.rules_version === 1) return mapFields.every((key) => data[key] === undefined);\n return data.rules_version === 2 && LIVE_MAPS.includes(data.map_id) && uint32(data.seed) && LIVE_LIVES.includes(data.lives)\n && hashValid(data.map_hash) && data.map_hash === liveMapHash(data.map_id, data.seed);\n }\n case 'game_accept': return keysOnly(data, ['invite_event_id', 'map_hash']) && uuid(data.invite_event_id)\n && (data.map_hash === undefined || hashValid(data.map_hash));\n case 'game_decline': return keysOnly(data, ['invite_event_id']) && uuid(data.invite_event_id);\n case 'game_end': return keysOnly(data, ['reason']) && data.reason === 'closed';\n default: return false;\n }\n}\n\nexport const randomLiveSeed = () => globalThis.crypto.getRandomValues(new Uint32Array(1))[0];\n\n/** Invitation data. `mapId: null` builds a legacy invitation (meadow, 1 life); 'random' resolves to a concrete map. */\nexport function createLiveInviteData({ opponentId, mapId = 'random', lives = DEFAULT_LIVE_LIVES, seed = randomLiveSeed(), rematchOf } = {}) {\n const legacy = mapId === null;\n if (!id(opponentId) || (rematchOf !== undefined && !uuid(rematchOf))\n || (!legacy && (!TANKS_LIVE_MAP_IDS.includes(mapId) || !uint32(seed) || !LIVE_LIVES.includes(lives)))) {\n throw new TypeError('Configuración de invitación de Tanques LIVE inválida');\n }\n const extra = rematchOf === undefined ? {} : { rematch_of: rematchOf };\n if (legacy) return { opponent_id: opponentId, rules_version: 1, ...extra };\n const map = generateMap(mapId, seed);\n return { opponent_id: opponentId, rules_version: 2, map_id: map.id, seed, map_hash: map.hash, lives, ...extra };\n}\n\nexport function createLiveGame(base, data) {\n const liveConfig = data.rules_version === 2 ? { mapId: data.map_id, seed: data.seed, mapHash: data.map_hash, lives: data.lives } : null;\n return { ...base, game: 'tanks_live', status: 'invited', turnId: null, winnerId: null, liveConfig,\n rematchOf: data.rematch_of ?? null, pending: false, pendingEvent: null, error: '', acceptEventId: null };\n}\nexport function applyLiveEvent(game, event, author) {\n if (![game.hostId, game.guestId].includes(author)) return game;\n if (event.type === 'game_end') return ['closed', 'declined'].includes(game.status) ? game : { ...game, status: 'closed', closedBy: author, error: '' };\n if (game.status !== 'invited' || author !== game.guestId || event.data.invite_event_id !== game.inviteEventId) return game;\n if (event.type === 'game_decline') return { ...game, status: 'declined', lastEventId: event.event_id };\n // The guest echoes the hash of the map it generated; a mismatch never starts the match.\n if (event.type === 'game_accept' && event.data.map_hash === (game.liveConfig?.mapHash ?? undefined)) {\n return { ...game, status: 'active', acceptEventId: event.event_id, lastEventId: event.event_id };\n }\n return game;\n}\n","import { generateTrack } from './logic/track.js';\nimport { DEFAULT_RACE_CLASS, LEGACY_RACE, getRaceClass } from './logic/classes.js';\n\n// Chat carries lifecycle only. Authoritative racing results belong to the future\n// DataChannel controller, never to a game_end {reason:'win'} chat message.\nconst uuid = (value) => typeof value === 'string' && /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);\nconst id = (value) => typeof value === 'string' && value.length > 0 && value.length <= 256 && value.trim() === value;\nconst record = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);\nconst keysOnly = (data, keys) => Object.keys(data).every((key) => keys.includes(key));\nconst trackHash = (value) => typeof value === 'string' && /^racing-v1-[0-9a-f]{8}$/.test(value);\nconst uint32 = (value) => Number.isInteger(value) && value >= 0 && value <= 0xffffffff;\n\nexport function isValidRaceEvent(event) {\n const data = event?.data;\n if (!record(data)) return false;\n switch (event.type) {\n case 'game_invite':\n // speed_class is optional: invitations without it keep the legacy rules, 3 laps and 600 m track.\n return keysOnly(data, ['opponent_id', 'rules_version', 'mode', 'map_id', 'seed', 'track_hash', 'laps', 'speed_class', 'rematch_of'])\n && id(data.opponent_id) && data.rules_version === 1 && data.mode === 'classic'\n && data.map_id === 'neon_city' && uint32(data.seed)\n && (data.speed_class === undefined || getRaceClass(data.speed_class) !== null)\n && data.laps === (getRaceClass(data.speed_class)?.laps ?? LEGACY_RACE.laps)\n && trackHash(data.track_hash) && (data.rematch_of === undefined || uuid(data.rematch_of))\n && data.track_hash === generateTrack(data.map_id, data.seed, { speedClass: data.speed_class }).trackHash;\n case 'game_accept':\n return keysOnly(data, ['invite_event_id', 'track_hash']) && uuid(data.invite_event_id) && trackHash(data.track_hash);\n case 'game_decline':\n return keysOnly(data, ['invite_event_id']) && uuid(data.invite_event_id);\n case 'game_end':\n return keysOnly(data, ['reason']) && data.reason === 'closed';\n default: return false;\n }\n}\n\n/** Only implemented competitive configuration is admitted; unknown modes fail.\n * New invitations default to 200cc; `speedClass: null` builds a legacy invitation (no speed_class).\n */\nexport function createRaceInviteData({ opponentId, seed = 0, rematchOf, speedClass = DEFAULT_RACE_CLASS } = {}) {\n const raceClass = getRaceClass(speedClass);\n if (!id(opponentId) || !uint32(seed) || (rematchOf !== undefined && !uuid(rematchOf)) || (speedClass !== null && !raceClass)) {\n throw new TypeError('Configuración de invitación de carrera inválida');\n }\n return { opponent_id: opponentId, rules_version: 1, mode: 'classic', map_id: 'neon_city', seed,\n track_hash: generateTrack('neon_city', seed, { speedClass: raceClass?.id }).trackHash, laps: raceClass?.laps ?? LEGACY_RACE.laps,\n ...(raceClass ? { speed_class: raceClass.id } : {}),\n ...(rematchOf === undefined ? {} : { rematch_of: rematchOf }) };\n}\n\nexport function createRaceGame(base, data) {\n if (!isValidRaceEvent({ type: 'game_invite', data })) throw new TypeError('Configuración de carrera inválida');\n return { ...base, game: 'racing_live', status: 'invited', turnId: null, winnerId: null,\n raceConfig: { mode: data.mode, mapId: data.map_id, seed: data.seed, trackHash: data.track_hash,\n laps: data.laps, rulesVersion: data.rules_version, speedClass: data.speed_class ?? null },\n rematchOf: data.rematch_of ?? null, pending: false, pendingEvent: null, error: '', acceptEventId: null };\n}\n\nexport function applyRaceEvent(game, event, author) {\n if (!game || event?.game !== 'racing_live' || event.game_id !== game.gameId\n || ![game.hostId, game.guestId].includes(author) || !isValidRaceEvent(event)) return game;\n if (event.type === 'game_end') {\n return ['closed', 'declined'].includes(game.status) ? game : { ...game, status: 'closed', closedBy: author,\n lastEventId: event.event_id, error: '' };\n }\n if (game.status !== 'invited' || author !== game.guestId || event.data.invite_event_id !== game.inviteEventId) return game;\n if (event.type === 'game_decline') return { ...game, status: 'declined', lastEventId: event.event_id };\n if (event.type === 'game_accept' && event.data.track_hash === game.raceConfig.trackHash) {\n return { ...game, status: 'active', acceptEventId: event.event_id, lastEventId: event.event_id };\n }\n return game;\n}\n","// Chat-side delivery of LIRA_WEBRTC_V1: frames. The chat store hands every such\n// frame here (and never shows, stores or counts it); peer links subscribe.\n\nconst listeners = new Set();\n\nexport const rtcSignals = {\n emit(frame) {\n listeners.forEach((listener) => {\n try { listener(frame); } catch { /* one link must not break the others */ }\n });\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n};\n\n/** Signaling adapter for createPeerLink over the chat: send(roomId, text) is the host's chat send. */\nexport const createChatSignaling = ({ send, roomId }) => ({\n send: (text) => send(roomId, text),\n subscribe: (listener) => rtcSignals.subscribe((frame) => {\n if (String(frame.roomId) === String(roomId)) listener(frame);\n }),\n});\n","// Wire validation for game: 'tanks' frames inside LIRA_GAME_V1 (see session.js).\n// Only control inputs travel; both clients simulate the shot and compare `hash`.\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nconst HEX16 = /^[0-9a-f]{16}$/;\nconst HEX32 = /^[0-9a-f]{32}$/;\nconst HEX64 = /^[0-9a-f]{64}$/;\nconst isRecord = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);\nconst isId = (value) => typeof value === 'string' && value.length > 0 && value.length <= 256 && value.trim() === value;\nconst isUuid = (value) => typeof value === 'string' && UUID.test(value);\nconst isInt = (value, min, max) => Number.isInteger(value) && value >= min && value <= max;\n\nexport const MAX_LOG = 120;\nexport const AMMO_IDS = Object.freeze(['standard', 'heavy', 'cluster']);\nexport const LOG_TURN = 1;\nexport const LOG_SKIP = 2;\nexport const LOG_RESIGN = 3;\n\nconst isPly = (value) => isInt(value, 1, MAX_LOG);\nexport const isTurnInput = (data) => isInt(data.move, -16, 16) && isInt(data.yaw, 0, 359)\n && isInt(data.pitch, 5, 80) && isInt(data.power, 0, 100) && isInt(data.ammo, 0, AMMO_IDS.length - 1);\n\n// Log entries: [1, move, yaw, pitch, power, ammo] | [2] skip | [3, playerIndex] resign.\nexport function isLogEntry(entry) {\n if (!Array.isArray(entry)) return false;\n if (entry[0] === LOG_TURN) {\n return entry.length === 6 && isTurnInput({ move: entry[1], yaw: entry[2], pitch: entry[3], power: entry[4], ammo: entry[5] });\n }\n if (entry[0] === LOG_SKIP) return entry.length === 1;\n return entry[0] === LOG_RESIGN && entry.length === 2 && (entry[1] === 0 || entry[1] === 1);\n}\n\nconst isTanksLog = (data) => Array.isArray(data.log) && data.log.length <= MAX_LOG && data.log.every(isLogEntry)\n && isUuid(data.head)\n && (data.accept_event_id === undefined\n ? data.log.length === 0 && data.seed_b === undefined && data.seed_a === undefined\n : isUuid(data.accept_event_id) && typeof data.seed_b === 'string' && HEX32.test(data.seed_b))\n && (data.seed_a === undefined ? data.log.length === 0 : HEX32.test(data.seed_a) && isUuid(data.seed_event_id));\n\nexport function isValidTanksEvent(event) {\n const data = event.data;\n switch (event.type) {\n case 'game_invite':\n return isId(data.opponent_id) && data.rules_version === 1 && typeof data.seed_commit === 'string' && HEX64.test(data.seed_commit)\n && (data.first_player_id === undefined || isId(data.first_player_id))\n && (data.rematch_of === undefined || isUuid(data.rematch_of));\n case 'game_accept':\n return isUuid(data.invite_event_id) && typeof data.seed_b === 'string' && HEX32.test(data.seed_b);\n case 'game_decline':\n return isUuid(data.invite_event_id);\n case 'game_end':\n return data.reason === 'closed';\n case 'tk_seed':\n return typeof data.seed_a === 'string' && HEX32.test(data.seed_a);\n case 'tk_turn':\n return isPly(data.ply) && isUuid(data.prev_event_id) && isTurnInput(data) && typeof data.hash === 'string' && HEX16.test(data.hash);\n case 'tk_skip':\n case 'tk_resign':\n return isPly(data.ply) && isUuid(data.prev_event_id);\n case 'tk_sync_request':\n return isRecord(data) && isTanksLog(data);\n case 'tk_sync_state':\n return isRecord(data) && isTanksLog(data) && isUuid(data.request_event_id);\n default:\n return false;\n }\n}\n","import { randomUuid } from '../../core/ids/randomUuid.js';\nimport { isValidLiveEvent } from '../tanks-live/session.js';\nimport { isValidRaceEvent } from '../racing-live/session.js';\nimport { isValidTanksEvent } from '../tanks/net/protocol.js';\n\nexport const GAME_PREFIX = 'LIRA_GAME_V1:';\nexport const GAME_VERSION = 1;\nconst MAX_MESSAGE_LENGTH = 4096;\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nconst isRecord = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);\nconst isId = (value) => typeof value === 'string' && value.length > 0 && value.length <= 256 && value.trim() === value;\nconst isUuid = (value) => typeof value === 'string' && UUID.test(value);\n// Resync history: [[column, move_event_id], ...] in ply order; author follows parity.\nconst isMoves = (moves) => Array.isArray(moves) && moves.length <= 42\n && moves.every((move) => Array.isArray(move) && move.length === 2 && Number.isInteger(move[0])\n && move[0] >= 0 && move[0] < 7 && isUuid(move[1]))\n && new Set(moves.map((move) => move[1])).size === moves.length;\nconst isHistory = (data) => isMoves(data.moves) && data.rev === data.moves.length\n && (data.accept_event_id === undefined ? data.moves.length === 0 : isUuid(data.accept_event_id));\n\n// Battleship (game: 'battleship'). Fleets stay private until bs_reveal; see\n// src/features/battleship/net/session.js for the commit-reveal design.\nconst SHIP_IDS = ['carrier', 'battleship', 'cruiser', 'submarine', 'destroyer'];\nconst isCoord = (value) => Number.isInteger(value) && value >= 0 && value < 10;\nconst isCommitment = (value) => typeof value === 'string' && /^[0-9a-f]{64}$/.test(value);\nconst isPly = (value) => Number.isInteger(value) && value >= 1 && value <= 200;\nconst isSunk = (sunk) => sunk === null || (isRecord(sunk) && SHIP_IDS.includes(sunk.ship_id)\n && Array.isArray(sunk.cells) && sunk.cells.length >= 2 && sunk.cells.length <= 5\n && sunk.cells.every((cell) => Array.isArray(cell) && cell.length === 2 && isCoord(cell[0]) && isCoord(cell[1])));\nconst isFleet = (fleet) => Array.isArray(fleet) && fleet.length === SHIP_IDS.length\n && fleet.every((ship) => isRecord(ship) && SHIP_IDS.includes(ship.ship_id) && isCoord(ship.row) && isCoord(ship.col)\n && (ship.orientation === 'horizontal' || ship.orientation === 'vertical'))\n && new Set(fleet.map((ship) => ship.ship_id)).size === fleet.length;\n// Public log entry: [row, col] pending fire (last only) | [row, col, 0 miss | 1 hit]\n// | [row, col, 2, shipIndex, startRow, startCol, 0 horizontal | 1 vertical] (sunk).\nconst isLogEntry = (entry, last) => Array.isArray(entry) && isCoord(entry[0]) && isCoord(entry[1]) && (\n (entry.length === 2 && last)\n || (entry.length === 3 && (entry[2] === 0 || entry[2] === 1))\n || (entry.length === 7 && entry[2] === 2 && Number.isInteger(entry[3]) && entry[3] >= 0 && entry[3] < SHIP_IDS.length\n && isCoord(entry[4]) && isCoord(entry[5]) && (entry[6] === 0 || entry[6] === 1)));\nconst isBattleshipLog = (data) => Array.isArray(data.commits) && data.commits.length === 2\n && data.commits.every((commit) => commit === null || isCommitment(commit))\n && Array.isArray(data.log) && data.log.length <= 200\n && data.log.every((entry, index) => isLogEntry(entry, index === data.log.length - 1))\n && isUuid(data.head)\n && (data.accept_event_id === undefined\n ? data.commits.every((commit) => commit === null) && data.log.length === 0\n : isUuid(data.accept_event_id))\n && (data.log.length === 0 || data.commits.every(Boolean));\n\nfunction isValidBattleshipEvent(event) {\n const data = event.data;\n switch (event.type) {\n case 'game_invite':\n return isId(data.opponent_id) && data.rules_version === 1;\n case 'game_accept':\n case 'game_decline':\n return isUuid(data.invite_event_id);\n case 'game_end':\n return ['closed', 'win'].includes(data.reason) && (data.winner_id === undefined || isId(data.winner_id));\n case 'bs_commit':\n return isCommitment(data.commitment);\n case 'bs_fire':\n return isPly(data.ply) && isCoord(data.row) && isCoord(data.col) && isUuid(data.prev_event_id);\n case 'bs_result':\n return isPly(data.ply) && isCoord(data.row) && isCoord(data.col) && ['hit', 'miss'].includes(data.result)\n && isSunk(data.sunk) && typeof data.defeated === 'boolean'\n && (data.result === 'hit' || (data.sunk === null && !data.defeated));\n case 'bs_reveal':\n return isFleet(data.fleet) && typeof data.salt === 'string' && /^[0-9a-f]{32}$/.test(data.salt);\n case 'bs_sync_request':\n return isBattleshipLog(data);\n case 'bs_sync_state':\n return isBattleshipLog(data) && isUuid(data.request_event_id);\n default:\n return false;\n }\n}\n\nexport function isGameMessage(text) {\n return typeof text === 'string' && text.startsWith(GAME_PREFIX);\n}\n\nfunction isValidConnect4Event(event) {\n const data = event.data;\n switch (event.type) {\n case 'game_invite':\n return isId(data.opponent_id) && data.rules_version === 1;\n case 'game_accept':\n case 'game_decline':\n return isUuid(data.invite_event_id);\n case 'game_move':\n return Number.isInteger(data.column) && data.column >= 0 && data.column < 7\n && Number.isInteger(data.ply) && data.ply >= 1 && data.ply <= 42\n && isUuid(data.prev_event_id);\n case 'game_end':\n return ['closed', 'win', 'draw'].includes(data.reason)\n && (data.winner_id === undefined || isId(data.winner_id))\n && (data.final_move_event_id === undefined || isUuid(data.final_move_event_id))\n && (data.reason !== 'win' || (isId(data.winner_id) && isUuid(data.final_move_event_id)))\n && (data.reason !== 'draw' || isUuid(data.final_move_event_id));\n case 'game_resync_request':\n return isHistory(data);\n case 'game_resync_state':\n return isHistory(data) && isUuid(data.request_event_id);\n default:\n return false;\n }\n}\n\n// One validator per game type; unknown games are rejected (and ignored by ingest).\nconst VALIDATORS = { connect4: isValidConnect4Event, battleship: isValidBattleshipEvent, tanks: isValidTanksEvent, tanks_live: isValidLiveEvent, racing_live: isValidRaceEvent };\nexport const GAME_IDS = Object.freeze(Object.keys(VALIDATORS));\n\nexport function isValidGameEvent(event) {\n if (!isRecord(event) || event.version !== GAME_VERSION || !Object.hasOwn(VALIDATORS, event.game)\n || !isUuid(event.game_id) || !isUuid(event.event_id) || !isRecord(event.data)) return false;\n return VALIDATORS[event.game](event);\n}\n\nexport function parseGameMessage(text) {\n if (!isGameMessage(text) || text.length > MAX_MESSAGE_LENGTH) return null;\n try {\n const event = JSON.parse(text.slice(GAME_PREFIX.length));\n return isValidGameEvent(event) ? event : null;\n } catch {\n return null;\n }\n}\n\nexport function encodeGameEvent(event) {\n if (!isValidGameEvent(event)) throw new Error('Evento de juego inválido');\n const message = GAME_PREFIX + JSON.stringify(event);\n if (message.length > MAX_MESSAGE_LENGTH) throw new Error('Evento de juego demasiado grande');\n return message;\n}\n\nexport function createGameEvent(type, { game_id, data, event_id = randomUuid(), game = 'connect4' }) {\n const event = { version: GAME_VERSION, game, game_id, event_id, type, data };\n if (!isValidGameEvent(event)) throw new Error('Evento de juego inválido');\n return event;\n}\n","export const ROWS = 6;\nexport const COLUMNS = 7;\nexport const CONNECT = 4;\n\nexport function createBoard() {\n return Array.from({ length: ROWS }, () => Array(COLUMNS).fill(null));\n}\n\nconst directions = [[0, 1], [1, 0], [1, 1], [1, -1]];\n\nexport function getWinningCells(board) {\n for (let row = 0; row < ROWS; row += 1) {\n for (let column = 0; column < COLUMNS; column += 1) {\n const player = board[row][column];\n if (player == null) continue;\n for (const [dr, dc] of directions) {\n const cells = [];\n for (let step = 0; step < CONNECT; step += 1) {\n const r = row + dr * step;\n const c = column + dc * step;\n if (r < 0 || r >= ROWS || c < 0 || c >= COLUMNS || board[r][c] !== player) break;\n cells.push([r, c]);\n }\n if (cells.length === CONNECT) return cells;\n }\n }\n }\n return [];\n}\n\nexport function getWinner(board) {\n const cells = getWinningCells(board);\n return cells.length ? board[cells[0][0]][cells[0][1]] : null;\n}\n\nexport function isBoardFull(board) {\n return board[0].every((cell) => cell !== null);\n}\n\n// Pure rules: the store validates identities, sequencing and whose turn it is.\nexport function dropPiece(board, column, playerId) {\n if (!Number.isInteger(column) || column < 0 || column >= COLUMNS || playerId == null\n || getWinner(board) !== null) return null;\n let row = ROWS - 1;\n while (row >= 0 && board[row][column] !== null) row -= 1;\n if (row < 0) return null;\n const next = board.map((cells) => cells.slice());\n next[row][column] = playerId;\n const winningCells = getWinningCells(next);\n const winner = winningCells.length ? next[winningCells[0][0]][winningCells[0][1]] : null;\n return { board: next, row, column, winner, draw: winner === null && isBoardFull(next), winningCells };\n}\n\nexport function getTurn(players, ply = 0) {\n return players[ply % 2];\n}\n","import { RULES_VERSION, createBoard, placeShip, removeShip, isFleetComplete, fireShot } from './board.js';\n\nconst isId = (value) => typeof value === 'string' && value.length > 0 && value.length <= 256 && value.trim() === value;\n\n/** Caller supplies identifiers and the initial player: no clocks or randomness. */\nexport function createGame({ gameId, players, firstPlayerId = players?.[0] } = {}) {\n if (!isId(gameId) || !Array.isArray(players) || players.length !== 2\n || !players.every(isId) || players[0] === players[1] || !players.includes(firstPlayerId)) {\n throw new TypeError('Supply a gameId, two distinct player IDs and a valid firstPlayerId.');\n }\n return {\n game: 'battleship', rulesVersion: RULES_VERSION, gameId,\n players: players.slice(), boards: [createBoard(), createBoard()],\n ready: [false, false], phase: 'placement', turnId: null,\n firstPlayerId, winnerId: null, shotCount: 0, lastShot: null, revision: 0,\n };\n}\n\n/**\n * Invalid/stale actions return the original reference. Each accepted action adds\n * exactly one revision. Never trust a claimed hit/result: derive it from boards.\n * Optional gameId/expectedRevision let a future transport reject stale commands.\n */\nexport function battleshipReducer(state, action) {\n if (!state || !action || typeof action !== 'object' || state.phase === 'finished') return state;\n if (action.gameId !== undefined && action.gameId !== state.gameId) return state;\n if (action.expectedRevision !== undefined && action.expectedRevision !== state.revision) return state;\n const playerIndex = state.players.indexOf(action.playerId);\n if (playerIndex < 0) return state;\n const board = state.boards[playerIndex];\n if (state.phase === 'placement') {\n if (state.ready[playerIndex]) return state;\n if (action.type === 'place_ship' || action.type === 'remove_ship') {\n const outcome = action.type === 'place_ship'\n ? placeShip(board, action) : removeShip(board, action.shipId);\n if (!outcome.ok) return state;\n const boards = state.boards.slice();\n boards[playerIndex] = outcome.board;\n return { ...state, boards, revision: state.revision + 1 };\n }\n if (action.type === 'ready' && isFleetComplete(board)) {\n const ready = state.ready.slice();\n ready[playerIndex] = true;\n const playing = ready.every(Boolean);\n return {\n ...state, ready, phase: playing ? 'playing' : 'placement',\n turnId: playing ? state.firstPlayerId : null, revision: state.revision + 1,\n };\n }\n return state;\n }\n if (state.phase !== 'playing' || action.type !== 'fire' || action.playerId !== state.turnId) return state;\n const targetIndex = 1 - playerIndex;\n const outcome = fireShot(state.boards[targetIndex], action);\n if (!outcome.ok) return state;\n const boards = state.boards.slice();\n boards[targetIndex] = outcome.board;\n return {\n ...state, boards, revision: state.revision + 1, shotCount: state.shotCount + 1,\n phase: outcome.defeated ? 'finished' : 'playing',\n turnId: outcome.defeated ? null : state.players[targetIndex],\n winnerId: outcome.defeated ? action.playerId : null,\n lastShot: {\n playerId: action.playerId, targetId: state.players[targetIndex],\n row: action.row, col: action.col, result: outcome.result,\n shipId: outcome.shipId, sunk: outcome.sunk, defeated: outcome.defeated,\n },\n };\n}\n","/**\n * Battleship over LIRA_GAME_V1 chat frames: pure session reducer. No React, no\n * sockets, no storage. Board rules come from ../logic (Codex, read-only).\n *\n * Fairness (100% frontend, commit-reveal; detection, not prevention):\n * 1. Each player places the fleet locally. The fleet is NEVER sent before the end.\n * 2. On \"ready\" the client draws a 128-bit salt (crypto.getRandomValues) and sends\n * bs_commit { commitment = SHA-256(canonicalFleet(fleet, salt)) } where the\n * canonical form is JSON {fleet:[{ship_id,row,col,orientation}] sorted by\n * ship_id, salt}. {fleet, salt} is kept in localStorage (fleetStorage.js).\n * 3. The battle starts when both commitments are known. The host fires first and\n * every resolved shot changes turn (Codex rule in logic/game.js).\n * 4. The attacker sends bs_fire {ply, row, col, prev_event_id}. The defender's\n * client computes the result from its own fleet (logic/board.js fireShot) and\n * answers bs_result automatically. The attacker accepts only plausible results:\n * the cell matches the pending ply; a sunk ship is a straight contiguous line of\n * the size of a not-yet-sunk class, contains the cell and only previously\n * reported hits; defeated iff 17 hits (and five ships sunk); 17 hits must remain\n * reachable. Implausible results put the game in 'conflict'.\n * 5. When a fleet is defeated both clients send bs_reveal {fleet, salt}. Each one\n * checks SHA-256 against the opponent commitment and replays ALL shots with the\n * Codex createGame/battleshipReducer (both fleets, firstPlayer = host). Same\n * results/sunk/defeated → verification 'ok', otherwise 'mismatch' (cheating\n * warning; the winner stays the one reported during play). No reveal → 'pending'.\n *\n * Chain: ply 1 references the accept event; every later bs_fire references the\n * previous bs_result. Commits are independent of the chain.\n * Resync: publicLog(game) is the public history (no fleets); compareLogs →\n * equal | behind | ahead | diverged | mixed (only before the battle: independent\n * commits, merge them); adoptLog replays a history through the same rules.\n */\nimport { BOARD_SIZE, FLEET, createBoard, isCell, placeShip, validatePlacement, isFleetComplete, fireShot } from '../logic/board.js';\nimport { createGame, battleshipReducer } from '../logic/game.js';\n\nexport const TOTAL_SHIP_CELLS = FLEET.reduce((sum, ship) => sum + ship.size, 0);\nconst HEX32 = /^[0-9a-f]{32}$/;\nconst ENDED = ['won', 'closed', 'declined'];\nconst SYNC_LOST = 'La partida perdió sincronización. Se intentará resincronizar.';\nconst MISSING_ACCEPT = 'Falta la aceptación de la partida. Ciérrala y vuelve a invitar.';\nconst INVALID_RESULT = 'El rival envió un resultado imposible para ese disparo.';\nconst FLEET_MISSING = 'Tu flota no está disponible en este dispositivo; no se pueden responder disparos.';\n\nconst emptyMatrix = () => Array.from({ length: BOARD_SIZE }, () => Array(BOARD_SIZE).fill(null));\nconst setCell = (matrix, row, col, value) => matrix.map((line, r) => (r === row ? line.map((cell, c) => (c === col ? value : cell)) : line));\nconst countHits = (matrix) => matrix.reduce((sum, line) => sum + line.filter((cell) => cell === 'hit').length, 0);\nconst countShots = (matrix) => matrix.reduce((sum, line) => sum + line.filter((cell) => cell !== null).length, 0);\nconst attackerFor = (game, ply) => (ply % 2 === 1 ? game.hostId : game.guestId);\nconst otherPlayer = (game, id) => (id === game.hostId ? game.guestId : game.hostId);\nconst commitField = (game, id) => (id === game.hostId ? 'hostCommitment' : 'guestCommitment');\nconst conflict = (game, error) => ({ ...game, status: 'conflict', error });\nconst cellKey = (cell) => `${cell.row},${cell.col}`;\nconst byCell = (a, b) => a.row - b.row || a.col - b.col;\nconst sameCells = (left, right) => left.length === right.length\n && left.map(cellKey).sort().join('|') === right.map(cellKey).sort().join('|');\n\n/* ------------------------------ game object ------------------------------ */\n\n/** base: { key, gameId, scope, roomId, hostId, guestId, ownId, createdAt, inviteEventId, lastEventId, seen, sync } */\nexport function createBattleshipGame(base) {\n return {\n ...base, game: 'battleship', status: 'invited', turnId: null,\n myFleet: [], myReady: false, opponentReady: false,\n incomingShots: emptyMatrix(), targetShots: emptyMatrix(), sunkEnemyShips: [],\n pendingShot: null, lastShot: null, winnerId: null, verification: null,\n ply: 0, shots: [], acceptEventId: null, hostCommitment: null, guestCommitment: null,\n myCommitment: null, mySalt: null, myRevealSent: false, opponentReveal: null,\n seen: base.seen ?? {}, pending: false, pendingEvent: null, error: '', sync: base.sync ?? null,\n };\n}\n\nexport const canEditFleet = (game) => game?.game === 'battleship' && ['invited', 'placement'].includes(game.status) && !game.myReady;\nexport const canFire = (game) => game?.status === 'active' && game.turnId === game.ownId && !game.pendingShot;\n\n/* --------------------------------- fleets -------------------------------- */\n\nconst shipCopy = (ship) => ({ id: ship.id, size: ship.size, orientation: ship.orientation, cells: ship.cells.map((cell) => ({ row: cell.row, col: cell.col })) });\nconst placementOf = (ship) => ({ shipId: ship.id, row: ship.cells[0].row, col: ship.cells[0].col, orientation: ship.orientation });\n\n// Accepts game ships ({id, cells, orientation}) and reveal ships ({ship_id, row, col, orientation}).\nfunction normalizePlacement(item) {\n if (!item || typeof item !== 'object') return null;\n if (typeof item.ship_id === 'string') return { shipId: item.ship_id, row: item.row, col: item.col, orientation: item.orientation };\n if (typeof item.id === 'string' && Array.isArray(item.cells) && item.cells.length) return placementOf(item);\n return null;\n}\n\n/** Codex board for a fleet (no shots), or null when any ship is invalid/overlapping. */\nexport function boardFromFleet(fleet) {\n if (!Array.isArray(fleet)) return null;\n let board = createBoard();\n for (const item of fleet) {\n const placement = normalizePlacement(item);\n const outcome = placement && placeShip(board, placement);\n if (!outcome?.ok) return null;\n board = outcome.board;\n }\n return board;\n}\n\n/** Reveal/commit format: [{ship_id,row,col,orientation}] sorted by ship_id; null if invalid. */\nexport function toRevealFleet(fleet) {\n if (!Array.isArray(fleet)) return null;\n const items = fleet.map(normalizePlacement);\n if (items.some((item) => !item)) return null;\n return items.map(({ shipId, row, col, orientation }) => ({ ship_id: shipId, row, col, orientation }))\n .sort((a, b) => (a.ship_id < b.ship_id ? -1 : a.ship_id > b.ship_id ? 1 : 0));\n}\n\n/** Complete fleet → game ships; null when invalid or incomplete. */\nexport function fromRevealFleet(fleet) {\n const board = boardFromFleet(fleet);\n return board && isFleetComplete(board) ? board.ships.map(shipCopy) : null;\n}\n\nexport const isFleetReady = (fleet) => Boolean(fromRevealFleet(fleet));\n\n/** Own board with the opponent's shots applied (for fireShot), or null without a fleet. */\nexport function ownBoard(game) {\n const board = boardFromFleet(game?.myFleet);\n return board && isFleetComplete(board) ? { ...board, shots: game.incomingShots.map((line) => line.slice()) } : null;\n}\n\n/** Placement preview ignoring the ship being moved: { ok, reason?, ship? }. */\nexport function previewPlacement(game, placement) {\n const board = boardFromFleet((game?.myFleet ?? []).filter((ship) => ship.id !== placement?.shipId));\n return board ? validatePlacement(board, placement) : { ok: false, reason: 'invalid_fleet' };\n}\n\n/** Places (or moves) one ship. Invalid placements return the same reference. */\nexport function placeFleetShip(game, { shipId, row, col, orientation } = {}) {\n if (!canEditFleet(game)) return game;\n const board = boardFromFleet(game.myFleet.filter((ship) => ship.id !== shipId));\n const outcome = board && placeShip(board, { shipId, row, col, orientation });\n return outcome?.ok ? { ...game, myFleet: outcome.board.ships.map(shipCopy) } : game;\n}\n\nexport function removeFleetShip(game, shipId) {\n if (!canEditFleet(game) || !game.myFleet.some((ship) => ship.id === shipId)) return game;\n return { ...game, myFleet: game.myFleet.filter((ship) => ship.id !== shipId) };\n}\n\nexport function secureRandomInt(limit) {\n const max = Math.floor(0x100000000 / limit) * limit;\n const buffer = new Uint32Array(1);\n do globalThis.crypto.getRandomValues(buffer); while (buffer[0] >= max);\n return buffer[0] % limit;\n}\n\n/** Random complete fleet (seedless, crypto-backed unless randomInt is supplied). */\nexport function randomFleet(randomInt = secureRandomInt) {\n for (let attempt = 0; attempt < 50; attempt += 1) {\n let board = createBoard();\n for (const ship of FLEET) {\n for (let tries = 0; tries < 300; tries += 1) {\n const outcome = placeShip(board, {\n shipId: ship.id, row: randomInt(BOARD_SIZE), col: randomInt(BOARD_SIZE),\n orientation: randomInt(2) === 0 ? 'horizontal' : 'vertical',\n });\n if (outcome.ok) { board = outcome.board; break; }\n }\n }\n if (isFleetComplete(board)) return board.ships.map(shipCopy);\n }\n throw new Error('No se pudo generar una flota aleatoria.');\n}\n\nexport const randomizeFleet = (game, randomInt) => (canEditFleet(game) ? { ...game, myFleet: randomFleet(randomInt) } : game);\n\n/* ------------------------------ commit-reveal ----------------------------- */\n\nconst toHex = (bytes) => Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');\n\nexport function createSalt() {\n const bytes = new Uint8Array(16);\n globalThis.crypto.getRandomValues(bytes);\n return toHex(bytes);\n}\n\nexport function canonicalFleet(fleet, salt) {\n const sorted = toRevealFleet(fleet);\n if (!sorted || typeof salt !== 'string') throw new TypeError('Flota inválida');\n return JSON.stringify({ fleet: sorted, salt });\n}\n\nexport async function computeCommitment(fleet, salt) {\n const digest = await globalThis.crypto.subtle.digest('SHA-256', new TextEncoder().encode(canonicalFleet(fleet, salt)));\n return toHex(new Uint8Array(digest));\n}\n\n/** bs_result data for a shot at `board` (own fleet + received shots), or null. */\nexport function buildResult(board, shot) {\n if (!board || !shot) return null;\n const outcome = fireShot(board, { row: shot.row, col: shot.col });\n if (!outcome.ok) return null;\n const ship = outcome.sunk ? board.ships.find((item) => item.id === outcome.shipId) : null;\n return {\n ply: shot.ply, row: shot.row, col: shot.col, result: outcome.result,\n sunk: ship ? { ship_id: ship.id, cells: ship.cells.map((cell) => [cell.row, cell.col]) } : null,\n defeated: outcome.defeated,\n };\n}\n\n/** Wire sunk {ship_id, cells:[[r,c]]} → ship {id,size,orientation,cells} when it is a valid straight ship. */\nfunction sunkShip(sunk) {\n const definition = FLEET.find((ship) => ship.id === sunk?.ship_id);\n if (!definition || !Array.isArray(sunk.cells) || sunk.cells.length !== definition.size) return null;\n const cells = sunk.cells.map((cell) => (Array.isArray(cell) ? { row: cell[0], col: cell[1] } : null));\n if (cells.some((cell) => !isCell(cell))) return null;\n cells.sort(byCell);\n const horizontal = cells.every((cell, index) => cell.row === cells[0].row && cell.col === cells[0].col + index);\n const vertical = cells.every((cell, index) => cell.col === cells[0].col && cell.row === cells[0].row + index);\n if (!horizontal && !vertical) return null;\n return { id: definition.id, size: definition.size, orientation: horizontal ? 'horizontal' : 'vertical', cells, sunk: true };\n}\n\n// Attacker side: the defender's fleet is unknown, so check what can be checked.\nfunction checkReportedResult(game, data) {\n const { row, col, result, sunk } = data;\n const defeated = Boolean(data.defeated);\n if ((result !== 'hit' && result !== 'miss') || game.targetShots[row][col] !== null) return null;\n const shots = setCell(game.targetShots, row, col, result);\n const hits = countHits(shots);\n let ship = null;\n if (sunk) {\n ship = result === 'hit' ? sunkShip(sunk) : null;\n if (!ship || game.sunkEnemyShips.some((item) => item.id === ship.id)) return null;\n const taken = new Set(game.sunkEnemyShips.flatMap((item) => item.cells.map(cellKey)));\n if (!ship.cells.some((cell) => cell.row === row && cell.col === col)) return null;\n if (ship.cells.some((cell) => shots[cell.row][cell.col] !== 'hit' || taken.has(cellKey(cell)))) return null;\n }\n const sunkCount = game.sunkEnemyShips.length + (ship ? 1 : 0);\n if (hits > TOTAL_SHIP_CELLS || defeated !== (hits === TOTAL_SHIP_CELLS)) return null;\n if (defeated !== (sunkCount === FLEET.length)) return null;\n // Even hitting every remaining cell could not reach 17: hits are being hidden.\n if (!defeated && TOTAL_SHIP_CELLS - hits > BOARD_SIZE * BOARD_SIZE - countShots(shots)) return null;\n return { shots, ship };\n}\n\n// Defender side: the result must be exactly what our own fleet produces.\nfunction checkOwnResult(game, data) {\n const expected = buildResult(ownBoard(game), data);\n if (!expected || expected.result !== data.result || expected.defeated !== Boolean(data.defeated)\n || Boolean(expected.sunk) !== Boolean(data.sunk)) return null;\n const ship = expected.sunk ? sunkShip(expected.sunk) : null;\n if (ship && (data.sunk.ship_id !== ship.id || !sameCells(ship.cells, data.sunk.cells.map(([row, col]) => ({ row, col }))))) return null;\n return { shots: setCell(game.incomingShots, data.row, data.col, data.result), ship };\n}\n\n/* -------------------------------- reducer -------------------------------- */\n\nfunction applyCommit(game, author, commitment, stored) {\n const field = commitField(game, author);\n if (game[field]) return game[field] === commitment ? game : null;\n let next = { ...game, [field]: commitment };\n if (author === game.ownId) {\n const ships = stored?.commitment === commitment ? fromRevealFleet(stored.fleet) : null;\n if (ships && HEX32.test(stored.salt ?? '')) next = { ...next, myFleet: ships, mySalt: stored.salt, myCommitment: commitment };\n else if (game.myCommitment !== commitment || !game.mySalt) next = { ...next, myFleet: [], mySalt: null, myCommitment: commitment, error: FLEET_MISSING };\n next.myReady = true;\n } else next.opponentReady = true;\n if (next.hostCommitment && next.guestCommitment) next = { ...next, status: 'active', turnId: game.hostId, ply: 0, pendingShot: null };\n return next;\n}\n\nfunction applyFire(game, attacker, { row, col, ply }, eventId) {\n const matrix = attacker === game.ownId ? game.targetShots : game.incomingShots;\n if (!isCell({ row, col }) || matrix[row][col] !== null) return null;\n return { ...game, pendingShot: { row, col, ply, by: attacker }, lastEventId: eventId ?? game.lastEventId };\n}\n\nfunction applyResult(game, defender, data, eventId) {\n const shot = game.pendingShot;\n const mine = defender === game.ownId;\n const checked = mine ? checkOwnResult(game, data) : checkReportedResult(game, data);\n if (!checked) return null;\n const defeated = Boolean(data.defeated);\n const record = { ply: shot.ply, by: shot.by, row: shot.row, col: shot.col, result: data.result, sunk: checked.ship, defeated };\n return {\n ...game,\n incomingShots: mine ? checked.shots : game.incomingShots,\n targetShots: mine ? game.targetShots : checked.shots,\n sunkEnemyShips: !mine && checked.ship ? [...game.sunkEnemyShips, checked.ship] : game.sunkEnemyShips,\n ply: shot.ply, shots: [...game.shots, record], pendingShot: null,\n lastShot: { ...record, eventId: eventId ?? null }, lastEventId: eventId ?? game.lastEventId,\n turnId: defeated ? null : defender, status: defeated ? 'won' : 'active',\n winnerId: defeated ? shot.by : null, verification: defeated ? 'pending' : game.verification,\n };\n}\n\nfunction receiveFire(game, event, author) {\n const { ply, row, col, prev_event_id: previous } = event.data;\n if (author !== attackerFor(game, ply)) return game;\n if (game.status !== 'active') return conflict(game, game.status === 'invited' ? MISSING_ACCEPT : SYNC_LOST);\n if (ply <= game.ply) return game;\n if (game.pendingShot) return ply === game.pendingShot.ply ? game : conflict(game, SYNC_LOST);\n if (ply > game.ply + 1) return conflict(game, SYNC_LOST);\n if (author !== game.turnId) return game;\n if (previous !== game.lastEventId) return conflict(game, SYNC_LOST);\n return applyFire(game, author, { row, col, ply }, event.event_id) ?? game;\n}\n\nfunction receiveResult(game, event, author) {\n const { ply, row, col } = event.data;\n if (game.status !== 'active') return game.status === 'placement' ? conflict(game, SYNC_LOST) : game;\n const shot = game.pendingShot;\n if (!shot) return ply <= game.ply ? game : conflict(game, SYNC_LOST);\n if (ply !== shot.ply) return ply < shot.ply ? game : conflict(game, SYNC_LOST);\n if (author === shot.by) return game;\n if (row !== shot.row || col !== shot.col) return author === game.ownId ? game : conflict(game, 'El rival respondió a un disparo distinto.');\n const next = applyResult(game, author, event.data, event.event_id);\n if (next) return next;\n return author === game.ownId ? game : conflict(game, INVALID_RESULT);\n}\n\nfunction applyReveal(game, data, author) {\n if (!game.winnerId || !['won', 'closed'].includes(game.status)) return game;\n if (author === game.ownId) return game.myRevealSent ? game : { ...game, myRevealSent: true };\n if (game.opponentReveal) return game;\n return { ...game, opponentReveal: { fleet: data.fleet.map((ship) => ({ ...ship })), salt: data.salt }, verification: 'pending' };\n}\n\n/**\n * Applies one validated protocol event authored by `author`. Returns the next game\n * or the same reference when the event is invalid, duplicated, stale or out of turn.\n * ctx.stored: own {fleet, salt, commitment} (needed when ingesting our own bs_commit).\n */\nexport function applyBattleshipEvent(game, event, author, ctx = {}) {\n if (!game || game.game !== 'battleship' || event?.game !== 'battleship' || event.game_id !== game.gameId) return game;\n if (author !== game.hostId && author !== game.guestId) return game;\n const data = event.data;\n if (event.type === 'game_end') {\n if (data.reason !== 'closed' || ['closed', 'declined', 'won'].includes(game.status)) return game;\n return { ...game, status: 'closed', closedBy: author, error: '' };\n }\n if (event.type === 'bs_reveal') return applyReveal(game, data, author);\n if (ENDED.includes(game.status) || game.status === 'conflict') return game;\n switch (event.type) {\n case 'game_accept':\n case 'game_decline':\n if (author !== game.guestId || game.status !== 'invited' || data.invite_event_id !== game.inviteEventId) return game;\n return event.type === 'game_accept'\n ? { ...game, status: 'placement', acceptEventId: event.event_id, lastEventId: event.event_id }\n : { ...game, status: 'declined', lastEventId: event.event_id };\n case 'bs_commit':\n if (game.status === 'invited') return conflict(game, MISSING_ACCEPT);\n if (game.status !== 'placement') return game;\n return applyCommit(game, author, data.commitment, ctx.stored) ?? game;\n case 'bs_fire':\n return receiveFire(game, event, author);\n case 'bs_result':\n return receiveResult(game, event, author);\n default:\n return game;\n }\n}\n\n/* ------------------------------ verification ----------------------------- */\n\nfunction replayMatches(game, fleets) {\n let state = createGame({ gameId: String(game.gameId), players: [game.hostId, game.guestId], firstPlayerId: game.hostId });\n for (const playerId of state.players) {\n for (const ship of fleets[playerId]) state = battleshipReducer(state, { type: 'place_ship', playerId, ...placementOf(ship) });\n state = battleshipReducer(state, { type: 'ready', playerId });\n }\n if (state.phase !== 'playing') return false;\n for (const shot of game.shots) {\n const next = battleshipReducer(state, { type: 'fire', playerId: shot.by, row: shot.row, col: shot.col });\n if (next === state) return false;\n const real = next.lastShot;\n if (real.result !== shot.result || real.defeated !== shot.defeated || real.sunk !== Boolean(shot.sunk)) return false;\n if (shot.sunk) {\n const ship = next.boards[next.players.indexOf(real.targetId)].ships.find((item) => item.id === real.shipId);\n if (shot.sunk.id !== real.shipId || !sameCells(ship.cells, shot.sunk.cells)) return false;\n }\n state = next;\n }\n return !game.winnerId || state.winnerId === game.winnerId;\n}\n\n/** 'ok' | 'mismatch' | 'pending' (no reveal yet, or our own fleet is unavailable). */\nexport async function verifyReveal(game, reveal = game?.opponentReveal) {\n if (!game || !reveal) return 'pending';\n const opponentId = otherPlayer(game, game.ownId);\n const commitment = game[commitField(game, opponentId)];\n const enemy = fromRevealFleet(reveal.fleet);\n if (!commitment || !enemy || typeof reveal.salt !== 'string' || !HEX32.test(reveal.salt)) return 'mismatch';\n let actual;\n try {\n actual = await computeCommitment(reveal.fleet, reveal.salt);\n } catch {\n return 'mismatch';\n }\n if (actual !== commitment) return 'mismatch';\n const own = fromRevealFleet(game.myFleet);\n if (!own) return 'pending';\n return replayMatches(game, { [game.ownId]: own, [opponentId]: enemy }) ? 'ok' : 'mismatch';\n}\n\n/* --------------------------------- resync -------------------------------- */\n\nconst encodeShot = (shot) => {\n if (shot.result === 'miss') return [shot.row, shot.col, 0];\n if (!shot.sunk) return [shot.row, shot.col, 1];\n const start = shot.sunk.cells[0];\n return [shot.row, shot.col, 2, FLEET.findIndex((ship) => ship.id === shot.sunk.id), start.row, start.col, shot.sunk.orientation === 'vertical' ? 1 : 0];\n};\n\n/** Public history for bs_sync_request/bs_sync_state data (never contains a fleet). */\nexport function publicLog(game) {\n if (!game.acceptEventId) return { commits: [null, null], log: [], head: game.inviteEventId };\n const log = game.shots.map(encodeShot);\n if (game.pendingShot) log.push([game.pendingShot.row, game.pendingShot.col]);\n return { accept_event_id: game.acceptEventId, commits: [game.hostCommitment ?? null, game.guestCommitment ?? null], log, head: game.lastEventId };\n}\n\n/** equal | behind (remote extends local) | ahead | diverged | mixed (pre-battle commits on both sides). */\nexport function compareLogs(local, remote) {\n const localAccept = local.accept_event_id ?? null;\n const remoteAccept = remote.accept_event_id ?? null;\n if (localAccept && remoteAccept && localAccept !== remoteAccept) return 'diverged';\n const marks = new Set();\n if (localAccept && !remoteAccept) marks.add('ahead');\n if (!localAccept && remoteAccept) marks.add('behind');\n for (const index of [0, 1]) {\n const mine = local.commits?.[index] ?? null;\n const theirs = remote.commits?.[index] ?? null;\n if (mine && theirs && mine !== theirs) return 'diverged';\n if (mine && !theirs) marks.add('ahead');\n if (!mine && theirs) marks.add('behind');\n }\n const ours = local.log ?? [];\n const theirs = remote.log ?? [];\n for (let index = 0; index < Math.min(ours.length, theirs.length); index += 1) {\n const left = ours[index];\n const right = theirs[index];\n if (left.length === right.length) {\n if (left.some((value, position) => value !== right[position])) return 'diverged';\n } else if (left[0] !== right[0] || left[1] !== right[1]) return 'diverged';\n // A pending fire is a prefix of its resolved entry.\n else marks.add(left.length === 2 ? 'behind' : 'ahead');\n }\n if (ours.length !== theirs.length) marks.add(ours.length < theirs.length ? 'behind' : 'ahead');\n if (marks.size === 2) return 'mixed';\n if (marks.size === 1) return [...marks][0];\n return ours.length && local.head !== remote.head ? 'diverged' : 'equal';\n}\n\n/** Union of two pre-battle histories (relation 'mixed'); null when they cannot merge. */\nexport function mergeLogs(local, remote) {\n if ((local.log ?? []).length || (remote.log ?? []).length) return null;\n const accept = local.accept_event_id ?? remote.accept_event_id;\n if (!accept) return null;\n return { accept_event_id: accept, commits: [0, 1].map((index) => local.commits?.[index] ?? remote.commits?.[index] ?? null), log: [], head: accept };\n}\n\n/**\n * Rebuilds the game from a public history using the same rules as live events.\n * Keeps local-only data (own fleet draft, salt). Returns null for an invalid history.\n */\nexport function adoptLog(game, data, ctx = {}) {\n const base = {\n ...game, status: 'invited', turnId: null, myReady: false, opponentReady: false,\n incomingShots: emptyMatrix(), targetShots: emptyMatrix(), sunkEnemyShips: [],\n pendingShot: null, lastShot: null, winnerId: null, verification: null, ply: 0, shots: [],\n acceptEventId: null, hostCommitment: null, guestCommitment: null, error: '',\n myRevealSent: false, opponentReveal: null, closedBy: undefined,\n };\n const log = data.log ?? [];\n const commits = data.commits ?? [null, null];\n if (!data.accept_event_id) {\n return commits.some(Boolean) || log.length ? null : { ...base, lastEventId: game.inviteEventId };\n }\n if (data.accept_event_id === game.inviteEventId) return null;\n const ownIndex = game.ownId === game.hostId ? 0 : 1;\n if (game.myCommitment && commits[ownIndex] && commits[ownIndex] !== game.myCommitment\n && ctx.stored?.commitment !== commits[ownIndex]) return null;\n let state = { ...base, status: 'placement', acceptEventId: data.accept_event_id, lastEventId: data.accept_event_id };\n for (const [index, playerId] of [game.hostId, game.guestId].entries()) {\n if (!commits[index]) continue;\n state = applyCommit(state, playerId, commits[index], ctx.stored);\n if (!state) return null;\n }\n if (log.length && state.status !== 'active') return null;\n for (let index = 0; index < log.length; index += 1) {\n const entry = log[index];\n const ply = index + 1;\n state = applyFire(state, attackerFor(state, ply), { row: entry[0], col: entry[1], ply }, null);\n if (!state) return null;\n if (entry.length === 2) {\n if (index !== log.length - 1) return null;\n break;\n }\n const defender = otherPlayer(state, state.pendingShot.by);\n let sunk = null;\n if (entry[2] === 2) {\n const definition = FLEET[entry[3]];\n if (!definition) return null;\n const vertical = entry[6] === 1;\n sunk = { ship_id: definition.id, cells: Array.from({ length: definition.size }, (_, offset) => [entry[4] + (vertical ? offset : 0), entry[5] + (vertical ? 0 : offset)]) };\n }\n const matrix = defender === state.ownId ? state.incomingShots : state.targetShots;\n const hits = countHits(matrix) + (entry[2] === 0 ? 0 : 1);\n state = applyResult(state, defender, { ply, row: entry[0], col: entry[1], result: entry[2] === 0 ? 'miss' : 'hit', sunk, defeated: hits === TOTAL_SHIP_CELLS }, null);\n if (!state || (state.status === 'won' && index !== log.length - 1)) return null;\n }\n if (!log.length && data.head !== data.accept_event_id) return null;\n state = { ...state, lastEventId: data.head };\n // A finished game keeps the reveal exchange it already had.\n if (state.winnerId && game.winnerId === state.winnerId) {\n state = { ...state, myRevealSent: game.myRevealSent, opponentReveal: game.opponentReveal, verification: game.verification };\n }\n return state;\n}\n\n/** Whether a not-yet-acknowledged own event is already contained in a public history. */\nexport function logCovers(data, event) {\n if (!data || !event) return false;\n const entry = data.log?.[(event.data?.ply ?? 0) - 1];\n switch (event.type) {\n case 'game_accept': return data.accept_event_id === event.event_id;\n case 'bs_commit': return (data.commits ?? []).includes(event.data.commitment);\n case 'bs_fire': return Boolean(entry && entry[0] === event.data.row && entry[1] === event.data.col);\n case 'bs_result': return Boolean(entry && entry.length > 2 && entry[0] === event.data.row && entry[1] === event.data.col);\n default: return false;\n }\n}\n\n/** Ids implied by an adopted history count as seen, so late copies are not forks. */\nexport function withLogSeen(seen, game) {\n const next = { ...seen };\n if (game.acceptEventId) next[game.acceptEventId] = true;\n if (game.lastEventId) next[game.lastEventId] = true;\n return next;\n}\n","// Private fleet + salt of the local player, needed to answer shots and reveal at\n// the end after a reload. Never sent to the opponent before the game ends.\nconst PREFIX = 'lira:bs:';\nconst MAX_AGE_MS = 14 * 24 * 60 * 60 * 1000;\nconst keyOf = (scope, gameId) => `${PREFIX}${scope}:${gameId}`;\nconst storage = () => {\n try {\n return globalThis.localStorage ?? null;\n } catch {\n return null;\n }\n};\n\nfunction isSecret(value) {\n return value !== null && typeof value === 'object' && Array.isArray(value.fleet) && value.fleet.length === 5\n && typeof value.salt === 'string' && /^[0-9a-f]{32}$/.test(value.salt)\n && typeof value.commitment === 'string' && /^[0-9a-f]{64}$/.test(value.commitment);\n}\n\nfunction prune(store) {\n const now = Date.now();\n for (let index = store.length - 1; index >= 0; index -= 1) {\n const key = store.key(index);\n if (!key?.startsWith(PREFIX)) continue;\n try {\n const value = JSON.parse(store.getItem(key));\n if (!isSecret(value) || !(now - value.savedAt < MAX_AGE_MS)) store.removeItem(key);\n } catch {\n store.removeItem(key);\n }\n }\n}\n\n/** Saves { fleet (reveal format), salt, commitment }. Returns false when storage is unavailable. */\nexport function saveFleet(scope, gameId, { fleet, salt, commitment }) {\n try {\n const store = storage();\n if (!store) return false;\n prune(store);\n store.setItem(keyOf(scope, gameId), JSON.stringify({ fleet, salt, commitment, savedAt: Date.now() }));\n return true;\n } catch {\n return false;\n }\n}\n\n/** { fleet, salt, commitment } or null. */\nexport function loadFleet(scope, gameId) {\n try {\n const value = JSON.parse(storage()?.getItem(keyOf(scope, gameId)) ?? 'null');\n return isSecret(value) ? { fleet: value.fleet, salt: value.salt, commitment: value.commitment } : null;\n } catch {\n return null;\n }\n}\n\nexport function clearFleet(scope, gameId) {\n try {\n storage()?.removeItem(keyOf(scope, gameId));\n } catch {\n // Storage unavailable: nothing to clear.\n }\n}\n","/** Integer world constants. Distances in u (1 m = 100000 u), time in ticks (20 ms). */\nexport const RULES_VERSION = 1;\nexport const U = 100000;\nexport const TICKS_PER_SECOND = 50;\nexport const GRAVITY = 392; // 9.8 m/s^2 in u/tick^2.\nexport const MAX_TICKS = 600; // 12 s of flight.\nexport const SAMPLE_EVERY = 2;\n\nexport const MAP_SIZE = 160 * U;\nexport const GRID = 81;\nexport const CELL = 2 * U;\nexport const MAX_HEIGHT = 20 * U;\n\nexport const TANK_RADIUS = 2 * U; // Movement footprint and hit sphere.\nexport const TANK_CENTER_Y = 1 * U;\nexport const TANK_MIN_GAP = 4 * U;\nexport const BORDER_MARGIN = 4 * U;\nexport const MUZZLE_Y = 180000;\nexport const BARREL = 250000;\nexport const MOVE_UNIT = 50000; // Wire `move` step: 0.5 m.\nexport const MOVE_STEP = 25000; // Simulation step: 0.25 m.\nexport const MAX_FUEL = 60 * U;\nexport const SLOPE_NUM = 700; // tan(35 deg) ~ 0.700.\nexport const SLOPE_DEN = 1000;\nexport const SPAWN_FLAT = 4 * U;\n\nexport const MAX_HP = 100;\nexport const MAX_SHOTS = 30;\nexport const MAX_SKIPS = 3;\nexport const DIRECT_HIT_BONUS = 25;\nexport const WIND_MAX = 40; // u/tick^2 (1 m/s^2).\n\nexport const LIMITS = Object.freeze({\n move: Object.freeze([-16, 16]),\n yaw: Object.freeze([0, 359]),\n pitch: Object.freeze([5, 80]),\n power: Object.freeze([0, 100]),\n});\n\nexport const AMMO = Object.freeze({\n standard: Object.freeze({ id: 'standard', cost: 0, radius: 6 * U, maxDmg: 40, depth: 150000, speedPct: 100 }),\n heavy: Object.freeze({ id: 'heavy', cost: 1, radius: 8 * U, maxDmg: 55, depth: 250000, speedPct: 85 }),\n cluster: Object.freeze({ id: 'cluster', cost: 1, radius: 4 * U, maxDmg: 15, depth: 80000, speedPct: 100 }),\n});\nexport const BOMBLET = Object.freeze({ radius: 4 * U, maxDmg: 15, depth: 80000 });\n// Fixed bomblet velocity offsets [dvx, dvy, dvz] in u/tick added at the apex.\nexport const BOMBLET_OFFSETS = Object.freeze([\n Object.freeze([0, 0, 0]),\n Object.freeze([6000, 0, 0]),\n Object.freeze([-6000, 0, 0]),\n Object.freeze([0, 0, 6000]),\n Object.freeze([0, 0, -6000]),\n]);\nexport const START_AMMO = Object.freeze({ heavy: 2, cluster: 2 });\n\n/** sin(d) * 1e6 for integer degrees 0..90. */\nexport const SIN_TABLE = Object.freeze([\n 0, 17452, 34899, 52336, 69756, 87156, 104528, 121869, 139173, 156434,\n 173648, 190809, 207912, 224951, 241922, 258819, 275637, 292372, 309017, 325568,\n 342020, 358368, 374607, 390731, 406737, 422618, 438371, 453990, 469472, 484810,\n 500000, 515038, 529919, 544639, 559193, 573576, 587785, 601815, 615661, 629320,\n 642788, 656059, 669131, 681998, 694658, 707107, 719340, 731354, 743145, 754710,\n 766044, 777146, 788011, 798636, 809017, 819152, 829038, 838671, 848048, 857167,\n 866025, 874620, 882948, 891007, 898794, 906308, 913545, 920505, 927184, 933580,\n 939693, 945519, 951057, 956305, 961262, 965926, 970296, 974370, 978148, 981627,\n 984808, 987688, 990268, 992546, 994522, 996195, 997564, 998630, 999391, 999848,\n 1000000,\n]);\nexport const TRIG_SCALE = 1000000;\n\n/** Integer degrees -> sine scaled by 1e6, via quadrant symmetry. */\nexport function sinDeg(deg) {\n const d = ((deg % 360) + 360) % 360;\n if (d <= 90) return SIN_TABLE[d];\n if (d <= 180) return SIN_TABLE[180 - d];\n if (d <= 270) return -SIN_TABLE[d - 180];\n return -SIN_TABLE[360 - d];\n}\n\nexport function cosDeg(deg) {\n return sinDeg(deg + 90);\n}\n\n/** trunc(value * scaled / 1e6); callers keep |value| <= ~9e9 so the product stays < 2^53. */\nexport function mulTrig(value, scaled) {\n return Math.trunc((value * scaled) / TRIG_SCALE);\n}\n","import { WIND_MAX } from './constants.js';\n\nexport const isSeed = (value) => Number.isInteger(value) && value >= 0 && value <= 0xffffffff;\n\n/** mulberry32: exact 32-bit integer PRNG. Returns a function yielding uint32. */\nexport function createRng(seed) {\n let a = seed >>> 0;\n return function next() {\n a = (a + 0x6d2b79f5) >>> 0;\n let t = a;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return (t ^ (t >>> 14)) >>> 0;\n };\n}\n\n/** Inclusive integer range; modulo bias is irrelevant here and keeps it exact. */\nexport function randInt(next, min, max) {\n return min + (next() % (max - min + 1));\n}\n\n/** Per-ply wind in u/tick^2, derived without advancing any stored state. */\nexport function windFor(seed, ply) {\n const next = createRng((seed ^ Math.imul(ply, 0x9e3779b1)) >>> 0);\n return { x: randInt(next, -WIND_MAX, WIND_MAX), z: randInt(next, -WIND_MAX, WIND_MAX) };\n}\n","import {\n U, GRID, CELL, MAP_SIZE, MAX_HEIGHT, SPAWN_FLAT, TANK_RADIUS,\n} from './constants.js';\nimport { createRng, randInt } from './rng.js';\n\n/** Heights are row-major: heights[iz * GRID + ix], vertex at (ix * CELL, iz * CELL). */\nconst clamp = (v, lo, hi) => (v < lo ? lo : v > hi ? hi : v);\nconst lerp = (a, b, f, span) => a + Math.trunc(((b - a) * f) / span);\n\n/** Bilinear integer interpolation; positions clamp to the map. */\nexport function heightAt(heights, x, z) {\n const cx = clamp(x, 0, MAP_SIZE);\n const cz = clamp(z, 0, MAP_SIZE);\n const ix = Math.min(Math.trunc(cx / CELL), GRID - 2);\n const iz = Math.min(Math.trunc(cz / CELL), GRID - 2);\n const fx = cx - ix * CELL;\n const fz = cz - iz * CELL;\n const row = iz * GRID;\n const top = lerp(heights[row + ix], heights[row + ix + 1], fx, CELL);\n const bottom = lerp(heights[row + GRID + ix], heights[row + GRID + ix + 1], fx, CELL);\n return lerp(top, bottom, fz, CELL);\n}\n\nfunction lattice(next, step, lo, hi) {\n const n = Math.trunc((GRID - 1) / step) + 1;\n const values = [];\n for (let i = 0; i < n * n; i += 1) values.push(randInt(next, lo, hi) * 1000);\n return { n, step, values };\n}\n\nfunction sampleLattice({ n, step, values }, ix, iz) {\n const lx = Math.min(Math.trunc(ix / step), n - 2);\n const lz = Math.min(Math.trunc(iz / step), n - 2);\n const fx = ix - lx * step;\n const fz = iz - lz * step;\n const at = (a, b) => values[b * n + a];\n const top = lerp(at(lx, lz), at(lx + 1, lz), fx, step);\n const bottom = lerp(at(lx, lz + 1), at(lx + 1, lz + 1), fx, step);\n return lerp(top, bottom, fz, step);\n}\n\nfunction smooth(heights) {\n const out = new Int32Array(heights.length);\n for (let iz = 0; iz < GRID; iz += 1) {\n for (let ix = 0; ix < GRID; ix += 1) {\n let sum = 0;\n for (let dz = -1; dz <= 1; dz += 1) {\n for (let dx = -1; dx <= 1; dx += 1) {\n sum += heights[clamp(iz + dz, 0, GRID - 1) * GRID + clamp(ix + dx, 0, GRID - 1)];\n }\n }\n out[iz * GRID + ix] = Math.trunc(sum / 9);\n }\n }\n return out;\n}\n\n/** Flat disc of radius r1 blended back to the original terrain by r2 (permille weights). */\nfunction flatten(heights, x, z, r1, r2) {\n const target = heightAt(heights, x, z);\n const r1sq = r1 * r1;\n const r2sq = r2 * r2;\n for (let iz = 0; iz < GRID; iz += 1) {\n for (let ix = 0; ix < GRID; ix += 1) {\n const dx = ix * CELL - x;\n const dz = iz * CELL - z;\n if (dx > r2 || dx < -r2 || dz > r2 || dz < -r2) continue;\n const d2 = dx * dx + dz * dz;\n if (d2 >= r2sq) continue;\n const i = iz * GRID + ix;\n if (d2 <= r1sq) heights[i] = target;\n else {\n const k = Math.trunc(((d2 - r1sq) * 1000) / (r2sq - r1sq));\n heights[i] = target + Math.trunc(((heights[i] - target) * k) / 1000);\n }\n }\n }\n}\n\nconst halfStep = (next, minM2, maxM2) => randInt(next, minM2, maxM2) * (U / 2);\nconst near = (ax, az, bx, bz, r) => {\n const dx = ax - bx; const dz = az - bz;\n if (dx > r || dx < -r || dz > r || dz < -r) return false;\n return dx * dx + dz * dz < r * r;\n};\nexport const insideBox = (box, x, z, pad) => x >= box.x - box.w / 2 - pad && x <= box.x + box.w / 2 + pad\n && z >= box.z - box.d / 2 - pad && z <= box.z + box.d / 2 + pad;\n\n/** Seeded map: heights, spawns, obstacles (AABB colliders) and decor (no collision). */\nexport function generateMap(seed) {\n const next = createRng(seed);\n const coarse = lattice(next, 20, 0, 1200); // 0..12 m every 40 m.\n const medium = lattice(next, 10, -250, 250); // +-2.5 m every 20 m.\n const fine = lattice(next, 4, -60, 60); // +-0.6 m every 8 m.\n let heights = new Int32Array(GRID * GRID);\n for (let iz = 0; iz < GRID; iz += 1) {\n for (let ix = 0; ix < GRID; ix += 1) {\n const h = 3 * U + sampleLattice(coarse, ix, iz) + sampleLattice(medium, ix, iz)\n + sampleLattice(fine, ix, iz);\n heights[iz * GRID + ix] = clamp(h, 0, MAX_HEIGHT);\n }\n }\n heights = smooth(smooth(heights));\n\n const spawns = [\n { x: 20 * U + halfStep(next, -4, 4), z: 80 * U + halfStep(next, -40, 40) },\n { x: 140 * U + halfStep(next, -4, 4), z: 80 * U + halfStep(next, -40, 40) },\n ];\n for (const spawn of spawns) flatten(heights, spawn.x, spawn.z, SPAWN_FLAT, SPAWN_FLAT + 3 * U);\n\n const obstacles = [];\n const obstacleCount = randInt(next, 4, 6);\n for (let attempt = 0; attempt < 200 && obstacles.length < obstacleCount; attempt += 1) {\n const kind = next() % 2 === 0 ? 'rock' : 'wall';\n let w = halfStep(next, 4, 12);\n let d = halfStep(next, 4, 12);\n if (kind === 'wall') { if (w >= d) d = 2 * U; else w = 2 * U; }\n const h = halfStep(next, 4, 10);\n const x = halfStep(next, 100, 220); // 50..110 m.\n const z = halfStep(next, 40, 280); // 20..140 m.\n const reach = 12 * U + (w > d ? w : d);\n if (spawns.some((s) => near(s.x, s.z, x, z, reach))) continue;\n const box = { x, z, w, d };\n if (obstacles.some((o) => insideBox(o, x, z, (w > d ? w : d) + 4 * U))) continue;\n const corners = [[-1, -1], [1, -1], [-1, 1], [1, 1]]\n .map(([sx, sz]) => heightAt(heights, x + (sx * w) / 2, z + (sz * d) / 2));\n const y = Math.min(heightAt(heights, x, z), ...corners);\n obstacles.push({ id: obstacles.length, kind, ...box, h, y });\n }\n\n const decor = [];\n const decorCount = randInt(next, 30, 60);\n for (let attempt = 0; attempt < decorCount * 10 && decor.length < decorCount; attempt += 1) {\n const x = halfStep(next, 4, 316);\n const z = halfStep(next, 4, 316);\n const kind = next() % 3 === 0 ? 'rock' : 'tree';\n const scale = randInt(next, 80, 140);\n if (spawns.some((s) => near(s.x, s.z, x, z, 10 * U))) continue;\n if (obstacles.some((o) => insideBox(o, x, z, TANK_RADIUS))) continue;\n decor.push({ id: decor.length, kind, x, z, scale });\n }\n return { heights, spawns, obstacles, decor };\n}\n\n/** Lowers vertices in place (caller passes a copy). Fraction in 1/4096 keeps products < 2^53. */\nexport function applyCrater(heights, { x, z, radius, depth }) {\n const r2 = radius * radius;\n const lo = (v) => clamp(Math.trunc(v / CELL) - 1, 0, GRID - 1);\n for (let iz = lo(z - radius); iz <= lo(z + radius) + 2 && iz < GRID; iz += 1) {\n for (let ix = lo(x - radius); ix <= lo(x + radius) + 2 && ix < GRID; ix += 1) {\n const dx = ix * CELL - x;\n const dz = iz * CELL - z;\n if (dx > radius || dx < -radius || dz > radius || dz < -radius) continue;\n const d2 = dx * dx + dz * dz;\n if (d2 >= r2) continue;\n const k = Math.trunc(((r2 - d2) * 4096) / r2);\n const i = iz * GRID + ix;\n const h = heights[i] - Math.trunc((depth * k) / 4096);\n heights[i] = h < 0 ? 0 : h;\n }\n }\n return heights;\n}\n\nexport function decorSurvives(decor, craters) {\n return decor.filter((item) => !craters.some((c) => near(c.x, c.z, item.x, item.z, c.radius)));\n}\n","import {\n GRAVITY, MAX_TICKS, SAMPLE_EVERY, MAP_SIZE, TANK_RADIUS, TANK_CENTER_Y, MUZZLE_Y, BARREL,\n AMMO, BOMBLET, BOMBLET_OFFSETS, DIRECT_HIT_BONUS, sinDeg, cosDeg, mulTrig,\n} from './constants.js';\nimport { heightAt, insideBox } from './terrain.js';\n\n/** Muzzle speed in u/tick: (10 + 0.3 * power) m/s, scaled by ammo speedPct. */\nexport function muzzleSpeed(power, ammo) {\n return Math.trunc(((20000 + 600 * power) * AMMO[ammo].speedPct) / 100);\n}\n\n/** Integer launch state from tank ground position and aim. */\nexport function launchState(tank, { yaw, pitch, power, ammo }) {\n const cp = cosDeg(pitch); const sp = sinDeg(pitch);\n const cy = cosDeg(yaw); const sy = sinDeg(yaw);\n const barrelH = mulTrig(BARREL, cp);\n const v0 = muzzleSpeed(power, ammo);\n const vh = mulTrig(v0, cp);\n return {\n x: tank.x + mulTrig(barrelH, cy),\n y: tank.y + MUZZLE_Y + mulTrig(BARREL, sp),\n z: tank.z + mulTrig(barrelH, sy),\n vx: mulTrig(vh, cy), vy: mulTrig(v0, sp), vz: mulTrig(vh, sy),\n };\n}\n\n/** True when |d| per axis is within r and squared distance < r^2 (guards keep squares small). */\nfunction inSphere(px, py, pz, cx, cy, cz, r) {\n const dx = px - cx; const dy = py - cy; const dz = pz - cz;\n if (dx > r || dx < -r || dy > r || dy < -r || dz > r || dz < -r) return false;\n return dx * dx + dy * dy + dz * dz < r * r;\n}\n\n/**\n * Semi-implicit Euler: v += a; p += v. Per-tick checks in order: tanks, obstacles,\n * map bounds ('out'), terrain. `split` stops at the apex (vy > 0 -> vy <= 0).\n */\nexport function trace(start, { wind, heights, tanks, obstacles, maxTicks = MAX_TICKS, split = false }) {\n let { x, y, z, vx, vy, vz } = start;\n const samples = [x, y, z];\n for (let tick = 1; tick <= maxTicks; tick += 1) {\n const prevVy = vy;\n vx += wind.x; vy -= GRAVITY; vz += wind.z;\n x += vx; y += vy; z += vz;\n let impact = null;\n for (const tank of tanks) {\n if (inSphere(x, y, z, tank.x, tank.y + TANK_CENTER_Y, tank.z, TANK_RADIUS)) {\n impact = { x, y, z, kind: 'tank', tankId: tank.id };\n break;\n }\n }\n if (!impact) {\n const box = obstacles.find((o) => y <= o.y + o.h && insideBox(o, x, z, 0));\n if (box) impact = { x, y, z, kind: 'obstacle', obstacleId: box.id };\n }\n if (!impact && (x < 0 || x > MAP_SIZE || z < 0 || z > MAP_SIZE)) impact = { x, y, z, kind: 'out' };\n if (!impact) {\n const ground = heightAt(heights, x, z);\n if (y <= ground) impact = { x, y: ground, z, kind: 'terrain' };\n }\n if (!impact && split && prevVy > 0 && vy <= 0) impact = { x, y, z, kind: 'split' };\n if (impact) {\n samples.push(impact.x, impact.y, impact.z);\n return { samples, ticks: tick, impact, velocity: { vx, vy, vz } };\n }\n if (tick % SAMPLE_EVERY === 0) samples.push(x, y, z);\n }\n return { samples, ticks: maxTicks, impact: { x, y, z, kind: 'out' }, velocity: { vx, vy, vz } };\n}\n\nconst shotOf = (role, startTick, path, blast) => ({\n role, startTick, samples: path.samples, ticks: path.ticks, impact: path.impact,\n radius: path.impact.kind === 'split' ? 0 : blast.radius,\n maxDmg: path.impact.kind === 'split' ? 0 : blast.maxDmg,\n depth: path.impact.kind === 'split' ? 0 : blast.depth,\n});\n\n/** All projectile paths for one shot. Cluster: carrier splits at apex into 5 bomblets. */\nexport function fireShots(shooter, input, world) {\n const start = launchState(shooter, input);\n if (input.ammo !== 'cluster') {\n return [shotOf('main', 0, trace(start, world), AMMO[input.ammo])];\n }\n const carrier = trace(start, { ...world, split: true });\n const shots = [shotOf('carrier', 0, carrier, BOMBLET)];\n if (carrier.impact.kind !== 'split') return shots;\n const remaining = (world.maxTicks ?? MAX_TICKS) - carrier.ticks;\n for (const [dvx, dvy, dvz] of BOMBLET_OFFSETS) {\n const { x, y, z } = carrier.impact;\n const { vx, vy, vz } = carrier.velocity;\n const path = trace(\n { x, y, z, vx: vx + dvx, vy: vy + dvy, vz: vz + dvz },\n { ...world, maxTicks: remaining, split: false },\n );\n shots.push(shotOf('bomblet', carrier.ticks, path, BOMBLET));\n }\n return shots;\n}\n\n/** Explosions damage every tank in radius (self included); a direct hit adds a bonus. */\nexport function damageFrom(shots, tanks) {\n const damage = tanks.map(() => 0);\n for (const shot of shots) {\n const { impact, radius, maxDmg } = shot;\n if (impact.kind === 'out' || impact.kind === 'split') continue;\n const r2 = radius * radius;\n tanks.forEach((tank, index) => {\n const cy = tank.y + TANK_CENTER_Y;\n if (impact.kind === 'tank' && impact.tankId === tank.id) damage[index] += DIRECT_HIT_BONUS;\n const dx = impact.x - tank.x; const dy = impact.y - cy; const dz = impact.z - tank.z;\n if (dx >= radius || dx <= -radius || dy >= radius || dy <= -radius || dz >= radius || dz <= -radius) return;\n const d2 = dx * dx + dy * dy + dz * dz;\n if (d2 < r2) damage[index] += Math.trunc((maxDmg * (r2 - d2)) / r2);\n });\n }\n return damage;\n}\n\nexport function cratersFrom(shots) {\n return shots\n .filter((shot) => shot.impact.kind !== 'out' && shot.impact.kind !== 'split')\n .map((shot) => ({ x: shot.impact.x, z: shot.impact.z, radius: shot.radius, depth: shot.depth }));\n}\n","import {\n MAP_SIZE, BORDER_MARGIN, TANK_RADIUS, TANK_MIN_GAP, MOVE_UNIT, MOVE_STEP,\n SLOPE_NUM, SLOPE_DEN, sinDeg, cosDeg, mulTrig,\n} from './constants.js';\nimport { heightAt, insideBox } from './terrain.js';\n\n/**\n * Drives along the hull heading in 0.25 m steps. Stops silently on a slope above\n * ~35 deg, an obstacle (padded by tank radius), the other tank, the border or fuel.\n * Path samples are every 0.5 m, in u.\n */\nexport function simulateMove(tank, move, { heights, obstacles, others }) {\n const sign = move < 0 ? -1 : 1;\n const wanted = (move < 0 ? -move : move) * (MOVE_UNIT / MOVE_STEP);\n const steps = Math.min(wanted, Math.trunc(tank.fuel / MOVE_STEP));\n const sx = sign * mulTrig(MOVE_STEP, cosDeg(tank.hullYaw));\n const sz = sign * mulTrig(MOVE_STEP, sinDeg(tank.hullYaw));\n let { x, z } = tank;\n let y = heightAt(heights, x, z);\n const path = [{ x, y, z }];\n let taken = 0;\n let stop = steps < wanted ? 'fuel' : null;\n for (let i = 0; i < steps; i += 1) {\n const nx = x + sx; const nz = z + sz;\n if (nx < BORDER_MARGIN || nx > MAP_SIZE - BORDER_MARGIN\n || nz < BORDER_MARGIN || nz > MAP_SIZE - BORDER_MARGIN) { stop = 'border'; break; }\n if (obstacles.some((o) => insideBox(o, nx, nz, TANK_RADIUS))) { stop = 'obstacle'; break; }\n if (others.some((o) => {\n const dx = o.x - nx; const dz = o.z - nz;\n return dx * dx + dz * dz < TANK_MIN_GAP * TANK_MIN_GAP;\n })) { stop = 'tank'; break; }\n const ny = heightAt(heights, nx, nz);\n const dh = ny > y ? ny - y : y - ny;\n if (dh * SLOPE_DEN > MOVE_STEP * SLOPE_NUM) { stop = 'slope'; break; }\n x = nx; z = nz; y = ny; taken += 1;\n if (taken % 2 === 0) path.push({ x, y, z });\n }\n if (taken % 2 === 1) path.push({ x, y, z });\n return { path, x, y, z, used: taken * MOVE_STEP, stop };\n}\n","import {\n RULES_VERSION, LIMITS, AMMO, MAX_HP, MAX_FUEL, MAX_SHOTS, MAX_SKIPS, START_AMMO, MAX_TICKS,\n} from './constants.js';\nimport { isSeed, windFor } from './rng.js';\nimport { generateMap, heightAt, applyCrater, decorSurvives } from './terrain.js';\nimport { fireShots, damageFrom, cratersFrom } from './ballistics.js';\nimport { simulateMove } from './movement.js';\n\nconst isId = (value) => typeof value === 'string' && value.length > 0 && value.length <= 256 && value.trim() === value;\nconst fail = (reason) => ({ ok: false, reason });\nconst inRange = (value, [lo, hi]) => Number.isInteger(value) && value >= lo && value <= hi;\n\n/** Caller supplies ids, first player and a uint32 seed: no clocks or ambient randomness. */\nexport function createGame({ gameId, players, firstPlayerId = players?.[0], seed } = {}) {\n if (!isId(gameId) || !Array.isArray(players) || players.length !== 2\n || !players.every(isId) || players[0] === players[1] || !players.includes(firstPlayerId)) {\n throw new TypeError('Supply a gameId, two distinct player IDs and a valid firstPlayerId.');\n }\n if (!isSeed(seed)) throw new TypeError('Supply an integer seed in 0..0xffffffff.');\n const { heights, spawns, obstacles, decor } = generateMap(seed);\n const tanks = players.map((id, index) => ({\n id, x: spawns[index].x, y: heightAt(heights, spawns[index].x, spawns[index].z), z: spawns[index].z,\n hullYaw: index === 0 ? 0 : 180, yaw: index === 0 ? 0 : 180, pitch: 30,\n hp: MAX_HP, fuel: MAX_FUEL, ammo: { ...START_AMMO }, skips: 0,\n }));\n return {\n game: 'tanks', rulesVersion: RULES_VERSION, gameId, seed, players: players.slice(), firstPlayerId,\n phase: 'playing', turnIndex: players.indexOf(firstPlayerId), ply: 0, maxShots: MAX_SHOTS, shots: 0,\n tanks, heights, obstacles, decor, winnerId: null, result: null, reason: null, lastTurn: null, revision: 0,\n };\n}\n\nexport function getWind(state) {\n return windFor(state.seed, state.ply);\n}\n\nfunction validateCommon(state, action) {\n if (!state || !action || typeof action !== 'object') return fail('invalid_action');\n if (state.phase === 'finished') return fail('game_finished');\n if (action.gameId !== undefined && action.gameId !== state.gameId) return fail('wrong_game');\n if (action.expectedRevision !== undefined && action.expectedRevision !== state.revision) return fail('stale_revision');\n if (!state.players.includes(action.playerId)) return fail('unknown_player');\n return { ok: true };\n}\n\n/** Strict wire validation for a 'turn' action. */\nexport function validateTurn(state, action) {\n const common = validateCommon(state, action);\n if (!common.ok) return common;\n const index = state.players.indexOf(action.playerId);\n if (index !== state.turnIndex) return fail('not_your_turn');\n if (!inRange(action.move, LIMITS.move)) return fail('invalid_move');\n if (!inRange(action.yaw, LIMITS.yaw)) return fail('invalid_yaw');\n if (!inRange(action.pitch, LIMITS.pitch)) return fail('invalid_pitch');\n if (!inRange(action.power, LIMITS.power)) return fail('invalid_power');\n if (typeof action.ammo !== 'string' || !Object.hasOwn(AMMO, action.ammo)) return fail('unknown_ammo');\n const cost = AMMO[action.ammo].cost;\n if (cost > 0 && state.tanks[index].ammo[action.ammo] < cost) return fail('out_of_ammo');\n return { ok: true };\n}\n\n/**\n * Pure replay of one turn (input assumed valid): move, then fire from the new\n * position against the pre-turn terrain. The reducer applies exactly this result.\n */\nexport function simulateTurn(state, input, { maxTicks = MAX_TICKS } = {}) {\n const index = state.players.indexOf(input.playerId);\n const tank = state.tanks[index];\n const other = state.tanks[1 - index];\n const wind = windFor(state.seed, state.ply);\n const moved = simulateMove(tank, input.move ?? 0, {\n heights: state.heights, obstacles: state.obstacles, others: [other],\n });\n const tankAfter = { x: moved.x, y: moved.y, z: moved.z };\n const tanks = state.tanks.map((t, i) => (i === index ? { id: t.id, ...tankAfter } : { id: t.id, x: t.x, y: t.y, z: t.z }));\n const shots = fireShots(tankAfter, input, {\n wind, heights: state.heights, tanks, obstacles: state.obstacles, maxTicks,\n });\n const amounts = damageFrom(shots, tanks);\n const damage = {};\n state.players.forEach((id, i) => { damage[id] = amounts[i]; });\n return {\n playerId: input.playerId, movePath: moved.path, moveStop: moved.stop, fuelUsed: moved.used,\n tankAfter, shots, damage, craters: cratersFrom(shots), wind,\n };\n}\n\nfunction finish(state, winnerIndex, reason, extra) {\n return {\n ...state, ...extra, phase: 'finished', winnerId: winnerIndex < 0 ? null : state.players[winnerIndex],\n result: winnerIndex < 0 ? 'draw' : 'win', reason, revision: state.revision + 1,\n };\n}\n\nfunction applyTurn(state, action) {\n const index = state.turnIndex;\n const input = {\n playerId: action.playerId, move: action.move, yaw: action.yaw,\n pitch: action.pitch, power: action.power, ammo: action.ammo,\n };\n const sim = simulateTurn(state, input);\n let heights = state.heights;\n if (sim.craters.length) {\n heights = Int32Array.from(state.heights);\n for (const crater of sim.craters) applyCrater(heights, crater);\n }\n const decor = sim.craters.length ? decorSurvives(state.decor, sim.craters) : state.decor;\n const tanks = state.tanks.map((tank, i) => {\n const pos = i === index ? sim.tankAfter : tank;\n const next = {\n ...tank, ammo: { ...tank.ammo }, x: pos.x, z: pos.z, y: heightAt(heights, pos.x, pos.z),\n hp: Math.max(0, tank.hp - sim.damage[tank.id]),\n };\n if (i === index) {\n next.fuel = tank.fuel - sim.fuelUsed;\n next.yaw = input.yaw; next.pitch = input.pitch; next.skips = 0;\n const cost = AMMO[input.ammo].cost;\n if (cost > 0) next.ammo[input.ammo] -= cost;\n }\n return next;\n });\n const next = {\n ...state, tanks, heights, decor, shots: state.shots + 1, ply: state.ply + 1,\n turnIndex: 1 - index, lastTurn: { type: 'turn', ply: state.ply, input, ...sim },\n };\n const dead = tanks.map((tank) => tank.hp === 0);\n if (dead[0] && dead[1]) return finish(next, -1, 'destroyed');\n if (dead[0] || dead[1]) return finish(next, dead[0] ? 1 : 0, 'destroyed');\n if (next.shots >= next.maxShots) {\n const [a, b] = tanks.map((tank) => tank.hp);\n return finish(next, a === b ? -1 : a > b ? 0 : 1, 'max_shots');\n }\n return { ...next, revision: state.revision + 1 };\n}\n\n/**\n * Invalid/stale actions return the original reference. Each accepted action adds\n * exactly one revision. Outcomes are always re-derived from inputs, never trusted.\n */\nexport function tanksReducer(state, action) {\n if (!action || typeof action !== 'object') return state;\n if (action.type === 'turn') {\n return validateTurn(state, action).ok ? applyTurn(state, action) : state;\n }\n if (!validateCommon(state, action).ok) return state;\n const index = state.players.indexOf(action.playerId);\n if (action.type === 'resign') return finish(state, 1 - index, 'resign');\n if (action.type === 'skip') {\n if (index !== state.turnIndex || (action.reason !== undefined && action.reason !== 'timeout')) return state;\n const skips = state.tanks[index].skips + 1;\n const tanks = state.tanks.map((tank, i) => (i === index ? { ...tank, skips } : tank));\n const next = {\n ...state, tanks, ply: state.ply + 1, turnIndex: 1 - index,\n lastTurn: { type: 'skip', ply: state.ply, playerId: action.playerId },\n };\n if (skips >= MAX_SKIPS) return finish(next, 1 - index, 'timeout');\n return { ...next, revision: state.revision + 1 };\n }\n return state;\n}\n\n/* FNV-1a 64 over two uint32 halves; prime 2^40 + 0x1b3. */\nfunction fnvByte(h, byte) {\n const lo = (h.lo ^ byte) >>> 0;\n const a = lo * 0x1b3; // < 2^41, exact.\n const nlo = a >>> 0;\n const carry = (a - nlo) / 4294967296;\n h.hi = (Math.imul(h.hi, 0x1b3) + carry + (lo << 8)) >>> 0;\n h.lo = nlo;\n}\nfunction fnvInt(h, value) {\n const v = value | 0;\n fnvByte(h, v & 255); fnvByte(h, (v >>> 8) & 255); fnvByte(h, (v >>> 16) & 255); fnvByte(h, (v >>> 24) & 255);\n}\n\n/** 16 hex chars; identical states on both clients must give identical hashes. */\nexport function stateHash(state) {\n const h = { hi: 0xcbf29ce4, lo: 0x84222325 };\n let sum = 0;\n for (let i = 0; i < state.heights.length; i += 1) sum = (Math.imul(sum, 31) + state.heights[i]) | 0;\n const winner = state.winnerId === null ? -1 : state.players.indexOf(state.winnerId);\n const values = [\n state.rulesVersion, state.ply, state.turnIndex, state.shots,\n state.phase === 'finished' ? 1 : 0, state.result === 'win' ? 1 : state.result === 'draw' ? 2 : 0, winner,\n ];\n for (const t of state.tanks) {\n values.push(t.x, t.y, t.z, t.hp, t.fuel, t.ammo.heavy, t.ammo.cluster, t.skips, t.yaw, t.pitch);\n }\n values.push(sum, state.decor.length);\n for (const value of values) fnvInt(h, value);\n return h.hi.toString(16).padStart(8, '0') + h.lo.toString(16).padStart(8, '0');\n}\n","// Synchronous SHA-256 (FIPS 180-4) over UTF-8 text. The seed commit-reveal must be\n// verified inside the synchronous event reducer, so WebCrypto's async digest won't do.\nconst K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\nconst rotr = (value, bits) => (value >>> bits) | (value << (32 - bits));\n\nexport function sha256Hex(text) {\n const bytes = new TextEncoder().encode(String(text));\n const length = bytes.length;\n const padded = new Uint8Array((((length + 9) >> 6) + 1) << 6);\n padded.set(bytes);\n padded[length] = 0x80;\n const view = new DataView(padded.buffer);\n view.setUint32(padded.length - 8, Math.floor(length / 0x20000000));\n view.setUint32(padded.length - 4, (length << 3) >>> 0);\n const hash = new Uint32Array([0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19]);\n const words = new Uint32Array(64);\n for (let offset = 0; offset < padded.length; offset += 64) {\n for (let i = 0; i < 16; i += 1) words[i] = view.getUint32(offset + i * 4);\n for (let i = 16; i < 64; i += 1) {\n const s0 = rotr(words[i - 15], 7) ^ rotr(words[i - 15], 18) ^ (words[i - 15] >>> 3);\n const s1 = rotr(words[i - 2], 17) ^ rotr(words[i - 2], 19) ^ (words[i - 2] >>> 10);\n words[i] = (words[i - 16] + s0 + words[i - 7] + s1) >>> 0;\n }\n let [a, b, c, d, e, f, g, h] = hash;\n for (let i = 0; i < 64; i += 1) {\n const t1 = (h + (rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25)) + ((e & f) ^ (~e & g)) + K[i] + words[i]) >>> 0;\n const t2 = ((rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22)) + ((a & b) ^ (a & c) ^ (b & c))) >>> 0;\n h = g; g = f; f = e; e = (d + t1) >>> 0; d = c; c = b; b = a; a = (t1 + t2) >>> 0;\n }\n hash[0] += a; hash[1] += b; hash[2] += c; hash[3] += d; hash[4] += e; hash[5] += f; hash[6] += g; hash[7] += h;\n }\n return Array.from(hash, (word) => word.toString(16).padStart(8, '0')).join('');\n}\n","// Network layer of Tanques de guerra: lockstep over chat frames, no server authority.\n//\n// Seed: the host commits SHA-256(seed_a) in the invite, the guest answers seed_b in the\n// accept, then the host reveals seed_a (tk_seed). Neither side can pick the map alone.\n// Turns: only inputs travel (tk_turn); both clients run the deterministic reducer and\n// compare the 16-hex state hash, so a lying or out-of-date client turns into a conflict.\n// The public log ([1,...] turn | [2] skip | [3, i] resign) rebuilds the game for resync\n// and after a reload.\nimport { createGame, tanksReducer, stateHash } from '../logic/index.js';\nimport { sha256Hex } from './sha256.js';\nimport { AMMO_IDS, LOG_RESIGN, LOG_SKIP, LOG_TURN, isLogEntry } from './protocol.js';\n\nconst SYNC_LOST = 'La partida perdió sincronización. Se intentará resincronizar.';\nconst MISSING_ACCEPT = 'Falta la aceptación de la partida. Ciérrala y vuelve a invitar.';\nconst BAD_SEED = 'El rival reveló una semilla que no coincide con su invitación.';\nconst DIVERGED = 'Los resultados del disparo no coinciden entre dispositivos.';\nconst ENDED = ['won', 'draw', 'closed', 'declined'];\nconst conflict = (game, error) => ({ ...game, status: 'conflict', error });\n\nconst toHex = (bytes) => Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');\nexport function createSeedSecret() {\n const bytes = new Uint8Array(16);\n globalThis.crypto.getRandomValues(bytes);\n return toHex(bytes);\n}\nexport const commitSeed = (seedA) => sha256Hex(`lira-tanks-seed:${seedA}`);\nexport const deriveSeed = (seedA, seedB) => parseInt(sha256Hex(`lira-tanks-map:${seedA}:${seedB}`).slice(0, 8), 16) >>> 0;\n\nexport function createTanksGame(base, data) {\n const firstPlayerId = data.first_player_id === base.guestId ? base.guestId : base.hostId;\n return {\n ...base, game: 'tanks', status: 'invited', turnId: null, firstPlayerId,\n seedCommit: data.seed_commit, rematchOf: data.rematch_of ?? null,\n seedA: null, seedB: null, seedEventId: null, acceptEventId: null,\n logic: null, log: [], ply: 0, lastAction: null, winnerId: null, result: null,\n seen: base.seen ?? {}, pending: false, pendingEvent: null, error: '', sync: base.sync ?? null,\n };\n}\n\nconst playersOf = (game) => [game.hostId, game.guestId];\nconst currentPlayer = (game) => (game.logic && game.logic.phase === 'playing' ? playersOf(game)[game.logic.turnIndex] : null);\nexport const canAct = (game) => game?.status === 'active' && !game.pendingEvent && currentPlayer(game) === game.ownId;\n\nexport const entryOf = (type, data, playerIndex) => (type === 'tk_turn'\n ? [LOG_TURN, data.move, data.yaw, data.pitch, data.power, data.ammo]\n : type === 'tk_skip' ? [LOG_SKIP] : [LOG_RESIGN, playerIndex]);\nconst sameEntry = (left, right) => left.length === right.length && left.every((value, index) => value === right[index]);\n\nfunction actionOf(game, entry) {\n const players = playersOf(game);\n if (entry[0] === LOG_RESIGN) return { type: 'resign', playerId: players[entry[1]] };\n const playerId = currentPlayer(game);\n if (entry[0] === LOG_SKIP) return { type: 'skip', playerId, reason: 'timeout' };\n return { type: 'turn', playerId, move: entry[1], yaw: entry[2], pitch: entry[3], power: entry[4], ammo: AMMO_IDS[entry[5]] };\n}\n\n/** Applies one log entry; returns null when the rules reject it. */\nfunction step(game, entry, eventId, author) {\n const logic = tanksReducer(game.logic, actionOf(game, entry));\n if (logic === game.logic) return null;\n const finished = logic.phase === 'finished';\n return {\n ...game, logic, log: [...game.log, entry], ply: game.ply + 1, lastEventId: eventId,\n lastAction: { eventId, entry, author, turn: logic.lastTurn ?? null },\n turnId: finished ? null : playersOf(game)[logic.turnIndex],\n status: finished ? (logic.result === 'draw' ? 'draw' : 'won') : 'active',\n winnerId: logic.winnerId ?? null, result: logic.result ?? null,\n };\n}\n\n/** Starts the match once both halves of the seed are known (and the commit matches). */\nfunction start(game, seedA, seedEventId) {\n if (commitSeed(seedA) !== game.seedCommit) return null;\n const logic = createGame({ gameId: game.gameId, players: playersOf(game), firstPlayerId: game.firstPlayerId, seed: deriveSeed(seedA, game.seedB) });\n return { ...game, seedA, seedEventId, logic, log: [], ply: 0, lastEventId: seedEventId, lastAction: null,\n status: 'active', turnId: playersOf(game)[logic.turnIndex], error: '' };\n}\n\nexport function applyTanksEvent(game, event, author) {\n if (![game.hostId, game.guestId].includes(author)) return game;\n const data = event.data;\n if (event.type === 'game_end') {\n return ['closed', 'declined'].includes(game.status) ? game : { ...game, status: 'closed', closedBy: author, error: '' };\n }\n if (ENDED.includes(game.status) || game.status === 'conflict') return game;\n if (event.type === 'game_accept' || event.type === 'game_decline') {\n if (author !== game.guestId || game.status !== 'invited' || data.invite_event_id !== game.inviteEventId) return game;\n if (event.type === 'game_decline') return { ...game, status: 'declined', lastEventId: event.event_id };\n return { ...game, status: 'seeding', seedB: data.seed_b, acceptEventId: event.event_id, lastEventId: event.event_id };\n }\n if (event.type === 'tk_seed') {\n if (author !== game.hostId || game.status !== 'seeding') return game;\n return start(game, data.seed_a, event.event_id) ?? conflict(game, BAD_SEED);\n }\n if (!['tk_turn', 'tk_skip', 'tk_resign'].includes(event.type)) return game;\n if (game.status !== 'active') return conflict(game, MISSING_ACCEPT);\n const playerIndex = playersOf(game).indexOf(author);\n const entry = entryOf(event.type, data, playerIndex);\n // A late copy of an applied turn is a replay; a different one is a fork.\n if (data.ply <= game.ply) return sameEntry(game.log[data.ply - 1] ?? [], entry) ? game : conflict(game, SYNC_LOST);\n if (data.ply > game.ply + 1 || data.prev_event_id !== game.lastEventId) return conflict(game, SYNC_LOST);\n if (event.type !== 'tk_resign' && author !== currentPlayer(game)) return game;\n const next = step(game, entry, event.event_id, author);\n if (!next) return game;\n if (event.type === 'tk_turn' && stateHash(next.logic) !== data.hash) return conflict(game, DIVERGED);\n return next;\n}\n\n/** Builds the tk_turn payload for the local player, including the hash both sides must reach. */\nexport function buildTurn(game, input) {\n if (!canAct(game)) return null;\n const data = { ply: game.ply + 1, prev_event_id: game.lastEventId, move: input.move, yaw: input.yaw,\n pitch: input.pitch, power: input.power, ammo: AMMO_IDS.indexOf(input.ammo) };\n if (data.ammo < 0) return null;\n const next = step(game, entryOf('tk_turn', data), 'local', game.ownId);\n return next ? { ...data, hash: stateHash(next.logic) } : null;\n}\n\n// ---- resync\n\nexport function publicLog(game) {\n const data = { log: game.log ?? [], head: game.lastEventId };\n if (game.acceptEventId) Object.assign(data, { accept_event_id: game.acceptEventId, seed_b: game.seedB });\n if (game.seedA) Object.assign(data, { seed_a: game.seedA, seed_event_id: game.seedEventId });\n return data;\n}\n\n// equal | behind (remote extends local) | ahead (local extends remote) | diverged\nexport function compareLogs(local, remote) {\n if (local.accept_event_id && remote.accept_event_id && local.accept_event_id !== remote.accept_event_id) return 'diverged';\n if (local.seed_a && remote.seed_a && local.seed_a !== remote.seed_a) return 'diverged';\n const shared = Math.min(local.log.length, remote.log.length);\n for (let index = 0; index < shared; index += 1) {\n if (!sameEntry(local.log[index], remote.log[index])) return 'diverged';\n }\n const rank = (data) => (data.seed_a ? 2 : data.accept_event_id ? 1 : 0) * 1000 + data.log.length;\n if (rank(local) === rank(remote)) return local.log.length === remote.log.length && local.head !== remote.head && local.log.length > 0 ? 'diverged' : 'equal';\n return rank(local) < rank(remote) ? 'behind' : 'ahead';\n}\n\n/** Replays a public log from the invitation through the rules; null when impossible. */\nexport function adoptLog(game, data) {\n let state = { ...game, status: 'invited', acceptEventId: null, seedB: null, seedA: null, seedEventId: null,\n logic: null, log: [], ply: 0, lastAction: null, winnerId: null, result: null, turnId: null, error: '',\n lastEventId: game.inviteEventId };\n if (!data.accept_event_id) return data.log.length ? null : { ...state, lastEventId: data.head === game.inviteEventId ? data.head : game.inviteEventId };\n if (data.accept_event_id === game.inviteEventId) return null;\n state = { ...state, status: 'seeding', acceptEventId: data.accept_event_id, seedB: data.seed_b, lastEventId: data.accept_event_id };\n if (!data.seed_a) return state;\n state = start(state, data.seed_a, data.seed_event_id);\n if (!state) return null;\n for (let index = 0; index < data.log.length; index += 1) {\n const entry = data.log[index];\n if (!isLogEntry(entry)) return null;\n const last = index === data.log.length - 1;\n const author = entry[0] === LOG_RESIGN ? playersOf(state)[entry[1]] : currentPlayer(state);\n state = step(state, entry, last ? data.head : `${data.seed_event_id}:${index + 1}`, author);\n if (!state) return null;\n }\n return state;\n}\n\nexport function logCovers(data, event) {\n if (!event) return false;\n if (event.type === 'tk_seed') return data.seed_a === event.data.seed_a;\n if (event.type === 'game_accept') return data.accept_event_id === event.event_id;\n if (!['tk_turn', 'tk_skip', 'tk_resign'].includes(event.type)) return false;\n const entry = data.log[event.data.ply - 1];\n return Boolean(entry) && entry[0] === entryOf(event.type, event.data, 0)[0];\n}\n\nexport function withLogSeen(seen, game) {\n const next = { ...seen };\n [game.acceptEventId, game.seedEventId, game.lastEventId].forEach((id) => { if (id) next[id] = true; });\n return next;\n}\n\n/** Plain data saved per device so a reload can rebuild the match from its log. */\nexport function snapshotOf(game) {\n return {\n gameId: game.gameId, roomId: game.roomId, hostId: game.hostId, guestId: game.guestId, ownId: game.ownId,\n firstPlayerId: game.firstPlayerId, seedCommit: game.seedCommit, rematchOf: game.rematchOf,\n inviteEventId: game.inviteEventId, createdAt: game.createdAt, status: game.status, ...publicLog(game),\n };\n}\n","// Per-device Tanques data: the host's unrevealed seed_a (needed to start the match after\n// a reload) and a snapshot of the public log, so a reload rebuilds the game and resyncs.\nconst PREFIX = 'lira:tk:';\nconst MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\nconst MAX_ITEMS = 20;\nconst keyOf = (scope, gameId) => `${PREFIX}${scope}:${gameId}`;\nconst storage = () => {\n try {\n return globalThis.localStorage ?? null;\n } catch {\n return null;\n }\n};\n\nfunction entries(store) {\n const list = [];\n for (let index = 0; index < store.length; index += 1) {\n const key = store.key(index);\n if (!key?.startsWith(PREFIX)) continue;\n try {\n const value = JSON.parse(store.getItem(key));\n list.push({ key, value });\n } catch {\n list.push({ key, value: null });\n }\n }\n return list;\n}\n\nfunction prune(store) {\n const now = Date.now();\n const list = entries(store);\n list.filter(({ value }) => !value || !(now - value.savedAt < MAX_AGE_MS)).forEach(({ key }) => store.removeItem(key));\n const alive = list.filter(({ value }) => value && now - value.savedAt < MAX_AGE_MS).sort((a, b) => a.value.savedAt - b.value.savedAt);\n alive.slice(0, Math.max(0, alive.length - MAX_ITEMS)).forEach(({ key }) => store.removeItem(key));\n}\n\n/** Merges `patch` ({ seedA?, snapshot? }) into the stored record. */\nexport function saveTanks(scope, gameId, patch) {\n try {\n const store = storage();\n if (!store) return false;\n const previous = loadTanks(scope, gameId) ?? {};\n store.setItem(keyOf(scope, gameId), JSON.stringify({ ...previous, ...patch, savedAt: Date.now() }));\n prune(store);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function loadTanks(scope, gameId) {\n try {\n const value = JSON.parse(storage()?.getItem(keyOf(scope, gameId)) ?? 'null');\n if (!value || typeof value !== 'object' || !(Date.now() - value.savedAt < MAX_AGE_MS)) return null;\n if (value.seedA !== undefined && !/^[0-9a-f]{32}$/.test(value.seedA)) return null;\n return value;\n } catch {\n return null;\n }\n}\n\n/** Snapshots of unfinished games for `scope`, newest first. */\nexport function listTanks(scope) {\n try {\n const store = storage();\n if (!store) return [];\n return entries(store)\n .filter(({ key, value }) => key.startsWith(`${PREFIX}${scope}:`) && value?.snapshot && Date.now() - value.savedAt < MAX_AGE_MS)\n .map(({ value }) => value)\n .sort((a, b) => b.savedAt - a.savedAt);\n } catch {\n return [];\n }\n}\n","import { randomUuid } from '../../core/ids/randomUuid.js';\nimport { createLiveGame, applyLiveEvent, createLiveInviteData } from '../tanks-live/session.js';\nimport { createRaceGame, applyRaceEvent, createRaceInviteData } from '../racing-live/session.js';\nimport { createChatSignaling } from '../../net/webrtc/rtcSignals.js';\nimport { useStore } from 'zustand';\nimport { createStore } from 'zustand/vanilla';\nimport { parseGameMessage, encodeGameEvent, createGameEvent, GAME_IDS } from './protocol.js';\nimport { createBoard, dropPiece } from '../connect4/connect4.js';\nimport {\n createBattleshipGame, applyBattleshipEvent, placeFleetShip, removeFleetShip, randomizeFleet,\n toRevealFleet, isFleetReady, createSalt, computeCommitment, ownBoard, buildResult, verifyReveal,\n canFire, publicLog, compareLogs, mergeLogs, adoptLog, logCovers, withLogSeen,\n} from '../battleship/net/session.js';\nimport { saveFleet, loadFleet } from '../battleship/net/fleetStorage.js';\nimport * as tanks from '../tanks/net/session.js';\nimport { saveTanks, loadTanks, listTanks } from '../tanks/net/tankStorage.js';\n\nconst GAME_TYPES = GAME_IDS;\nconst gameTypeOf = (game) => game?.game ?? 'connect4';\nconst isBattleship = (game) => gameTypeOf(game) === 'battleship';\nconst isTanks = (game) => gameTypeOf(game) === 'tanks';\nconst isRealtimeGame = (game) => ['tanks_live', 'racing_live'].includes(gameTypeOf(game));\n// Automatic Battleship frames (bs_result, bs_reveal) run debounced after state\n// changes, so replayed or duplicated frames settle before anything is sent.\nconst BS_EFFECT_DELAY = 250;\nconst terminal = (game) => ['won', 'draw', 'closed', 'declined'].includes(game.status);\nconst keyFor = (scope, roomId, gameId) => JSON.stringify([scope, String(roomId), gameId]);\nconst retainGames = (games) => {\n const finished = Object.keys(games).filter((key) => terminal(games[key]));\n if (finished.length <= 80) return games;\n const next = { ...games };\n finished.slice(0, finished.length - 80).forEach((key) => { delete next[key]; });\n return next;\n};\n\nfunction applyEvent(game, event, author) {\n if (![game.hostId, game.guestId].includes(author)) return game;\n if (event.type === 'game_end' && event.data.reason === 'closed') {\n return ['closed', 'declined'].includes(game.status) ? game : { ...game, status: 'closed', closedBy: author, error: '' };\n }\n if (terminal(game) || game.status === 'conflict') return game;\n if (event.type === 'game_accept' || event.type === 'game_decline') {\n if (author !== game.guestId || game.status !== 'invited' || event.data.invite_event_id !== game.inviteEventId) return game;\n return { ...game, status: event.type === 'game_accept' ? 'active' : 'declined', lastEventId: event.event_id,\n acceptEventId: event.type === 'game_accept' ? event.event_id : game.acceptEventId };\n }\n if (event.type !== 'game_move') return game;\n const { ply, prev_event_id: previous, column } = event.data;\n const expectedAuthor = ply % 2 === 1 ? game.hostId : game.guestId;\n if (author !== expectedAuthor) return game;\n if (game.status !== 'active') return { ...game, status: 'conflict', error: 'Falta la aceptación de la partida. Ciérrala y vuelve a invitar.' };\n // An alternative event for an already-applied turn is a fork, not a replay.\n if (ply <= game.ply || ply > game.ply + 1 || previous !== game.lastEventId) {\n return { ...game, status: 'conflict', error: 'La partida perdió sincronización. Ciérrala y envía una nueva invitación.' };\n }\n if (author !== game.turnId) return game;\n const move = dropPiece(game.board, column, author);\n if (!move) return game;\n return {\n ...game, board: move.board, ply, lastEventId: event.event_id,\n moves: [...(game.moves ?? []), [column, event.event_id]],\n lastMove: { row: move.row, column, eventId: event.event_id },\n winnerId: move.winner || null,\n winningCells: move.winningCells,\n status: move.winner ? 'won' : move.draw ? 'draw' : 'active',\n turnId: author === game.hostId ? game.guestId : game.hostId,\n };\n}\n\nconst RESYNC_TIMEOUT = 8000;\nconst idleSync = { status: 'idle', requestId: null, requestedAt: 0, auto: false, outgoing: [], replies: [], offer: null, message: '' };\nconst isResync = (type) => ['game_resync_request', 'game_resync_state', 'bs_sync_request', 'bs_sync_state', 'tk_sync_request', 'tk_sync_state'].includes(type);\nconst historyOf = (game) => (game.acceptEventId\n ? { accept_event_id: game.acceptEventId, moves: game.moves ?? [], rev: (game.moves ?? []).length }\n : { moves: [], rev: 0 });\n\n// Replays a history from the invitation through the regular reducer, so a\n// resync can never produce a board, turn or result the move rules reject.\nfunction rebuild(game, acceptEventId, moves) {\n const base = { ...game, board: createBoard(), ply: 0, turnId: game.hostId, winnerId: null, winningCells: [],\n lastMove: null, moves: [], error: '' };\n if (!acceptEventId) return moves.length ? null : { ...base, status: 'invited', acceptEventId: null, lastEventId: game.inviteEventId };\n if (acceptEventId === game.inviteEventId) return null;\n let state = { ...base, status: 'active', acceptEventId, lastEventId: acceptEventId };\n const used = new Set([game.inviteEventId, acceptEventId]);\n for (let index = 0; index < moves.length; index += 1) {\n const [column, eventId] = moves[index];\n if (used.has(eventId)) return null;\n used.add(eventId);\n const author = index % 2 === 0 ? game.hostId : game.guestId;\n const next = applyEvent(state, { type: 'game_move', event_id: eventId, data: { column, ply: index + 1, prev_event_id: state.lastEventId } }, author);\n if (next.status === 'conflict' || next.ply !== index + 1 || next.lastEventId !== eventId) return null;\n state = next;\n }\n return state;\n}\n\n// equal | behind (remote extends local) | ahead (local extends remote) | diverged\nfunction compareHistories(local, remote) {\n if (local.acceptEventId && remote.acceptEventId && local.acceptEventId !== remote.acceptEventId) return 'diverged';\n const shared = Math.min(local.moves.length, remote.moves.length);\n for (let index = 0; index < shared; index += 1) {\n if (local.moves[index][0] !== remote.moves[index][0] || local.moves[index][1] !== remote.moves[index][1]) return 'diverged';\n }\n if (local.moves.length !== remote.moves.length) return local.moves.length < remote.moves.length ? 'behind' : 'ahead';\n if (local.acceptEventId && !remote.acceptEventId) return 'ahead';\n return !local.acceptEventId && remote.acceptEventId ? 'behind' : 'equal';\n}\n\nconst pendingMoveId = (game) => (game.pendingEvent?.type === 'game_move' && !game.pending ? game.pendingEvent.event_id : null);\n\n// Adopted history ids count as seen so late copies of those events are not forks.\nconst withHistorySeen = (seen, game) => {\n const next = { ...seen };\n if (game.acceptEventId) next[game.acceptEventId] = true;\n (game.moves ?? []).forEach((move) => { next[move[1]] = true; });\n return next;\n};\n\n// Per-game resync rules. Connect 4 keeps its original history/replay; Battleship\n// uses the public log from battleship/net/session.js.\nconst connect4Sync = {\n requestType: 'game_resync_request',\n stateType: 'game_resync_state',\n historyOf,\n rebuild: (game, data) => rebuild(game, data.accept_event_id ?? null, data.moves),\n compare: (game, data) => compareHistories({ acceptEventId: game.acceptEventId ?? null, moves: game.moves ?? [] },\n { acceptEventId: data.accept_event_id ?? null, moves: data.moves }),\n offerOf: (data) => ({ accept_event_id: data.accept_event_id ?? null, moves: data.moves }),\n covers: (game, data) => {\n const pendingId = pendingMoveId(game);\n return Boolean(pendingId && data.moves?.some((move) => move[1] === pendingId));\n },\n markSeen: withHistorySeen,\n merge: () => null,\n};\nconst createBattleshipSync = (secretFor) => ({\n requestType: 'bs_sync_request',\n stateType: 'bs_sync_state',\n historyOf: publicLog,\n rebuild: (game, data) => adoptLog(game, data, { stored: secretFor(game.scope, game.gameId) }),\n compare: (game, data) => compareLogs(publicLog(game), data),\n offerOf: (data) => ({ accept_event_id: data.accept_event_id, commits: data.commits, log: data.log, head: data.head }),\n covers: (game, data) => Boolean(game.pendingEvent && !game.pending && logCovers(data, game.pendingEvent)),\n markSeen: withLogSeen,\n merge: (game, data) => mergeLogs(publicLog(game), data),\n});\nconst tanksSync = {\n requestType: 'tk_sync_request',\n stateType: 'tk_sync_state',\n historyOf: tanks.publicLog,\n rebuild: tanks.adoptLog,\n compare: (game, data) => tanks.compareLogs(tanks.publicLog(game), data),\n offerOf: (data) => ({ ...data, request_event_id: undefined }),\n covers: (game, data) => Boolean(game.pendingEvent && !game.pending && tanks.logCovers(data, game.pendingEvent)),\n markSeen: tanks.withLogSeen,\n merge: () => null,\n};\nconst createConnect4Game = (base) => ({\n ...base, game: 'connect4', turnId: base.hostId, status: 'invited',\n board: createBoard(), ply: 0, winnerId: null, lastMove: null,\n pending: false, error: '', pendingEvent: null, acceptEventId: null, moves: [],\n});\nconst resyncEvent = (game, type, data) => createGameEvent(type, { game_id: game.gameId, data, game: gameTypeOf(game) });\n\n// Each store instance owns its transport, timers and Battleship secrets.\nexport function createChatGamesStore() {\n let transport = null;\n // Battleship secrets created this session (fallback when localStorage is blocked).\n const secrets = new Map();\n const secretFor = (scope, gameId) => secrets.get(`${scope}:${gameId}`) ?? loadFleet(scope, gameId);\n const effectTimers = new Map();\n const verifying = new Set();\n // Bounded, short-lived inbox for frames delivered before their invitation.\n const earlyEvents = new Map();\n const resyncTimers = new Set();\n const battleshipSync = createBattleshipSync(secretFor);\n // Tanques: the host's seed_a until it is revealed (fallback when localStorage is blocked).\n const tankSeeds = new Map();\n const seedFor = (scope, gameId) => tankSeeds.get(`${scope}:${gameId}`) ?? loadTanks(scope, gameId)?.seedA ?? null;\n // One entry per game type: how a game is created from its invite, how events apply,\n // how it resyncs and which automatic follow-up runs after a change.\n const GAME_ADAPTERS = {\n connect4: { create: (base) => createConnect4Game(base), apply: (game, event, author) => applyEvent(game, event, author), sync: connect4Sync },\n battleship: {\n create: (base) => createBattleshipGame(base),\n apply: (game, event, author, ownId) => applyBattleshipEvent(game, event, author,\n { stored: event.type === 'bs_commit' && author === ownId ? secretFor(game.scope, game.gameId) : null }),\n sync: battleshipSync,\n after: (key, get) => get().bsScheduleEffects(key),\n },\n racing_live: { create: (base, event) => createRaceGame(base, event.data), apply: applyRaceEvent },\n tanks_live: { create: (base, event) => createLiveGame(base, event.data), apply: applyLiveEvent },\n tanks: {\n create: (base, event) => tanks.createTanksGame(base, event.data),\n apply: (game, event, author) => tanks.applyTanksEvent(game, event, author),\n sync: tanksSync,\n after: (key, get) => get().tkScheduleEffects(key),\n },\n };\n const adapterFor = (game) => GAME_ADAPTERS[gameTypeOf(game)] ?? null;\n const syncFor = (game) => adapterFor(game)?.sync ?? connect4Sync;\n\n return createStore((set, get) => ({\n games: {},\n configureTransport: (value) => { transport = value; },\n clear: () => {\n effectTimers.forEach((timer) => clearTimeout(timer));\n effectTimers.clear();\n resyncTimers.forEach((timer) => clearTimeout(timer));\n resyncTimers.clear();\n secrets.clear();\n tankSeeds.clear();\n verifying.clear();\n earlyEvents.clear();\n set({ games: {} });\n },\n markDisconnected: (scope) => set((state) => ({ games: Object.fromEntries(Object.entries(state.games).map(([key, game]) => [key,\n game.scope === scope && !isRealtimeGame(game) && !terminal(game) ? { ...game, status: 'conflict', error: 'Conexión interrumpida. Se intentará resincronizar al reconectar.',\n sync: { ...idleSync, ...game.sync, status: 'idle', auto: false } } : game,\n ])) })),\n\n // Return true for protocol messages, including malformed ones, so they never\n // leak into ordinary bubbles or notifications.\n ingest: (message, scopeOrOptions, ownIdArgument) => {\n const options = typeof scopeOrOptions === 'object' ? scopeOrOptions : { scope: scopeOrOptions, currentUserId: ownIdArgument };\n const scope = options?.scope ?? transport?.getScope?.();\n const ownId = String(options?.currentUserId ?? transport?.getUserId?.() ?? '');\n const body = message.data ?? message.payload;\n const normalized = body && typeof body === 'object' ? { ...body, ...message } : message;\n const text = normalized.message ?? normalized.text;\n if (typeof text !== 'string' || !text.startsWith('LIRA_GAME_V1:')) return false;\n const event = parseGameMessage(text);\n const roomId = String(normalized.room_id ?? '');\n const author = String(normalized.user_id ?? '');\n if (!event || !scope || !ownId || !author || !roomId.startsWith('private_')) return true;\n const members = roomId.slice('private_'.length).split('_');\n if (members.length !== 2 || !members.includes(ownId) || !members.includes(author)) return true;\n const key = keyFor(scope, roomId, event.game_id);\n const game = get().games[key];\n // A game id never changes game type.\n if (game && gameTypeOf(game) !== event.game) return true;\n // Resync frames never wait in the early inbox: without a game there is nothing to repair.\n if (isResync(event.type)) {\n if (game && !game.seen[event.event_id]) get().handleResync(key, event, author, ownId);\n return true;\n }\n if (!game && event.type !== 'game_invite' && event.game === 'tanks' && get().restoreTanks(scope, event.game_id)) {\n return get().ingest(message, scopeOrOptions, ownIdArgument);\n }\n if (!game && event.type !== 'game_invite') {\n const now = Date.now();\n for (const [id, entry] of earlyEvents) {\n if (now - entry.at > 30000) earlyEvents.delete(id);\n }\n if (!earlyEvents.has(key) && earlyEvents.size >= 32) earlyEvents.delete(earlyEvents.keys().next().value);\n const entry = earlyEvents.get(key) ?? { at: now, messages: [] };\n if (entry.messages.length < 8 && !entry.messages.some((item) => item.eventId === event.event_id)) {\n entry.messages.push({ eventId: event.event_id, message: normalized });\n }\n earlyEvents.set(key, entry);\n return true;\n }\n if (game?.seen[event.event_id]) return true;\n let next = game;\n const adapter = GAME_ADAPTERS[event.game];\n if (!adapter) return true;\n if (event.type === 'game_invite') {\n const guestId = event.data.opponent_id;\n if (game || guestId === author || !members.includes(guestId)) return true;\n next = adapter.create({\n key, gameId: event.game_id, game_id: event.game_id, scope, roomId, ownId, hostId: author, guestId,\n createdAt: normalized.timestamp ?? new Date().toISOString(),\n inviteEventId: event.event_id, lastEventId: event.event_id, seen: {}, sync: { ...idleSync },\n }, event);\n } else if (game) next = adapter.apply(game, event, author, ownId);\n if (!next) return true;\n // Invalid events cannot grow the replay set indefinitely.\n if (next === game) return true;\n next = { ...next, seen: { ...next.seen, [event.event_id]: true } };\n set((state) => {\n const games = { ...state.games, [key]: next };\n if (event.type === 'game_invite') {\n const competing = Object.values(games).filter((item) => item.scope === scope && item.roomId === roomId && !terminal(item));\n const winner = competing.sort((a, b) => a.gameId < b.gameId ? -1 : a.gameId > b.gameId ? 1 : 0)[0];\n competing.forEach((item) => {\n if (item.key !== winner?.key) games[item.key] = { ...item, status: 'closed', error: 'Se conserva la otra invitación de esta conversación.' };\n });\n }\n return { games: retainGames(games) };\n });\n if (next.status === 'conflict' && game?.status !== 'conflict') {\n queueMicrotask(() => { void get().requestResync(key, { auto: true }); });\n }\n get().afterGameChange(key);\n if (event.type === 'game_invite') {\n const queued = earlyEvents.get(key);\n earlyEvents.delete(key);\n if (queued && Date.now() - queued.at <= 30000) {\n queued.messages.forEach((item) => get().ingest(item.message, scope, ownId));\n }\n }\n return true;\n },\n\n invite: async ({ roomId, opponentId, gameType = 'connect4', firstPlayerId, rematchOf, speedClass, mapId, lives, seed }) => {\n if (!transport) throw new Error('Chat no disponible');\n if (!GAME_TYPES.includes(gameType)) throw new Error('Juego no disponible');\n const scope = transport.getScope();\n const ownId = String(transport.getUserId() ?? '');\n if (!ownId || !String(roomId).startsWith('private_')) throw new Error('Abre un chat privado para jugar.');\n if (Object.values(get().games).some((game) => game.scope === scope && game.roomId === String(roomId) && (!terminal(game) || game.pendingEvent))) {\n throw new Error('Cierra la partida actual antes de invitar.');\n }\n const gameId = randomUuid();\n const data = gameType === 'racing_live'\n ? createRaceInviteData({ opponentId: String(opponentId), seed: parseInt(gameId.slice(0, 8), 16), rematchOf, ...(speedClass === undefined ? {} : { speedClass }) })\n : gameType === 'tanks_live'\n // Tanques LIVE: mapId 'random' and 3 lives by default; mapId null = legacy (meadow, 1 life).\n ? createLiveInviteData({ opponentId: String(opponentId), rematchOf, ...(mapId === undefined ? {} : { mapId }),\n ...(lives === undefined ? {} : { lives }), ...(seed === undefined ? {} : { seed }) })\n : { opponent_id: String(opponentId), rules_version: 1 };\n if (gameType === 'tanks') {\n const seedA = tanks.createSeedSecret();\n tankSeeds.set(`${scope}:${gameId}`, seedA);\n saveTanks(scope, gameId, { seedA });\n data.seed_commit = tanks.commitSeed(seedA);\n if (firstPlayerId != null) data.first_player_id = String(firstPlayerId);\n if (rematchOf) data.rematch_of = rematchOf;\n }\n const event = createGameEvent('game_invite', { game_id: gameId, data, game: gameType });\n return get().sendEvent(roomId, event);\n },\n\n act: async (key, type, data = {}) => {\n const game = get().games[key];\n const ownId = String(transport?.getUserId?.() ?? '');\n if (!game || game.scope !== transport?.getScope?.()) throw new Error('Partida no disponible');\n if (type !== 'game_end' && (game.pending || game.pendingEvent)) throw new Error('Reintenta el envío pendiente antes de continuar.');\n let eventData = data;\n if (type === 'game_accept' || type === 'game_decline') {\n if (game.status !== 'invited' || ownId !== game.guestId) return;\n eventData = { invite_event_id: game.inviteEventId };\n if (type === 'game_accept' && isTanks(game)) eventData.seed_b = tanks.createSeedSecret();\n if (type === 'game_accept' && game.game === 'racing_live') eventData.track_hash = game.raceConfig.trackHash;\n if (type === 'game_accept' && game.game === 'tanks_live' && game.liveConfig) eventData.map_hash = game.liveConfig.mapHash;\n } else if (type === 'game_move') {\n if (gameTypeOf(game) !== 'connect4') return;\n if (game.status !== 'active' || ownId !== game.turnId || !dropPiece(game.board, data.column, ownId)) return;\n eventData = { column: data.column, ply: game.ply + 1, prev_event_id: game.lastEventId };\n } else if (type === 'game_end') eventData = { reason: 'closed' };\n else return;\n return get().sendEvent(game.roomId, createGameEvent(type, { game_id: game.gameId, data: eventData, game: gameTypeOf(game) }));\n },\n\n // Battleship placement is local until bsReady sends only a commitment.\n bsUpdateLocal: (key, change) => {\n const game = get().games[key];\n if (!isBattleship(game)) return false;\n const next = change(game);\n if (next === game) return false;\n set((state) => (state.games[key] === game ? { games: { ...state.games, [key]: next } } : state));\n return get().games[key] === next;\n },\n bsPlaceShip: (key, placement) => get().bsUpdateLocal(key, (game) => placeFleetShip(game, placement)),\n bsRemoveShip: (key, shipId) => get().bsUpdateLocal(key, (game) => removeFleetShip(game, shipId)),\n bsRandomFleet: (key) => get().bsUpdateLocal(key, (game) => randomizeFleet(game)),\n bsReady: async (key) => {\n const game = get().games[key];\n if (!isBattleship(game) || game.status !== 'placement' || game.myReady) return;\n if (game.scope !== transport?.getScope?.()) throw new Error('Partida no disponible');\n if (game.pending || game.pendingEvent) throw new Error('Reintenta el envío pendiente antes de continuar.');\n const fleet = toRevealFleet(game.myFleet);\n if (!isFleetReady(fleet)) throw new Error('Coloca los cinco barcos antes de continuar.');\n const salt = createSalt();\n const commitment = await computeCommitment(fleet, salt);\n const current = get().games[key];\n // The fleet may have changed (or another ready won) while hashing.\n if (!current || current.myReady || current.status !== 'placement' || current.pending || current.pendingEvent\n || JSON.stringify(toRevealFleet(current.myFleet)) !== JSON.stringify(fleet)) return;\n secrets.set(`${game.scope}:${game.gameId}`, { fleet, salt, commitment });\n saveFleet(game.scope, game.gameId, { fleet, salt, commitment });\n return get().sendEvent(game.roomId, createGameEvent('bs_commit', { game_id: game.gameId, data: { commitment }, game: 'battleship' }));\n },\n bsFire: async (key, { row, col } = {}) => {\n const game = get().games[key];\n if (!isBattleship(game) || game.scope !== transport?.getScope?.()) throw new Error('Partida no disponible');\n if (game.pending || game.pendingEvent) throw new Error('Reintenta el envío pendiente antes de continuar.');\n if (!canFire(game) || game.targetShots[row]?.[col] !== null) return;\n return get().sendEvent(game.roomId, createGameEvent('bs_fire', {\n game_id: game.gameId, data: { ply: game.ply + 1, row, col, prev_event_id: game.lastEventId }, game: 'battleship',\n }));\n },\n bsScheduleEffects: (key) => {\n if (effectTimers.has(key)) return;\n effectTimers.set(key, setTimeout(() => {\n effectTimers.delete(key);\n get().bsRunEffects(key);\n }, BS_EFFECT_DELAY));\n },\n // Automatic frames: verification of the rival reveal, our bs_result for a\n // pending incoming shot, and our bs_reveal once the game is decided.\n bsRunEffects: (key) => {\n const game = get().games[key];\n if (!isBattleship(game) || !transport || game.scope !== transport.getScope?.()) return;\n if (game.opponentReveal && game.verification === 'pending' && !verifying.has(key)) {\n const reveal = game.opponentReveal;\n verifying.add(key);\n void verifyReveal(game, reveal).then((verification) => set((state) => {\n const current = state.games[key];\n if (!current || current.opponentReveal !== reveal || current.verification === verification) return state;\n return { games: { ...state.games, [key]: { ...current, verification } } };\n })).catch(() => {}).finally(() => { verifying.delete(key); });\n }\n if (game.pending || game.pendingEvent) return;\n const send = (type, data) => {\n void get().sendEvent(game.roomId, createGameEvent(type, { game_id: game.gameId, data, game: 'battleship' })).catch(() => {});\n };\n if (game.status === 'active' && game.pendingShot && game.pendingShot.by !== game.ownId) {\n const data = buildResult(ownBoard(game), game.pendingShot);\n if (data) send('bs_result', data);\n else if (!game.error) set((state) => ({ games: { ...state.games, [key]: { ...state.games[key], error: 'Tu flota no está disponible en este dispositivo; no se pueden responder disparos.' } } }));\n return;\n }\n const mayReveal = String(game.winnerId) !== String(game.ownId) || Boolean(game.opponentReveal);\n if (game.winnerId && ['won', 'closed'].includes(game.status) && !game.myRevealSent && mayReveal) {\n const fleet = toRevealFleet(game.myFleet);\n const salt = game.mySalt ?? secretFor(game.scope, game.gameId)?.salt;\n if (isFleetReady(fleet) && salt) send('bs_reveal', { fleet, salt });\n }\n },\n\n afterGameChange: (key) => {\n const game = get().games[key];\n adapterFor(game)?.after?.(key, get);\n },\n\n // Tanques: one tk_turn (move + aim + fire) per turn; both clients simulate it.\n tkTurn: async (key, input) => {\n const game = get().games[key];\n if (!isTanks(game) || game.scope !== transport?.getScope?.()) throw new Error('Partida no disponible');\n if (game.pending || game.pendingEvent) throw new Error('Reintenta el envío pendiente antes de continuar.');\n const data = tanks.buildTurn(game, input);\n if (!data) return;\n return get().sendEvent(game.roomId, createGameEvent('tk_turn', { game_id: game.gameId, data, game: 'tanks' }));\n },\n tkSkip: async (key) => {\n const game = get().games[key];\n if (!isTanks(game) || !tanks.canAct(game) || game.scope !== transport?.getScope?.()) return;\n return get().sendEvent(game.roomId, createGameEvent('tk_skip', { game_id: game.gameId, data: { ply: game.ply + 1, prev_event_id: game.lastEventId }, game: 'tanks' }));\n },\n tkResign: async (key) => {\n const game = get().games[key];\n if (!isTanks(game) || game.status !== 'active' || game.pending || game.pendingEvent || game.scope !== transport?.getScope?.()) return;\n return get().sendEvent(game.roomId, createGameEvent('tk_resign', { game_id: game.gameId, data: { ply: game.ply + 1, prev_event_id: game.lastEventId }, game: 'tanks' }));\n },\n tkScheduleEffects: (key) => {\n if (effectTimers.has(key)) return;\n effectTimers.set(key, setTimeout(() => {\n effectTimers.delete(key);\n get().tkRunEffects(key);\n }, BS_EFFECT_DELAY));\n },\n // Saves the public log for reloads; the host reveals seed_a once the guest accepted.\n tkRunEffects: (key) => {\n const game = get().games[key];\n if (!isTanks(game)) return;\n saveTanks(game.scope, game.gameId, { snapshot: tanks.snapshotOf(game) });\n if (!transport || game.scope !== transport.getScope?.() || game.pending || game.pendingEvent) return;\n if (game.status !== 'seeding' || game.ownId !== game.hostId) return;\n const seedA = seedFor(game.scope, game.gameId);\n if (!seedA) {\n if (!game.error) set((state) => ({ games: { ...state.games, [key]: { ...state.games[key], error: 'La semilla de esta partida no está en este dispositivo. Ciérrala e invita de nuevo.' } } }));\n return;\n }\n void get().sendEvent(game.roomId, createGameEvent('tk_seed', { game_id: game.gameId, data: { seed_a: seedA }, game: 'tanks' })).catch(() => {});\n },\n // Rebuilds stored, unfinished Tanques games after a reload (as conflicts, so they resync).\n restoreTanks: (scope, onlyGameId) => {\n let restored = false;\n listTanks(scope).forEach(({ snapshot }) => {\n if (!snapshot || (onlyGameId && snapshot.gameId !== onlyGameId) || ['closed', 'declined', 'won', 'draw'].includes(snapshot.status)) return;\n const key = keyFor(scope, snapshot.roomId, snapshot.gameId);\n if (get().games[key]) return;\n const base = tanks.createTanksGame({\n key, gameId: snapshot.gameId, game_id: snapshot.gameId, scope, roomId: snapshot.roomId, ownId: snapshot.ownId,\n hostId: snapshot.hostId, guestId: snapshot.guestId, createdAt: snapshot.createdAt,\n inviteEventId: snapshot.inviteEventId, lastEventId: snapshot.inviteEventId, seen: {}, sync: { ...idleSync },\n }, { seed_commit: snapshot.seedCommit, first_player_id: snapshot.firstPlayerId, rematch_of: snapshot.rematchOf ?? undefined });\n const rebuilt = tanks.adoptLog(base, snapshot);\n if (!rebuilt) return;\n restored = true;\n const game = { ...rebuilt, seen: tanks.withLogSeen({ [snapshot.inviteEventId]: true }, rebuilt), status: 'conflict',\n error: 'Partida recuperada en este dispositivo. Sincronizando con el rival…' };\n set((state) => ({ games: retainGames({ ...state.games, [key]: game }) }));\n queueMicrotask(() => { void get().requestResync(key, { auto: true }); });\n });\n return restored;\n },\n\n createLiveSignaling: (key) => {\n const game = get().games[key];\n if (!['tanks_live', 'racing_live'].includes(game?.game) || game.scope !== transport?.getScope?.()) throw new Error('Partida no disponible');\n const activeTransport = transport;\n return createChatSignaling({ roomId: game.roomId, send: (roomId, text) => {\n if (transport !== activeTransport || get().games[key]?.scope !== activeTransport.getScope()) throw new Error('La sesión cambió');\n return activeTransport.send(roomId, text);\n } });\n },\n liveFinish: (key, winnerId) => {\n const game = get().games[key];\n if (game?.game !== 'tanks_live' || game.scope !== transport?.getScope?.() || game.status !== 'active' || ![game.hostId, game.guestId].includes(String(winnerId))) return;\n set((state) => ({ games: { ...state.games, [key]: { ...game, status: 'won', winnerId: String(winnerId) } } }));\n },\n // Rematch keeps map, seed and lives; { newMap: true } draws a new seed (mapId 'random' unless given).\n // A legacy match stays legacy unless newMap/mapId/lives are passed.\n liveRematch: (key, { newMap = false, mapId, lives } = {}) => {\n const game = get().games[key];\n if (game?.game !== 'tanks_live' || game.scope !== transport?.getScope?.() || !terminal(game)) return;\n const prior = game.liveConfig;\n const config = newMap ? { mapId: mapId ?? 'random', lives: lives ?? prior?.lives }\n : mapId !== undefined ? { mapId, lives: lives ?? prior?.lives }\n : prior ? { mapId: prior.mapId, seed: prior.seed, lives: lives ?? prior.lives }\n : lives !== undefined ? { mapId: 'random', lives } : { mapId: null };\n if (config.lives === undefined) delete config.lives;\n return get().invite({ roomId: game.roomId, opponentId: game.ownId === game.hostId ? game.guestId : game.hostId,\n gameType: 'tanks_live', rematchOf: game.gameId, ...config });\n },\n sendEvent: async (roomId, event) => {\n if (!transport) throw new Error('Chat no disponible');\n const sendingTransport = transport;\n const scope = sendingTransport.getScope();\n const ownId = String(sendingTransport.getUserId() ?? '');\n const key = keyFor(scope, roomId, event.game_id);\n const text = encodeGameEvent(event);\n get().ingest({ room_id: roomId, user_id: ownId, message: text }, scope, ownId);\n if (!get().games[key]?.seen[event.event_id]) throw new Error('Evento de partida inválido');\n const update = (patch, requireCurrent = true) => set((state) => {\n const game = state.games[key];\n if (!game || (requireCurrent && game.pendingEvent?.event_id !== event.event_id)) return state;\n return { games: { ...state.games, [key]: { ...game, ...patch } } };\n });\n update({ pending: true, pendingEvent: event, error: '' }, false);\n try {\n await sendingTransport.send(roomId, text);\n update({ pending: false, pendingEvent: null });\n get().afterGameChange(key);\n } catch (error) {\n update({ pending: false, error: error.message || 'No se pudo enviar. Reintenta el mismo evento.' });\n throw error;\n }\n return key;\n },\n // The host is the initial source of truth. Histories are only adopted after a\n // full replay; a fork is never overwritten without the player's consent.\n handleResync: (key, event, author, ownId) => {\n const game = get().games[key];\n const adapter = syncFor(game);\n const seen = { ...game.seen, [event.event_id]: true };\n const put = (next) => {\n set((state) => ({ games: { ...state.games, [key]: next } }));\n get().afterGameChange(key);\n };\n if (author === ownId || ![game.hostId, game.guestId].includes(author) || ['closed', 'declined'].includes(game.status)) {\n put({ ...game, seen });\n return;\n }\n const sync = { ...idleSync, ...game.sync };\n if (![adapter.requestType, adapter.stateType].includes(event.type)) {\n put({ ...game, seen });\n return;\n }\n const isState = event.type === adapter.stateType;\n // Stale or unsolicited answers are dropped: they must reference one of our recent frames.\n if (isState && !sync.outgoing.includes(event.data.request_event_id)) {\n put({ ...game, seen });\n return;\n }\n const remote = adapter.rebuild(game, event.data);\n if (!remote) {\n put({ ...game, seen, sync: isState ? { ...sync, status: 'failed', message: 'El rival envió un estado de partida inválido.' } : sync });\n return;\n }\n const relation = adapter.compare(game, event.data);\n const resolved = { ...sync, status: 'ok', offer: null, auto: false, message: '' };\n let next;\n let reply = !isState;\n let deliversPending = false;\n const merged = relation === 'mixed' ? adapter.merge(game, event.data) : null;\n if (relation === 'equal' || relation === 'behind') {\n next = { ...remote, sync: resolved };\n if (adapter.covers(game, event.data)) next = { ...next, pendingEvent: null };\n } else if (merged) {\n // Independent pre-battle commits on both sides: keep the union and answer with it.\n const union = adapter.rebuild(game, merged);\n next = union ? { ...union, sync: resolved } : { ...game, sync: { ...sync, status: 'failed', message: 'No se pudo reconstruir la partida local.' } };\n reply = Boolean(union);\n deliversPending = Boolean(union);\n } else if (relation === 'ahead' || author === game.guestId) {\n // Our history is longer, or we are the host and keep ours on a fork.\n const own = adapter.rebuild(game, adapter.historyOf(game));\n next = own ? { ...own, sync: resolved } : { ...game, sync: { ...sync, status: 'failed', message: 'No se pudo reconstruir la partida local.' } };\n reply = Boolean(own);\n deliversPending = Boolean(own);\n } else {\n next = { ...game, status: 'conflict', error: 'El anfitrión tiene otra versión de la partida. Revísala antes de aceptarla.',\n sync: { ...sync, status: 'incompatible', offer: adapter.offerOf(event.data), message: '' } };\n }\n next = { ...next, seen: adapter.markSeen(seen, next) };\n const now = Date.now();\n const replies = next.sync.replies.filter((at) => now - at < 30000);\n let replyEvent = null;\n if (reply && replies.length < 6) {\n try {\n replyEvent = resyncEvent(game, adapter.stateType, { ...adapter.historyOf(next), request_event_id: event.event_id });\n } catch { replyEvent = null; }\n }\n if (replyEvent) {\n next = { ...next, seen: { ...next.seen, [replyEvent.event_id]: true },\n sync: { ...next.sync, replies: [...replies, now], outgoing: [...next.sync.outgoing, replyEvent.event_id].slice(-8) } };\n }\n put(next);\n if (!replyEvent) return;\n void get().sendResync(key, replyEvent).then(() => {\n if (!deliversPending) return;\n // The reply carried our unsent move, so its retry is no longer needed.\n set((state) => {\n const current = state.games[key];\n if (!current || !syncFor(current).covers(current, syncFor(current).historyOf(current))) return state;\n return { games: { ...state.games, [key]: { ...current, pendingEvent: null, error: '' } } };\n });\n get().afterGameChange(key);\n }).catch(() => {});\n },\n sendResync: async (key, event) => {\n const game = get().games[key];\n if (!transport || !game || game.scope !== transport.getScope?.()) throw new Error('Chat no disponible');\n await transport.send(game.roomId, encodeGameEvent(event));\n },\n requestResync: async (key, { auto = false } = {}) => {\n const game = get().games[key];\n if (!game || isRealtimeGame(game) || !transport || ['closed', 'declined'].includes(game.status) || game.scope !== transport.getScope?.()) return;\n const sync = { ...idleSync, ...game.sync };\n if ((sync.status === 'requesting' && Date.now() - sync.requestedAt < RESYNC_TIMEOUT) || (auto && sync.auto)) return;\n let event;\n try {\n event = resyncEvent(game, syncFor(game).requestType, syncFor(game).historyOf(game));\n } catch { return; }\n const fail = (message) => set((state) => {\n const current = state.games[key];\n if (current?.sync?.requestId !== event.event_id || current.sync.status !== 'requesting') return state;\n return { games: { ...state.games, [key]: { ...current, sync: { ...current.sync, status: 'failed', message } } } };\n });\n set((state) => {\n const current = state.games[key];\n if (!current) return state;\n return { games: { ...state.games, [key]: { ...current, seen: { ...current.seen, [event.event_id]: true },\n sync: { ...sync, status: 'requesting', requestId: event.event_id, requestedAt: Date.now(), auto: sync.auto || auto,\n message: '', outgoing: [...sync.outgoing, event.event_id].slice(-8) } } } };\n });\n const timer = setTimeout(() => {\n resyncTimers.delete(timer);\n fail('El rival no respondió a la sincronización. Reintenta cuando esté conectado.');\n }, RESYNC_TIMEOUT);\n resyncTimers.add(timer);\n try {\n await get().sendResync(key, event);\n } catch (error) {\n fail(error.message || 'No se pudo enviar la solicitud de sincronización.');\n }\n },\n adoptResyncOffer: (key) => {\n const game = get().games[key];\n const offer = game?.sync?.offer;\n if (!offer || game.sync.status !== 'incompatible') return false;\n const adapter = syncFor(game);\n const remote = adapter.rebuild(game, offer);\n set((state) => ({ games: { ...state.games, [key]: remote\n ? { ...remote, seen: adapter.markSeen(game.seen, remote), pending: false, pendingEvent: null, sync: { ...game.sync, status: 'ok', offer: null, auto: false, message: '' } }\n : { ...game, sync: { ...game.sync, status: 'failed', offer: null, message: 'El estado del anfitrión ya no es válido.' } } } }));\n if (remote) get().afterGameChange(key);\n return Boolean(remote);\n },\n resyncConflicts: (scope) => {\n get().restoreTanks(scope);\n Object.values(get().games).filter((game) => game.scope === scope && game.status === 'conflict')\n .forEach((game) => { void get().requestResync(game.key, { auto: true }); });\n },\n retry: (key) => {\n const game = get().games[key];\n if (!game?.pendingEvent || game.pending) return Promise.resolve();\n if (game.scope !== transport?.getScope?.()) return Promise.reject(new Error('La sesión de esta partida ya no está activa.'));\n return get().sendEvent(game.roomId, game.pendingEvent);\n },\n }));\n}\n\n// Backward-compatible singleton: hook plus getState/setState/subscribe.\nexport const chatGamesStore = createChatGamesStore();\nexport const useChatGames = (selector) => useStore(chatGamesStore, selector);\nObject.assign(useChatGames, {\n getState: chatGamesStore.getState,\n setState: chatGamesStore.setState,\n subscribe: chatGamesStore.subscribe,\n});\n\nexport default useChatGames;\n","// Base URL for chat static assets (sounds). The host app serves them; by\n// default they live under `/sounds` in its public folder.\n//\n// Module-level state on purpose: this is a single host-level setting, set once\n// at bootstrap (before any sound plays) via setChatAssetsBaseUrl. URLs are\n// resolved lazily, so changing it later still affects subsequent loads.\nconst DEFAULT_BASE_URL = '/sounds';\nlet baseUrl = DEFAULT_BASE_URL;\n\nconst trimTrailingSlash = (url) => String(url).replace(/\\/+$/, '');\n\nexport function setChatAssetsBaseUrl(url) {\n baseUrl = url == null ? DEFAULT_BASE_URL : trimTrailingSlash(url);\n}\n\nexport function getChatAssetsBaseUrl() {\n return baseUrl;\n}\n\nexport function chatSoundUrl(relativePath) {\n return `${baseUrl}/${String(relativePath).replace(/^\\/+/, '')}`;\n}\n"],"mappings":"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"}
|