From a4210af2355dcf0636f6754e5bebc955466ec997 Mon Sep 17 00:00:00 2001 From: bitsearch Date: Thu, 19 Feb 2026 16:45:54 +0100 Subject: [PATCH] duel tetris fonctionnel mais galere a tester en solo --- Transcendence/srcs/backend/services/socket.js | 11 ++++++++ Transcendence/srcs/frontend/src/duel.js | 12 ++++++++- Transcendence/srcs/frontend/src/ui.js | 26 ++++++++++++++----- 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/Transcendence/srcs/backend/services/socket.js b/Transcendence/srcs/backend/services/socket.js index e556a6c..cba814b 100644 --- a/Transcendence/srcs/backend/services/socket.js +++ b/Transcendence/srcs/backend/services/socket.js @@ -482,6 +482,17 @@ function setupSocketIO(io) _tetrisRelayToOpponent(socket, 'tetris:lines-cleared', data); }); + // start-duel → relayé aux DEUX joueurs de la room (inclut l'émetteur) + socket.on('tetris:start-duel', () => { + const code = socket.tetrisRoomCode; + if (!code) return; + const room = tetrisRooms.get(code); + if (!room || room.size < 2) return; + for (const s of room.values()) { + s.emit('tetris:start-duel'); + } + }); + // game-over → relayé en opponent-game-over chez l'adversaire socket.on('tetris:game-over', (data) => { _tetrisRelayToOpponent(socket, 'tetris:opponent-game-over', data); diff --git a/Transcendence/srcs/frontend/src/duel.js b/Transcendence/srcs/frontend/src/duel.js index 303ebe2..859d99e 100644 --- a/Transcendence/srcs/frontend/src/duel.js +++ b/Transcendence/srcs/frontend/src/duel.js @@ -3,10 +3,11 @@ // ───────────────────────────────────────────── class Duel { - constructor(socket, tetrisGame, onStatusChange) { + constructor(socket, tetrisGame, onStatusChange, onStart) { this.socket = socket; this.tetrisGame = tetrisGame; this.onStatusChange = onStatusChange; // (status, opponentName) => void + this.onStart = onStart; // () => void — déclenche le début du jeu local this.action_queue = []; this.opponentGrid = this._emptyGrid(); @@ -24,6 +25,11 @@ class Duel { this.socket.emit('tetris:join', { roomCode }); } + startDuel() { + if (!this.isReady) return; + this.socket.emit('tetris:start-duel'); + } + leave() { if (!this.roomCode) return; this.socket.emit('tetris:leave'); @@ -112,6 +118,10 @@ class Duel { this.socket.on('tetris:opponent-game-over', (data) => { this.action_queue.push({ type: 'OPPONENT_GAME_OVER', score: data.score }); }); + + this.socket.on('tetris:start-duel', () => { + if (this.onStart) this.onStart(); + }); } // ─── Utilitaires ───────────────────────── diff --git a/Transcendence/srcs/frontend/src/ui.js b/Transcendence/srcs/frontend/src/ui.js index f5e75bb..009abdb 100644 --- a/Transcendence/srcs/frontend/src/ui.js +++ b/Transcendence/srcs/frontend/src/ui.js @@ -41,7 +41,13 @@ function hideOverlay() { // SOCKET + DUEL // ───────────────────────────────────────────── -const socket = io({ auth: { token: localStorage.getItem('token') } }); +const socket = io({ + auth: { token: localStorage.getItem('auth_token') }, + reconnection: true, + reconnectionAttempts: 5, + reconnectionDelay: 1000, + transports: ['websocket', 'polling'] +}); let duel = null; @@ -63,11 +69,18 @@ function updateDuelStatus(status, opponentName) { } } +function startLocalGame() { + hideOverlay(); + game.start(); + updateButtons(); + render(); +} + btnJoinDuel.addEventListener('click', () => { const code = inputRoomCode.value.trim().toUpperCase(); if (!code) return; if (duel) { duel.leave(); } - duel = new Duel(socket, game, updateDuelStatus); + duel = new Duel(socket, game, updateDuelStatus, startLocalGame); duel.join(code); btnJoinDuel.disabled = true; btnLeaveDuel.disabled = false; @@ -112,10 +125,11 @@ const game = new Tetris( ); btnStart.addEventListener('click', () => { - hideOverlay(); - game.start(); - updateButtons(); - render(); + if (duel && duel.isReady) { + duel.startDuel(); // déclenche les deux parties via le serveur + } else { + startLocalGame(); // solo + } }); btnPause.addEventListener('click', () => {