@minicode-dev/chat 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +25 -0
  2. package/dist/chunks/{BattleshipGameCard-CAWHxqJE.js → BattleshipGameCard-BFqA0cjT.js} +247 -246
  3. package/dist/chunks/{BattleshipGameCard-CAWHxqJE.js.map → BattleshipGameCard-BFqA0cjT.js.map} +1 -1
  4. package/dist/chunks/{ChatContext-CUiEAMKK.js → ChatContext-dty_KPDX.js} +2 -2
  5. package/dist/chunks/{ChatContext-CUiEAMKK.js.map → ChatContext-dty_KPDX.js.map} +1 -1
  6. package/dist/chunks/TanksGameCard-D0n-lzTs.js +1535 -0
  7. package/dist/chunks/TanksGameCard-D0n-lzTs.js.map +1 -0
  8. package/dist/chunks/TanksLiveGameCard-BmNRXP66.js +849 -0
  9. package/dist/chunks/TanksLiveGameCard-BmNRXP66.js.map +1 -0
  10. package/dist/chunks/WebRtcLab-B7xBlJy1.js +510 -0
  11. package/dist/chunks/WebRtcLab-B7xBlJy1.js.map +1 -0
  12. package/dist/chunks/{connect4Sounds-BDXQAvU1.js → connect4Sounds-BN7d_TM2.js} +654 -618
  13. package/dist/chunks/connect4Sounds-BN7d_TM2.js.map +1 -0
  14. package/dist/chunks/createLiveScene-CtYPcOPo.js +364 -0
  15. package/dist/chunks/createLiveScene-CtYPcOPo.js.map +1 -0
  16. package/dist/chunks/createPeerLink-qei05vpV.js +478 -0
  17. package/dist/chunks/createPeerLink-qei05vpV.js.map +1 -0
  18. package/dist/chunks/createTankScene-CV7Brxmt.js +685 -0
  19. package/dist/chunks/createTankScene-CV7Brxmt.js.map +1 -0
  20. package/dist/chunks/fx-BHsl4S_J.js +1470 -0
  21. package/dist/chunks/fx-BHsl4S_J.js.map +1 -0
  22. package/dist/chunks/gameStatus-Cu1Z8un9.js +69 -0
  23. package/dist/chunks/gameStatus-Cu1Z8un9.js.map +1 -0
  24. package/dist/chunks/signalFaults-Dv2YjjKy.js +36 -0
  25. package/dist/chunks/signalFaults-Dv2YjjKy.js.map +1 -0
  26. package/dist/chunks/tanksSounds-C99OD2xD.js +177 -0
  27. package/dist/chunks/tanksSounds-C99OD2xD.js.map +1 -0
  28. package/dist/index.js +1861 -1829
  29. package/dist/index.js.map +1 -1
  30. package/dist/styles.css +1 -1
  31. package/index.d.ts +61 -0
  32. package/package.json +1 -1
  33. package/dist/chunks/TanksGameCard-BEnXTz_J.js +0 -1705
  34. package/dist/chunks/TanksGameCard-BEnXTz_J.js.map +0 -1
  35. package/dist/chunks/connect4Sounds-BDXQAvU1.js.map +0 -1
  36. package/dist/chunks/createTankScene-BuliAxwR.js +0 -2150
  37. package/dist/chunks/createTankScene-BuliAxwR.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"TanksGameCard-BEnXTz_J.js","names":["clamp","_Fragment","MAP_SIZE","useChatGames","windFor","trace","AMMO","launchState","createSoundManager","sameUser","U","LIMITS","isTerminalGame","GameSoundControls","getGameStatus","connect4Sounds","useChatConnectionStatus","canAct","chatSoundUrl","isSoundEnabled","subscribeSoundPreference","ChatContext","hasWebGL","ACCEL_TO_MS2","samplesToMeters","out","samples","i","windToMeters","wind","getRenderWorld","heights","state","o","d","t","previewTrajectory","index","playerId","yaw","pitch","power","v","lo","hi","ammo","TICK_MS","TEAM_COLORS","worldFor","world","game","players","tank","point","p","turnFor","turn","before","previousLogic","shot","crater","item","previewFor","aim","yawToward","to","from","MAX_PARTICLES","MOVE_SPEED","TURRET_SPEED","RAD","HULL_LENGTH","HULL_WIDTH","DEFAULT_MAX_HP","TANK_COLORS","CHARRED","QUALITY","PALETTE","clamp$1","max","min","value","finite","fallback","easeInOut","computeView","span","size","half","center","origin","scale","width","height","pad","zoom","fit","halfView","viewX","cx","viewZ","cz","worldToCanvas","view","x","z","headingVector","headingToCanvasAngle","angleDelta","lerpAngle","sampleHeight","grid","fx","fz","x0","z0","tx","tz","top","bottom","terrainColor","k","t0","c0","t1","c1","f","channel","shade","buildTerrainPixels","res","h","range","cell","light","norm","py","px","c","l","r","u","dx","dz","nl","bowl","contourStep","band","cr","cg","cb","altitudeColor","a","b","mix","pathPointAt","points","path","lengths","total","target","seg","heading","pathLength","samplePoint","shotTimeline","cursor","split","shots","entry","count","startMs","gapMs","endMs","bomblet","normalizePoints","createTankScene2d","doc","win","canvas","ctx","container","speed","reducedMotion","quality","cameraMode","preview","terrain","craters","particles","rings","flashes","smoke","floats","projectiles","celebration","overrides","charred","poseOf","id","anims","dpr","raf","last","disposed","queue","hidden","emit","data","tuning","viewFor","focus","findTank","groundAt","busy","requestFrame","frame","dt","ts","advance","draw","wait","resolve","ms","anim","s","burst","room","angle","life","colors","explode","radius","big","terrainImage","factor","pixels","image","ictx","roundRect","rr","w","y","drawObstacles","lift","drawDecor","drawCraters","g","drawPreview","alts","alt","end","drawTank","pose","active","dead","palette","len","wid","maxHp","ratio","barW","barY","drawProjectile","head","prev","offset","drawEffects","q","drawHud","wx","wz","strength","ux","uz","parts","text","corner","flight","runTurn","start","length","dust","back","targetYaw","delta","damage","shownDamage","pendingCraters","dir","muzzle","flights","launch","land","tail","impact","amount","now","tankId","destroyed","puff","applyWorld","next","keepCraters","resize","rect","onVisibility","observer","run","mode","winnerId","TANKS_LOOPS","play","loopStart","loopStop","IMPACT_SOUNDS","sceneEventToCues","event","name","outcomeToCues","result","TANKS_SOUND_NAMES","LEVELS","DELIVERED_TANKS_SOUNDS","RETRIGGER_MS","LOOP_RAMPS","MP3_LOOP_TRIM","YIELDS_TO","supportsOgg","files","fileFor","extension","configured","format","configureTanksSounds","available","file","manager","getTanksSoundManager","canPlay","wantedLoops","syncLoops","allowed","started","startTanksSounds","lastPlayed","suppressedUntil","suppressTanksCue","playTanksCue","key","played","startTanksLoop","stopTanksLoop","stopAllTanksLoops","names","runCues","cues","action","handleSceneEvent","suffix","playOutcome","TURN_SECONDS","INVITE_HINT_MS","AMMO_LABELS","clamp","wrapYaw","useConnected","transport","useContext","subscribe","useCallback","unsubscribe","notify","status","useSyncExternalStore","call","args","error","SyncControls","sync","connected","onAdoptOffer","onResync","HpBar","color","label","hp","useTankScene","sceneRef","useRef","setMode","useState","forced2d","setForced2d","eventRef","onSceneEvent","use2d","prefer2d","useEffect","host","stageRef","enabled","scene","options","ready","kind","mount2d","createTankScene","TanksHistoryCard","Swords","currentUserId","TanksPanel","setPrefer2d","setAim","animating","setAnimating","camera","setCamera","setError","confirmResign","setConfirmResign","setNow","animKey","eventSeq","showStage","ownId","myIndex","isGuest","isParticipant","terminal","myTurn","reason","shown","eventId","previous","isNewTurn","endedOnMount","me","other","turnStart","timer","remaining","skipped","gameKey","updateAim","patch","fire","drag","onPointerDown","onPointerMove","onPointerUp","onKeyDown","step","opponentId","rematch","tanks","windStrength","windAngle","waitingLong","variant","onMinimize","ChevronDown","X","onDismiss","Wind","Video","Layers","left","Crosshair","Fragment","Flag","RotateCcw","TanksGameCard","TanksGameCard_default","memo"],"sources":["../../src/games/tanks/logic/selectors.js","../../src/games/tanks/view.js","../../src/games/tanks/fallback/createTankScene2d.js","../../src/games/tanks/sound/cues.js","../../src/games/tanks/sound/tanksSounds.js","../../src/games/tanks/TanksGameCard.jsx"],"sourcesContent":["import { U, GRID, MAP_SIZE, TICKS_PER_SECOND, LIMITS, AMMO, MAX_TICKS } from './constants.js';\nimport { windFor } from './rng.js';\nimport { launchState, trace } from './ballistics.js';\n\n/* Render conversion only: floats are produced here and never stored in state. */\nexport const toMeters = (u) => u / U;\nconst ACCEL_TO_MS2 = TICKS_PER_SECOND * TICKS_PER_SECOND;\n\n/** Flat [x,y,z,...] samples in u -> Float32Array in meters. */\nexport function samplesToMeters(samples) {\n const out = new Float32Array(samples.length);\n for (let i = 0; i < samples.length; i += 1) out[i] = samples[i] / U;\n return out;\n}\n\nexport function windToMeters(wind) {\n return { x: (wind.x * ACCEL_TO_MS2) / U, z: (wind.z * ACCEL_TO_MS2) / U };\n}\n\nexport function getRenderWorld(state) {\n const heights = new Float32Array(state.heights.length);\n for (let i = 0; i < heights.length; i += 1) heights[i] = state.heights[i] / U;\n return {\n size: MAP_SIZE / U, grid: GRID, heights,\n obstacles: state.obstacles.map((o) => ({\n id: o.id, kind: o.kind, x: o.x / U, z: o.z / U, y: o.y / U, w: o.w / U, d: o.d / U, h: o.h / U,\n })),\n decor: state.decor.map((d) => ({ id: d.id, kind: d.kind, x: d.x / U, z: d.z / U, scale: d.scale / 100 })),\n tanks: state.tanks.map((t) => ({\n id: t.id, x: t.x / U, y: t.y / U, z: t.z / U, hullYaw: t.hullYaw, yaw: t.yaw, pitch: t.pitch,\n hp: t.hp, fuel: t.fuel / U, ammo: { ...t.ammo }, alive: t.hp > 0,\n })),\n wind: windToMeters(windFor(state.seed, state.ply)),\n turnPlayerId: state.phase === 'playing' ? state.players[state.turnIndex] : null,\n };\n}\n\nexport function getPlayerView(state, playerId) {\n const index = state.players.indexOf(playerId);\n if (index < 0) return null;\n const isMyTurn = state.phase === 'playing' && state.turnIndex === index;\n const me = state.tanks[index];\n return {\n gameId: state.gameId, revision: state.revision, phase: state.phase, playerId,\n opponentId: state.players[1 - index], isMyTurn, canAct: isMyTurn && me.hp > 0,\n hp: me.hp, opponentHp: state.tanks[1 - index].hp, fuel: me.fuel / U, ammo: { ...me.ammo },\n shots: state.shots, maxShots: state.maxShots, wind: windToMeters(windFor(state.seed, state.ply)),\n winnerId: state.winnerId, result: state.result, reason: state.reason,\n };\n}\n\n/** Aim preview from the current tank position (no movement); [] for invalid input. */\nexport function previewTrajectory(state, playerId, { yaw, pitch, power, ammo, maxTicks = MAX_TICKS } = {}) {\n const index = state.players.indexOf(playerId);\n const valid = index >= 0 && [[yaw, LIMITS.yaw], [pitch, LIMITS.pitch], [power, LIMITS.power]]\n .every(([v, [lo, hi]]) => Number.isInteger(v) && v >= lo && v <= hi)\n && typeof ammo === 'string' && Object.hasOwn(AMMO, ammo);\n if (!valid) return new Float32Array(0);\n const path = trace(launchState(state.tanks[index], { yaw, pitch, power, ammo }), {\n wind: windFor(state.seed, state.ply), heights: state.heights, tanks: state.tanks,\n obstacles: state.obstacles, maxTicks,\n });\n return samplesToMeters(path.samples);\n}\n","// Converts the deterministic logic state (integer units) into the meter-based data the\n// 3D and 2D scenes draw. Floats live only here and in the scenes, never in game state.\nimport { U, getRenderWorld, samplesToMeters, previewTrajectory } from './logic/index.js';\n\nconst TICK_MS = 20;\nexport const TEAM_COLORS = Object.freeze(['green', 'red']);\n\nexport function worldFor(game) {\n const world = getRenderWorld(game.logic);\n const players = game.logic.players;\n return {\n ...world,\n tanks: world.tanks.map((tank) => ({ ...tank, color: TEAM_COLORS[players.indexOf(tank.id)] ?? 'green' })),\n activeId: world.turnPlayerId,\n };\n}\n\nconst point = (p) => ({ x: p.x / U, y: p.y / U, z: p.z / U });\n\n/** Scene playback data for the turn that produced `game.logic`; null for skips/resigns. */\nexport function turnFor(game, previousLogic) {\n const turn = game.logic?.lastTurn;\n if (!turn || turn.type !== 'turn') return null;\n const before = previousLogic?.tanks ?? [];\n return {\n tankId: turn.playerId,\n movePath: turn.movePath.map(point),\n yaw: turn.input.yaw,\n pitch: turn.input.pitch,\n ammo: turn.input.ammo,\n shots: turn.shots.map((shot) => ({\n role: shot.role, startMs: shot.startTick * TICK_MS, samples: samplesToMeters(shot.samples),\n impact: { ...point(shot.impact), kind: shot.impact.kind, tankId: shot.impact.tankId }, radius: shot.radius / U,\n })),\n craters: turn.craters.map((crater) => ({ x: crater.x / U, z: crater.z / U, radius: crater.radius / U, depth: crater.depth / U })),\n damage: { ...turn.damage },\n destroyed: game.logic.tanks.filter((tank) => tank.hp === 0 && (before.find((item) => item.id === tank.id)?.hp ?? 1) > 0).map((tank) => tank.id),\n world: worldFor(game),\n };\n}\n\nexport function previewFor(game, playerId, aim) {\n try {\n return previewTrajectory(game.logic, playerId, aim);\n } catch {\n return null;\n }\n}\n\n/** Turret yaw (integer degrees, 0 = +x, 90 = +z) pointing from `from` to `to`; UI only. */\nexport function yawToward(from, to) {\n const degrees = Math.round((Math.atan2(to.z - from.z, to.x - from.x) * 180) / Math.PI);\n return ((degrees % 360) + 360) % 360;\n}\n","// Canvas 2D fallback for the Tanks scene (no three.js / no WebGL). Same API as\n// the 3D scene so the card can swap them. Top-down map: x → right, z → down.\n// World coordinates are meters with the map at [0, size] (logic convention);\n// pass { origin: 'center' } for [-size/2, size/2]. Angles are degrees and a yaw\n// points along (cos yaw, sin yaw) in (x, z), matching tanks/logic.\n// Renders on demand: rAF only runs while something animates, and pauses while\n// the page is hidden. Rendering never throws.\n\nexport const SAMPLE_MS = 40;\nconst MAX_PARTICLES = 60;\nconst MOVE_SPEED = 9; // m/s\nconst TURRET_SPEED = 120; // deg/s\nconst RAD = Math.PI / 180;\nconst HULL_LENGTH = 7;\nconst HULL_WIDTH = 4.4;\nconst DEFAULT_MAX_HP = 100;\nconst TANK_COLORS = {\n green: { hull: '#4f8a3c', dark: '#2f5a24', turret: '#6aa851' },\n red: { hull: '#b8423a', dark: '#7a2620', turret: '#d45a4f' },\n};\nconst CHARRED = { hull: '#2b2a28', dark: '#151413', turret: '#3a3835' };\nconst QUALITY = {\n low: { terrain: 2, dpr: 1, particles: 0.5 },\n medium: { terrain: 3, dpr: 1.5, particles: 0.75 },\n high: { terrain: 4, dpr: 2, particles: 1 },\n};\nconst PALETTE = [\n [0, [52, 96, 48]], [0.25, [86, 130, 58]], [0.5, [128, 134, 72]],\n [0.68, [126, 100, 68]], [0.85, [128, 124, 118]], [1, [190, 188, 182]],\n];\n\nconst clamp = (value, min, max) => Math.min(max, Math.max(min, value));\nconst finite = (value, fallback = 0) => (Number.isFinite(value) ? value : fallback);\nconst easeInOut = (t) => (t < 0.5 ? 2 * t * t : 1 - ((-2 * t + 2) ** 2) / 2);\n\n// ---- Pure helpers (tested) -------------------------------------------------\n\n/** Fits the map in a width×height box (CSS px). zoom > 1 centers on (cx, cz), clamped to the map. */\nexport function computeView(width, height, size, { zoom = 1, cx, cz, pad = 8, origin = 'corner' } = {}) {\n const span = Math.max(1, finite(size, 160));\n const half = span / 2;\n const center = origin === 'corner' ? half : 0;\n const scale = (Math.max(1, Math.min(width, height) - pad * 2) / span) * Math.max(1, finite(zoom, 1));\n const fit = (value, halfView) => (halfView >= half ? center : clamp(finite(value, center), center - half + halfView, center + half - halfView));\n const viewX = fit(cx, width / 2 / scale);\n const viewZ = fit(cz, height / 2 / scale);\n return { scale, ox: width / 2 - viewX * scale, oy: height / 2 - viewZ * scale, size: span, minX: center - half, minZ: center - half };\n}\n\nexport function worldToCanvas(x, z, view) {\n return { x: view.ox + x * view.scale, y: view.oy + z * view.scale };\n}\n\nexport function canvasToWorld(px, py, view) {\n return { x: (px - view.ox) / view.scale, z: (py - view.oy) / view.scale };\n}\n\n/** Forward direction of a yaw in degrees (logic convention: x = cos, z = sin). */\nexport function headingVector(yaw) {\n return { x: Math.cos(yaw * RAD), z: Math.sin(yaw * RAD) };\n}\n\n/** Canvas rotation (radians) that points local +x along the yaw (z maps to canvas y). */\nexport function headingToCanvasAngle(yaw) {\n return yaw * RAD;\n}\n\n/** Shortest signed difference in degrees, in (-180, 180]. */\nexport function angleDelta(from, to) {\n const d = (((to - from) % 360) + 540) % 360 - 180;\n return d === -180 ? 180 : d;\n}\n\nexport function lerpAngle(from, to, t) {\n return from + angleDelta(from, to) * t;\n}\n\n/** Bilinear height at fractional grid coordinates (clamped to the grid). */\nexport function sampleHeight(heights, grid, fx, fz) {\n if (!heights || grid < 2) return 0;\n const x = clamp(finite(fx), 0, grid - 1);\n const z = clamp(finite(fz), 0, grid - 1);\n const x0 = Math.min(grid - 2, Math.floor(x));\n const z0 = Math.min(grid - 2, Math.floor(z));\n const tx = x - x0;\n const tz = z - z0;\n const i = z0 * grid + x0;\n const top = heights[i] * (1 - tx) + heights[i + 1] * tx;\n const bottom = heights[i + grid] * (1 - tx) + heights[i + grid + 1] * tx;\n return finite(top * (1 - tz) + bottom * tz);\n}\n\n/** Palette color for normalized altitude t, multiplied by shade. */\nexport function terrainColor(t, shade = 1) {\n const v = clamp(finite(t), 0, 1);\n let k = 1;\n while (k < PALETTE.length - 1 && PALETTE[k][0] < v) k += 1;\n const [t0, c0] = PALETTE[k - 1];\n const [t1, c1] = PALETTE[k];\n const f = t1 > t0 ? (v - t0) / (t1 - t0) : 0;\n return c0.map((channel, i) => clamp(Math.round((channel + (c1[i] - channel) * f) * shade), 0, 255));\n}\n\n/**\n * Hillshaded RGBA pixels (res×res) for a row-major height grid: palette by\n * altitude, NW light, darker bowls (craters) and contour hints.\n */\nexport function buildTerrainPixels(heights, grid, res, { size = 160, contourStep = 3 } = {}) {\n const out = new Uint8ClampedArray(res * res * 4);\n if (!heights || grid < 2 || res < 2) return out;\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < grid * grid; i += 1) {\n const h = finite(heights[i]);\n if (h < min) min = h;\n if (h > max) max = h;\n }\n const range = max - min;\n const k = (grid - 1) / (res - 1);\n const cell = size / (grid - 1); // meters per grid step\n const light = [-0.55, 0.75, -0.55]; // from the north-west\n const norm = Math.hypot(...light);\n const h = (fx, fz) => sampleHeight(heights, grid, fx, fz);\n for (let py = 0; py < res; py += 1) {\n for (let px = 0; px < res; px += 1) {\n const fx = px * k;\n const fz = py * k;\n const c = h(fx, fz);\n const l = h(fx - 0.5, fz);\n const r = h(fx + 0.5, fz);\n const u = h(fx, fz - 0.5);\n const d = h(fx, fz + 0.5);\n const dx = (r - l) / cell;\n const dz = (d - u) / cell;\n const nl = Math.hypot(dx, 1, dz);\n const lambert = (-dx * light[0] + light[1] - dz * light[2]) / (nl * norm);\n let shade = clamp(0.45 + 0.65 * lambert, 0.35, 1.2);\n const bowl = (l + r + u + d - 4 * c) / cell; // > 0 inside dips\n shade *= 1 - clamp(bowl * 0.6, 0, 0.35);\n if (contourStep > 0 && range > contourStep) {\n const band = Math.floor(c / contourStep);\n if (band !== Math.floor(r / contourStep) || band !== Math.floor(d / contourStep)) shade *= 0.88;\n }\n const [cr, cg, cb] = terrainColor(range > 1e-3 ? (c - min) / range : 0.3, shade);\n const o = (py * res + px) * 4;\n out[o] = cr; out[o + 1] = cg; out[o + 2] = cb; out[o + 3] = 255;\n }\n }\n return out;\n}\n\n/** CSS color for a normalized projectile altitude: low cyan → yellow → high red. */\nexport function altitudeColor(t) {\n const v = clamp(finite(t), 0, 1);\n const [a, b, f] = v < 0.5 ? [[90, 200, 255], [255, 214, 90], v * 2] : [[255, 214, 90], [255, 90, 60], (v - 0.5) * 2];\n const mix = a.map((channel, i) => Math.round(channel + (b[i] - channel) * f));\n return `rgb(${mix[0]},${mix[1]},${mix[2]})`;\n}\n\n/** Point at fraction t of a polyline's length, with the travel heading (yaw). */\nexport function pathPointAt(path, t) {\n const points = (path || []).filter((p) => p && Number.isFinite(p.x) && Number.isFinite(p.z));\n if (!points.length) return null;\n if (points.length === 1) return { x: points[0].x, y: finite(points[0].y), z: points[0].z, heading: null };\n const lengths = [0];\n for (let i = 1; i < points.length; i += 1) lengths.push(lengths[i - 1] + Math.hypot(points[i].x - points[i - 1].x, points[i].z - points[i - 1].z));\n const total = lengths[lengths.length - 1];\n const target = clamp(finite(t), 0, 1) * total;\n let i = 1;\n while (i < points.length - 1 && lengths[i] < target) i += 1;\n const a = points[i - 1];\n const b = points[i];\n const seg = lengths[i] - lengths[i - 1];\n const f = seg > 0 ? clamp((target - lengths[i - 1]) / seg, 0, 1) : 1;\n const heading = seg > 0 ? Math.atan2(b.z - a.z, b.x - a.x) / RAD : null;\n return { x: a.x + (b.x - a.x) * f, y: finite(a.y) + (finite(b.y) - finite(a.y)) * f, z: a.z + (b.z - a.z) * f, heading };\n}\n\nexport function pathLength(path) {\n let total = 0;\n for (let i = 1; i < (path?.length || 0); i += 1) total += Math.hypot(path[i].x - path[i - 1].x, path[i].z - path[i - 1].z);\n return total;\n}\n\n/** Interpolated xyz at fractional sample index f of a flat xyz array. */\nexport function samplePoint(samples, f) {\n const n = Math.floor((samples?.length || 0) / 3);\n if (!n) return null;\n const x = clamp(finite(f), 0, n - 1);\n const i = Math.min(n - 2, Math.floor(x));\n if (i < 0) return { x: samples[0], y: samples[1], z: samples[2] };\n const t = x - i;\n const o = i * 3;\n return {\n x: samples[o] + (samples[o + 3] - samples[o]) * t,\n y: samples[o + 1] + (samples[o + 4] - samples[o + 1]) * t,\n z: samples[o + 2] + (samples[o + 5] - samples[o + 2]) * t,\n };\n}\n\n/**\n * Flight schedule for a turn's shots: startMs (when given, e.g. cluster\n * bomblets) or right after the previous shot. Bomblets follow a 'split' and\n * do not re-fire the cannon.\n */\nexport function shotTimeline(shots, gapMs = 380) {\n let cursor = 0;\n let split = false;\n return (shots || []).map((shot, index) => {\n const entry = shot || {};\n const count = Math.floor((entry.samples?.length || 0) / 3);\n const startMs = Number.isFinite(entry.startMs) ? Math.max(0, entry.startMs) : (index ? cursor + gapMs : 0);\n const endMs = startMs + Math.max(0, count - 1) * SAMPLE_MS;\n const bomblet = split && startMs > 0;\n if (entry.impact?.kind === 'split') split = true;\n cursor = Math.max(cursor, endMs);\n return { shot: entry, index, count, startMs, endMs, bomblet };\n });\n}\n\n/** Normalizes preview points: [{x,y,z}] or a flat xyz array → [{x,y,z}]. */\nexport function normalizePoints(points) {\n if (!points) return null;\n if (Array.isArray(points)) return points.filter((p) => p && Number.isFinite(p.x) && Number.isFinite(p.z)).map((p) => ({ x: p.x, y: finite(p.y), z: p.z }));\n if (typeof points.length === 'number') {\n const out = [];\n for (let i = 0; i + 2 < points.length; i += 3) out.push({ x: points[i], y: points[i + 1], z: points[i + 2] });\n return out;\n }\n return null;\n}\n\n// ---- Scene ----------------------------------------------------------------------\n\nexport function createTankScene2d(container, { reducedMotion = false, onEvent, origin = 'corner' } = {}) {\n const doc = typeof document !== 'undefined' ? document : null;\n const win = typeof window !== 'undefined' ? window : null;\n const canvas = doc ? doc.createElement('canvas') : null;\n let ctx = null;\n if (canvas) {\n canvas.className = 'tanks-scene-2d';\n canvas.style.cssText = 'display:block;width:100%;height:100%;touch-action:none';\n try { container?.appendChild(canvas); ctx = canvas.getContext('2d'); } catch { ctx = null; }\n }\n const speed = reducedMotion ? 2 : 1;\n\n let world = null;\n let quality = 'high';\n let cameraMode = 'overview';\n let aim = null;\n let preview = null;\n let terrain = { heights: null, grid: 0, factor: 0, canvas: null };\n let craters = [];\n let particles = [];\n let rings = [];\n let flashes = [];\n let smoke = [];\n let floats = [];\n let projectiles = [];\n let celebration = null;\n const overrides = new Map(); // String(tankId) -> animated pose\n const charred = new Set(); // String(tankId)\n const poseOf = (id) => overrides.get(String(id));\n const anims = new Set();\n let width = 0;\n let height = 0;\n let dpr = 1;\n let raf = 0;\n let last = 0;\n let disposed = false;\n let queue = Promise.resolve();\n\n const hidden = () => Boolean(doc?.hidden);\n const emit = (type, data) => {\n try { onEvent?.({ type, ...data }); } catch { /* host handler must not break the scene */ }\n };\n const tuning = () => QUALITY[quality] || QUALITY.high;\n const viewFor = () => {\n const size = finite(world?.size, 160);\n if (cameraMode === 'overview' || !world) return computeView(width, height, size, { origin });\n const focus = poseOf(world.activeId) || findTank(world.activeId);\n return computeView(width, height, size, { origin, zoom: 2, cx: focus?.x, cz: focus?.z });\n };\n const findTank = (id) => world?.tanks?.find((tank) => String(tank.id) === String(id)) || null;\n const groundAt = (x, z) => {\n if (!world?.heights) return 0;\n const size = finite(world.size, 160);\n const min = origin === 'corner' ? 0 : -size / 2;\n const grid = world.grid || Math.round(Math.sqrt(world.heights.length));\n return sampleHeight(world.heights, grid, ((x - min) / size) * (grid - 1), ((z - min) / size) * (grid - 1));\n };\n\n // -- frame loop\n const busy = () => anims.size > 0 || particles.length || rings.length || flashes.length || smoke.length\n || floats.length || Boolean(celebration && celebration.left > 0);\n\n const requestFrame = () => {\n if (raf || disposed || hidden() || !win?.requestAnimationFrame) return;\n raf = win.requestAnimationFrame(frame);\n };\n\n function frame(ts) {\n raf = 0;\n if (disposed) return;\n const dt = last ? clamp(ts - last, 0, 50) : 16;\n last = ts;\n advance(dt);\n draw();\n if (busy() && !hidden()) requestFrame();\n else last = 0;\n }\n\n // Resolves after ms of scene time (paused while hidden); step(t) runs every frame.\n const wait = (ms, step) => new Promise((resolve) => {\n if (disposed) { resolve(); return; }\n anims.add({ elapsed: 0, duration: Math.max(1, ms / speed), step, resolve });\n requestFrame();\n });\n\n function advance(dt) {\n anims.forEach((anim) => {\n anim.elapsed += dt;\n const t = Math.min(1, anim.elapsed / anim.duration);\n try { anim.step?.(t, dt); } catch { /* keep animating */ }\n if (t >= 1) { anims.delete(anim); anim.resolve(); }\n });\n const s = dt / 1000;\n const wind = world?.wind || {};\n particles = particles.filter((p) => {\n p.life -= dt;\n p.x += p.vx * s; p.z += p.vz * s;\n p.vx *= 0.94; p.vz *= 0.94;\n return p.life > 0;\n });\n smoke = smoke.filter((p) => {\n p.life -= dt;\n p.x += finite(wind.x) * 0.25 * s; p.z += finite(wind.z) * 0.25 * s;\n p.r += 1.2 * s;\n return p.life > 0;\n });\n rings = rings.filter((r) => (r.life -= dt) > 0);\n flashes = flashes.filter((f) => (f.life -= dt) > 0);\n floats = floats.filter((f) => (f.life -= dt) > 0);\n if (celebration?.left > 0) {\n celebration.left -= dt;\n celebration.next -= dt;\n if (celebration.next <= 0 && !reducedMotion) {\n celebration.next = 450;\n const tank = poseOf(celebration.id) || findTank(celebration.id);\n if (tank) {\n rings.push({ x: tank.x, z: tank.z, r0: 3, r1: 14, life: 900, max: 900, color: '255,214,90' });\n burst(tank.x, tank.z, 8, ['#ffd65a', '#ffffff', '#7fd36b', '#ff7a5c'], 14);\n }\n }\n }\n }\n\n // -- effects\n function burst(x, z, count, colors, power = 10) {\n const room = Math.floor(MAX_PARTICLES * tuning().particles) - particles.length;\n for (let i = 0; i < Math.min(count, room); i += 1) {\n const angle = Math.random() * Math.PI * 2;\n const v = power * (0.4 + Math.random() * 0.8);\n const life = 500 + Math.random() * 600;\n particles.push({ x, z, vx: Math.cos(angle) * v, vz: Math.sin(angle) * v, life, max: life, color: colors[i % colors.length], size: 0.5 + Math.random() * 0.8 });\n }\n }\n\n function explode(x, z, radius, big) {\n const r = Math.max(2, finite(radius, 4));\n rings.push({ x, z, r0: r * 0.2, r1: r * (big ? 1.8 : 1.2), life: 700, max: 700, color: '255,190,90' });\n if (big) rings.push({ x, z, r0: r * 0.5, r1: r * 2.6, life: 1100, max: 1100, color: '255,120,60' });\n flashes.push({ x, z, r: r * (big ? 1.6 : 1), life: 220, max: 220 });\n burst(x, z, big ? 30 : 16, ['#ffd27a', '#ff8a3c', '#6b5a48', '#3b332c'], big ? 22 : 14);\n for (let i = 0; i < (big ? 6 : 3); i += 1) {\n const life = 1200 + Math.random() * 800;\n smoke.push({ x: x + (Math.random() - 0.5) * r, z: z + (Math.random() - 0.5) * r, r: r * 0.4, life, max: life });\n }\n }\n\n // -- terrain cache\n function terrainImage() {\n const heights = world?.heights;\n if (!heights || !doc) return null;\n const grid = world.grid || Math.round(Math.sqrt(heights.length));\n const factor = tuning().terrain;\n if (terrain.canvas && terrain.heights === heights && terrain.grid === grid && terrain.factor === factor) return terrain.canvas;\n const res = Math.min(400, (grid - 1) * factor + 1);\n const pixels = buildTerrainPixels(heights, grid, res, { size: finite(world.size, 160) });\n const image = terrain.canvas && terrain.canvas.width === res ? terrain.canvas : doc.createElement('canvas');\n image.width = res;\n image.height = res;\n const ictx = image.getContext('2d');\n if (!ictx) return null;\n const data = ictx.createImageData(res, res);\n data.data.set(pixels);\n ictx.putImageData(data, 0, 0);\n terrain = { heights, grid, factor, canvas: image };\n return image;\n }\n\n // -- drawing\n function roundRect(x, y, w, h, r) {\n const rr = Math.min(r, w / 2, h / 2);\n ctx.beginPath();\n ctx.moveTo(x + rr, y);\n ctx.arcTo(x + w, y, x + w, y + h, rr);\n ctx.arcTo(x + w, y + h, x, y + h, rr);\n ctx.arcTo(x, y + h, x, y, rr);\n ctx.arcTo(x, y, x + w, y, rr);\n ctx.closePath();\n }\n\n function drawObstacles(view) {\n (world.obstacles || []).forEach((o) => {\n if (!Number.isFinite(o?.x) || !Number.isFinite(o?.z)) return;\n const w = Math.max(2, finite(o.w, 4) * view.scale);\n const d = Math.max(2, finite(o.d, 4) * view.scale);\n const p = worldToCanvas(o.x, o.z, view);\n const lift = clamp(finite(o.h, 3) * view.scale * 0.25, 1, 10);\n ctx.fillStyle = 'rgba(0,0,0,0.35)';\n roundRect(p.x - w / 2 + lift, p.y - d / 2 + lift, w, d, 3);\n ctx.fill();\n ctx.fillStyle = o.kind === 'wall' ? '#8d8a82' : o.kind === 'crate' ? '#8a6a3e' : '#9a958a';\n roundRect(p.x - w / 2, p.y - d / 2, w, d, 3);\n ctx.fill();\n ctx.strokeStyle = 'rgba(0,0,0,0.45)';\n ctx.lineWidth = 1;\n ctx.stroke();\n });\n }\n\n function drawDecor(view) {\n (world.decor || []).forEach((item) => {\n if (!Number.isFinite(item?.x) || !Number.isFinite(item?.z)) return;\n const p = worldToCanvas(item.x, item.z, view);\n const scale = finite(item.scale, 1);\n if (item.kind === 'tree') {\n const r = Math.max(2, 1.6 * scale * view.scale);\n ctx.fillStyle = 'rgba(0,0,0,0.3)';\n ctx.beginPath(); ctx.arc(p.x + r * 0.35, p.y + r * 0.35, r, 0, Math.PI * 2); ctx.fill();\n ctx.fillStyle = '#2f6b2a';\n ctx.beginPath(); ctx.arc(p.x, p.y, r, 0, Math.PI * 2); ctx.fill();\n ctx.fillStyle = 'rgba(140,200,110,0.35)';\n ctx.beginPath(); ctx.arc(p.x - r * 0.3, p.y - r * 0.3, r * 0.45, 0, Math.PI * 2); ctx.fill();\n } else {\n const r = Math.max(1.5, 0.8 * scale * view.scale);\n ctx.fillStyle = '#7c7a74';\n ctx.beginPath(); ctx.arc(p.x, p.y, r, 0, Math.PI * 2); ctx.fill();\n }\n });\n }\n\n function drawCraters(view) {\n craters.forEach((c) => {\n const p = worldToCanvas(c.x, c.z, view);\n const r = Math.max(2, finite(c.radius, 3) * view.scale);\n const g = ctx.createRadialGradient(p.x, p.y, 0, p.x, p.y, r);\n g.addColorStop(0, 'rgba(25,20,15,0.6)');\n g.addColorStop(0.7, 'rgba(45,35,25,0.35)');\n g.addColorStop(1, 'rgba(45,35,25,0)');\n ctx.fillStyle = g;\n ctx.beginPath(); ctx.arc(p.x, p.y, r, 0, Math.PI * 2); ctx.fill();\n });\n }\n\n function drawPreview(view) {\n if (!preview || preview.length < 2) return;\n let top = 1;\n const alts = preview.map((p) => {\n const alt = Math.max(0, p.y - groundAt(p.x, p.z));\n top = Math.max(top, alt);\n return alt;\n });\n ctx.save();\n ctx.setLineDash([5, 4]);\n ctx.lineWidth = 2;\n ctx.lineCap = 'round';\n for (let i = 1; i < preview.length; i += 1) {\n const a = worldToCanvas(preview[i - 1].x, preview[i - 1].z, view);\n const b = worldToCanvas(preview[i].x, preview[i].z, view);\n ctx.strokeStyle = altitudeColor(alts[i] / top);\n ctx.beginPath(); ctx.moveTo(a.x, a.y); ctx.lineTo(b.x, b.y); ctx.stroke();\n }\n ctx.setLineDash([]);\n const end = worldToCanvas(preview[preview.length - 1].x, preview[preview.length - 1].z, view);\n ctx.strokeStyle = 'rgba(255,255,255,0.9)';\n ctx.lineWidth = 1.5;\n ctx.beginPath(); ctx.arc(end.x, end.y, 5, 0, Math.PI * 2); ctx.stroke();\n ctx.beginPath(); ctx.moveTo(end.x - 8, end.y); ctx.lineTo(end.x + 8, end.y); ctx.moveTo(end.x, end.y - 8); ctx.lineTo(end.x, end.y + 8); ctx.stroke();\n ctx.restore();\n }\n\n function drawTank(tank, view) {\n if (!Number.isFinite(tank?.x) || !Number.isFinite(tank?.z)) return;\n const pose = poseOf(tank.id) || tank;\n const active = String(tank.id) === String(world.activeId);\n const dead = charred.has(String(tank.id)) || tank.alive === false;\n const index = world.tanks.indexOf(tank);\n const palette = dead ? CHARRED : TANK_COLORS[tank.color] || (index === 1 ? TANK_COLORS.red : TANK_COLORS.green);\n const yaw = active && aim && !poseOf(tank.id) && Number.isFinite(aim.yaw) ? aim.yaw : finite(pose.yaw, finite(pose.hullYaw));\n const p = worldToCanvas(pose.x, pose.z, view);\n const len = Math.max(14, HULL_LENGTH * view.scale);\n const wid = Math.max(9, HULL_WIDTH * view.scale);\n\n if (active && !dead) {\n ctx.strokeStyle = 'rgba(255,255,255,0.75)';\n ctx.setLineDash([3, 3]);\n ctx.lineWidth = 1.5;\n ctx.beginPath(); ctx.arc(p.x, p.y, len * 0.85, 0, Math.PI * 2); ctx.stroke();\n ctx.setLineDash([]);\n }\n if (celebration && String(celebration.id) === String(tank.id)) {\n ctx.strokeStyle = 'rgba(255,214,90,0.9)';\n ctx.lineWidth = 3;\n ctx.beginPath(); ctx.arc(p.x, p.y, len, 0, Math.PI * 2); ctx.stroke();\n }\n\n ctx.save();\n ctx.translate(p.x, p.y);\n ctx.save();\n ctx.rotate(headingToCanvasAngle(finite(pose.hullYaw)));\n ctx.fillStyle = 'rgba(0,0,0,0.35)';\n roundRect(-len / 2 + 2, -wid / 2 + 2, len, wid, 3); ctx.fill();\n ctx.fillStyle = palette.dark;\n roundRect(-len / 2, -wid / 2, len, wid, 3); ctx.fill();\n ctx.fillStyle = palette.hull;\n roundRect(-len / 2 + 1, -wid / 2 + wid * 0.2, len - 2, wid * 0.6, 2); ctx.fill();\n ctx.restore();\n ctx.rotate(headingToCanvasAngle(yaw));\n ctx.strokeStyle = palette.dark;\n ctx.lineWidth = Math.max(2, wid * 0.22);\n ctx.lineCap = 'round';\n ctx.beginPath(); ctx.moveTo(0, 0); ctx.lineTo(len * 0.85, 0); ctx.stroke();\n ctx.fillStyle = palette.turret;\n ctx.beginPath(); ctx.arc(0, 0, wid * 0.36, 0, Math.PI * 2); ctx.fill();\n ctx.strokeStyle = 'rgba(0,0,0,0.5)';\n ctx.lineWidth = 1;\n ctx.stroke();\n ctx.restore();\n\n const maxHp = finite(tank.maxHp, finite(world.maxHp, DEFAULT_MAX_HP)) || DEFAULT_MAX_HP;\n const ratio = clamp(finite(tank.hp, maxHp) / maxHp, 0, 1);\n const barW = Math.max(24, len * 1.1);\n const barY = p.y - len * 0.9 - 6;\n ctx.fillStyle = 'rgba(0,0,0,0.6)';\n ctx.fillRect(p.x - barW / 2 - 1, barY - 1, barW + 2, 6);\n ctx.fillStyle = dead ? '#555' : ratio > 0.5 ? '#6bd35b' : ratio > 0.25 ? '#f2c14e' : '#f05a4f';\n ctx.fillRect(p.x - barW / 2, barY, barW * ratio, 4);\n }\n\n function drawProjectile(view, { samples, f }) {\n const head = samplePoint(samples, f);\n if (!head) return;\n // Trail: recent samples, fading.\n const from = Math.max(0, Math.floor(f) - 18);\n ctx.lineCap = 'round';\n let prev = null;\n for (let i = from; i <= Math.floor(f); i += 1) {\n const point = samplePoint(samples, i);\n const c = worldToCanvas(point.x, point.z, view);\n if (prev) {\n ctx.strokeStyle = `rgba(255,240,200,${((i - from) / 19) * 0.7})`;\n ctx.lineWidth = 1.5;\n ctx.beginPath(); ctx.moveTo(prev.x, prev.y); ctx.lineTo(c.x, c.y); ctx.stroke();\n }\n prev = c;\n }\n const alt = Math.max(0, head.y - groundAt(head.x, head.z));\n const p = worldToCanvas(head.x, head.z, view);\n const offset = Math.min(alt * 0.35 * view.scale, 40);\n ctx.fillStyle = 'rgba(0,0,0,0.35)';\n ctx.beginPath(); ctx.ellipse(p.x + offset, p.y + offset, 3, 2, 0, 0, Math.PI * 2); ctx.fill();\n if (prev) { ctx.strokeStyle = 'rgba(255,240,200,0.7)'; ctx.beginPath(); ctx.moveTo(prev.x, prev.y); ctx.lineTo(p.x, p.y); ctx.stroke(); }\n const r = clamp(2.5 + alt * 0.06, 2.5, 7);\n ctx.fillStyle = '#fff3c4';\n ctx.beginPath(); ctx.arc(p.x, p.y, r, 0, Math.PI * 2); ctx.fill();\n ctx.strokeStyle = '#3a2a12';\n ctx.lineWidth = 1;\n ctx.stroke();\n }\n\n function drawEffects(view) {\n flashes.forEach((f) => {\n const p = worldToCanvas(f.x, f.z, view);\n const r = Math.max(4, f.r * view.scale);\n const g = ctx.createRadialGradient(p.x, p.y, 0, p.x, p.y, r);\n g.addColorStop(0, `rgba(255,250,220,${f.life / f.max})`);\n g.addColorStop(1, 'rgba(255,160,60,0)');\n ctx.fillStyle = g;\n ctx.beginPath(); ctx.arc(p.x, p.y, r, 0, Math.PI * 2); ctx.fill();\n });\n smoke.forEach((s) => {\n const p = worldToCanvas(s.x, s.z, view);\n ctx.fillStyle = `rgba(60,58,55,${(s.life / s.max) * 0.45})`;\n ctx.beginPath(); ctx.arc(p.x, p.y, Math.max(2, s.r * view.scale), 0, Math.PI * 2); ctx.fill();\n });\n rings.forEach((r) => {\n const t = 1 - r.life / r.max;\n const p = worldToCanvas(r.x, r.z, view);\n ctx.strokeStyle = `rgba(${r.color},${1 - t})`;\n ctx.lineWidth = 2 + (1 - t) * 2;\n ctx.beginPath(); ctx.arc(p.x, p.y, Math.max(1, (r.r0 + (r.r1 - r.r0) * t) * view.scale), 0, Math.PI * 2); ctx.stroke();\n });\n particles.forEach((q) => {\n const p = worldToCanvas(q.x, q.z, view);\n ctx.globalAlpha = clamp(q.life / q.max, 0, 1);\n ctx.fillStyle = q.color;\n const s = Math.max(1.5, q.size * view.scale);\n ctx.fillRect(p.x - s / 2, p.y - s / 2, s, s);\n });\n ctx.globalAlpha = 1;\n ctx.textAlign = 'center';\n ctx.font = 'bold 14px system-ui, sans-serif';\n floats.forEach((f) => {\n const t = 1 - f.life / f.max;\n const p = worldToCanvas(f.x, f.z, view);\n ctx.globalAlpha = clamp(1.4 - t * 1.4, 0, 1);\n ctx.lineWidth = 3;\n ctx.strokeStyle = 'rgba(0,0,0,0.7)';\n ctx.strokeText(f.text, p.x, p.y - 18 - t * 26);\n ctx.fillStyle = f.color;\n ctx.fillText(f.text, p.x, p.y - 18 - t * 26);\n });\n ctx.globalAlpha = 1;\n }\n\n function drawHud() {\n const wind = world.wind || {};\n const wx = finite(wind.x);\n const wz = finite(wind.z);\n const strength = Math.hypot(wx, wz);\n const cx = width - 34;\n const cy = 34;\n ctx.fillStyle = 'rgba(0,0,0,0.45)';\n ctx.beginPath(); ctx.arc(cx, cy, 24, 0, Math.PI * 2); ctx.fill();\n ctx.strokeStyle = '#e8f1ff';\n ctx.fillStyle = '#e8f1ff';\n ctx.lineWidth = 2;\n if (strength > 0.01) {\n const len = clamp(6 + strength * 2, 8, 18);\n const ux = wx / strength;\n const uz = wz / strength;\n ctx.beginPath(); ctx.moveTo(cx - ux * len, cy - uz * len); ctx.lineTo(cx + ux * len, cy + uz * len); ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(cx + ux * (len + 4), cy + uz * (len + 4));\n ctx.lineTo(cx + ux * len - uz * 5, cy + uz * len + ux * 5);\n ctx.lineTo(cx + ux * len + uz * 5, cy + uz * len - ux * 5);\n ctx.closePath(); ctx.fill();\n } else {\n ctx.beginPath(); ctx.arc(cx, cy, 3, 0, Math.PI * 2); ctx.fill();\n }\n ctx.font = '11px system-ui, sans-serif';\n ctx.textAlign = 'center';\n ctx.fillText(`${strength.toFixed(1)} m/s`, cx, cy + 38);\n\n if (aim && (Number.isFinite(aim.pitch) || Number.isFinite(aim.power))) {\n ctx.textAlign = 'left';\n const parts = [];\n if (Number.isFinite(aim.pitch)) parts.push(`${Math.round(aim.pitch)}°`);\n if (Number.isFinite(aim.power)) parts.push(`${Math.round(aim.power)}%`);\n const text = parts.join(' · ');\n ctx.fillStyle = 'rgba(0,0,0,0.45)';\n ctx.fillRect(8, 8, ctx.measureText(text).width + 12, 20);\n ctx.fillStyle = '#e8f1ff';\n ctx.fillText(text, 14, 22);\n }\n }\n\n function draw() {\n if (!ctx || !width || !height || disposed) return;\n try {\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.fillStyle = '#18211a';\n ctx.fillRect(0, 0, width, height);\n if (!world) return;\n const view = viewFor();\n const corner = worldToCanvas(view.minX, view.minZ, view);\n const span = view.size * view.scale;\n const image = terrainImage();\n if (image) {\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(image, corner.x, corner.y, span, span);\n } else {\n ctx.fillStyle = '#4c7a3e';\n ctx.fillRect(corner.x, corner.y, span, span);\n }\n ctx.strokeStyle = 'rgba(0,0,0,0.5)';\n ctx.lineWidth = 1;\n ctx.strokeRect(corner.x, corner.y, span, span);\n drawCraters(view);\n drawObstacles(view);\n drawDecor(view);\n drawPreview(view);\n (world.tanks || []).forEach((tank) => drawTank(tank, view));\n projectiles.forEach((flight) => drawProjectile(view, flight));\n drawEffects(view);\n drawHud();\n } catch { /* never throw from render */ }\n }\n\n // -- turn playback\n async function runTurn(turn) {\n if (disposed || !turn) return;\n const id = turn.tankId;\n const tank = findTank(id);\n const path = (turn.movePath || []).filter((p) => p && Number.isFinite(p.x) && Number.isFinite(p.z));\n const start = tank || path[0] || { x: 0, z: 0 };\n const pose = {\n x: start.x, y: finite(start.y), z: start.z,\n hullYaw: finite(tank?.hullYaw), yaw: finite(tank?.yaw, finite(tank?.hullYaw)), pitch: finite(tank?.pitch),\n };\n overrides.set(String(id), pose);\n\n if (path.length > 1 && pathLength(path) > 0.05) {\n const length = pathLength(path);\n let dust = 0;\n // Same cue order as the 3D scene: ignition, a beat, then the tracks.\n emit('engine_start', { tankId: id });\n await wait(reducedMotion ? 50 : 350);\n emit('move_start', { tankId: id });\n await wait(clamp((length / MOVE_SPEED) * 1000, 400, 3500), (t, dt) => {\n const p = pathPointAt(path, easeInOut(t));\n if (!p) return;\n if (p.heading != null) {\n pose.yaw += angleDelta(pose.hullYaw, p.heading); // turret turns with the hull\n pose.hullYaw = p.heading;\n }\n pose.x = p.x; pose.y = p.y; pose.z = p.z;\n dust += dt || 0;\n if (dust > 110 && !reducedMotion) {\n dust = 0;\n const back = headingVector(pose.hullYaw);\n burst(p.x - back.x * 3, p.z - back.z * 3, 1, ['#8c7a5c'], 2);\n }\n });\n emit('move_end', { tankId: id });\n if (disposed) return;\n }\n\n const targetYaw = finite(turn.yaw, pose.yaw);\n const delta = Math.abs(angleDelta(pose.yaw, targetYaw));\n if (delta > 1) {\n const from = pose.yaw;\n emit('turret_start', { tankId: id });\n await wait(clamp((delta / TURRET_SPEED) * 1000, 200, 1500), (t) => { pose.yaw = lerpAngle(from, targetYaw, easeInOut(t)); });\n emit('turret_end', { tankId: id });\n if (disposed) return;\n }\n pose.yaw = targetYaw;\n pose.pitch = finite(turn.pitch, pose.pitch);\n\n const damage = turn.damage || {};\n const shownDamage = new Set();\n const pendingCraters = [...(turn.craters || [])].filter((c) => Number.isFinite(c?.x) && Number.isFinite(c?.z));\n const dir = headingVector(pose.yaw);\n const muzzle = { x: pose.x + dir.x * HULL_LENGTH * 0.85, z: pose.z + dir.z * HULL_LENGTH * 0.85 };\n const timeline = shotTimeline(turn.shots);\n const flights = timeline.map((entry) => ({ ...entry, state: 'waiting', f: 0 }));\n\n const launch = (flight) => {\n flight.state = 'flying';\n if (!flight.bomblet) {\n emit('fire', { tankId: id, shot: flight.index });\n flashes.push({ x: muzzle.x, z: muzzle.z, r: 2.5, life: 160, max: 160 });\n smoke.push({ x: muzzle.x, z: muzzle.z, r: 1, life: 900, max: 900 });\n if (flight.count >= 2) emit('projectile_start', { tankId: id, shot: flight.index });\n }\n };\n const land = (flight) => {\n flight.state = 'done';\n const { shot, index } = flight;\n const tail = flight.count ? samplePoint(shot.samples, flight.count - 1) : muzzle;\n const impact = shot.impact && Number.isFinite(shot.impact.x) ? shot.impact : { ...tail, kind: 'terrain' };\n emit('impact', { kind: impact.kind, tankId: impact.tankId, shot: index });\n if (impact.kind === 'split') {\n // Cluster carrier apex: small pop, no blast.\n flashes.push({ x: impact.x, z: impact.z, r: 1.5, life: 140, max: 140 });\n burst(impact.x, impact.z, 4, ['#ffe9a8', '#cfcfcf'], 6);\n return;\n }\n if (impact.kind === 'out') return;\n explode(impact.x, impact.z, shot.radius, false);\n if (impact.kind === 'tank' && impact.tankId != null) {\n emit('tank_hit', { tankId: impact.tankId, shot: index });\n const amount = damage[impact.tankId];\n if (Number.isFinite(amount) && amount > 0 && !shownDamage.has(String(impact.tankId))) {\n shownDamage.add(String(impact.tankId));\n const target = poseOf(impact.tankId) || findTank(impact.tankId) || impact;\n floats.push({ x: target.x, z: target.z, text: `-${Math.round(amount)}`, color: '#ff6b5a', life: 1400, max: 1400 });\n }\n }\n for (let c = pendingCraters.length - 1; c >= 0; c -= 1) {\n const crater = pendingCraters[c];\n if (Math.hypot(crater.x - impact.x, crater.z - impact.z) <= finite(crater.radius, 3) + 1.5) craters.push(...pendingCraters.splice(c, 1));\n }\n };\n\n if (flights.length) {\n const total = Math.max(...flights.map((flight) => flight.endMs)) + 380;\n await wait(total, (t) => {\n const now = t * total;\n flights.forEach((flight) => {\n if (flight.state === 'waiting' && now >= flight.startMs) launch(flight);\n if (flight.state === 'flying') {\n flight.f = clamp((now - flight.startMs) / SAMPLE_MS, 0, Math.max(0, flight.count - 1));\n if (now >= flight.endMs) land(flight);\n }\n });\n projectiles = flights.filter((flight) => flight.state === 'flying' && flight.count >= 2)\n .map((flight) => ({ samples: flight.shot.samples, f: flight.f }));\n });\n projectiles = [];\n if (disposed) return;\n }\n craters.push(...pendingCraters);\n\n Object.entries(damage).forEach(([tankId, amount]) => {\n if (shownDamage.has(tankId) || !Number.isFinite(amount) || amount <= 0) return;\n const target = poseOf(tankId) || findTank(tankId);\n if (target) floats.push({ x: target.x, z: target.z, text: `-${Math.round(amount)}`, color: '#ff6b5a', life: 1400, max: 1400 });\n });\n\n const destroyed = turn.destroyed || [];\n destroyed.forEach((tankId) => {\n const target = poseOf(tankId) || findTank(tankId);\n emit('big_explosion', { tankId });\n if (target) explode(target.x, target.z, 6, true);\n emit('destroyed', { tankId });\n charred.add(String(tankId));\n });\n if (destroyed.length) {\n let puff = 0;\n await wait(1600, (t, dt) => {\n puff += dt || 0;\n if (puff < 140) return;\n puff = 0;\n destroyed.forEach((tankId) => {\n const target = poseOf(tankId) || findTank(tankId);\n if (target) smoke.push({ x: target.x + (Math.random() - 0.5) * 2, z: target.z + (Math.random() - 0.5) * 2, r: 1.2, life: 1600, max: 1600 });\n });\n });\n } else {\n await wait(500);\n }\n if (disposed) return;\n if (turn.world) applyWorld(turn.world, true);\n overrides.delete(String(id));\n requestFrame();\n draw();\n }\n\n function applyWorld(next, keepCraters) {\n if (!next) return;\n if (!keepCraters && world && next.heights !== world.heights) craters = [];\n world = next;\n (next.tanks || []).forEach((tank) => { if (tank.alive !== false && !(Number(tank.hp) <= 0)) charred.delete(String(tank.id)); });\n }\n\n // -- sizing / lifecycle\n function resize() {\n if (!canvas || disposed) return;\n const rect = container?.getBoundingClientRect?.() || { width: container?.clientWidth || 0, height: container?.clientHeight || 0 };\n width = Math.max(0, Math.floor(rect.width));\n height = Math.max(0, Math.floor(rect.height));\n dpr = Math.min(tuning().dpr, win?.devicePixelRatio || 1);\n canvas.width = Math.max(1, Math.round(width * dpr));\n canvas.height = Math.max(1, Math.round(height * dpr));\n draw();\n }\n\n const onVisibility = () => {\n if (hidden()) {\n if (raf && win?.cancelAnimationFrame) win.cancelAnimationFrame(raf);\n raf = 0;\n last = 0;\n } else {\n requestFrame();\n }\n };\n doc?.addEventListener('visibilitychange', onVisibility);\n let observer = null;\n if (win?.ResizeObserver && container) {\n observer = new win.ResizeObserver(() => resize());\n observer.observe(container);\n } else {\n win?.addEventListener('resize', resize);\n }\n resize();\n\n return {\n setWorld(next) {\n applyWorld(next, false);\n draw();\n },\n setAim(next) {\n aim = next ? { yaw: next.yaw, pitch: next.pitch, power: next.power } : null;\n draw();\n },\n setPreview(points) {\n preview = normalizePoints(points);\n draw();\n },\n playTurn(turn) {\n const run = queue.then(() => runTurn(turn)).catch(() => {});\n queue = run;\n return run;\n },\n setCameraMode(mode) {\n cameraMode = mode || 'overview';\n draw();\n },\n setQuality(next) {\n if (!QUALITY[next] || next === quality) return;\n quality = next;\n resize();\n },\n celebrate(winnerId) {\n celebration = winnerId == null ? null : { id: winnerId, left: 3000, next: 0 };\n if (celebration) requestFrame();\n draw();\n },\n resize,\n dispose() {\n if (disposed) return;\n disposed = true;\n if (raf && win?.cancelAnimationFrame) win.cancelAnimationFrame(raf);\n raf = 0;\n anims.forEach((anim) => anim.resolve());\n anims.clear();\n observer?.disconnect();\n win?.removeEventListener('resize', resize);\n doc?.removeEventListener('visibilitychange', onVisibility);\n particles = []; rings = []; flashes = []; smoke = []; floats = []; craters = [];\n projectiles = [];\n terrain = { heights: null, grid: 0, factor: 0, canvas: null };\n overrides.clear();\n try { canvas?.remove(); } catch { /* already detached */ }\n ctx = null;\n },\n };\n}\n\nexport default createTankScene2d;\n","// Pure sound choreography for Tanks (no audio, no DOM): maps scene events to\n// one-shot plays and loop start/stop actions.\n\nexport const TANKS_LOOPS = ['engine_loop', 'tracks_loop', 'turret_loop'];\n\nconst play = (name) => ({ name, action: 'play' });\nconst loopStart = (name) => ({ name, action: 'loop_start' });\nconst loopStop = (name) => ({ name, action: 'loop_stop' });\n\nconst IMPACT_SOUNDS = { terrain: 'terrain_impact', obstacle: 'terrain_impact', ground: 'terrain_impact' };\n\n/** Scene onEvent ({ type, ... } or a bare type string) → ordered cues. */\nexport function sceneEventToCues(event) {\n const type = typeof event === 'string' ? event : event?.type;\n switch (type) {\n case 'engine_start': return [play('engine_start')];\n case 'move_start': return [loopStart('engine_loop'), loopStart('tracks_loop')];\n case 'move_end': return [loopStop('tracks_loop'), loopStop('engine_loop')];\n case 'turret_start': return [loopStart('turret_loop')];\n case 'turret_end': return [loopStop('turret_loop')];\n case 'fire': return [play('cannon_fire')];\n case 'projectile_start': return [play('projectile_whistle')];\n case 'impact': {\n const name = IMPACT_SOUNDS[event?.kind];\n return name ? [play(name)] : [];\n }\n case 'tank_hit': return [play('tank_hit')];\n case 'big_explosion': return [play('big_explosion')];\n case 'destroyed': return [play('tank_destroyed')];\n default: return [];\n }\n}\n\n/** 'victory' | 'defeat' → cues; anything else (draw, unknown) stays silent. */\nexport function outcomeToCues(result) {\n if (result === 'victory' || result === 'defeat') return [...TANKS_LOOPS.map(loopStop), play(result)];\n return [];\n}\n","// Tanks (3D) sound layer.\n//\n// Expected files (host serves them from <assets>/sounds/tanks/, i.e. the\n// package's assets/sounds/tanks/), each as .ogg and .mp3: OGG Vorbis is used where\n// the browser supports it, MP3 otherwise. Only names listed in `available` are\n// fetched, so sounds not delivered (the optional UI cues) cost no requests and never error.\n// Format: 44.1 kHz, mono. True peak <= -1 dBTP; loops cut at zero crossings so\n// they repeat without clicks.\n//\n// name duration loudness\n// engine_start 1.5-2.5 s -20 LUFS\n// engine_loop 2-4 s (loop) -24 LUFS\n// tracks_loop 1-2 s (loop) -24 LUFS\n// turret_loop 1-2 s (loop) -26 LUFS\n// cannon_fire 1.5-2.5 s -16 LUFS\n// projectile_whistle 1.5-3 s -22 LUFS\n// terrain_impact 1-2 s -17 LUFS\n// tank_hit 1-2 s -16 LUFS\n// big_explosion 2.5-4 s -14 LUFS\n// tank_destroyed 3-5 s -18 LUFS\n// victory 3-4 s -18 LUFS\n// defeat 2.5-4 s -19 LUFS\n// optional: turn_start, your_turn, timer_warning (short UI cues, ~-22 LUFS)\n//\n// Gating: the games' shared mute/volume (connect4Sounds) applies through the\n// manager; the GLOBAL chat mute (isSoundEnabled) and a hidden page silence\n// every play and stop all loops.\n\nimport { createSoundManager } from '../../../audio/createSoundManager.js';\nimport { connect4Sounds } from '../../connect4/connect4Sounds.js';\nimport { chatSoundUrl } from '../../../assets/chatAssets.js';\nimport { isSoundEnabled, subscribeSoundPreference } from '../../../notifications/chatSounds.js';\nimport { outcomeToCues, sceneEventToCues, TANKS_LOOPS } from './cues.js';\n\nexport { outcomeToCues, sceneEventToCues } from './cues.js';\n\nexport const TANKS_SOUND_NAMES = [\n 'engine_start', 'engine_loop', 'tracks_loop', 'turret_loop', 'cannon_fire', 'projectile_whistle',\n 'terrain_impact', 'tank_hit', 'big_explosion', 'tank_destroyed', 'victory', 'defeat',\n 'turn_start', 'your_turn', 'timer_warning',\n];\n\n// Relative mix, set from the delivered files' measured loudness (blasts ~-16 LUFS,\n// impacts/stingers ~-20, loops -23..-25) so weapons lead and the engine sits under them.\nconst LEVELS = {\n engine_start: 0.6, engine_loop: 0.45, tracks_loop: 0.5, turret_loop: 0.5, cannon_fire: 0.8,\n projectile_whistle: 0.6, terrain_impact: 0.85, tank_hit: 0.85, big_explosion: 0.9, tank_destroyed: 1,\n victory: 0.8, defeat: 0.8, turn_start: 0.35, your_turn: 0.4, timer_warning: 0.35,\n};\n\n// Sounds shipped in assets/sounds/tanks/ (the UI cues are optional and not delivered).\nexport const DELIVERED_TANKS_SOUNDS = [\n 'engine_start', 'engine_loop', 'tracks_loop', 'turret_loop', 'cannon_fire', 'projectile_whistle',\n 'terrain_impact', 'tank_hit', 'big_explosion', 'tank_destroyed', 'victory', 'defeat',\n];\n// The same sound within this window (cluster bomblets, impact + blast in one frame) plays once.\nconst RETRIGGER_MS = 120;\n// Short ramps so loops follow the animation without clicks (defaults are ambient-slow).\nconst LOOP_RAMPS = {\n engine_loop: { fadeIn: 0.5, fadeOut: 0.35 },\n tracks_loop: { fadeIn: 0.12, fadeOut: 0.2 },\n turret_loop: { fadeIn: 0.06, fadeOut: 0.12 },\n};\n// MP3 decoders pad both ends; trimming that keeps the Safari loops gapless.\nconst MP3_LOOP_TRIM = 0.03;\n// tank_destroyed is the cinematic destruction sound: big_explosion yields to it.\nconst YIELDS_TO = { tank_destroyed: { name: 'big_explosion', ms: 1500 } };\n\nconst supportsOgg = () => {\n try {\n return typeof Audio !== 'undefined' && new Audio().canPlayType('audio/ogg; codecs=\"vorbis\"') !== '';\n } catch {\n return false;\n }\n};\n\n// Shared by reference with the manager, so configure() still applies to files\n// not fetched yet.\nconst files = {};\nconst fileFor = (name, extension) => `${name}.${String(extension).replace(/^\\./, '')}`;\n\nlet configured = false;\nlet format = 'ogg';\n/**\n * Call before first use to change the format ('auto' | 'ogg' | 'mp3'), the delivered\n * names, or override files ({ name: 'file.ext' | null }).\n */\nexport function configureTanksSounds({ extension = 'auto', available = DELIVERED_TANKS_SOUNDS, files: overrides } = {}) {\n configured = true;\n format = extension === 'auto' ? (supportsOgg() ? 'ogg' : 'mp3') : extension;\n TANKS_SOUND_NAMES.forEach((name) => {\n if (available.includes(name)) files[name] = fileFor(name, format);\n else delete files[name];\n });\n Object.entries(overrides || {}).forEach(([name, file]) => {\n if (file) files[name] = String(file);\n else delete files[name];\n });\n}\n\nlet manager = null;\nexport function getTanksSoundManager() {\n if (!configured) configureTanksSounds();\n if (!manager) {\n manager = createSoundManager({\n id: 'tanks',\n baseUrl: () => chatSoundUrl('tanks'), // resolved lazily at fetch time\n settingsFrom: connect4Sounds, // one mute/volume preference for every chat game\n sounds: files,\n levels: LEVELS,\n });\n }\n return manager;\n}\n\nconst hidden = () => typeof document !== 'undefined' && document.hidden;\nconst canPlay = () => isSoundEnabled() && !hidden();\n\n// Loops the game currently wants; they only sound while canPlay().\nconst wantedLoops = new Set();\nconst syncLoops = () => {\n if (!manager) return;\n const allowed = canPlay();\n new Set([...TANKS_LOOPS, ...wantedLoops]).forEach((name) => {\n if (allowed && wantedLoops.has(name)) manager.startLoop(name, { ...LOOP_RAMPS[name], trim: format === 'mp3' ? MP3_LOOP_TRIM : 0 });\n else manager.stopLoop(name);\n });\n};\n\nlet started = false;\nlet unsubscribePreference = null;\n\n/** Idempotent: starts the manager, preloads files and links mute/visibility. */\nexport function startTanksSounds() {\n const sounds = getTanksSoundManager();\n sounds.preload();\n if (started) return;\n started = true;\n unsubscribePreference = subscribeSoundPreference(syncLoops);\n if (typeof document !== 'undefined') document.addEventListener('visibilitychange', syncLoops);\n}\n\n/** Stops loops and unlinks listeners (the manager restarts on next use). */\nexport function disposeTanksSounds() {\n wantedLoops.clear();\n syncLoops();\n if (unsubscribePreference) { unsubscribePreference(); unsubscribePreference = null; }\n if (typeof document !== 'undefined') document.removeEventListener('visibilitychange', syncLoops);\n started = false;\n manager?.dispose();\n}\n\nconst lastPlayed = new Map();\nconst suppressedUntil = new Map();\n\n/** Silences `name` for `ms` (e.g. a turn whose destruction already has its own sound). */\nexport function suppressTanksCue(name, ms) {\n suppressedUntil.set(name, Math.max(suppressedUntil.get(name) ?? 0, Date.now() + ms));\n}\n\n/** One-shot cue, deduplicated by key when given. Returns true when scheduled. */\nexport function playTanksCue(name, key) {\n if (!configured) configureTanksSounds();\n if (Date.now() < (suppressedUntil.get(name) ?? 0)) return false;\n if (!canPlay()) {\n // Keep keyed cues from replaying once the page/sound comes back.\n if (key != null) getTanksSoundManager().markPlayed(name, key);\n return false;\n }\n const now = Date.now();\n if (now - (lastPlayed.get(name) ?? 0) < RETRIGGER_MS) return false;\n const played = getTanksSoundManager().play(name, key != null ? { key } : undefined);\n if (played) {\n lastPlayed.set(name, now);\n if (YIELDS_TO[name]) suppressTanksCue(YIELDS_TO[name].name, YIELDS_TO[name].ms);\n }\n return played;\n}\n\nexport function startTanksLoop(name) {\n wantedLoops.add(name);\n getTanksSoundManager();\n syncLoops();\n}\n\nexport function stopTanksLoop(name) {\n wantedLoops.delete(name);\n manager?.stopLoop(name);\n}\n\nexport function stopAllTanksLoops() {\n const names = [...TANKS_LOOPS, ...wantedLoops];\n wantedLoops.clear();\n names.forEach((name) => manager?.stopLoop(name));\n}\n\nconst runCues = (cues, key) => cues.forEach(({ name, action }) => {\n if (action === 'loop_start') startTanksLoop(name);\n else if (action === 'loop_stop') stopTanksLoop(name);\n else playTanksCue(name, key != null ? `${key}:${name}` : undefined);\n});\n\n/** Maps a scene onEvent ({ type, kind?, tankId? }) to sounds. `key` dedupes one-shots (e.g. turn id). */\nexport function handleSceneEvent(event, key) {\n const suffix = event?.tankId != null ? `:${event.tankId}` : '';\n runCues(sceneEventToCues(event), key != null ? `${key}${suffix}` : undefined);\n}\n\n/** 'victory' | 'defeat': stops every loop and plays the outcome once per key. */\nexport function playOutcome(result, key) {\n runCues(outcomeToCues(result), key);\n}\n","/* eslint-disable react/prop-types */\nimport { memo, useCallback, useContext, useEffect, useRef, useState, useSyncExternalStore } from 'react';\nimport { ChevronDown, Crosshair, Flag, Layers, RotateCcw, Swords, Video, Wind, X } from 'lucide-react';\nimport { useChatConnectionStatus } from '../../core/connection/connectionStore.js';\nimport { ChatContext } from '../../provider/ChatContext.js';\nimport useChatGames from '../shared/useChatGames.js';\nimport { getGameStatus, isTerminalGame, sameUser } from '../shared/gameStatus.js';\nimport GameSoundControls from '../shared/GameSoundControls.jsx';\nimport { hasWebGL } from '../battleship/webglSupport.js';\nimport { canAct } from './net/session.js';\nimport { AMMO, LIMITS } from './logic/index.js';\nimport { worldFor, turnFor, previewFor, yawToward, TEAM_COLORS } from './view.js';\nimport { createTankScene2d } from './fallback/createTankScene2d.js';\nimport { getTanksSoundManager, startTanksSounds, handleSceneEvent, playOutcome, stopAllTanksLoops, suppressTanksCue } from './sound/tanksSounds.js';\nimport '../connect4/games.css';\nimport './tanks.css';\n\nconst TURN_SECONDS = 60;\nconst INVITE_HINT_MS = 60000;\nconst AMMO_LABELS = { standard: 'Estándar', heavy: 'Pesada', cluster: 'Racimo' };\nconst clamp = (value, [min, max]) => Math.max(min, Math.min(max, Math.round(value)));\nconst wrapYaw = (value) => ((Math.round(value) % 360) + 360) % 360;\nconst reducedMotion = () => typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n// Connected per the provider's transport (each detached window owns its socket) or\n// the shared connection store, whichever the host keeps up to date.\nfunction useConnected() {\n const transport = useContext(ChatContext)?.transport ?? null;\n const subscribe = useCallback((notify) => {\n const unsubscribe = transport?.onStatus?.(notify);\n return typeof unsubscribe === 'function' ? unsubscribe : () => {};\n }, [transport]);\n const status = useSyncExternalStore(subscribe, () => transport?.getStatus?.() ?? null, () => null);\n return useChatConnectionStatus() === 'connected' || status === 'connected';\n}\n\nfunction call(name, ...args) {\n return Promise.resolve(useChatGames.getState()[name]?.(...args)).catch((error) => { throw error; });\n}\n\nfunction SyncControls({ sync, connected, onResync, onAdoptOffer }) {\n if (sync?.status === 'requesting') return <div className=\"chat-game-sync\" role=\"status\">Sincronizando partida…</div>;\n return <div className=\"chat-game-sync\" role=\"alert\">\n {sync?.message && <span>{sync.message}</span>}\n {sync?.status === 'incompatible' && sync.offer && <button type=\"button\" className=\"chat-game-action chat-game-action--primary\" disabled={!connected} onClick={onAdoptOffer}>Usar estado del anfitrión</button>}\n <button type=\"button\" className=\"chat-game-action\" disabled={!connected} onClick={onResync}>Reintentar sincronización</button>\n </div>;\n}\n\nfunction HpBar({ label, hp, color, active }) {\n return <div className={`tk-hp tk-hp--${color}${active ? ' is-active' : ''}`}>\n <span className=\"tk-hp-label\">{label}</span>\n <span className=\"tk-hp-track\" role=\"meter\" aria-valuemin={0} aria-valuemax={100} aria-valuenow={hp} aria-label={`Vida de ${label}`}>\n <span className=\"tk-hp-fill\" style={{ width: `${hp}%` }} />\n </span>\n <strong>{hp}</strong>\n </div>;\n}\n\n/** Scene lifecycle: lazily loads the 3D scene, falling back to the 2D canvas. */\nfunction useTankScene(stageRef, enabled, prefer2d, onSceneEvent) {\n const sceneRef = useRef(null);\n const [mode, setMode] = useState('loading');\n const [forced2d, setForced2d] = useState(false);\n const eventRef = useRef(onSceneEvent);\n eventRef.current = onSceneEvent;\n const use2d = prefer2d || forced2d;\n useEffect(() => {\n const host = stageRef.current;\n if (!enabled || !host) return undefined;\n let disposed = false;\n let scene = null;\n const options = {\n reducedMotion: reducedMotion(),\n onEvent: (event) => {\n if (event?.type === 'context_lost') { setForced2d(true); return; }\n eventRef.current?.(event);\n },\n };\n const ready = (next, kind) => { scene = next; sceneRef.current = next; setMode(kind); };\n const mount2d = () => {\n try { ready(createTankScene2d(host, options), '2d'); } catch { setMode('none'); }\n };\n setMode('loading');\n if (use2d || !hasWebGL()) mount2d();\n else {\n import('./scene/createTankScene.js')\n .then(({ createTankScene }) => {\n if (disposed) return;\n try { ready(createTankScene(host, options), '3d'); } catch { mount2d(); }\n })\n .catch(() => { if (!disposed) mount2d(); });\n }\n return () => {\n disposed = true;\n try { scene?.dispose(); } catch { /* already released */ }\n sceneRef.current = null;\n stopAllTanksLoops();\n };\n }, [stageRef, enabled, use2d]);\n return { sceneRef, mode, use2d, setForced2d };\n}\n\nfunction TanksHistoryCard({ game, currentUserId }) {\n const hp = game.logic?.tanks.map((tank) => tank.hp) ?? [100, 100];\n return <section className=\"chat-game-card chat-game-card--history tk-card tk-card--history\" aria-label=\"Partida de Tanques de guerra\">\n <header className=\"chat-game-header\">\n <div className=\"chat-game-heading\">\n <span className=\"chat-game-eyebrow\">MINIJUEGOS · 2 JUGADORES</span>\n <h3>Tanques de guerra <Swords size={13} aria-hidden=\"true\" /></h3>\n </div>\n </header>\n <p className=\"chat-game-status\" role=\"status\">{getGameStatus(game, currentUserId)}</p>\n {game.logic && <p className=\"tk-history-score\">Verde {hp[0]} · Rojo {hp[1]} HP</p>}\n </section>;\n}\n\nfunction TanksPanel({ game, gameKey, currentUserId, variant, onMinimize, onDismiss }) {\n const connected = useConnected();\n const stageRef = useRef(null);\n const [prefer2d, setPrefer2d] = useState(false);\n const [aim, setAim] = useState(null);\n const [animating, setAnimating] = useState(false);\n const [camera, setCamera] = useState('overview');\n const [error, setError] = useState('');\n const [confirmResign, setConfirmResign] = useState(false);\n const [now, setNow] = useState(() => Date.now());\n const animKey = useRef('init');\n const eventSeq = useRef(0);\n const showStage = ['active', 'won', 'draw', 'conflict', 'closed'].includes(game.status) && Boolean(game.logic);\n const { sceneRef, mode, use2d } = useTankScene(stageRef, showStage, prefer2d,\n (event) => handleSceneEvent(event, `${animKey.current}:${event.type}:${(eventSeq.current += 1)}`));\n\n const ownId = String(currentUserId ?? game.ownId);\n const players = game.logic?.players ?? [game.hostId, game.guestId];\n const myIndex = players.indexOf(ownId);\n const isGuest = sameUser(ownId, game.guestId);\n const isParticipant = myIndex >= 0;\n const terminal = isTerminalGame(game);\n const myTurn = canAct(game) && !animating;\n const run = (name, ...args) => {\n setError('');\n void call(name, ...args).catch((reason) => setError(reason?.message || 'No se pudo enviar.'));\n };\n\n useEffect(() => { startTanksSounds(); }, []);\n\n // Push game state into the scene: animate new turns, otherwise just show the world.\n const shown = useRef({ eventId: undefined, logic: null, scene: null });\n const queue = useRef(Promise.resolve());\n useEffect(() => {\n const scene = sceneRef.current;\n if (!scene || !game.logic) return;\n const state = shown.current;\n const eventId = game.lastAction?.eventId ?? null;\n if (state.scene !== scene) {\n // First paint (or a new renderer): show the current state without replaying history.\n shown.current = { eventId, logic: game.logic, scene };\n scene.setWorld(worldFor(game));\n return;\n }\n if (state.logic === game.logic) return;\n const previous = state.logic;\n const isNewTurn = eventId !== state.eventId && game.lastAction?.entry?.[0] === 1;\n shown.current = { eventId, logic: game.logic, scene };\n const turn = isNewTurn ? turnFor(game, previous) : null;\n const world = worldFor(game);\n queue.current = queue.current.then(async () => {\n if (sceneRef.current !== scene) return;\n if (!turn) { scene.setWorld(world); return; }\n animKey.current = eventId;\n // A destroying turn already has tank_destroyed: no stacked big_explosion on top.\n if (turn.destroyed.length) suppressTanksCue('big_explosion', 15000);\n setAnimating(true);\n setCamera('overview');\n try { await scene.playTurn(turn); } catch { scene.setWorld(world); }\n if (sceneRef.current === scene) setAnimating(false);\n });\n }, [game, mode, sceneRef]);\n\n // Victory/defeat beat once per game, only when the end happens while watching.\n const endedOnMount = useRef(terminal);\n useEffect(() => {\n if (endedOnMount.current || !['won', 'draw'].includes(game.status)) return;\n void queue.current.then(() => {\n sceneRef.current?.celebrate?.(game.winnerId ?? null);\n if (isParticipant) playOutcome(sameUser(game.winnerId, ownId) ? 'victory' : 'defeat', `${game.gameId}:end`);\n });\n }, [game.status, game.winnerId, game.gameId, ownId, isParticipant, sceneRef]);\n\n // A fresh aim each time our turn starts, pointing at the rival.\n useEffect(() => {\n if (!canAct(game) || !game.logic) { setAim(null); return; }\n const me = game.logic.tanks[myIndex];\n const other = game.logic.tanks[1 - myIndex];\n setAim({ move: 0, yaw: yawToward(me, other), pitch: 45, power: 60, ammo: 'standard' });\n }, [game.ply, game.status, game.pendingEvent, myIndex]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n const scene = sceneRef.current;\n if (!scene || !game.logic) return;\n if (!aim || !myTurn) { scene.setPreview(null); return; }\n scene.setAim(aim);\n scene.setPreview(previewFor(game, ownId, aim));\n }, [aim, myTurn, mode]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => { sceneRef.current?.setCameraMode?.(camera); }, [camera, mode, sceneRef]);\n\n // Turn clock: our own idle turn is skipped after 60 s (3 skips forfeit). The rival's\n // timeout can never be enforced from here, so a disconnection never loses a game.\n const turnStart = useRef({ ply: -1, at: 0 });\n if (!animating && game.status === 'active' && turnStart.current.ply !== game.ply) turnStart.current = { ply: game.ply, at: Date.now() };\n useEffect(() => {\n if (game.status !== 'active' && game.status !== 'invited') return undefined;\n const timer = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(timer);\n }, [game.status]);\n const remaining = Math.max(0, TURN_SECONDS - Math.floor((now - turnStart.current.at) / 1000));\n const skipped = useRef(-1);\n useEffect(() => {\n if (!myTurn || remaining > 0 || skipped.current === game.ply || document.visibilityState !== 'visible') return;\n skipped.current = game.ply;\n run('tkSkip', gameKey);\n }, [myTurn, remaining, game.ply, gameKey]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const updateAim = (patch) => setAim((value) => (value ? { ...value, ...patch } : value));\n const fire = () => {\n if (!myTurn || !aim || !connected) return;\n run('tkTurn', gameKey, aim);\n };\n\n // Drag on the stage to aim: horizontal turns the turret, vertical raises the cannon.\n const drag = useRef(null);\n const onPointerDown = (event) => {\n if (!myTurn || !aim) return;\n drag.current = { x: event.clientX, y: event.clientY, yaw: aim.yaw, pitch: aim.pitch };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n };\n const onPointerMove = (event) => {\n if (!drag.current) return;\n const start = drag.current;\n updateAim({ yaw: wrapYaw(start.yaw - (event.clientX - start.x) * 0.4), pitch: clamp(start.pitch - (event.clientY - start.y) * 0.25, LIMITS.pitch) });\n };\n const onPointerUp = () => { drag.current = null; };\n const onKeyDown = (event) => {\n if (!myTurn || !aim) return;\n const step = event.shiftKey ? 10 : 2;\n const keys = {\n ArrowLeft: () => updateAim({ yaw: wrapYaw(aim.yaw + step) }),\n ArrowRight: () => updateAim({ yaw: wrapYaw(aim.yaw - step) }),\n ArrowUp: () => updateAim({ pitch: clamp(aim.pitch + 1, LIMITS.pitch) }),\n ArrowDown: () => updateAim({ pitch: clamp(aim.pitch - 1, LIMITS.pitch) }),\n '+': () => updateAim({ power: clamp(aim.power + 2, LIMITS.power) }),\n '=': () => updateAim({ power: clamp(aim.power + 2, LIMITS.power) }),\n '-': () => updateAim({ power: clamp(aim.power - 2, LIMITS.power) }),\n Enter: fire,\n ' ': fire,\n };\n const action = keys[event.key];\n if (!action) return;\n event.preventDefault();\n action();\n };\n\n const opponentId = players[1 - myIndex] ?? (isGuest ? game.hostId : game.guestId);\n const rematch = () => run('invite', {\n roomId: game.roomId, opponentId, gameType: 'tanks',\n firstPlayerId: game.firstPlayerId === game.hostId ? game.guestId : game.hostId, rematchOf: game.gameId,\n });\n\n const status = !connected && !terminal ? 'Sin conexión · esperando reconexión' : game.pending ? 'Enviando…' : getGameStatus(game, currentUserId);\n const tanks = game.logic?.tanks ?? [];\n const me = tanks[myIndex];\n const wind = game.logic ? worldFor(game).wind : null;\n const windStrength = wind ? Math.hypot(wind.x, wind.z) : 0;\n const windAngle = wind ? Math.round((Math.atan2(wind.z, wind.x) * 180) / Math.PI) : 0;\n const waitingLong = game.status === 'invited' && !isGuest && Date.now() - Date.parse(game.createdAt) > INVITE_HINT_MS;\n\n return (\n <section className={`chat-game-card tk-card${myTurn ? ' chat-game-card--my-turn' : ''}${variant ? ` chat-game-card--${variant}` : ''}`} aria-label=\"Partida de Tanques de guerra\">\n <header className=\"chat-game-header\">\n <div className=\"chat-game-heading\">\n <span className=\"chat-game-eyebrow\">MINIJUEGOS · 2 JUGADORES</span>\n <h3>Tanques de guerra <Swords size={13} aria-hidden=\"true\" /></h3>\n </div>\n {variant === 'panel' && <GameSoundControls manager={getTanksSoundManager()} />}\n {onMinimize && <button className=\"chat-game-close\" type=\"button\" aria-label=\"Minimizar tablero\" title=\"Minimizar tablero\" onClick={onMinimize}><ChevronDown size={16} aria-hidden=\"true\" /></button>}\n {isParticipant && !terminal && <button className=\"chat-game-close\" type=\"button\" aria-label=\"Finalizar partida para ambos jugadores\" title=\"Finalizar partida para ambos\" disabled={!connected} onClick={() => run('act', gameKey, 'game_end')}><X size={16} aria-hidden=\"true\" /></button>}\n {onDismiss && <button className=\"chat-game-close\" type=\"button\" aria-label=\"Cerrar tablero y volver al chat\" title=\"Cerrar tablero\" onClick={onDismiss}><X size={16} aria-hidden=\"true\" /></button>}\n </header>\n\n <p className=\"chat-game-status\" role=\"status\">{status}</p>\n\n {game.status === 'invited' && <div className=\"tk-invite\">\n <p>Duelo de artillería por turnos: mueve tu tanque, apunta la torreta, elige la potencia y destruye al rival. 100 HP cada uno.</p>\n {isGuest && <div className=\"chat-game-actions\">\n <button type=\"button\" className=\"chat-game-action chat-game-action--primary\" disabled={!connected || game.pending} onClick={() => run('act', gameKey, 'game_accept')}>Aceptar duelo</button>\n <button type=\"button\" className=\"chat-game-action\" disabled={!connected || game.pending} onClick={() => run('act', gameKey, 'game_decline')}>Rechazar</button>\n </div>}\n {waitingLong && <p className=\"tk-hint\">¿No responde? Tu contacto puede necesitar actualizar la app para jugar a Tanques.</p>}\n </div>}\n\n {showStage && <div className=\"tk-stage-wrap\">\n <div ref={stageRef} className={`tk-stage${myTurn ? ' is-aiming' : ''}`} tabIndex={0} role=\"application\"\n aria-label=\"Campo de batalla. Flechas para apuntar, más y menos para la potencia, Enter para disparar.\"\n onPointerDown={onPointerDown} onPointerMove={onPointerMove} onPointerUp={onPointerUp} onPointerCancel={onPointerUp} onKeyDown={onKeyDown} />\n {mode === 'loading' && <div className=\"tk-stage-note\" role=\"status\">Cargando campo de batalla…</div>}\n {mode === 'none' && <div className=\"tk-stage-note\" role=\"alert\">No se pudo dibujar el campo de batalla.</div>}\n <div className=\"tk-hud\">\n <HpBar label={myIndex === 0 ? 'Tú' : 'Verde'} hp={tanks[0]?.hp ?? 100} color={TEAM_COLORS[0]} active={game.turnId === players[0]} />\n <HpBar label={myIndex === 1 ? 'Tú' : 'Rojo'} hp={tanks[1]?.hp ?? 100} color={TEAM_COLORS[1]} active={game.turnId === players[1]} />\n <div className=\"tk-hud-meta\">\n {wind && <span title=\"Viento\"><Wind size={12} aria-hidden=\"true\" /><i className=\"tk-wind-arrow\" style={{ transform: `rotate(${windAngle}deg)` }} aria-hidden=\"true\">➜</i>{windStrength.toFixed(1)} m/s²</span>}\n {game.logic && <span>Disparo {Math.min(game.logic.shots + 1, game.logic.maxShots)}/{game.logic.maxShots}</span>}\n {game.status === 'active' && !animating && <span className={remaining <= 10 ? 'tk-timer is-low' : 'tk-timer'}>{remaining}s</span>}\n </div>\n </div>\n <div className=\"tk-stage-tools\">\n <button type=\"button\" className=\"chat-game-action\" aria-pressed={camera === 'aim'} onClick={() => setCamera(camera === 'aim' ? 'overview' : 'aim')} title=\"Cambiar cámara\"><Video size={14} aria-hidden=\"true\" />{camera === 'aim' ? 'Vista general' : 'Cámara de apuntado'}</button>\n {mode !== 'loading' && <button type=\"button\" className=\"chat-game-action\" aria-pressed={use2d} onClick={() => setPrefer2d(!use2d)} title=\"Cambiar vista\"><Layers size={14} aria-hidden=\"true\" />{use2d ? 'Vista 3D' : 'Vista 2D'}</button>}\n </div>\n </div>}\n\n {myTurn && aim && me && <div className=\"tk-controls\" aria-label=\"Controles del disparo\">\n <label className=\"tk-control\">\n <span>Mover <strong>{(aim.move * 0.5).toFixed(1)} m</strong> <small>combustible {Math.floor(me.fuel / 100000)} m</small></span>\n <input type=\"range\" min={LIMITS.move[0]} max={LIMITS.move[1]} value={aim.move} onChange={(event) => updateAim({ move: Number(event.target.value) })} aria-valuetext={`${(aim.move * 0.5).toFixed(1)} metros`} />\n </label>\n <label className=\"tk-control\">\n <span>Torreta <strong>{aim.yaw}°</strong></span>\n <input type=\"range\" min={LIMITS.yaw[0]} max={LIMITS.yaw[1]} value={aim.yaw} onChange={(event) => updateAim({ yaw: Number(event.target.value) })} aria-valuetext={`${aim.yaw} grados`} />\n </label>\n <label className=\"tk-control\">\n <span>Elevación <strong>{aim.pitch}°</strong></span>\n <input type=\"range\" min={LIMITS.pitch[0]} max={LIMITS.pitch[1]} value={aim.pitch} onChange={(event) => updateAim({ pitch: Number(event.target.value) })} aria-valuetext={`${aim.pitch} grados`} />\n </label>\n <label className=\"tk-control\">\n <span>Potencia <strong>{aim.power}</strong></span>\n <input type=\"range\" min={LIMITS.power[0]} max={LIMITS.power[1]} value={aim.power} onChange={(event) => updateAim({ power: Number(event.target.value) })} aria-valuetext={`Potencia ${aim.power}`} />\n </label>\n <div className=\"tk-ammo\" role=\"radiogroup\" aria-label=\"Munición\">\n {Object.keys(AMMO).map((id) => {\n const left = AMMO[id].cost === 0 ? '∞' : me.ammo[id] ?? 0;\n return <button key={id} type=\"button\" role=\"radio\" aria-checked={aim.ammo === id} disabled={left === 0}\n className={`tk-ammo-item${aim.ammo === id ? ' is-selected' : ''}`} onClick={() => updateAim({ ammo: id })}>\n {AMMO_LABELS[id]} <small>{left}</small>\n </button>;\n })}\n </div>\n <button type=\"button\" className=\"tk-fire\" disabled={!connected || game.pending} onClick={fire}><Crosshair size={18} aria-hidden=\"true\" />DISPARAR</button>\n </div>}\n\n {game.status === 'conflict' && <>\n {game.error && <p className=\"chat-game-error\" role=\"alert\">{game.error}</p>}\n <SyncControls sync={game.sync} connected={connected} onResync={() => run('requestResync', gameKey)} onAdoptOffer={() => run('adoptResyncOffer', gameKey)} />\n </>}\n {game.status !== 'conflict' && game.error && <p className=\"chat-game-error\" role=\"alert\">{game.error}</p>}\n {error && <p className=\"chat-game-error\" role=\"alert\">{error}</p>}\n {game.pendingEvent && !game.pending && <div className=\"chat-game-actions\">\n <button type=\"button\" className=\"chat-game-action chat-game-action--primary\" disabled={!connected} onClick={() => run('retry', gameKey)}>Reintentar envío</button>\n </div>}\n\n {game.status === 'active' && isParticipant && <div className=\"chat-game-actions tk-secondary\">\n {!confirmResign\n ? <button type=\"button\" className=\"chat-game-action\" disabled={!connected || Boolean(game.pendingEvent)} onClick={() => setConfirmResign(true)}><Flag size={14} aria-hidden=\"true\" />Rendirse</button>\n : <>\n <button type=\"button\" className=\"chat-game-action chat-game-action--danger\" onClick={() => { setConfirmResign(false); run('tkResign', gameKey); }}>Confirmar rendición</button>\n <button type=\"button\" className=\"chat-game-action\" onClick={() => setConfirmResign(false)}>Cancelar</button>\n </>}\n </div>}\n {['won', 'draw', 'closed'].includes(game.status) && isParticipant && <div className=\"chat-game-actions\">\n <button type=\"button\" className=\"chat-game-action chat-game-action--primary\" disabled={!connected} onClick={rematch}><RotateCcw size={14} aria-hidden=\"true\" />Revancha</button>\n </div>}\n </section>\n );\n}\n\nfunction TanksGameCard({ gameKey, currentUserId, variant = 'panel', onMinimize, onDismiss }) {\n const game = useChatGames((state) => state.games[gameKey]);\n if (!game) return null;\n if (variant === 'history') return <TanksHistoryCard game={game} currentUserId={currentUserId} />;\n return <TanksPanel game={game} gameKey={gameKey} currentUserId={currentUserId} variant={variant} onMinimize={onMinimize} onDismiss={onDismiss} />;\n}\n\nexport default memo(TanksGameCard);\n"],"mappings":"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"}