@minicode-dev/chat 0.1.14 → 0.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{BattleshipGameCard-B-B4r7lK.js → BattleshipGameCard-8H-sBCsv.js} +3 -3
- package/dist/chunks/{BattleshipGameCard-B-B4r7lK.js.map → BattleshipGameCard-8H-sBCsv.js.map} +1 -1
- package/dist/chunks/{ChatContext-DQtKsR6Z.js → ChatContext-CVW58bzC.js} +2 -2
- package/dist/chunks/{ChatContext-DQtKsR6Z.js.map → ChatContext-CVW58bzC.js.map} +1 -1
- package/dist/chunks/{RacingLiveGameCard-c1G7uoDI.js → RacingLiveGameCard-8j9QLnxW.js} +4 -4
- package/dist/chunks/{RacingLiveGameCard-c1G7uoDI.js.map → RacingLiveGameCard-8j9QLnxW.js.map} +1 -1
- package/dist/chunks/{TanksGameCard-CvTaF7tu.js → TanksGameCard-DnCufSH6.js} +12 -12
- package/dist/chunks/{TanksGameCard-CvTaF7tu.js.map → TanksGameCard-DnCufSH6.js.map} +1 -1
- package/dist/chunks/TanksLiveGameCard-D_27Jomp.js +1274 -0
- package/dist/chunks/TanksLiveGameCard-D_27Jomp.js.map +1 -0
- package/dist/chunks/{avalancheScene3d-Z5QyZIid.js → avalancheScene3d-CIE2WKQn.js} +51 -50
- package/dist/chunks/{avalancheScene3d-Z5QyZIid.js.map → avalancheScene3d-CIE2WKQn.js.map} +1 -1
- package/dist/chunks/cars-D1PM7mVD.js +340 -0
- package/dist/chunks/cars-D1PM7mVD.js.map +1 -0
- package/dist/chunks/{connect4Sounds-DmD-E9kX.js → connect4Sounds-BqEHULjv.js} +2 -2
- package/dist/chunks/{connect4Sounds-DmD-E9kX.js.map → connect4Sounds-BqEHULjv.js.map} +1 -1
- package/dist/chunks/createLiveScene-MTGRv8rx.js +758 -0
- package/dist/chunks/createLiveScene-MTGRv8rx.js.map +1 -0
- package/dist/chunks/{createRaceScene-C7Rw89kj.js → createRaceScene-BiEtQsVs.js} +4 -3
- package/dist/chunks/{createRaceScene-C7Rw89kj.js.map → createRaceScene-BiEtQsVs.js.map} +1 -1
- package/dist/chunks/fx-DhXerGyt.js +248 -0
- package/dist/chunks/fx-DhXerGyt.js.map +1 -0
- package/dist/chunks/{games-BvYTWgaR.js → games-Bl_8raG6.js} +1147 -574
- package/dist/chunks/games-Bl_8raG6.js.map +1 -0
- package/dist/chunks/{tanksSounds-DwjfSp3W.js → tanksSounds-DTnidbiq.js} +5 -5
- package/dist/chunks/{tanksSounds-DwjfSp3W.js.map → tanksSounds-DTnidbiq.js.map} +1 -1
- package/dist/index.js +28 -28
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/dist/chunks/TanksLiveGameCard-COr9Oay5.js +0 -1011
- package/dist/chunks/TanksLiveGameCard-COr9Oay5.js.map +0 -1
- package/dist/chunks/createLiveScene-CWBunxPi.js +0 -367
- package/dist/chunks/createLiveScene-CWBunxPi.js.map +0 -1
- package/dist/chunks/fx-UZwhOmdl.js +0 -584
- package/dist/chunks/fx-UZwhOmdl.js.map +0 -1
- package/dist/chunks/games-BvYTWgaR.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { a as e, t } from "./games-
|
|
1
|
+
import { a as e, t } from "./games-Bl_8raG6.js";
|
|
2
2
|
import { l as n, n as r, s as i, t as a } from "./board-DXKuIZ1I.js";
|
|
3
3
|
import { r as o } from "./connectionStore-DwgIUl30.js";
|
|
4
4
|
import { c as s, i as c, l, t as u } from "./gameStatus-BChd29yI.js";
|
|
5
|
-
import { a as d, o as f, t as p } from "./connect4Sounds-
|
|
5
|
+
import { a as d, o as f, t as p } from "./connect4Sounds-BqEHULjv.js";
|
|
6
6
|
import "../index.js";
|
|
7
7
|
import { t as ee } from "./webglSupport-2WjPEPZ_.js";
|
|
8
8
|
import { memo as m, useCallback as h, useEffect as g, useId as te, useMemo as _, useRef as v, useState as y } from "react";
|
|
@@ -959,4 +959,4 @@ function Be({ game: e, gameKey: t, currentUserId: r, connected: i, status: o, va
|
|
|
959
959
|
var F = m(ze);
|
|
960
960
|
export { F as default };
|
|
961
961
|
|
|
962
|
-
//# sourceMappingURL=BattleshipGameCard-
|
|
962
|
+
//# sourceMappingURL=BattleshipGameCard-8H-sBCsv.js.map
|
package/dist/chunks/{BattleshipGameCard-B-B4r7lK.js.map → BattleshipGameCard-8H-sBCsv.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BattleshipGameCard-B-B4r7lK.js","names":["sameCell","_Fragment","useChatGames","validatePlacement","createBoard","placeShip","FLEET","useChatConnectionStatus","isTerminalGame","getVerificationLabel","getGameStatus","createSoundManager","GameSoundControls","connect4Sounds","hasWebGL","AMBIENT","battleshipSounds","chatSoundUrl","name","hidden","playUiSound","scheduleCues","run","keyFor","at","timer","timers","ambientHolders","syncAmbient","holdAmbient","released","CRUISER_ID","sameCell$1","a","b","hitsOn","ship","shots","cell","skip","crossesCruiserAlarm","shot","cruiser","fleet","before","incomingShots","after","launchCues","incoming","impactCues","cues","result","sunk","cruiserAlarm","defeated","won","ROWS","SHIP_NAMES","SCENE_STATUSES","DOUBLE_SELECT_MS","EMPTY_SHOTS","cellLabel","sameCell","isCell","shipName","id","shotAt","shipAt","ships","item","capitalize","text","prefersReducedMotion","call","args","buildBoard","board","first","placed","previewCells","size","anchor","orientation","index","countShots","total","hits","row","SyncControls","sync","connected","onAdoptOffer","onResync","VerificationBadge","label","game","ShieldCheck","TriangleAlert","FallbackGrid","shipCells","preview","view","onHover","col","cls","selected","cursor","onSelect","HistorySummary","showStats","iWon","sameUser","currentUserId","Anchor","status","BattleshipGameCard","state","gameKey","variant","BattleshipPanel","stageRef","useRef","sceneRef","animatingRef","lastSeenShotRef","lastSelectRef","handlersRef","soundTimersRef","lastStatusRef","hintId","useId","sceneStatus","setSceneStatus","useState","viewMode","setViewMode","hovered","setHovered","setCursor","setSelected","setOrientation","activeShipId","setActiveShipId","radar","setRadar","expanded","setExpanded","animating","setAnimating","announcement","setAnnouncement","isHost","isGuest","isParticipant","terminal","placing","battle","myTurn","busy","canFire","canPlace","sceneVisible","sceneReady","myFleet","useMemo","targetShots","ownBoard","placedIds","fleetComplete","currentShip","ownShips","enemyShips","shotCount","hitCount","radarContacts","cells","r","c","mode","buildView","useCallback","viewModeArg","hideCell","announce","fire","placeAt","selectCell","now","last","useEffect","container","disposed","scene","createBattleScene","error","ambient","lastShot","eventId","sunkId","kind","nextMode","impact","cueKey","cancelled","hold","resolve","rotate","value","ready","clicked","action","toggleRadar","handleStageKeyDown","event","moves","dr","dc","base","next","handleCardKeyDown","verification","statusText","sunkCount","jsx","Minimize2","Maximize2","onMinimize","ChevronDown","X","onDismiss","Fragment","Crosshair","Waves","active","i","Check","RotateCw","Shuffle","Radar","LocateFixed","BattleshipGameCard_default","memo"],"sources":["../../src/games/battleship/sound/battleshipSounds.js","../../src/games/battleship/sound/cues.js","../../src/games/battleship/BattleshipGameCard.jsx"],"sourcesContent":["import { createSoundManager } from '../../../audio/createSoundManager.js';\nimport { connect4Sounds } from '../../connect4/connect4Sounds.js';\nimport { chatSoundUrl } from '../../../assets/chatAssets.js';\n\nconst AMBIENT = 'ocean_ambient_loop';\n\n// Files come from the supplied pack; levels even out its loudness (measured\n// mean volume) so impacts stay present and alarms/fly-bys never dominate.\nexport const battleshipSounds = createSoundManager({\n id: 'battleship',\n baseUrl: () => chatSoundUrl('battleship_audio_pack/assets'), // resolved lazily at fetch time\n settingsFrom: connect4Sounds, // one mute/volume preference for every chat game\n sounds: Object.fromEntries([\n 'cannon_fire', 'projectile_flyby', 'water_splash', 'ship_hit', 'ship_heavy_hit', 'ship_sinking',\n 'sonar_ping', 'cruiser_damage_alarm', 'ship_place', 'ship_rotate', 'ui_click', 'victory', 'defeat', AMBIENT,\n ].map((name) => [name, `${name}.ogg`])),\n levels: {\n cannon_fire: 0.7, projectile_flyby: 0.3, water_splash: 0.9, ship_hit: 0.9, ship_heavy_hit: 1,\n ship_sinking: 0.4, sonar_ping: 0.35, cruiser_damage_alarm: 0.3, ship_place: 0.4, ship_rotate: 0.4,\n ui_click: 0.3, victory: 0.55, defeat: 0.4, [AMBIENT]: 0.22,\n },\n});\n\nconst hidden = () => typeof document !== 'undefined' && document.hidden;\n\n/** Immediate feedback for a local UI action (never deduplicated). */\nexport function playUiSound(name) {\n if (!hidden()) battleshipSounds.play(name);\n}\n\n/**\n * Plays timed cues once per key. Pending timers live in `timers` so the panel\n * can cancel them on unmount; a hidden page stays silent.\n */\nexport function scheduleCues(cues, keyFor, timers) {\n cues.forEach(({ name, at }) => {\n const run = () => { if (!hidden()) battleshipSounds.play(name, { key: keyFor(name) }); };\n if (at <= 0) { run(); return; }\n const timer = setTimeout(() => { timers.delete(timer); run(); }, at);\n timers.add(timer);\n });\n}\n\n// Ocean bed: plays while at least one open board holds it and the page is visible.\nlet ambientHolders = 0;\nconst syncAmbient = () => {\n if (ambientHolders > 0 && !hidden()) battleshipSounds.startLoop(AMBIENT);\n else battleshipSounds.stopLoop(AMBIENT);\n};\n\nexport function holdAmbient() {\n ambientHolders += 1;\n if (ambientHolders === 1) document.addEventListener('visibilitychange', syncAmbient);\n syncAmbient();\n let released = false;\n return () => {\n if (released) return;\n released = true;\n ambientHolders -= 1;\n if (ambientHolders === 0) document.removeEventListener('visibilitychange', syncAmbient);\n syncAmbient();\n };\n}\n","// Pure sound choreography for Battleship (no audio, no DOM): what to play and\n// when, relative to the shot animation. Times are milliseconds.\n\nexport const CRUISER_ID = 'cruiser';\nexport const CRUISER_ALARM_HITS = 2;\n\nconst sameCell = (a, b) => a.row === b.row && a.col === b.col;\nconst hitsOn = (ship, shots, skip) => ship.cells\n .filter((cell) => shots?.[cell.row]?.[cell.col] === 'hit' && !(skip && sameCell(cell, skip))).length;\n\n/**\n * True only for the confirmed hit that takes our own cruiser from fewer than two\n * hits to two or more. `incomingShots` already contains `shot`. The enemy cruiser\n * stays hidden until sunk, so only our fleet can raise the alarm.\n */\nexport function crossesCruiserAlarm(fleet, incomingShots, shot) {\n if (shot?.result !== 'hit') return false;\n const cruiser = (fleet || []).find((ship) => ship.id === CRUISER_ID);\n if (!cruiser?.cells?.some((cell) => sameCell(cell, shot))) return false;\n const before = hitsOn(cruiser, incomingShots, shot);\n const after = hitsOn(cruiser, incomingShots);\n return before < CRUISER_ALARM_HITS && after >= CRUISER_ALARM_HITS;\n}\n\n// Launch cues play when the projectile leaves; impact cues when it lands.\nexport function launchCues({ incoming }) {\n return incoming\n ? [{ name: 'projectile_flyby', at: 0 }]\n : [{ name: 'cannon_fire', at: 0 }, { name: 'projectile_flyby', at: 180 }];\n}\n\nexport function impactCues({ result, sunk, defeated, won, cruiserAlarm }) {\n const cues = result === 'hit'\n ? (sunk ? [{ name: 'ship_heavy_hit', at: 0 }, { name: 'ship_sinking', at: 350 }] : [{ name: 'ship_hit', at: 0 }])\n : [{ name: 'water_splash', at: 0 }];\n if (cruiserAlarm) cues.push({ name: 'cruiser_damage_alarm', at: 500 });\n if (defeated) cues.push({ name: won ? 'victory' : 'defeat', at: sunk ? 1600 : 600 });\n return cues;\n}\n","/* eslint-disable react/prop-types */\nimport { memo, useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { ChevronDown, Crosshair, LocateFixed, Maximize2, Minimize2, Radar, RotateCw, Shuffle, Check, Anchor, TriangleAlert, Waves, ShieldCheck, X } from 'lucide-react';\nimport { useChatConnectionStatus } from '../../core/connection/connectionStore.js';\nimport useChatGames from '../shared/useChatGames.js';\nimport { getGameStatus, getVerificationLabel, isTerminalGame, sameUser } from '../shared/gameStatus.js';\nimport { BOARD_SIZE, FLEET, createBoard, placeShip, validatePlacement } from './logic';\nimport { hasWebGL } from './webglSupport';\nimport GameSoundControls from '../shared/GameSoundControls.jsx';\nimport { battleshipSounds, holdAmbient, playUiSound, scheduleCues } from './sound/battleshipSounds';\nimport { crossesCruiserAlarm, impactCues, launchCues } from './sound/cues';\nimport '../connect4/games.css';\nimport './battleship.css';\n\nconst ROWS = 'ABCDEFGHIJ';\nconst SHIP_NAMES = { carrier: 'portaaviones', battleship: 'acorazado', cruiser: 'crucero', submarine: 'submarino', destroyer: 'destructor' };\nconst SCENE_STATUSES = ['placement', 'active', 'won', 'conflict', 'closed'];\nconst DOUBLE_SELECT_MS = 400;\nconst EMPTY_SHOTS = Array.from({ length: BOARD_SIZE }, () => Array(BOARD_SIZE).fill(null));\n\nconst cellLabel = (cell) => (cell ? `${ROWS[cell.row]}${cell.col + 1}` : '—');\nconst sameCell = (a, b) => Boolean(a && b && a.row === b.row && a.col === b.col);\nconst isCell = (cell) => Boolean(cell) && Number.isInteger(cell.row) && Number.isInteger(cell.col)\n && cell.row >= 0 && cell.row < BOARD_SIZE && cell.col >= 0 && cell.col < BOARD_SIZE;\nconst shipName = (id) => SHIP_NAMES[id] || 'barco';\nconst shotAt = (shots, cell) => shots?.[cell.row]?.[cell.col] ?? null;\nconst shipAt = (ships, cell) => ships.find((ship) => ship.cells?.some((item) => sameCell(item, cell)));\nconst capitalize = (text) => text.charAt(0).toUpperCase() + text.slice(1);\n\nconst prefersReducedMotion = () => typeof window !== 'undefined' && Boolean(window.matchMedia?.('(prefers-reduced-motion: reduce)').matches);\n\n// The store owns delivery errors; UI handlers must never leak rejected promises.\nconst call = (name, ...args) => Promise.resolve().then(() => useChatGames.getState()[name]?.(...args)).catch(() => {});\n\nfunction buildBoard(fleet) {\n let board = createBoard();\n for (const ship of fleet || []) {\n const first = ship.cells?.[0];\n if (!first) continue;\n const placed = placeShip(board, { shipId: ship.id, row: first.row, col: first.col, orientation: ship.orientation });\n if (placed.ok) board = placed.board;\n }\n return board;\n}\n\nfunction previewCells(anchor, size, orientation) {\n return Array.from({ length: size }, (_, index) => ({\n row: anchor.row + (orientation === 'vertical' ? index : 0),\n col: anchor.col + (orientation === 'horizontal' ? index : 0),\n })).filter(isCell);\n}\n\nfunction countShots(shots) {\n let total = 0; let hits = 0;\n for (const row of shots || []) for (const shot of row || []) { if (shot) total += 1; if (shot === 'hit') hits += 1; }\n return { total, hits };\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 VerificationBadge({ game }) {\n const label = getVerificationLabel(game);\n if (!label) return null;\n return <span className={`bs-badge bs-badge--${game.verification}`}>{game.verification === 'ok' && <ShieldCheck size={12} aria-hidden=\"true\" />}{game.verification === 'mismatch' && <TriangleAlert size={12} aria-hidden=\"true\" />}{label}</span>;\n}\n\n// 2D grid used when WebGL is unavailable: same interaction, no three.js.\nfunction FallbackGrid({ view, selected, cursor, onSelect, onHover }) {\n const shipCells = new Map();\n view.ships.forEach((ship) => ship.cells.forEach((cell) => shipCells.set(`${cell.row}-${cell.col}`, ship)));\n const preview = new Set((view.preview?.cells || []).map((cell) => `${cell.row}-${cell.col}`));\n return <div className=\"bs-grid\" role=\"grid\" aria-label={view.mode === 'target' ? 'Tablero objetivo' : 'Mi flota'} onMouseLeave={() => onHover(null)}>\n {Array.from({ length: BOARD_SIZE }, (_, row) => <div role=\"row\" key={row} className=\"bs-grid__row\">\n {Array.from({ length: BOARD_SIZE }, (_, col) => {\n const id = `${row}-${col}`;\n const ship = shipCells.get(id);\n const shot = view.shots?.[row]?.[col];\n const cls = ['bs-grid__cell', ship && 'is-ship', ship?.sunk && 'is-sunk', shot && `is-${shot}`,\n preview.has(id) && (view.preview.valid ? 'is-preview' : 'is-invalid'),\n sameCell(selected, { row, col }) && 'is-selected', sameCell(cursor, { row, col }) && 'is-cursor'].filter(Boolean).join(' ');\n return <button key={id} type=\"button\" role=\"gridcell\" tabIndex={-1} className={cls} disabled={!view.interactive}\n aria-label={`${ROWS[row]}${col + 1}${shot === 'hit' ? ', impacto' : shot === 'miss' ? ', agua' : ''}${ship ? ', barco' : ''}`}\n onMouseEnter={() => onHover({ row, col })} onClick={() => onSelect({ row, col })} />;\n })}\n </div>)}\n </div>;\n}\n\nfunction HistorySummary({ game, currentUserId, status }) {\n const { total, hits } = countShots(game.targetShots);\n const sunk = game.sunkEnemyShips?.length || 0;\n const showStats = ['active', 'won', 'closed', 'conflict'].includes(game.status) && total > 0;\n const iWon = game.status === 'won' && sameUser(currentUserId, game.winnerId);\n return <section className=\"chat-game-card chat-game-card--history bs-card bs-card--history\" aria-label=\"Partida de Batalla Naval\">\n <header className=\"chat-game-header\">\n <div className=\"chat-game-heading\">\n <span className=\"chat-game-eyebrow\">MINIJUEGOS · 2 JUGADORES</span>\n <h3>Batalla Naval <Anchor size={13} aria-hidden=\"true\" className=\"bs-title-icon\" /></h3>\n </div>\n </header>\n <p className={`chat-game-status${iWon ? ' bs-status--win' : ''}`}>{status}</p>\n {showStats && <p className=\"bs-history-stats\">Disparos {total} · Impactos {hits} · Hundidos {sunk}/{FLEET.length}</p>}\n <VerificationBadge game={game} />\n </section>;\n}\n\nfunction BattleshipGameCard({ gameKey, currentUserId, variant = 'panel', onMinimize, onDismiss }) {\n const game = useChatGames((state) => state.games[gameKey]);\n const connected = useChatConnectionStatus() === 'connected';\n if (!game) return null;\n const status = getGameStatus(game, currentUserId);\n if (variant === 'history') return <HistorySummary game={game} currentUserId={currentUserId} status={status} />;\n return <BattleshipPanel game={game} gameKey={gameKey} currentUserId={currentUserId} connected={connected}\n status={status} variant={variant} onMinimize={onMinimize} onDismiss={onDismiss} />;\n}\n\nfunction BattleshipPanel({ game, gameKey, currentUserId, connected, status, variant, onMinimize, onDismiss }) {\n const stageRef = useRef(null);\n const sceneRef = useRef(null);\n const animatingRef = useRef(false);\n const lastSeenShotRef = useRef(undefined);\n const lastSelectRef = useRef({ cell: null, time: 0 });\n const handlersRef = useRef({});\n const soundTimersRef = useRef(new Set());\n const lastStatusRef = useRef(game.status);\n const hintId = useId();\n const [sceneStatus, setSceneStatus] = useState('idle');\n const [viewMode, setViewMode] = useState('own');\n const [hovered, setHovered] = useState(null);\n const [cursor, setCursor] = useState(null);\n const [selected, setSelected] = useState(null);\n const [orientation, setOrientation] = useState('horizontal');\n const [activeShipId, setActiveShipId] = useState(null);\n const [radar, setRadar] = useState(false);\n const [expanded, setExpanded] = useState(false);\n const [animating, setAnimating] = useState(false);\n const [announcement, setAnnouncement] = useState(null);\n\n const isHost = sameUser(currentUserId, game.hostId);\n const isGuest = sameUser(currentUserId, game.guestId);\n const isParticipant = isHost || isGuest;\n const terminal = isTerminalGame(game);\n const placing = game.status === 'placement';\n const battle = game.status === 'active' || game.status === 'won';\n const myTurn = game.status === 'active' && sameUser(currentUserId, game.turnId);\n const busy = !connected || Boolean(game.pending) || Boolean(game.pendingEvent);\n const canFire = myTurn && !game.pendingShot && !busy && !game.error && !animating;\n const canPlace = placing && !game.myReady && !busy;\n const sceneVisible = SCENE_STATUSES.includes(game.status) && (game.status !== 'closed' || (game.myFleet?.length ?? 0) > 0);\n const sceneReady = sceneStatus === 'ready';\n\n const myFleet = useMemo(() => game.myFleet || [], [game.myFleet]);\n const incomingShots = game.incomingShots || EMPTY_SHOTS;\n const targetShots = game.targetShots || EMPTY_SHOTS;\n const ownBoard = useMemo(() => buildBoard(myFleet), [myFleet]);\n const placedIds = useMemo(() => new Set(myFleet.map((ship) => ship.id)), [myFleet]);\n const fleetComplete = FLEET.every((ship) => placedIds.has(ship.id));\n const currentShip = FLEET.find((ship) => ship.id === activeShipId && !placedIds.has(ship.id)) || FLEET.find((ship) => !placedIds.has(ship.id)) || null;\n\n const ownShips = useMemo(() => myFleet.map((ship) => ({ ...ship, sunk: Boolean(ship.cells?.length) && ship.cells.every((cell) => shotAt(incomingShots, cell) === 'hit') })), [myFleet, incomingShots]);\n const enemyShips = useMemo(() => (game.sunkEnemyShips || []).filter((ship) => ship?.cells?.length)\n .map((ship) => ({ ...ship, size: ship.size ?? ship.cells.length, sunk: true })), [game.sunkEnemyShips]);\n const { total: shotCount, hits: hitCount } = useMemo(() => countShots(targetShots), [targetShots]);\n const radarContacts = useMemo(() => {\n const cells = [];\n targetShots.forEach((row, r) => row?.forEach((shot, c) => { if (shot === 'hit') cells.push({ row: r, col: c }); }));\n return cells;\n }, [targetShots]);\n\n const mode = placing ? 'own' : viewMode;\n const anchor = hovered || cursor;\n const preview = useMemo(() => {\n if (!canPlace || !currentShip || !anchor) return null;\n const result = validatePlacement(ownBoard, { shipId: currentShip.id, row: anchor.row, col: anchor.col, orientation });\n return { cells: result.ok ? result.ship.cells : previewCells(anchor, currentShip.size, orientation), valid: result.ok };\n }, [canPlace, currentShip, anchor, ownBoard, orientation]);\n\n const buildView = useCallback((viewModeArg, hideCell) => {\n if (viewModeArg === 'target') {\n const shots = hideCell ? targetShots.map((row, r) => row.map((shot, c) => (r === hideCell.row && c === hideCell.col ? null : shot))) : targetShots;\n const ships = hideCell ? enemyShips.map((ship) => (shipAt([ship], hideCell) ? { ...ship, sunk: false } : ship)) : enemyShips;\n return { mode: 'target', ships, shots, preview: null, interactive: canFire };\n }\n const shots = hideCell ? incomingShots.map((row, r) => row.map((shot, c) => (r === hideCell.row && c === hideCell.col ? null : shot))) : incomingShots;\n const ships = hideCell ? ownShips.map((ship) => (shipAt([ship], hideCell) ? { ...ship, sunk: false } : ship)) : ownShips;\n return { mode: 'own', ships, shots, preview: placing ? preview : null, interactive: canPlace };\n }, [targetShots, enemyShips, incomingShots, ownShips, placing, preview, canFire, canPlace]);\n const view = useMemo(() => buildView(mode), [buildView, mode]);\n\n const announce = useCallback((text, kind = 'info') => setAnnouncement({ text, kind, id: Date.now() }), []);\n\n const fire = useCallback((cell = selected) => {\n if (!canFire || !isCell(cell)) return;\n if (shotAt(targetShots, cell)) { announce(`Ya disparaste en ${cellLabel(cell)}`); return; }\n setSelected(null);\n sceneRef.current?.selectCell?.(null);\n playUiSound('ui_click');\n void call('bsFire', gameKey, { row: cell.row, col: cell.col });\n }, [canFire, selected, targetShots, gameKey, announce]);\n\n const placeAt = useCallback((cell) => {\n if (!canPlace || !isCell(cell)) return;\n const placed = shipAt(myFleet, cell);\n if (placed) {\n setActiveShipId(placed.id);\n if (placed.orientation) setOrientation(placed.orientation);\n playUiSound('ui_click');\n void call('bsRemoveShip', gameKey, placed.id);\n return;\n }\n if (!currentShip) return;\n const result = validatePlacement(ownBoard, { shipId: currentShip.id, row: cell.row, col: cell.col, orientation });\n if (!result.ok) { announce(result.reason === 'overlap' ? 'Se superpone con otro barco' : 'No cabe en esa posición', 'miss'); return; }\n setActiveShipId(null);\n playUiSound('ship_place');\n void call('bsPlaceShip', gameKey, { shipId: currentShip.id, row: cell.row, col: cell.col, orientation });\n }, [canPlace, myFleet, currentShip, ownBoard, orientation, gameKey, announce]);\n\n const selectCell = useCallback((cell) => {\n if (!isCell(cell)) return;\n setCursor(cell);\n if (placing) { placeAt(cell); return; }\n if (mode !== 'target' || !canFire) return;\n const now = Date.now();\n const last = lastSelectRef.current;\n lastSelectRef.current = { cell, time: now };\n if (sameCell(last.cell, cell) && now - last.time < DOUBLE_SELECT_MS) { fire(cell); return; }\n if (shotAt(targetShots, cell)) { announce(`Ya disparaste en ${cellLabel(cell)}`); return; }\n setSelected(cell);\n sceneRef.current?.selectCell?.(cell);\n }, [placing, placeAt, mode, canFire, fire, targetShots, announce]);\n\n handlersRef.current = { selectCell, setHovered };\n\n // One WebGL context per card: created once while the board is visible, disposed on unmount.\n useEffect(() => {\n const container = stageRef.current;\n if (!sceneVisible || !container) return undefined;\n if (!hasWebGL()) { setSceneStatus('fallback'); return undefined; }\n let disposed = false;\n let scene = null;\n setSceneStatus('loading');\n import('./scene/createBattleScene.js')\n .then(({ createBattleScene }) => {\n if (disposed) return;\n scene = createBattleScene(container, {\n quality: 'auto',\n reducedMotion: prefersReducedMotion(),\n onCellHover: (cell) => { if (!disposed) handlersRef.current.setHovered(isCell(cell) ? { row: cell.row, col: cell.col } : null); },\n onCellSelect: (cell) => { if (!disposed) handlersRef.current.selectCell(isCell(cell) ? { row: cell.row, col: cell.col } : null); },\n });\n sceneRef.current = scene;\n setSceneStatus('ready');\n })\n .catch((error) => {\n if (disposed) return;\n console.error('[battleship] No se pudo iniciar la escena', error);\n setSceneStatus('fallback');\n });\n return () => {\n disposed = true;\n sceneRef.current = null;\n try { scene?.dispose(); } catch (error) { console.error('[battleship] Error al liberar la escena', error); }\n };\n }, [sceneVisible]);\n\n useEffect(() => {\n battleshipSounds.preload();\n const timers = soundTimersRef.current;\n return () => { timers.forEach(clearTimeout); timers.clear(); };\n }, []);\n\n // Ocean bed only while this board is open (unmounted when minimized/closed).\n const ambient = sceneVisible && !terminal;\n useEffect(() => (ambient ? holdAmbient() : undefined), [ambient]);\n\n // Both fleets committed: sonar sweep once per game.\n useEffect(() => {\n const before = lastStatusRef.current;\n lastStatusRef.current = game.status;\n if (before === 'placement' && game.status === 'active') scheduleCues([{ name: 'sonar_ping', at: 0 }], () => `${game.gameId}:start`, soundTimersRef.current);\n }, [game.status, game.gameId]);\n\n // Animate each new shot once (never replay history on mount), then show the settled state.\n // Sounds follow the same event id, so RESYNC/replayed frames (no new id) stay silent.\n const lastShot = game.lastShot;\n useEffect(() => {\n if (!sceneReady && sceneStatus !== 'fallback') return;\n const eventId = lastShot?.eventId ?? null;\n if (lastSeenShotRef.current === undefined) { lastSeenShotRef.current = eventId; return; }\n if (!eventId || eventId === lastSeenShotRef.current) return;\n lastSeenShotRef.current = eventId;\n const incoming = !sameUser(lastShot.by, currentUserId);\n const cell = { row: lastShot.row, col: lastShot.col };\n const label = cellLabel(cell);\n const sunkId = typeof lastShot.sunk === 'string' ? lastShot.sunk\n : lastShot.sunk ? shipAt(incoming ? myFleet : (game.sunkEnemyShips || []), cell)?.id : null;\n const text = incoming\n ? (lastShot.sunk ? `Te hundieron el ${shipName(sunkId)}` : lastShot.result === 'hit' ? `El rival impactó en ${label}` : `El rival falló: agua en ${label}`)\n : (lastShot.sunk ? `¡Hundiste el ${shipName(sunkId)}!` : lastShot.result === 'hit' ? `¡Impacto en ${label}!` : `Agua en ${label}`);\n const kind = lastShot.result === 'hit' ? 'hit' : 'miss';\n const nextMode = incoming ? 'own' : 'target';\n // The cruiser alarm is keyed per game: it can sound only once per cruiser.\n const cruiserAlarm = incoming && crossesCruiserAlarm(myFleet, game.incomingShots, lastShot);\n const impact = impactCues({ result: lastShot.result, sunk: Boolean(lastShot.sunk), defeated: Boolean(lastShot.defeated), won: !incoming, cruiserAlarm });\n const cueKey = (name) => (name === 'cruiser_damage_alarm' ? `${game.gameId}:cruiser`\n : name === 'victory' || name === 'defeat' ? `${game.gameId}:end` : eventId);\n const timers = soundTimersRef.current;\n setViewMode(nextMode);\n const scene = sceneRef.current;\n if (!scene?.playShot) { scheduleCues(impact, cueKey, timers); announce(text, kind); return; }\n scheduleCues(launchCues({ incoming }), cueKey, timers);\n animatingRef.current = true;\n setAnimating(true);\n let cancelled = false;\n try { scene.setView(buildView(nextMode, cell)); } catch { /* scene keeps its last view */ }\n const hold = prefersReducedMotion() ? 0 : 600;\n Promise.resolve(scene.playShot({ row: cell.row, col: cell.col, result: lastShot.result, sunk: Boolean(lastShot.sunk), incoming }))\n .catch(() => {})\n .then(() => { scheduleCues(impact, cueKey, timers); if (!cancelled) announce(text, kind); return new Promise((resolve) => setTimeout(resolve, hold)); })\n .then(() => { if (!cancelled) { animatingRef.current = false; setAnimating(false); } });\n return () => { cancelled = true; animatingRef.current = false; setAnimating(false); };\n // Only a new event id may trigger an animation.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sceneReady, sceneStatus, lastShot?.eventId]);\n\n // Auto-switch: my turn → target, rival turn → my fleet (after any running animation).\n useEffect(() => {\n if (animating || game.status !== 'active') return;\n setViewMode(myTurn ? 'target' : 'own');\n }, [myTurn, game.status, animating]);\n\n useEffect(() => { if (!canFire) setSelected(null); }, [canFire]);\n\n // Push the settled view to the scene unless a shot animation owns it.\n useEffect(() => {\n if (!sceneReady || animatingRef.current) return;\n try { sceneRef.current?.setView(view); } catch (error) { console.error('[battleship] setView', error); }\n }, [sceneReady, view, animating]);\n\n useEffect(() => {\n if (!sceneReady) return;\n sceneRef.current?.selectCell?.(mode === 'target' ? selected : null);\n }, [sceneReady, selected, mode]);\n\n useEffect(() => {\n if (!sceneReady) return;\n const scene = sceneRef.current;\n scene?.setRadarVisible?.(radar && mode === 'target');\n scene?.setRadarContacts?.(radarContacts);\n }, [sceneReady, radar, mode, radarContacts]);\n\n const rotate = () => { playUiSound('ship_rotate'); setOrientation((value) => (value === 'horizontal' ? 'vertical' : 'horizontal')); };\n const ready = () => { if (fleetComplete && canPlace) { playUiSound('ui_click'); void call('bsReady', gameKey); } };\n const clicked = (action) => (...args) => { playUiSound('ui_click'); action(...args); };\n const toggleRadar = () => {\n playUiSound(radar ? 'ui_click' : 'sonar_ping');\n setRadar((value) => !value);\n };\n\n const handleStageKeyDown = (event) => {\n if (event.target !== event.currentTarget || event.altKey || event.ctrlKey || event.metaKey) return;\n const moves = { ArrowUp: [-1, 0], ArrowDown: [1, 0], ArrowLeft: [0, -1], ArrowRight: [0, 1] };\n if (moves[event.key]) {\n event.preventDefault();\n const [dr, dc] = moves[event.key];\n const base = (mode === 'target' ? selected : null) || cursor || hovered;\n const next = base ? { row: Math.min(BOARD_SIZE - 1, Math.max(0, base.row + dr)), col: Math.min(BOARD_SIZE - 1, Math.max(0, base.col + dc)) } : { row: 0, col: 0 };\n setCursor(next);\n setHovered(null);\n if (mode === 'target' && canFire) { setSelected(next); sceneRef.current?.selectCell?.(next); }\n } else if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n if (placing) placeAt(cursor || hovered);\n else fire(selected || cursor);\n }\n };\n\n const handleCardKeyDown = (event) => {\n if (event.defaultPrevented || event.altKey || event.ctrlKey || event.metaKey) return;\n if (/^(INPUT|TEXTAREA|SELECT)$/.test(event.target.tagName) || event.target.isContentEditable) return;\n if (event.key === 'r' || event.key === 'R') {\n event.preventDefault();\n if (placing) rotate(); else sceneRef.current?.resetCamera?.();\n } else if (event.key === 'Escape' && expanded) {\n event.preventDefault();\n event.stopPropagation();\n setExpanded(false);\n }\n };\n\n const verification = <VerificationBadge game={game} />;\n const iWon = game.status === 'won' && sameUser(currentUserId, game.winnerId);\n const statusText = !connected && !terminal ? 'Sin conexión · esperando reconexión' : game.pending ? 'Sincronizando…' : status;\n const sunkCount = enemyShips.length;\n\n return (\n <section className={`chat-game-card bs-card${myTurn ? ' chat-game-card--my-turn' : ''}${variant ? ` chat-game-card--${variant}` : ''}${expanded ? ' bs-card--expanded' : ''}`}\n aria-label=\"Partida de Batalla Naval\" onKeyDown={handleCardKeyDown}>\n <header className=\"chat-game-header\">\n <div className=\"chat-game-heading\">\n <span className=\"chat-game-eyebrow\">MINIJUEGOS · 2 JUGADORES</span>\n <h3>Batalla Naval <Anchor size={13} aria-hidden=\"true\" className=\"bs-title-icon\" /></h3>\n </div>\n {variant === 'panel' && <GameSoundControls manager={battleshipSounds} />}\n {sceneVisible && <button className=\"chat-game-close bs-expand\" type=\"button\" aria-pressed={expanded}\n aria-label={expanded ? 'Reducir tablero' : 'Ampliar tablero'} title={expanded ? 'Reducir (Esc)' : 'Ampliar'} onClick={clicked(() => setExpanded((value) => !value))}>\n {expanded ? <Minimize2 size={15} aria-hidden=\"true\" /> : <Maximize2 size={15} aria-hidden=\"true\" />}\n </button>}\n {onMinimize && <button className=\"chat-game-close\" type=\"button\" aria-label=\"Minimizar tablero\" title=\"Minimizar tablero\" onClick={() => { setExpanded(false); onMinimize(); }}><ChevronDown size={16} aria-hidden=\"true\" /></button>}\n {isParticipant && !terminal && (\n <button className=\"chat-game-close\" type=\"button\" aria-label=\"Finalizar partida para ambos jugadores\" title=\"Finalizar partida para ambos\" onClick={() => void call('act', gameKey, 'game_end')} disabled={!connected}><X size={16} aria-hidden=\"true\" /></button>\n )}\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 <div className=\"bs-statusline\">\n <p className={`chat-game-status${iWon ? ' bs-status--win' : ''}`} role=\"status\">{statusText}</p>\n {verification}\n </div>\n\n {game.status === 'invited' && <div className=\"bs-invite\">\n <p>Coloca 5 barcos en un tablero de 10×10 y hunde la flota rival por turnos.</p>\n {isGuest && <div className=\"chat-game-actions\">\n <button type=\"button\" className=\"chat-game-action chat-game-action--primary\" disabled={busy} onClick={clicked(() => void call('act', gameKey, 'game_accept'))}>Aceptar partida</button>\n <button type=\"button\" className=\"chat-game-action\" disabled={busy} onClick={clicked(() => void call('act', gameKey, 'game_decline'))}>Rechazar</button>\n </div>}\n </div>}\n\n {sceneVisible && <>\n {battle && <div className=\"bs-hud\" role=\"toolbar\" aria-label=\"Vista del tablero\">\n <div className=\"bs-segment\">\n <button type=\"button\" aria-pressed={viewMode === 'target'} onClick={clicked(() => setViewMode('target'))}><Crosshair size={14} aria-hidden=\"true\" />Objetivo</button>\n <button type=\"button\" aria-pressed={viewMode === 'own'} onClick={clicked(() => setViewMode('own'))}><Anchor size={14} aria-hidden=\"true\" />Mi flota</button>\n </div>\n <dl className=\"bs-stats\">\n <div><dt>Disparos</dt><dd>{shotCount}</dd></div>\n <div><dt>Impactos</dt><dd>{hitCount}</dd></div>\n <div><dt>Hundidos</dt><dd>{sunkCount}/{FLEET.length}</dd></div>\n </dl>\n </div>}\n\n <div className=\"bs-stage-wrap\">\n <div ref={stageRef} className={`bs-stage${sceneStatus === 'fallback' ? ' bs-stage--fallback' : ''}`} tabIndex={0} role=\"application\"\n aria-label={placing ? 'Tablero 3D de tu flota. Flechas para mover, Enter para colocar o quitar un barco, R para rotar.' : 'Tablero 3D de Batalla Naval. Flechas para mover la selección, Enter para disparar, R para centrar la cámara.'}\n aria-describedby={hintId} aria-busy={sceneStatus === 'loading'} onKeyDown={handleStageKeyDown}>\n {sceneStatus === 'fallback' && <FallbackGrid view={view} selected={mode === 'target' ? selected : null} cursor={cursor} onSelect={selectCell} onHover={setHovered} />}\n </div>\n {sceneStatus === 'loading' && <div className=\"bs-stage-state\" role=\"status\"><Waves size={16} aria-hidden=\"true\" /> Preparando el océano…</div>}\n {sceneStatus === 'fallback' && <p className=\"bs-fallback-note\"><TriangleAlert size={12} aria-hidden=\"true\" /> Vista 3D no disponible · modo 2D</p>}\n <div className=\"bs-cell-chip\" aria-hidden=\"true\">{placing ? cellLabel(anchor) : mode === 'target' ? cellLabel(selected || hovered) : cellLabel(hovered)}</div>\n <div className=\"bs-live\" aria-live=\"polite\" aria-atomic=\"true\">\n {announcement && <span key={announcement.id} className={`bs-toast bs-toast--${announcement.kind}`}>{announcement.text}</span>}\n </div>\n </div>\n <p id={hintId} className=\"bs-hint\">{placing\n ? 'Clic para colocar · clic en un barco para quitarlo · R para rotar'\n : 'Arrastra para rotar · doble clic o Enter para disparar'}</p>\n\n {placing && <div className=\"bs-placement\">\n <ul className=\"bs-fleet\" aria-label=\"Tu flota\">\n {FLEET.map((ship) => {\n const placed = placedIds.has(ship.id);\n const active = currentShip?.id === ship.id;\n return <li key={ship.id}>\n <button type=\"button\" className={`bs-ship${placed ? ' is-placed' : ''}${active ? ' is-active' : ''}`} aria-pressed={active}\n disabled={!canPlace} title={placed ? 'Quitar y volver a colocar' : 'Seleccionar barco'}\n onClick={clicked(() => { if (placed) void call('bsRemoveShip', gameKey, ship.id); setActiveShipId(ship.id); })}>\n <span className=\"bs-ship__name\">{capitalize(shipName(ship.id))}</span>\n <span className=\"bs-ship__pips\" aria-label={`${ship.size} casillas`}>{Array.from({ length: ship.size }, (_, i) => <i key={i} />)}</span>\n {placed && <Check size={13} aria-label=\"colocado\" />}\n </button>\n </li>;\n })}\n </ul>\n <div className=\"chat-game-actions bs-actions\">\n <button type=\"button\" className=\"chat-game-action bs-btn\" disabled={!canPlace} onClick={rotate} title=\"Rotar (R)\">\n <RotateCw size={15} aria-hidden=\"true\" />{orientation === 'horizontal' ? 'Horizontal' : 'Vertical'}\n </button>\n <button type=\"button\" className=\"chat-game-action bs-btn\" disabled={!canPlace} onClick={() => { playUiSound('ship_place'); void call('bsRandomFleet', gameKey); }}><Shuffle size={15} aria-hidden=\"true\" />Aleatorio</button>\n <button type=\"button\" className=\"chat-game-action chat-game-action--primary bs-btn\" disabled={!canPlace || !fleetComplete} onClick={ready}>\n <Check size={15} aria-hidden=\"true\" />{game.myReady ? 'Flota lista' : `Listo (${placedIds.size}/${FLEET.length})`}\n </button>\n </div>\n {game.myReady && <p className=\"bs-waiting\">{game.opponentReady ? 'Ambas flotas listas · iniciando…' : 'Flota lista. Esperando a que el rival coloque su flota…'}</p>}\n </div>}\n\n {battle && <div className=\"chat-game-actions bs-actions\">\n <button type=\"button\" className=\"chat-game-action chat-game-action--primary bs-btn bs-btn--fire\" disabled={!canFire || !selected || mode !== 'target'} onClick={() => fire()}\n title={selected ? `Disparar en ${cellLabel(selected)} (Enter)` : 'Selecciona una casilla'}>\n <Crosshair size={15} aria-hidden=\"true\" />Disparar{selected ? ` · ${cellLabel(selected)}` : ''}\n </button>\n <button type=\"button\" className=\"chat-game-action bs-btn\" aria-pressed={radar} disabled={mode !== 'target' || !sceneReady} onClick={toggleRadar} title=\"Radar de impactos\">\n <Radar size={15} aria-hidden=\"true\" />Radar\n </button>\n <button type=\"button\" className=\"chat-game-action bs-btn\" disabled={!sceneReady} onClick={clicked(() => sceneRef.current?.resetCamera?.())} title=\"Centrar cámara (R)\">\n <LocateFixed size={15} aria-hidden=\"true\" /><span className=\"bs-btn-label\">Centrar</span>\n </button>\n </div>}\n </>}\n\n {game.status === 'conflict' && isParticipant && <SyncControls sync={game.sync} connected={connected}\n onResync={() => void call('requestResync', gameKey)} onAdoptOffer={() => void call('adoptResyncOffer', gameKey)} />}\n {game.error && <div className=\"chat-game-error\" role=\"alert\"><span>{game.error}</span>\n {game.pendingEvent && <button type=\"button\" className=\"chat-game-action\" disabled={!connected || game.pending} onClick={() => void call('retry', gameKey)}>Reintentar</button>}\n </div>}\n <footer className=\"chat-game-footer\">{terminal ? 'Puedes seguir conversando o invitar a otra partida.' : 'Hunde los 5 barcos rivales. El chat sigue disponible.'}</footer>\n </section>\n );\n}\n\nexport default memo(BattleshipGameCard);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BattleshipGameCard-8H-sBCsv.js","names":["sameCell","_Fragment","useChatGames","validatePlacement","createBoard","placeShip","FLEET","useChatConnectionStatus","isTerminalGame","getVerificationLabel","getGameStatus","createSoundManager","GameSoundControls","connect4Sounds","hasWebGL","AMBIENT","battleshipSounds","chatSoundUrl","name","hidden","playUiSound","scheduleCues","run","keyFor","at","timer","timers","ambientHolders","syncAmbient","holdAmbient","released","CRUISER_ID","sameCell$1","a","b","hitsOn","ship","shots","cell","skip","crossesCruiserAlarm","shot","cruiser","fleet","before","incomingShots","after","launchCues","incoming","impactCues","cues","result","sunk","cruiserAlarm","defeated","won","ROWS","SHIP_NAMES","SCENE_STATUSES","DOUBLE_SELECT_MS","EMPTY_SHOTS","cellLabel","sameCell","isCell","shipName","id","shotAt","shipAt","ships","item","capitalize","text","prefersReducedMotion","call","args","buildBoard","board","first","placed","previewCells","size","anchor","orientation","index","countShots","total","hits","row","SyncControls","sync","connected","onAdoptOffer","onResync","VerificationBadge","label","game","ShieldCheck","TriangleAlert","FallbackGrid","shipCells","preview","view","onHover","col","cls","selected","cursor","onSelect","HistorySummary","showStats","iWon","sameUser","currentUserId","Anchor","status","BattleshipGameCard","state","gameKey","variant","BattleshipPanel","stageRef","useRef","sceneRef","animatingRef","lastSeenShotRef","lastSelectRef","handlersRef","soundTimersRef","lastStatusRef","hintId","useId","sceneStatus","setSceneStatus","useState","viewMode","setViewMode","hovered","setHovered","setCursor","setSelected","setOrientation","activeShipId","setActiveShipId","radar","setRadar","expanded","setExpanded","animating","setAnimating","announcement","setAnnouncement","isHost","isGuest","isParticipant","terminal","placing","battle","myTurn","busy","canFire","canPlace","sceneVisible","sceneReady","myFleet","useMemo","targetShots","ownBoard","placedIds","fleetComplete","currentShip","ownShips","enemyShips","shotCount","hitCount","radarContacts","cells","r","c","mode","buildView","useCallback","viewModeArg","hideCell","announce","fire","placeAt","selectCell","now","last","useEffect","container","disposed","scene","createBattleScene","error","ambient","lastShot","eventId","sunkId","kind","nextMode","impact","cueKey","cancelled","hold","resolve","rotate","value","ready","clicked","action","toggleRadar","handleStageKeyDown","event","moves","dr","dc","base","next","handleCardKeyDown","verification","statusText","sunkCount","jsx","Minimize2","Maximize2","onMinimize","ChevronDown","X","onDismiss","Fragment","Crosshair","Waves","active","i","Check","RotateCw","Shuffle","Radar","LocateFixed","BattleshipGameCard_default","memo"],"sources":["../../src/games/battleship/sound/battleshipSounds.js","../../src/games/battleship/sound/cues.js","../../src/games/battleship/BattleshipGameCard.jsx"],"sourcesContent":["import { createSoundManager } from '../../../audio/createSoundManager.js';\nimport { connect4Sounds } from '../../connect4/connect4Sounds.js';\nimport { chatSoundUrl } from '../../../assets/chatAssets.js';\n\nconst AMBIENT = 'ocean_ambient_loop';\n\n// Files come from the supplied pack; levels even out its loudness (measured\n// mean volume) so impacts stay present and alarms/fly-bys never dominate.\nexport const battleshipSounds = createSoundManager({\n id: 'battleship',\n baseUrl: () => chatSoundUrl('battleship_audio_pack/assets'), // resolved lazily at fetch time\n settingsFrom: connect4Sounds, // one mute/volume preference for every chat game\n sounds: Object.fromEntries([\n 'cannon_fire', 'projectile_flyby', 'water_splash', 'ship_hit', 'ship_heavy_hit', 'ship_sinking',\n 'sonar_ping', 'cruiser_damage_alarm', 'ship_place', 'ship_rotate', 'ui_click', 'victory', 'defeat', AMBIENT,\n ].map((name) => [name, `${name}.ogg`])),\n levels: {\n cannon_fire: 0.7, projectile_flyby: 0.3, water_splash: 0.9, ship_hit: 0.9, ship_heavy_hit: 1,\n ship_sinking: 0.4, sonar_ping: 0.35, cruiser_damage_alarm: 0.3, ship_place: 0.4, ship_rotate: 0.4,\n ui_click: 0.3, victory: 0.55, defeat: 0.4, [AMBIENT]: 0.22,\n },\n});\n\nconst hidden = () => typeof document !== 'undefined' && document.hidden;\n\n/** Immediate feedback for a local UI action (never deduplicated). */\nexport function playUiSound(name) {\n if (!hidden()) battleshipSounds.play(name);\n}\n\n/**\n * Plays timed cues once per key. Pending timers live in `timers` so the panel\n * can cancel them on unmount; a hidden page stays silent.\n */\nexport function scheduleCues(cues, keyFor, timers) {\n cues.forEach(({ name, at }) => {\n const run = () => { if (!hidden()) battleshipSounds.play(name, { key: keyFor(name) }); };\n if (at <= 0) { run(); return; }\n const timer = setTimeout(() => { timers.delete(timer); run(); }, at);\n timers.add(timer);\n });\n}\n\n// Ocean bed: plays while at least one open board holds it and the page is visible.\nlet ambientHolders = 0;\nconst syncAmbient = () => {\n if (ambientHolders > 0 && !hidden()) battleshipSounds.startLoop(AMBIENT);\n else battleshipSounds.stopLoop(AMBIENT);\n};\n\nexport function holdAmbient() {\n ambientHolders += 1;\n if (ambientHolders === 1) document.addEventListener('visibilitychange', syncAmbient);\n syncAmbient();\n let released = false;\n return () => {\n if (released) return;\n released = true;\n ambientHolders -= 1;\n if (ambientHolders === 0) document.removeEventListener('visibilitychange', syncAmbient);\n syncAmbient();\n };\n}\n","// Pure sound choreography for Battleship (no audio, no DOM): what to play and\n// when, relative to the shot animation. Times are milliseconds.\n\nexport const CRUISER_ID = 'cruiser';\nexport const CRUISER_ALARM_HITS = 2;\n\nconst sameCell = (a, b) => a.row === b.row && a.col === b.col;\nconst hitsOn = (ship, shots, skip) => ship.cells\n .filter((cell) => shots?.[cell.row]?.[cell.col] === 'hit' && !(skip && sameCell(cell, skip))).length;\n\n/**\n * True only for the confirmed hit that takes our own cruiser from fewer than two\n * hits to two or more. `incomingShots` already contains `shot`. The enemy cruiser\n * stays hidden until sunk, so only our fleet can raise the alarm.\n */\nexport function crossesCruiserAlarm(fleet, incomingShots, shot) {\n if (shot?.result !== 'hit') return false;\n const cruiser = (fleet || []).find((ship) => ship.id === CRUISER_ID);\n if (!cruiser?.cells?.some((cell) => sameCell(cell, shot))) return false;\n const before = hitsOn(cruiser, incomingShots, shot);\n const after = hitsOn(cruiser, incomingShots);\n return before < CRUISER_ALARM_HITS && after >= CRUISER_ALARM_HITS;\n}\n\n// Launch cues play when the projectile leaves; impact cues when it lands.\nexport function launchCues({ incoming }) {\n return incoming\n ? [{ name: 'projectile_flyby', at: 0 }]\n : [{ name: 'cannon_fire', at: 0 }, { name: 'projectile_flyby', at: 180 }];\n}\n\nexport function impactCues({ result, sunk, defeated, won, cruiserAlarm }) {\n const cues = result === 'hit'\n ? (sunk ? [{ name: 'ship_heavy_hit', at: 0 }, { name: 'ship_sinking', at: 350 }] : [{ name: 'ship_hit', at: 0 }])\n : [{ name: 'water_splash', at: 0 }];\n if (cruiserAlarm) cues.push({ name: 'cruiser_damage_alarm', at: 500 });\n if (defeated) cues.push({ name: won ? 'victory' : 'defeat', at: sunk ? 1600 : 600 });\n return cues;\n}\n","/* eslint-disable react/prop-types */\nimport { memo, useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { ChevronDown, Crosshair, LocateFixed, Maximize2, Minimize2, Radar, RotateCw, Shuffle, Check, Anchor, TriangleAlert, Waves, ShieldCheck, X } from 'lucide-react';\nimport { useChatConnectionStatus } from '../../core/connection/connectionStore.js';\nimport useChatGames from '../shared/useChatGames.js';\nimport { getGameStatus, getVerificationLabel, isTerminalGame, sameUser } from '../shared/gameStatus.js';\nimport { BOARD_SIZE, FLEET, createBoard, placeShip, validatePlacement } from './logic';\nimport { hasWebGL } from './webglSupport';\nimport GameSoundControls from '../shared/GameSoundControls.jsx';\nimport { battleshipSounds, holdAmbient, playUiSound, scheduleCues } from './sound/battleshipSounds';\nimport { crossesCruiserAlarm, impactCues, launchCues } from './sound/cues';\nimport '../connect4/games.css';\nimport './battleship.css';\n\nconst ROWS = 'ABCDEFGHIJ';\nconst SHIP_NAMES = { carrier: 'portaaviones', battleship: 'acorazado', cruiser: 'crucero', submarine: 'submarino', destroyer: 'destructor' };\nconst SCENE_STATUSES = ['placement', 'active', 'won', 'conflict', 'closed'];\nconst DOUBLE_SELECT_MS = 400;\nconst EMPTY_SHOTS = Array.from({ length: BOARD_SIZE }, () => Array(BOARD_SIZE).fill(null));\n\nconst cellLabel = (cell) => (cell ? `${ROWS[cell.row]}${cell.col + 1}` : '—');\nconst sameCell = (a, b) => Boolean(a && b && a.row === b.row && a.col === b.col);\nconst isCell = (cell) => Boolean(cell) && Number.isInteger(cell.row) && Number.isInteger(cell.col)\n && cell.row >= 0 && cell.row < BOARD_SIZE && cell.col >= 0 && cell.col < BOARD_SIZE;\nconst shipName = (id) => SHIP_NAMES[id] || 'barco';\nconst shotAt = (shots, cell) => shots?.[cell.row]?.[cell.col] ?? null;\nconst shipAt = (ships, cell) => ships.find((ship) => ship.cells?.some((item) => sameCell(item, cell)));\nconst capitalize = (text) => text.charAt(0).toUpperCase() + text.slice(1);\n\nconst prefersReducedMotion = () => typeof window !== 'undefined' && Boolean(window.matchMedia?.('(prefers-reduced-motion: reduce)').matches);\n\n// The store owns delivery errors; UI handlers must never leak rejected promises.\nconst call = (name, ...args) => Promise.resolve().then(() => useChatGames.getState()[name]?.(...args)).catch(() => {});\n\nfunction buildBoard(fleet) {\n let board = createBoard();\n for (const ship of fleet || []) {\n const first = ship.cells?.[0];\n if (!first) continue;\n const placed = placeShip(board, { shipId: ship.id, row: first.row, col: first.col, orientation: ship.orientation });\n if (placed.ok) board = placed.board;\n }\n return board;\n}\n\nfunction previewCells(anchor, size, orientation) {\n return Array.from({ length: size }, (_, index) => ({\n row: anchor.row + (orientation === 'vertical' ? index : 0),\n col: anchor.col + (orientation === 'horizontal' ? index : 0),\n })).filter(isCell);\n}\n\nfunction countShots(shots) {\n let total = 0; let hits = 0;\n for (const row of shots || []) for (const shot of row || []) { if (shot) total += 1; if (shot === 'hit') hits += 1; }\n return { total, hits };\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 VerificationBadge({ game }) {\n const label = getVerificationLabel(game);\n if (!label) return null;\n return <span className={`bs-badge bs-badge--${game.verification}`}>{game.verification === 'ok' && <ShieldCheck size={12} aria-hidden=\"true\" />}{game.verification === 'mismatch' && <TriangleAlert size={12} aria-hidden=\"true\" />}{label}</span>;\n}\n\n// 2D grid used when WebGL is unavailable: same interaction, no three.js.\nfunction FallbackGrid({ view, selected, cursor, onSelect, onHover }) {\n const shipCells = new Map();\n view.ships.forEach((ship) => ship.cells.forEach((cell) => shipCells.set(`${cell.row}-${cell.col}`, ship)));\n const preview = new Set((view.preview?.cells || []).map((cell) => `${cell.row}-${cell.col}`));\n return <div className=\"bs-grid\" role=\"grid\" aria-label={view.mode === 'target' ? 'Tablero objetivo' : 'Mi flota'} onMouseLeave={() => onHover(null)}>\n {Array.from({ length: BOARD_SIZE }, (_, row) => <div role=\"row\" key={row} className=\"bs-grid__row\">\n {Array.from({ length: BOARD_SIZE }, (_, col) => {\n const id = `${row}-${col}`;\n const ship = shipCells.get(id);\n const shot = view.shots?.[row]?.[col];\n const cls = ['bs-grid__cell', ship && 'is-ship', ship?.sunk && 'is-sunk', shot && `is-${shot}`,\n preview.has(id) && (view.preview.valid ? 'is-preview' : 'is-invalid'),\n sameCell(selected, { row, col }) && 'is-selected', sameCell(cursor, { row, col }) && 'is-cursor'].filter(Boolean).join(' ');\n return <button key={id} type=\"button\" role=\"gridcell\" tabIndex={-1} className={cls} disabled={!view.interactive}\n aria-label={`${ROWS[row]}${col + 1}${shot === 'hit' ? ', impacto' : shot === 'miss' ? ', agua' : ''}${ship ? ', barco' : ''}`}\n onMouseEnter={() => onHover({ row, col })} onClick={() => onSelect({ row, col })} />;\n })}\n </div>)}\n </div>;\n}\n\nfunction HistorySummary({ game, currentUserId, status }) {\n const { total, hits } = countShots(game.targetShots);\n const sunk = game.sunkEnemyShips?.length || 0;\n const showStats = ['active', 'won', 'closed', 'conflict'].includes(game.status) && total > 0;\n const iWon = game.status === 'won' && sameUser(currentUserId, game.winnerId);\n return <section className=\"chat-game-card chat-game-card--history bs-card bs-card--history\" aria-label=\"Partida de Batalla Naval\">\n <header className=\"chat-game-header\">\n <div className=\"chat-game-heading\">\n <span className=\"chat-game-eyebrow\">MINIJUEGOS · 2 JUGADORES</span>\n <h3>Batalla Naval <Anchor size={13} aria-hidden=\"true\" className=\"bs-title-icon\" /></h3>\n </div>\n </header>\n <p className={`chat-game-status${iWon ? ' bs-status--win' : ''}`}>{status}</p>\n {showStats && <p className=\"bs-history-stats\">Disparos {total} · Impactos {hits} · Hundidos {sunk}/{FLEET.length}</p>}\n <VerificationBadge game={game} />\n </section>;\n}\n\nfunction BattleshipGameCard({ gameKey, currentUserId, variant = 'panel', onMinimize, onDismiss }) {\n const game = useChatGames((state) => state.games[gameKey]);\n const connected = useChatConnectionStatus() === 'connected';\n if (!game) return null;\n const status = getGameStatus(game, currentUserId);\n if (variant === 'history') return <HistorySummary game={game} currentUserId={currentUserId} status={status} />;\n return <BattleshipPanel game={game} gameKey={gameKey} currentUserId={currentUserId} connected={connected}\n status={status} variant={variant} onMinimize={onMinimize} onDismiss={onDismiss} />;\n}\n\nfunction BattleshipPanel({ game, gameKey, currentUserId, connected, status, variant, onMinimize, onDismiss }) {\n const stageRef = useRef(null);\n const sceneRef = useRef(null);\n const animatingRef = useRef(false);\n const lastSeenShotRef = useRef(undefined);\n const lastSelectRef = useRef({ cell: null, time: 0 });\n const handlersRef = useRef({});\n const soundTimersRef = useRef(new Set());\n const lastStatusRef = useRef(game.status);\n const hintId = useId();\n const [sceneStatus, setSceneStatus] = useState('idle');\n const [viewMode, setViewMode] = useState('own');\n const [hovered, setHovered] = useState(null);\n const [cursor, setCursor] = useState(null);\n const [selected, setSelected] = useState(null);\n const [orientation, setOrientation] = useState('horizontal');\n const [activeShipId, setActiveShipId] = useState(null);\n const [radar, setRadar] = useState(false);\n const [expanded, setExpanded] = useState(false);\n const [animating, setAnimating] = useState(false);\n const [announcement, setAnnouncement] = useState(null);\n\n const isHost = sameUser(currentUserId, game.hostId);\n const isGuest = sameUser(currentUserId, game.guestId);\n const isParticipant = isHost || isGuest;\n const terminal = isTerminalGame(game);\n const placing = game.status === 'placement';\n const battle = game.status === 'active' || game.status === 'won';\n const myTurn = game.status === 'active' && sameUser(currentUserId, game.turnId);\n const busy = !connected || Boolean(game.pending) || Boolean(game.pendingEvent);\n const canFire = myTurn && !game.pendingShot && !busy && !game.error && !animating;\n const canPlace = placing && !game.myReady && !busy;\n const sceneVisible = SCENE_STATUSES.includes(game.status) && (game.status !== 'closed' || (game.myFleet?.length ?? 0) > 0);\n const sceneReady = sceneStatus === 'ready';\n\n const myFleet = useMemo(() => game.myFleet || [], [game.myFleet]);\n const incomingShots = game.incomingShots || EMPTY_SHOTS;\n const targetShots = game.targetShots || EMPTY_SHOTS;\n const ownBoard = useMemo(() => buildBoard(myFleet), [myFleet]);\n const placedIds = useMemo(() => new Set(myFleet.map((ship) => ship.id)), [myFleet]);\n const fleetComplete = FLEET.every((ship) => placedIds.has(ship.id));\n const currentShip = FLEET.find((ship) => ship.id === activeShipId && !placedIds.has(ship.id)) || FLEET.find((ship) => !placedIds.has(ship.id)) || null;\n\n const ownShips = useMemo(() => myFleet.map((ship) => ({ ...ship, sunk: Boolean(ship.cells?.length) && ship.cells.every((cell) => shotAt(incomingShots, cell) === 'hit') })), [myFleet, incomingShots]);\n const enemyShips = useMemo(() => (game.sunkEnemyShips || []).filter((ship) => ship?.cells?.length)\n .map((ship) => ({ ...ship, size: ship.size ?? ship.cells.length, sunk: true })), [game.sunkEnemyShips]);\n const { total: shotCount, hits: hitCount } = useMemo(() => countShots(targetShots), [targetShots]);\n const radarContacts = useMemo(() => {\n const cells = [];\n targetShots.forEach((row, r) => row?.forEach((shot, c) => { if (shot === 'hit') cells.push({ row: r, col: c }); }));\n return cells;\n }, [targetShots]);\n\n const mode = placing ? 'own' : viewMode;\n const anchor = hovered || cursor;\n const preview = useMemo(() => {\n if (!canPlace || !currentShip || !anchor) return null;\n const result = validatePlacement(ownBoard, { shipId: currentShip.id, row: anchor.row, col: anchor.col, orientation });\n return { cells: result.ok ? result.ship.cells : previewCells(anchor, currentShip.size, orientation), valid: result.ok };\n }, [canPlace, currentShip, anchor, ownBoard, orientation]);\n\n const buildView = useCallback((viewModeArg, hideCell) => {\n if (viewModeArg === 'target') {\n const shots = hideCell ? targetShots.map((row, r) => row.map((shot, c) => (r === hideCell.row && c === hideCell.col ? null : shot))) : targetShots;\n const ships = hideCell ? enemyShips.map((ship) => (shipAt([ship], hideCell) ? { ...ship, sunk: false } : ship)) : enemyShips;\n return { mode: 'target', ships, shots, preview: null, interactive: canFire };\n }\n const shots = hideCell ? incomingShots.map((row, r) => row.map((shot, c) => (r === hideCell.row && c === hideCell.col ? null : shot))) : incomingShots;\n const ships = hideCell ? ownShips.map((ship) => (shipAt([ship], hideCell) ? { ...ship, sunk: false } : ship)) : ownShips;\n return { mode: 'own', ships, shots, preview: placing ? preview : null, interactive: canPlace };\n }, [targetShots, enemyShips, incomingShots, ownShips, placing, preview, canFire, canPlace]);\n const view = useMemo(() => buildView(mode), [buildView, mode]);\n\n const announce = useCallback((text, kind = 'info') => setAnnouncement({ text, kind, id: Date.now() }), []);\n\n const fire = useCallback((cell = selected) => {\n if (!canFire || !isCell(cell)) return;\n if (shotAt(targetShots, cell)) { announce(`Ya disparaste en ${cellLabel(cell)}`); return; }\n setSelected(null);\n sceneRef.current?.selectCell?.(null);\n playUiSound('ui_click');\n void call('bsFire', gameKey, { row: cell.row, col: cell.col });\n }, [canFire, selected, targetShots, gameKey, announce]);\n\n const placeAt = useCallback((cell) => {\n if (!canPlace || !isCell(cell)) return;\n const placed = shipAt(myFleet, cell);\n if (placed) {\n setActiveShipId(placed.id);\n if (placed.orientation) setOrientation(placed.orientation);\n playUiSound('ui_click');\n void call('bsRemoveShip', gameKey, placed.id);\n return;\n }\n if (!currentShip) return;\n const result = validatePlacement(ownBoard, { shipId: currentShip.id, row: cell.row, col: cell.col, orientation });\n if (!result.ok) { announce(result.reason === 'overlap' ? 'Se superpone con otro barco' : 'No cabe en esa posición', 'miss'); return; }\n setActiveShipId(null);\n playUiSound('ship_place');\n void call('bsPlaceShip', gameKey, { shipId: currentShip.id, row: cell.row, col: cell.col, orientation });\n }, [canPlace, myFleet, currentShip, ownBoard, orientation, gameKey, announce]);\n\n const selectCell = useCallback((cell) => {\n if (!isCell(cell)) return;\n setCursor(cell);\n if (placing) { placeAt(cell); return; }\n if (mode !== 'target' || !canFire) return;\n const now = Date.now();\n const last = lastSelectRef.current;\n lastSelectRef.current = { cell, time: now };\n if (sameCell(last.cell, cell) && now - last.time < DOUBLE_SELECT_MS) { fire(cell); return; }\n if (shotAt(targetShots, cell)) { announce(`Ya disparaste en ${cellLabel(cell)}`); return; }\n setSelected(cell);\n sceneRef.current?.selectCell?.(cell);\n }, [placing, placeAt, mode, canFire, fire, targetShots, announce]);\n\n handlersRef.current = { selectCell, setHovered };\n\n // One WebGL context per card: created once while the board is visible, disposed on unmount.\n useEffect(() => {\n const container = stageRef.current;\n if (!sceneVisible || !container) return undefined;\n if (!hasWebGL()) { setSceneStatus('fallback'); return undefined; }\n let disposed = false;\n let scene = null;\n setSceneStatus('loading');\n import('./scene/createBattleScene.js')\n .then(({ createBattleScene }) => {\n if (disposed) return;\n scene = createBattleScene(container, {\n quality: 'auto',\n reducedMotion: prefersReducedMotion(),\n onCellHover: (cell) => { if (!disposed) handlersRef.current.setHovered(isCell(cell) ? { row: cell.row, col: cell.col } : null); },\n onCellSelect: (cell) => { if (!disposed) handlersRef.current.selectCell(isCell(cell) ? { row: cell.row, col: cell.col } : null); },\n });\n sceneRef.current = scene;\n setSceneStatus('ready');\n })\n .catch((error) => {\n if (disposed) return;\n console.error('[battleship] No se pudo iniciar la escena', error);\n setSceneStatus('fallback');\n });\n return () => {\n disposed = true;\n sceneRef.current = null;\n try { scene?.dispose(); } catch (error) { console.error('[battleship] Error al liberar la escena', error); }\n };\n }, [sceneVisible]);\n\n useEffect(() => {\n battleshipSounds.preload();\n const timers = soundTimersRef.current;\n return () => { timers.forEach(clearTimeout); timers.clear(); };\n }, []);\n\n // Ocean bed only while this board is open (unmounted when minimized/closed).\n const ambient = sceneVisible && !terminal;\n useEffect(() => (ambient ? holdAmbient() : undefined), [ambient]);\n\n // Both fleets committed: sonar sweep once per game.\n useEffect(() => {\n const before = lastStatusRef.current;\n lastStatusRef.current = game.status;\n if (before === 'placement' && game.status === 'active') scheduleCues([{ name: 'sonar_ping', at: 0 }], () => `${game.gameId}:start`, soundTimersRef.current);\n }, [game.status, game.gameId]);\n\n // Animate each new shot once (never replay history on mount), then show the settled state.\n // Sounds follow the same event id, so RESYNC/replayed frames (no new id) stay silent.\n const lastShot = game.lastShot;\n useEffect(() => {\n if (!sceneReady && sceneStatus !== 'fallback') return;\n const eventId = lastShot?.eventId ?? null;\n if (lastSeenShotRef.current === undefined) { lastSeenShotRef.current = eventId; return; }\n if (!eventId || eventId === lastSeenShotRef.current) return;\n lastSeenShotRef.current = eventId;\n const incoming = !sameUser(lastShot.by, currentUserId);\n const cell = { row: lastShot.row, col: lastShot.col };\n const label = cellLabel(cell);\n const sunkId = typeof lastShot.sunk === 'string' ? lastShot.sunk\n : lastShot.sunk ? shipAt(incoming ? myFleet : (game.sunkEnemyShips || []), cell)?.id : null;\n const text = incoming\n ? (lastShot.sunk ? `Te hundieron el ${shipName(sunkId)}` : lastShot.result === 'hit' ? `El rival impactó en ${label}` : `El rival falló: agua en ${label}`)\n : (lastShot.sunk ? `¡Hundiste el ${shipName(sunkId)}!` : lastShot.result === 'hit' ? `¡Impacto en ${label}!` : `Agua en ${label}`);\n const kind = lastShot.result === 'hit' ? 'hit' : 'miss';\n const nextMode = incoming ? 'own' : 'target';\n // The cruiser alarm is keyed per game: it can sound only once per cruiser.\n const cruiserAlarm = incoming && crossesCruiserAlarm(myFleet, game.incomingShots, lastShot);\n const impact = impactCues({ result: lastShot.result, sunk: Boolean(lastShot.sunk), defeated: Boolean(lastShot.defeated), won: !incoming, cruiserAlarm });\n const cueKey = (name) => (name === 'cruiser_damage_alarm' ? `${game.gameId}:cruiser`\n : name === 'victory' || name === 'defeat' ? `${game.gameId}:end` : eventId);\n const timers = soundTimersRef.current;\n setViewMode(nextMode);\n const scene = sceneRef.current;\n if (!scene?.playShot) { scheduleCues(impact, cueKey, timers); announce(text, kind); return; }\n scheduleCues(launchCues({ incoming }), cueKey, timers);\n animatingRef.current = true;\n setAnimating(true);\n let cancelled = false;\n try { scene.setView(buildView(nextMode, cell)); } catch { /* scene keeps its last view */ }\n const hold = prefersReducedMotion() ? 0 : 600;\n Promise.resolve(scene.playShot({ row: cell.row, col: cell.col, result: lastShot.result, sunk: Boolean(lastShot.sunk), incoming }))\n .catch(() => {})\n .then(() => { scheduleCues(impact, cueKey, timers); if (!cancelled) announce(text, kind); return new Promise((resolve) => setTimeout(resolve, hold)); })\n .then(() => { if (!cancelled) { animatingRef.current = false; setAnimating(false); } });\n return () => { cancelled = true; animatingRef.current = false; setAnimating(false); };\n // Only a new event id may trigger an animation.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sceneReady, sceneStatus, lastShot?.eventId]);\n\n // Auto-switch: my turn → target, rival turn → my fleet (after any running animation).\n useEffect(() => {\n if (animating || game.status !== 'active') return;\n setViewMode(myTurn ? 'target' : 'own');\n }, [myTurn, game.status, animating]);\n\n useEffect(() => { if (!canFire) setSelected(null); }, [canFire]);\n\n // Push the settled view to the scene unless a shot animation owns it.\n useEffect(() => {\n if (!sceneReady || animatingRef.current) return;\n try { sceneRef.current?.setView(view); } catch (error) { console.error('[battleship] setView', error); }\n }, [sceneReady, view, animating]);\n\n useEffect(() => {\n if (!sceneReady) return;\n sceneRef.current?.selectCell?.(mode === 'target' ? selected : null);\n }, [sceneReady, selected, mode]);\n\n useEffect(() => {\n if (!sceneReady) return;\n const scene = sceneRef.current;\n scene?.setRadarVisible?.(radar && mode === 'target');\n scene?.setRadarContacts?.(radarContacts);\n }, [sceneReady, radar, mode, radarContacts]);\n\n const rotate = () => { playUiSound('ship_rotate'); setOrientation((value) => (value === 'horizontal' ? 'vertical' : 'horizontal')); };\n const ready = () => { if (fleetComplete && canPlace) { playUiSound('ui_click'); void call('bsReady', gameKey); } };\n const clicked = (action) => (...args) => { playUiSound('ui_click'); action(...args); };\n const toggleRadar = () => {\n playUiSound(radar ? 'ui_click' : 'sonar_ping');\n setRadar((value) => !value);\n };\n\n const handleStageKeyDown = (event) => {\n if (event.target !== event.currentTarget || event.altKey || event.ctrlKey || event.metaKey) return;\n const moves = { ArrowUp: [-1, 0], ArrowDown: [1, 0], ArrowLeft: [0, -1], ArrowRight: [0, 1] };\n if (moves[event.key]) {\n event.preventDefault();\n const [dr, dc] = moves[event.key];\n const base = (mode === 'target' ? selected : null) || cursor || hovered;\n const next = base ? { row: Math.min(BOARD_SIZE - 1, Math.max(0, base.row + dr)), col: Math.min(BOARD_SIZE - 1, Math.max(0, base.col + dc)) } : { row: 0, col: 0 };\n setCursor(next);\n setHovered(null);\n if (mode === 'target' && canFire) { setSelected(next); sceneRef.current?.selectCell?.(next); }\n } else if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n if (placing) placeAt(cursor || hovered);\n else fire(selected || cursor);\n }\n };\n\n const handleCardKeyDown = (event) => {\n if (event.defaultPrevented || event.altKey || event.ctrlKey || event.metaKey) return;\n if (/^(INPUT|TEXTAREA|SELECT)$/.test(event.target.tagName) || event.target.isContentEditable) return;\n if (event.key === 'r' || event.key === 'R') {\n event.preventDefault();\n if (placing) rotate(); else sceneRef.current?.resetCamera?.();\n } else if (event.key === 'Escape' && expanded) {\n event.preventDefault();\n event.stopPropagation();\n setExpanded(false);\n }\n };\n\n const verification = <VerificationBadge game={game} />;\n const iWon = game.status === 'won' && sameUser(currentUserId, game.winnerId);\n const statusText = !connected && !terminal ? 'Sin conexión · esperando reconexión' : game.pending ? 'Sincronizando…' : status;\n const sunkCount = enemyShips.length;\n\n return (\n <section className={`chat-game-card bs-card${myTurn ? ' chat-game-card--my-turn' : ''}${variant ? ` chat-game-card--${variant}` : ''}${expanded ? ' bs-card--expanded' : ''}`}\n aria-label=\"Partida de Batalla Naval\" onKeyDown={handleCardKeyDown}>\n <header className=\"chat-game-header\">\n <div className=\"chat-game-heading\">\n <span className=\"chat-game-eyebrow\">MINIJUEGOS · 2 JUGADORES</span>\n <h3>Batalla Naval <Anchor size={13} aria-hidden=\"true\" className=\"bs-title-icon\" /></h3>\n </div>\n {variant === 'panel' && <GameSoundControls manager={battleshipSounds} />}\n {sceneVisible && <button className=\"chat-game-close bs-expand\" type=\"button\" aria-pressed={expanded}\n aria-label={expanded ? 'Reducir tablero' : 'Ampliar tablero'} title={expanded ? 'Reducir (Esc)' : 'Ampliar'} onClick={clicked(() => setExpanded((value) => !value))}>\n {expanded ? <Minimize2 size={15} aria-hidden=\"true\" /> : <Maximize2 size={15} aria-hidden=\"true\" />}\n </button>}\n {onMinimize && <button className=\"chat-game-close\" type=\"button\" aria-label=\"Minimizar tablero\" title=\"Minimizar tablero\" onClick={() => { setExpanded(false); onMinimize(); }}><ChevronDown size={16} aria-hidden=\"true\" /></button>}\n {isParticipant && !terminal && (\n <button className=\"chat-game-close\" type=\"button\" aria-label=\"Finalizar partida para ambos jugadores\" title=\"Finalizar partida para ambos\" onClick={() => void call('act', gameKey, 'game_end')} disabled={!connected}><X size={16} aria-hidden=\"true\" /></button>\n )}\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 <div className=\"bs-statusline\">\n <p className={`chat-game-status${iWon ? ' bs-status--win' : ''}`} role=\"status\">{statusText}</p>\n {verification}\n </div>\n\n {game.status === 'invited' && <div className=\"bs-invite\">\n <p>Coloca 5 barcos en un tablero de 10×10 y hunde la flota rival por turnos.</p>\n {isGuest && <div className=\"chat-game-actions\">\n <button type=\"button\" className=\"chat-game-action chat-game-action--primary\" disabled={busy} onClick={clicked(() => void call('act', gameKey, 'game_accept'))}>Aceptar partida</button>\n <button type=\"button\" className=\"chat-game-action\" disabled={busy} onClick={clicked(() => void call('act', gameKey, 'game_decline'))}>Rechazar</button>\n </div>}\n </div>}\n\n {sceneVisible && <>\n {battle && <div className=\"bs-hud\" role=\"toolbar\" aria-label=\"Vista del tablero\">\n <div className=\"bs-segment\">\n <button type=\"button\" aria-pressed={viewMode === 'target'} onClick={clicked(() => setViewMode('target'))}><Crosshair size={14} aria-hidden=\"true\" />Objetivo</button>\n <button type=\"button\" aria-pressed={viewMode === 'own'} onClick={clicked(() => setViewMode('own'))}><Anchor size={14} aria-hidden=\"true\" />Mi flota</button>\n </div>\n <dl className=\"bs-stats\">\n <div><dt>Disparos</dt><dd>{shotCount}</dd></div>\n <div><dt>Impactos</dt><dd>{hitCount}</dd></div>\n <div><dt>Hundidos</dt><dd>{sunkCount}/{FLEET.length}</dd></div>\n </dl>\n </div>}\n\n <div className=\"bs-stage-wrap\">\n <div ref={stageRef} className={`bs-stage${sceneStatus === 'fallback' ? ' bs-stage--fallback' : ''}`} tabIndex={0} role=\"application\"\n aria-label={placing ? 'Tablero 3D de tu flota. Flechas para mover, Enter para colocar o quitar un barco, R para rotar.' : 'Tablero 3D de Batalla Naval. Flechas para mover la selección, Enter para disparar, R para centrar la cámara.'}\n aria-describedby={hintId} aria-busy={sceneStatus === 'loading'} onKeyDown={handleStageKeyDown}>\n {sceneStatus === 'fallback' && <FallbackGrid view={view} selected={mode === 'target' ? selected : null} cursor={cursor} onSelect={selectCell} onHover={setHovered} />}\n </div>\n {sceneStatus === 'loading' && <div className=\"bs-stage-state\" role=\"status\"><Waves size={16} aria-hidden=\"true\" /> Preparando el océano…</div>}\n {sceneStatus === 'fallback' && <p className=\"bs-fallback-note\"><TriangleAlert size={12} aria-hidden=\"true\" /> Vista 3D no disponible · modo 2D</p>}\n <div className=\"bs-cell-chip\" aria-hidden=\"true\">{placing ? cellLabel(anchor) : mode === 'target' ? cellLabel(selected || hovered) : cellLabel(hovered)}</div>\n <div className=\"bs-live\" aria-live=\"polite\" aria-atomic=\"true\">\n {announcement && <span key={announcement.id} className={`bs-toast bs-toast--${announcement.kind}`}>{announcement.text}</span>}\n </div>\n </div>\n <p id={hintId} className=\"bs-hint\">{placing\n ? 'Clic para colocar · clic en un barco para quitarlo · R para rotar'\n : 'Arrastra para rotar · doble clic o Enter para disparar'}</p>\n\n {placing && <div className=\"bs-placement\">\n <ul className=\"bs-fleet\" aria-label=\"Tu flota\">\n {FLEET.map((ship) => {\n const placed = placedIds.has(ship.id);\n const active = currentShip?.id === ship.id;\n return <li key={ship.id}>\n <button type=\"button\" className={`bs-ship${placed ? ' is-placed' : ''}${active ? ' is-active' : ''}`} aria-pressed={active}\n disabled={!canPlace} title={placed ? 'Quitar y volver a colocar' : 'Seleccionar barco'}\n onClick={clicked(() => { if (placed) void call('bsRemoveShip', gameKey, ship.id); setActiveShipId(ship.id); })}>\n <span className=\"bs-ship__name\">{capitalize(shipName(ship.id))}</span>\n <span className=\"bs-ship__pips\" aria-label={`${ship.size} casillas`}>{Array.from({ length: ship.size }, (_, i) => <i key={i} />)}</span>\n {placed && <Check size={13} aria-label=\"colocado\" />}\n </button>\n </li>;\n })}\n </ul>\n <div className=\"chat-game-actions bs-actions\">\n <button type=\"button\" className=\"chat-game-action bs-btn\" disabled={!canPlace} onClick={rotate} title=\"Rotar (R)\">\n <RotateCw size={15} aria-hidden=\"true\" />{orientation === 'horizontal' ? 'Horizontal' : 'Vertical'}\n </button>\n <button type=\"button\" className=\"chat-game-action bs-btn\" disabled={!canPlace} onClick={() => { playUiSound('ship_place'); void call('bsRandomFleet', gameKey); }}><Shuffle size={15} aria-hidden=\"true\" />Aleatorio</button>\n <button type=\"button\" className=\"chat-game-action chat-game-action--primary bs-btn\" disabled={!canPlace || !fleetComplete} onClick={ready}>\n <Check size={15} aria-hidden=\"true\" />{game.myReady ? 'Flota lista' : `Listo (${placedIds.size}/${FLEET.length})`}\n </button>\n </div>\n {game.myReady && <p className=\"bs-waiting\">{game.opponentReady ? 'Ambas flotas listas · iniciando…' : 'Flota lista. Esperando a que el rival coloque su flota…'}</p>}\n </div>}\n\n {battle && <div className=\"chat-game-actions bs-actions\">\n <button type=\"button\" className=\"chat-game-action chat-game-action--primary bs-btn bs-btn--fire\" disabled={!canFire || !selected || mode !== 'target'} onClick={() => fire()}\n title={selected ? `Disparar en ${cellLabel(selected)} (Enter)` : 'Selecciona una casilla'}>\n <Crosshair size={15} aria-hidden=\"true\" />Disparar{selected ? ` · ${cellLabel(selected)}` : ''}\n </button>\n <button type=\"button\" className=\"chat-game-action bs-btn\" aria-pressed={radar} disabled={mode !== 'target' || !sceneReady} onClick={toggleRadar} title=\"Radar de impactos\">\n <Radar size={15} aria-hidden=\"true\" />Radar\n </button>\n <button type=\"button\" className=\"chat-game-action bs-btn\" disabled={!sceneReady} onClick={clicked(() => sceneRef.current?.resetCamera?.())} title=\"Centrar cámara (R)\">\n <LocateFixed size={15} aria-hidden=\"true\" /><span className=\"bs-btn-label\">Centrar</span>\n </button>\n </div>}\n </>}\n\n {game.status === 'conflict' && isParticipant && <SyncControls sync={game.sync} connected={connected}\n onResync={() => void call('requestResync', gameKey)} onAdoptOffer={() => void call('adoptResyncOffer', gameKey)} />}\n {game.error && <div className=\"chat-game-error\" role=\"alert\"><span>{game.error}</span>\n {game.pendingEvent && <button type=\"button\" className=\"chat-game-action\" disabled={!connected || game.pending} onClick={() => void call('retry', gameKey)}>Reintentar</button>}\n </div>}\n <footer className=\"chat-game-footer\">{terminal ? 'Puedes seguir conversando o invitar a otra partida.' : 'Hunde los 5 barcos rivales. El chat sigue disponible.'}</footer>\n </section>\n );\n}\n\nexport default memo(BattleshipGameCard);\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as e } from "./games-
|
|
1
|
+
import { t as e } from "./games-Bl_8raG6.js";
|
|
2
2
|
import { createContext as t, useContext as n } from "react";
|
|
3
3
|
// src/notifications/chatSounds.js
|
|
4
4
|
var r = null, i = null, a = null, o = !1, s = !0, c = /* @__PURE__ */ new Set();
|
|
@@ -87,4 +87,4 @@ function C() {
|
|
|
87
87
|
}
|
|
88
88
|
export { v as a, b as i, C as n, l as o, _ as r, x as s, S as t };
|
|
89
89
|
|
|
90
|
-
//# sourceMappingURL=ChatContext-
|
|
90
|
+
//# sourceMappingURL=ChatContext-CVW58bzC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatContext-
|
|
1
|
+
{"version":3,"file":"ChatContext-CVW58bzC.js","names":["chatSoundUrl","audioNotification","audioTing","channel","initialized","soundEnabled","soundSubscribers","subscribeSoundPreference","listener","DEDUP_MAX","recentMsgIds","loadPreference","savePreference","enabled","getAudio","sound","source","playSound","audio","promise","initBroadcastChannel","data","first","initChatSounds","requestNotification","msgId","setSoundEnabled","isSoundEnabled","toggleSound","next","ChatContext","createContext","useChatContext","context","useContext"],"sources":["../../src/notifications/chatSounds.js","../../src/provider/ChatContext.js"],"sourcesContent":["import { chatSoundUrl } from '../assets/chatAssets';\n\nlet audioNotification = null;\nlet audioTing = null;\nlet channel = null;\nlet initialized = false;\nlet soundEnabled = true;\nconst soundSubscribers = new Set();\nexport function subscribeSoundPreference(listener) {\n soundSubscribers.add(listener);\n return () => soundSubscribers.delete(listener);\n}\nlet lastPlayedMsgId = null;\nconst DEDUP_MAX = 50;\nconst recentMsgIds = new Set();\n\nfunction loadPreference() {\n try {\n const stored = localStorage.getItem('lira-chat-sound');\n soundEnabled = stored !== 'false';\n } catch {\n soundEnabled = true;\n }\n}\n\nfunction savePreference(enabled) {\n try {\n localStorage.setItem('lira-chat-sound', enabled ? 'true' : 'false');\n } catch {}\n}\n\nfunction getAudio(sound) {\n if (sound === 'ting') {\n if (!audioTing) {\n audioTing = new Audio(chatSoundUrl('ting.mp3'));\n audioTing.preload = 'auto';\n const source = document.createElement('source');\n source.src = chatSoundUrl('ting.ogg');\n source.type = 'audio/ogg';\n audioTing.appendChild(source);\n }\n return audioTing;\n }\n if (!audioNotification) {\n audioNotification = new Audio(chatSoundUrl('notification.mp3'));\n audioNotification.preload = 'auto';\n const source = document.createElement('source');\n source.src = chatSoundUrl('notification.ogg');\n source.type = 'audio/ogg';\n audioNotification.appendChild(source);\n }\n return audioNotification;\n}\n\nfunction playSound(sound) {\n if (!soundEnabled) return;\n try {\n const audio = getAudio(sound);\n audio.currentTime = 0;\n const promise = audio.play();\n if (promise) promise.catch(() => {});\n } catch {}\n}\n\nfunction initBroadcastChannel() {\n if (typeof window === 'undefined' || !window.BroadcastChannel) return;\n if (channel) return;\n channel = new BroadcastChannel('lira-chat-sound');\n channel.onmessage = (e) => {\n const data = e.data;\n if (!data || data.type !== 'PLAY') return;\n if (data.msgId && recentMsgIds.has(data.msgId)) return;\n playSound(data.sound);\n if (data.msgId) {\n recentMsgIds.add(data.msgId);\n if (recentMsgIds.size > DEDUP_MAX) {\n const first = recentMsgIds.values().next().value;\n recentMsgIds.delete(first);\n }\n }\n };\n}\n\nexport function initChatSounds() {\n if (initialized) return;\n initialized = true;\n loadPreference();\n initBroadcastChannel();\n}\n\nexport function requestNotification(msgId) {\n if (!initialized) initChatSounds();\n if (!soundEnabled) return;\n if (msgId && recentMsgIds.has(msgId)) return;\n if (msgId) {\n lastPlayedMsgId = msgId;\n recentMsgIds.add(msgId);\n if (recentMsgIds.size > DEDUP_MAX) {\n const first = recentMsgIds.values().next().value;\n recentMsgIds.delete(first);\n }\n }\n playSound('notification');\n if (channel && msgId) {\n channel.postMessage({ type: 'PLAY', sound: 'notification', msgId });\n }\n}\n\nexport function setSoundEnabled(enabled) {\n soundEnabled = !!enabled;\n savePreference(soundEnabled);\n soundSubscribers.forEach((listener) => listener());\n}\n\nexport function isSoundEnabled() {\n return soundEnabled;\n}\n\nexport function toggleSound() {\n const next = !soundEnabled;\n setSoundEnabled(next);\n return next;\n}\n\nexport function cleanup() {\n if (channel) {\n channel.close();\n channel = null;\n }\n if (audioNotification) {\n audioNotification.src = '';\n audioNotification.load();\n audioNotification = null;\n }\n if (audioTing) {\n audioTing.src = '';\n audioTing.load();\n audioTing = null;\n }\n initialized = false;\n}\n","import { createContext, useContext } from 'react';\n\n// Value: { config, transport, chatStore, stores }.\nexport const ChatContext = createContext(null);\nChatContext.displayName = 'LiraChatContext';\n\nexport function useChatContext() {\n const context = useContext(ChatContext);\n if (!context) throw new Error('LiraChatProvider requerido');\n return context;\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { t as e } from "./rolldown-runtime-CGnMp29N.js";
|
|
2
|
-
import { a as t, t as n } from "./games-
|
|
2
|
+
import { a as t, t as n } from "./games-Bl_8raG6.js";
|
|
3
3
|
import { a as r, i, n as a, o, t as s } from "./track-BcnnpnAm.js";
|
|
4
4
|
import { n as c, o as l, s as u } from "./createPeerLink-DBVs_yvQ.js";
|
|
5
|
-
import { i as d, o as f, t as p } from "./ChatContext-
|
|
5
|
+
import { i as d, o as f, t as p } from "./ChatContext-CVW58bzC.js";
|
|
6
6
|
import { c as m, l as h } from "./gameStatus-BChd29yI.js";
|
|
7
7
|
import { n as g, r as _, t as v } from "./tanks-live-BcKmrhnV.js";
|
|
8
8
|
import { memo as y, useContext as b, useEffect as x, useRef as S, useState as C } from "react";
|
|
@@ -1208,7 +1208,7 @@ function Qe({ gameKey: e, currentUserId: n, onMinimize: r, onDismiss: i, suspend
|
|
|
1208
1208
|
oe("none");
|
|
1209
1209
|
}
|
|
1210
1210
|
};
|
|
1211
|
-
return re ? r() : import("./createRaceScene-
|
|
1211
|
+
return re ? r() : import("./createRaceScene-BiEtQsVs.js").then(({ createRaceScene: i }) => {
|
|
1212
1212
|
if (!e) try {
|
|
1213
1213
|
t = i(l.current, n), y.current = t, oe("3d");
|
|
1214
1214
|
} catch {
|
|
@@ -1651,4 +1651,4 @@ function Qe({ gameKey: e, currentUserId: n, onMinimize: r, onDismiss: i, suspend
|
|
|
1651
1651
|
var $e = y(Qe);
|
|
1652
1652
|
export { _e as a, U as c, $e as default, W as i, V as n, ve as o, K as r, G as s, Ge as t };
|
|
1653
1653
|
|
|
1654
|
-
//# sourceMappingURL=RacingLiveGameCard-
|
|
1654
|
+
//# sourceMappingURL=RacingLiveGameCard-8j9QLnxW.js.map
|