@minicode-dev/chat 0.1.13 → 0.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/CHANGELOG.md +112 -5
  2. package/README.md +401 -312
  3. package/assets/sounds/effects/avalanche.mp3 +0 -0
  4. package/assets/sounds/racing/car_boost.mp3 +0 -0
  5. package/assets/sounds/racing/car_boost.ogg +0 -0
  6. package/assets/sounds/racing/car_bump.mp3 +0 -0
  7. package/assets/sounds/racing/car_bump.ogg +0 -0
  8. package/assets/sounds/racing/car_drift_loop.mp3 +0 -0
  9. package/assets/sounds/racing/car_drift_loop.ogg +0 -0
  10. package/assets/sounds/racing/car_engine_loop.mp3 +0 -0
  11. package/assets/sounds/racing/car_engine_loop.ogg +0 -0
  12. package/assets/sounds/racing/car_engine_start.mp3 +0 -0
  13. package/assets/sounds/racing/car_engine_start.ogg +0 -0
  14. package/assets/sounds/racing/countdown_beep.mp3 +0 -0
  15. package/assets/sounds/racing/countdown_beep.ogg +0 -0
  16. package/assets/sounds/racing/countdown_go.mp3 +0 -0
  17. package/assets/sounds/racing/countdown_go.ogg +0 -0
  18. package/assets/sounds/racing/final_lap.mp3 +0 -0
  19. package/assets/sounds/racing/final_lap.ogg +0 -0
  20. package/assets/sounds/racing/finish_line.mp3 +0 -0
  21. package/assets/sounds/racing/finish_line.ogg +0 -0
  22. package/assets/sounds/racing/lap_complete.mp3 +0 -0
  23. package/assets/sounds/racing/lap_complete.ogg +0 -0
  24. package/assets/sounds/racing/music_circuit.mp3 +0 -0
  25. package/assets/sounds/racing/music_circuit.ogg +0 -0
  26. package/assets/sounds/racing/music_final_lap.mp3 +0 -0
  27. package/assets/sounds/racing/music_final_lap.ogg +0 -0
  28. package/assets/sounds/racing/race_defeat.mp3 +0 -0
  29. package/assets/sounds/racing/race_defeat.ogg +0 -0
  30. package/assets/sounds/racing/race_victory.mp3 +0 -0
  31. package/assets/sounds/racing/race_victory.ogg +0 -0
  32. package/assets/sounds/tanks/barrel_explode.mp3 +0 -0
  33. package/assets/sounds/tanks/barrel_explode.ogg +0 -0
  34. package/assets/sounds/tanks/crate_break.mp3 +0 -0
  35. package/assets/sounds/tanks/crate_break.ogg +0 -0
  36. package/assets/sounds/tanks/health_pickup.mp3 +0 -0
  37. package/assets/sounds/tanks/health_pickup.ogg +0 -0
  38. package/assets/sounds/tanks/last_life.mp3 +0 -0
  39. package/assets/sounds/tanks/last_life.ogg +0 -0
  40. package/assets/sounds/tanks/life_lost.mp3 +0 -0
  41. package/assets/sounds/tanks/life_lost.ogg +0 -0
  42. package/assets/sounds/tanks/respawn.mp3 +0 -0
  43. package/assets/sounds/tanks/respawn.ogg +0 -0
  44. package/assets/sounds/tanks/shield_end.mp3 +0 -0
  45. package/assets/sounds/tanks/shield_end.ogg +0 -0
  46. package/assets/sounds/tanks/shield_loop.mp3 +0 -0
  47. package/assets/sounds/tanks/shield_loop.ogg +0 -0
  48. package/assets/sounds/tanks/wall_hit.mp3 +0 -0
  49. package/assets/sounds/tanks/wall_hit.ogg +0 -0
  50. package/dist/chunks/{BattleshipGameCard-iRk8d4vR.js → BattleshipGameCard-B-B4r7lK.js} +146 -144
  51. package/dist/chunks/{BattleshipGameCard-iRk8d4vR.js.map → BattleshipGameCard-B-B4r7lK.js.map} +1 -1
  52. package/dist/chunks/{ChatContext-DjIEifGY.js → ChatContext-DQtKsR6Z.js} +2 -2
  53. package/dist/chunks/{ChatContext-DjIEifGY.js.map → ChatContext-DQtKsR6Z.js.map} +1 -1
  54. package/dist/chunks/RacingLiveGameCard-c1G7uoDI.js +1654 -0
  55. package/dist/chunks/RacingLiveGameCard-c1G7uoDI.js.map +1 -0
  56. package/dist/chunks/{TanksGameCard-GrqmdwJ7.js → TanksGameCard-CvTaF7tu.js} +164 -162
  57. package/dist/chunks/{TanksGameCard-GrqmdwJ7.js.map → TanksGameCard-CvTaF7tu.js.map} +1 -1
  58. package/dist/chunks/TanksLiveGameCard-COr9Oay5.js +1011 -0
  59. package/dist/chunks/TanksLiveGameCard-COr9Oay5.js.map +1 -0
  60. package/dist/chunks/avalancheScene3d-Z5QyZIid.js +1299 -0
  61. package/dist/chunks/avalancheScene3d-Z5QyZIid.js.map +1 -0
  62. package/dist/chunks/connect4Sounds-DmD-E9kX.js +235 -0
  63. package/dist/chunks/connect4Sounds-DmD-E9kX.js.map +1 -0
  64. package/dist/chunks/connectionStore-DwgIUl30.js +13 -0
  65. package/dist/chunks/connectionStore-DwgIUl30.js.map +1 -0
  66. package/dist/chunks/createLiveScene-CWBunxPi.js +367 -0
  67. package/dist/chunks/{createLiveScene-819NWv84.js.map → createLiveScene-CWBunxPi.js.map} +1 -1
  68. package/dist/chunks/createRaceScene-C7Rw89kj.js +305 -0
  69. package/dist/chunks/createRaceScene-C7Rw89kj.js.map +1 -0
  70. package/dist/chunks/{createTankScene-6asWHKFf.js → createTankScene-yhX6la27.js} +125 -123
  71. package/dist/chunks/{createTankScene-6asWHKFf.js.map → createTankScene-yhX6la27.js.map} +1 -1
  72. package/dist/chunks/decor-CyyCnmct.js +418 -0
  73. package/dist/chunks/decor-CyyCnmct.js.map +1 -0
  74. package/dist/chunks/fx-1ZwzmPWj.js +458 -0
  75. package/dist/chunks/fx-1ZwzmPWj.js.map +1 -0
  76. package/dist/chunks/fx-UZwhOmdl.js +584 -0
  77. package/dist/chunks/fx-UZwhOmdl.js.map +1 -0
  78. package/dist/chunks/gameStatus-BChd29yI.js +62 -0
  79. package/dist/chunks/gameStatus-BChd29yI.js.map +1 -0
  80. package/dist/chunks/{connect4Sounds-Cv0q31VW.js → games-BvYTWgaR.js} +814 -951
  81. package/dist/chunks/games-BvYTWgaR.js.map +1 -0
  82. package/dist/chunks/rolldown-runtime-CGnMp29N.js +10 -0
  83. package/dist/chunks/tank-DjEQ4FXF.js +553 -0
  84. package/dist/chunks/tank-DjEQ4FXF.js.map +1 -0
  85. package/dist/chunks/tanks-live-BcKmrhnV.js +261 -0
  86. package/dist/chunks/tanks-live-BcKmrhnV.js.map +1 -0
  87. package/dist/chunks/{tanksSounds-CUNDIOal.js → tanksSounds-DwjfSp3W.js} +43 -11
  88. package/dist/chunks/tanksSounds-DwjfSp3W.js.map +1 -0
  89. package/dist/chunks/track-BcnnpnAm.js +259 -0
  90. package/dist/chunks/track-BcnnpnAm.js.map +1 -0
  91. package/dist/chunks/util-DwI9bfS7.js +57 -0
  92. package/dist/chunks/util-DwI9bfS7.js.map +1 -0
  93. package/dist/index.js +812 -625
  94. package/dist/index.js.map +1 -1
  95. package/dist/styles.css +1 -1
  96. package/index.d.ts +3 -1
  97. package/package.json +1 -1
  98. package/dist/chunks/TanksLiveGameCard-DSmQcUMh.js +0 -1225
  99. package/dist/chunks/TanksLiveGameCard-DSmQcUMh.js.map +0 -1
  100. package/dist/chunks/avalancheScene3d-Dnl2E3EA.js +0 -1878
  101. package/dist/chunks/avalancheScene3d-Dnl2E3EA.js.map +0 -1
  102. package/dist/chunks/connect4Sounds-Cv0q31VW.js.map +0 -1
  103. package/dist/chunks/createLiveScene-819NWv84.js +0 -365
  104. package/dist/chunks/fx-BNJvJYOu.js +0 -871
  105. package/dist/chunks/fx-BNJvJYOu.js.map +0 -1
  106. package/dist/chunks/gameStatus-Cu1Z8un9.js +0 -69
  107. package/dist/chunks/gameStatus-Cu1Z8un9.js.map +0 -1
  108. package/dist/chunks/tank-DIn6Jyt8.js +0 -605
  109. package/dist/chunks/tank-DIn6Jyt8.js.map +0 -1
  110. package/dist/chunks/tanksSounds-CUNDIOal.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TanksGameCard-GrqmdwJ7.js","names":["clamp","_Fragment","LIMITS","useChatGames","canAct","AMMO","windFor","trace","launchState","MAP_SIZE","U","ChatContext","isTerminalGame","sameUser","getGameStatus","hasWebGL","stopAllTanksLoops","startTanksSounds","handleSceneEvent","suppressTanksCue","playOutcome","getTanksSoundManager","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","TURN_SECONDS","INVITE_HINT_MS","AMMO_LABELS","clamp","wrapYaw","useConnected","transport","useContext","subscribe","useCallback","unsubscribe","notify","status","useSyncExternalStore","useChatConnectionStatus","call","args","name","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","event","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","action","opponentId","rematch","tanks","windStrength","windAngle","waitingLong","variant","GameSoundControls","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/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","/* 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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"}
1
+ {"version":3,"file":"TanksGameCard-CvTaF7tu.js","names":["clamp","_Fragment","useChatGames","trace","LIMITS","MAP_SIZE","windFor","canAct","U","AMMO","ChatContext","useChatConnectionStatus","isTerminalGame","sameUser","getGameStatus","GameSoundControls","hasWebGL","stopAllTanksLoops","startTanksSounds","handleSceneEvent","suppressTanksCue","playOutcome","getTanksSoundManager","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","launchState","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","TURN_SECONDS","INVITE_HINT_MS","AMMO_LABELS","clamp","wrapYaw","useConnected","transport","useContext","subscribe","useCallback","unsubscribe","notify","status","useSyncExternalStore","call","args","name","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","event","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","action","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/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","/* 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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"}