@minicode-dev/chat 0.1.6 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -0
- package/assets/sounds/tanks/big_explosion.mp3 +0 -0
- package/assets/sounds/tanks/big_explosion.ogg +0 -0
- package/assets/sounds/tanks/cannon_fire.mp3 +0 -0
- package/assets/sounds/tanks/cannon_fire.ogg +0 -0
- package/assets/sounds/tanks/defeat.mp3 +0 -0
- package/assets/sounds/tanks/defeat.ogg +0 -0
- package/assets/sounds/tanks/engine_loop.mp3 +0 -0
- package/assets/sounds/tanks/engine_loop.ogg +0 -0
- package/assets/sounds/tanks/engine_start.mp3 +0 -0
- package/assets/sounds/tanks/engine_start.ogg +0 -0
- package/assets/sounds/tanks/projectile_whistle.mp3 +0 -0
- package/assets/sounds/tanks/projectile_whistle.ogg +0 -0
- package/assets/sounds/tanks/tank_destroyed.mp3 +0 -0
- package/assets/sounds/tanks/tank_destroyed.ogg +0 -0
- package/assets/sounds/tanks/tank_hit.mp3 +0 -0
- package/assets/sounds/tanks/tank_hit.ogg +0 -0
- package/assets/sounds/tanks/terrain_impact.mp3 +0 -0
- package/assets/sounds/tanks/terrain_impact.ogg +0 -0
- package/assets/sounds/tanks/tracks_loop.mp3 +0 -0
- package/assets/sounds/tanks/tracks_loop.ogg +0 -0
- package/assets/sounds/tanks/turret_loop.mp3 +0 -0
- package/assets/sounds/tanks/turret_loop.ogg +0 -0
- package/assets/sounds/tanks/victory.mp3 +0 -0
- package/assets/sounds/tanks/victory.ogg +0 -0
- package/dist/chunks/{BattleshipGameCard-S-UdM6rn.js → BattleshipGameCard-BFqA0cjT.js} +67 -65
- package/dist/chunks/{BattleshipGameCard-S-UdM6rn.js.map → BattleshipGameCard-BFqA0cjT.js.map} +1 -1
- package/dist/chunks/{BattleshipPrototype-Dm6U_mCr.js → BattleshipPrototype-CmQd5AUO.js} +4 -3
- package/dist/chunks/{BattleshipPrototype-Dm6U_mCr.js.map → BattleshipPrototype-CmQd5AUO.js.map} +1 -1
- package/dist/chunks/ChatContext-dty_KPDX.js +90 -0
- package/dist/chunks/ChatContext-dty_KPDX.js.map +1 -0
- package/dist/chunks/TanksGameCard-D0n-lzTs.js +1535 -0
- package/dist/chunks/TanksGameCard-D0n-lzTs.js.map +1 -0
- package/dist/chunks/TanksLiveGameCard-BmNRXP66.js +849 -0
- package/dist/chunks/TanksLiveGameCard-BmNRXP66.js.map +1 -0
- package/dist/chunks/WebRtcLab-B7xBlJy1.js +510 -0
- package/dist/chunks/WebRtcLab-B7xBlJy1.js.map +1 -0
- package/dist/chunks/{battleship-DXKuIZ1I.js → board-DXKuIZ1I.js} +1 -1
- package/dist/chunks/board-DXKuIZ1I.js.map +1 -0
- package/dist/chunks/connect4Sounds-BN7d_TM2.js +3235 -0
- package/dist/chunks/connect4Sounds-BN7d_TM2.js.map +1 -0
- package/dist/chunks/core-geo-UJY-tH9L.js +361 -0
- package/dist/chunks/core-geo-UJY-tH9L.js.map +1 -0
- package/dist/chunks/createBattleScene-L4ZRWDED.js +1265 -0
- package/dist/chunks/createBattleScene-L4ZRWDED.js.map +1 -0
- package/dist/chunks/createLiveScene-CtYPcOPo.js +364 -0
- package/dist/chunks/createLiveScene-CtYPcOPo.js.map +1 -0
- package/dist/chunks/createPeerLink-qei05vpV.js +478 -0
- package/dist/chunks/createPeerLink-qei05vpV.js.map +1 -0
- package/dist/chunks/createTankScene-CV7Brxmt.js +685 -0
- package/dist/chunks/createTankScene-CV7Brxmt.js.map +1 -0
- package/dist/chunks/fx-BHsl4S_J.js +1470 -0
- package/dist/chunks/fx-BHsl4S_J.js.map +1 -0
- package/dist/chunks/gameStatus-Cu1Z8un9.js +69 -0
- package/dist/chunks/gameStatus-Cu1Z8un9.js.map +1 -0
- package/dist/chunks/signalFaults-Dv2YjjKy.js +36 -0
- package/dist/chunks/signalFaults-Dv2YjjKy.js.map +1 -0
- package/dist/chunks/tanksSounds-C99OD2xD.js +177 -0
- package/dist/chunks/tanksSounds-C99OD2xD.js.map +1 -0
- package/dist/index.js +2404 -2427
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/index.d.ts +63 -0
- package/package.json +1 -1
- package/dist/chunks/battleship-DXKuIZ1I.js.map +0 -1
- package/dist/chunks/connect4Sounds-9u0p-dAf.js +0 -1847
- package/dist/chunks/connect4Sounds-9u0p-dAf.js.map +0 -1
- package/dist/chunks/createBattleScene-HIAvjixn.js +0 -1621
- package/dist/chunks/createBattleScene-HIAvjixn.js.map +0 -1
package/index.d.ts
CHANGED
|
@@ -87,6 +87,10 @@ export interface ChatGamesFeatures {
|
|
|
87
87
|
connect4?: boolean;
|
|
88
88
|
battleship?: boolean;
|
|
89
89
|
battleshipPreview?: boolean;
|
|
90
|
+
/** Tanques de guerra 3D. Default false while the game is in preview. */
|
|
91
|
+
tanks?: boolean;
|
|
92
|
+
/** Simultaneous WebRTC tank combat; disabled by default. */
|
|
93
|
+
tanksLive?: boolean;
|
|
90
94
|
}
|
|
91
95
|
|
|
92
96
|
export interface ChatFeatures {
|
|
@@ -164,7 +168,14 @@ export interface ChatCallbacks {
|
|
|
164
168
|
onConnectionChange?: (status: TransportStatus) => void;
|
|
165
169
|
}
|
|
166
170
|
|
|
171
|
+
export interface ChatWebRtcConfig {
|
|
172
|
+
/** Host supplied STUN/TURN configuration. Obtain TURN credentials at runtime. */
|
|
173
|
+
iceServers?: RTCIceServer[];
|
|
174
|
+
iceTransportPolicy?: 'all' | 'relay';
|
|
175
|
+
}
|
|
176
|
+
|
|
167
177
|
export interface ChatConfig {
|
|
178
|
+
webrtc?: ChatWebRtcConfig;
|
|
168
179
|
websocket?: {
|
|
169
180
|
url?: string | (() => string | Promise<string>) | null;
|
|
170
181
|
reconnect?: ReconnectOptions;
|
|
@@ -505,3 +516,55 @@ export function sendRelayMessage(socket: WebSocket | null, roomId: string, messa
|
|
|
505
516
|
|
|
506
517
|
/** Lazily loads the Battleship 3D preview (three.js); use with React.lazy. */
|
|
507
518
|
export function loadBattleshipPreview(): Promise<{ default: ComponentType<any> }>;
|
|
519
|
+
|
|
520
|
+
// ---- WebRTC (chat-signaled peer links, TANQUES LIVE groundwork) ----
|
|
521
|
+
|
|
522
|
+
export interface ChatSignalFrame { userId: string; roomId: string; text: string }
|
|
523
|
+
export interface PeerSignaling {
|
|
524
|
+
send(text: string): Promise<unknown> | unknown;
|
|
525
|
+
subscribe(listener: (frame: ChatSignalFrame) => void): () => void;
|
|
526
|
+
dispose?(): void;
|
|
527
|
+
}
|
|
528
|
+
export type PeerLinkPhase = 'idle' | 'listening' | 'calling' | 'negotiating' | 'connected' | 'restarting' | 'reconnecting' | 'failed';
|
|
529
|
+
export interface PeerLinkState {
|
|
530
|
+
phase: PeerLinkPhase; role: 'caller' | 'answerer' | null; sid: string | null; gen: number;
|
|
531
|
+
tabId: string; peerTab: string | null; ice: string; connection: string; signalingState: string; gathering: string;
|
|
532
|
+
route: { local: string | null; remote: string | null; protocol: string | null; relay: boolean; label: string } | null;
|
|
533
|
+
rtt: number | null; statsRtt: number | null; reconnects: number; restarts: number; error: string | null;
|
|
534
|
+
move: { sent: number; dropped: number; received: number; outOfOrder: number; lossPct: number; hzIn: number; hzOut: number };
|
|
535
|
+
signals: { sent: number; received: number; retransmits: number; duplicates: number; ignored: number; invalid: number; tooLarge: number; maxLength: number };
|
|
536
|
+
events: { sent: number; received: number };
|
|
537
|
+
}
|
|
538
|
+
export interface PeerLink {
|
|
539
|
+
tabId: string;
|
|
540
|
+
connect(): void;
|
|
541
|
+
setListening(value: boolean): void;
|
|
542
|
+
sendMove(payload: unknown): boolean;
|
|
543
|
+
sendEvent(payload: unknown): boolean;
|
|
544
|
+
restartIce(): void;
|
|
545
|
+
getState(): PeerLinkState;
|
|
546
|
+
hangup(): void;
|
|
547
|
+
destroy(): void;
|
|
548
|
+
}
|
|
549
|
+
export function createPeerLink(options: {
|
|
550
|
+
signaling: PeerSignaling; selfId: string; peerId: string; roomId?: string | null; tabId?: string;
|
|
551
|
+
iceServers?: RTCIceServer[]; iceTransportPolicy?: RTCIceTransportPolicy; autoReconnect?: boolean; listen?: boolean;
|
|
552
|
+
RTCPeerConnectionImpl?: typeof RTCPeerConnection;
|
|
553
|
+
onChange?: (state: PeerLinkState) => void; onMove?: (payload: any, meta: { seq: number }) => void;
|
|
554
|
+
onEvent?: (payload: any) => void; log?: (line: string) => void;
|
|
555
|
+
}): PeerLink;
|
|
556
|
+
export const DEFAULT_ICE_SERVERS: RTCIceServer[];
|
|
557
|
+
export const rtcSignals: { emit(frame: ChatSignalFrame): void; subscribe(listener: (frame: ChatSignalFrame) => void): () => void };
|
|
558
|
+
export function createChatSignaling(options: { send: (roomId: string, text: string) => Promise<unknown> | unknown; roomId: string }): PeerSignaling;
|
|
559
|
+
export function withSignalFaults(signaling: PeerSignaling, getFaults?: () => { drop?: number; duplicate?: number; jitter?: number }): PeerSignaling & { pause(ms: number): void; dispose(): void };
|
|
560
|
+
export const WEBRTC_PREFIX: 'LIRA_WEBRTC_V1:';
|
|
561
|
+
export const MAX_SIGNAL_LENGTH: number;
|
|
562
|
+
export function isWebrtcMessage(text: unknown): boolean;
|
|
563
|
+
export function encodeSignal(signal: Record<string, unknown>): string | null;
|
|
564
|
+
export function decodeSignal(text: string): Record<string, any> | null;
|
|
565
|
+
/** Lazy lab UI; render inside <Suspense>. */
|
|
566
|
+
export const WebRtcLab: ComponentType<{
|
|
567
|
+
selfId: string | null; selfName?: string; peers?: { id: string; name?: string }[]; defaultPeerId?: string;
|
|
568
|
+
createSignaling: (opts: { peerId: string; log: (line: string) => void }) => PeerSignaling | Promise<PeerSignaling>;
|
|
569
|
+
socketStatus?: string; disabledReason?: string; title?: string; children?: ReactNode; iceServers?: RTCIceServer[];
|
|
570
|
+
}>;
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"battleship-DXKuIZ1I.js","names":["FLEET","matrix","fail","isCell","cell","createBoard","validatePlacement","placement","definition","ship","shipId","board","orientation","cells","row","index","col","placeShip","validation","grid","removeShip","item","shot","isFleetComplete","isShipSunk","isFleetSunk","fireShot","result","shots","nextBoard"],"sources":["../../src/games/battleship/logic/board.js"],"sourcesContent":["/** Pure board rules. Coordinates are zero-based { row, col }. Ships may touch. */\nexport const BOARD_SIZE = 10;\nexport const RULES_VERSION = 1;\nexport const FLEET = Object.freeze([\n Object.freeze({ id: 'carrier', size: 5 }),\n Object.freeze({ id: 'battleship', size: 4 }),\n Object.freeze({ id: 'cruiser', size: 3 }),\n Object.freeze({ id: 'submarine', size: 3 }),\n Object.freeze({ id: 'destroyer', size: 2 }),\n]);\nconst matrix = () => Array.from({ length: BOARD_SIZE }, () => Array(BOARD_SIZE).fill(null));\nconst fail = (reason) => ({ ok: false, reason });\n\nexport function isCell(cell) {\n return cell != null && Number.isInteger(cell.row) && Number.isInteger(cell.col)\n && cell.row >= 0 && cell.row < BOARD_SIZE && cell.col >= 0 && cell.col < BOARD_SIZE;\n}\n\nexport function createBoard() {\n return { grid: matrix(), shots: matrix(), ships: [] };\n}\n\nexport function validatePlacement(board, placement) {\n if (!placement || typeof placement !== 'object') return fail('invalid_placement');\n const { shipId, row, col, orientation } = placement;\n const definition = FLEET.find((ship) => ship.id === shipId);\n if (!definition) return fail('unknown_ship');\n if (board.ships.some((ship) => ship.id === shipId)) return fail('already_placed');\n if (orientation !== 'horizontal' && orientation !== 'vertical') return fail('invalid_orientation');\n if (!isCell({ row, col })) return fail('out_of_bounds');\n const cells = Array.from({ length: definition.size }, (_, index) => ({\n row: row + (orientation === 'vertical' ? index : 0),\n col: col + (orientation === 'horizontal' ? index : 0),\n }));\n if (cells.some((cell) => !isCell(cell))) return fail('out_of_bounds');\n if (cells.some((cell) => board.grid[cell.row][cell.col] !== null)) return fail('overlap');\n return { ok: true, ship: { id: shipId, size: definition.size, orientation, cells } };\n}\n\nexport function placeShip(board, placement) {\n const validation = validatePlacement(board, placement);\n if (!validation.ok) return validation;\n const grid = board.grid.map((row) => row.slice());\n const { ship } = validation;\n for (const cell of ship.cells) grid[cell.row][cell.col] = ship.id;\n return { ok: true, board: { ...board, grid, ships: [...board.ships, ship] }, ship };\n}\n\nexport function removeShip(board, shipId) {\n const ship = board.ships.find((item) => item.id === shipId);\n if (!ship) return fail('unknown_ship');\n if (board.shots.some((row) => row.some((shot) => shot !== null))) return fail('battle_started');\n const grid = board.grid.map((row) => row.slice());\n for (const cell of ship.cells) grid[cell.row][cell.col] = null;\n return { ok: true, board: { ...board, grid, ships: board.ships.filter((item) => item.id !== shipId) } };\n}\n\nexport function isFleetComplete(board) {\n return board.ships.length === FLEET.length && FLEET.every((definition) => {\n const ship = board.ships.find((item) => item.id === definition.id);\n return ship?.size === definition.size && ship.cells.length === definition.size;\n });\n}\n\nexport function isShipSunk(board, shipId) {\n const ship = board.ships.find((item) => item.id === shipId);\n return Boolean(ship && ship.cells.every((cell) => board.shots[cell.row][cell.col] === 'hit'));\n}\n\nexport function isFleetSunk(board) {\n return isFleetComplete(board) && board.ships.every((ship) => isShipSunk(board, ship.id));\n}\n\nexport function fireShot(board, cell) {\n if (!isCell(cell)) return fail('out_of_bounds');\n if (board.shots[cell.row][cell.col] !== null) return fail('repeat_shot');\n if (isFleetSunk(board)) return fail('battle_finished');\n const shipId = board.grid[cell.row][cell.col];\n const result = shipId === null ? 'miss' : 'hit';\n const shots = board.shots.map((row) => row.slice());\n shots[cell.row][cell.col] = result;\n const nextBoard = { ...board, shots };\n return {\n ok: true, board: nextBoard, result, shipId,\n sunk: shipId !== null && isShipSunk(nextBoard, shipId),\n defeated: isFleetSunk(nextBoard),\n };\n}\n"],"mappings":"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"}
|