duel tetris fonctionnel mais galere a tester en solo
This commit is contained in:
@@ -482,6 +482,17 @@ function setupSocketIO(io)
|
|||||||
_tetrisRelayToOpponent(socket, 'tetris:lines-cleared', data);
|
_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
|
// game-over → relayé en opponent-game-over chez l'adversaire
|
||||||
socket.on('tetris:game-over', (data) => {
|
socket.on('tetris:game-over', (data) => {
|
||||||
_tetrisRelayToOpponent(socket, 'tetris:opponent-game-over', data);
|
_tetrisRelayToOpponent(socket, 'tetris:opponent-game-over', data);
|
||||||
|
|||||||
@@ -3,10 +3,11 @@
|
|||||||
// ─────────────────────────────────────────────
|
// ─────────────────────────────────────────────
|
||||||
|
|
||||||
class Duel {
|
class Duel {
|
||||||
constructor(socket, tetrisGame, onStatusChange) {
|
constructor(socket, tetrisGame, onStatusChange, onStart) {
|
||||||
this.socket = socket;
|
this.socket = socket;
|
||||||
this.tetrisGame = tetrisGame;
|
this.tetrisGame = tetrisGame;
|
||||||
this.onStatusChange = onStatusChange; // (status, opponentName) => void
|
this.onStatusChange = onStatusChange; // (status, opponentName) => void
|
||||||
|
this.onStart = onStart; // () => void — déclenche le début du jeu local
|
||||||
|
|
||||||
this.action_queue = [];
|
this.action_queue = [];
|
||||||
this.opponentGrid = this._emptyGrid();
|
this.opponentGrid = this._emptyGrid();
|
||||||
@@ -24,6 +25,11 @@ class Duel {
|
|||||||
this.socket.emit('tetris:join', { roomCode });
|
this.socket.emit('tetris:join', { roomCode });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
startDuel() {
|
||||||
|
if (!this.isReady) return;
|
||||||
|
this.socket.emit('tetris:start-duel');
|
||||||
|
}
|
||||||
|
|
||||||
leave() {
|
leave() {
|
||||||
if (!this.roomCode) return;
|
if (!this.roomCode) return;
|
||||||
this.socket.emit('tetris:leave');
|
this.socket.emit('tetris:leave');
|
||||||
@@ -112,6 +118,10 @@ class Duel {
|
|||||||
this.socket.on('tetris:opponent-game-over', (data) => {
|
this.socket.on('tetris:opponent-game-over', (data) => {
|
||||||
this.action_queue.push({ type: 'OPPONENT_GAME_OVER', score: data.score });
|
this.action_queue.push({ type: 'OPPONENT_GAME_OVER', score: data.score });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.socket.on('tetris:start-duel', () => {
|
||||||
|
if (this.onStart) this.onStart();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// ─── Utilitaires ─────────────────────────
|
// ─── Utilitaires ─────────────────────────
|
||||||
|
|||||||
@@ -41,7 +41,13 @@ function hideOverlay() {
|
|||||||
// SOCKET + DUEL
|
// 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;
|
let duel = null;
|
||||||
|
|
||||||
@@ -63,11 +69,18 @@ function updateDuelStatus(status, opponentName) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function startLocalGame() {
|
||||||
|
hideOverlay();
|
||||||
|
game.start();
|
||||||
|
updateButtons();
|
||||||
|
render();
|
||||||
|
}
|
||||||
|
|
||||||
btnJoinDuel.addEventListener('click', () => {
|
btnJoinDuel.addEventListener('click', () => {
|
||||||
const code = inputRoomCode.value.trim().toUpperCase();
|
const code = inputRoomCode.value.trim().toUpperCase();
|
||||||
if (!code) return;
|
if (!code) return;
|
||||||
if (duel) { duel.leave(); }
|
if (duel) { duel.leave(); }
|
||||||
duel = new Duel(socket, game, updateDuelStatus);
|
duel = new Duel(socket, game, updateDuelStatus, startLocalGame);
|
||||||
duel.join(code);
|
duel.join(code);
|
||||||
btnJoinDuel.disabled = true;
|
btnJoinDuel.disabled = true;
|
||||||
btnLeaveDuel.disabled = false;
|
btnLeaveDuel.disabled = false;
|
||||||
@@ -112,10 +125,11 @@ const game = new Tetris(
|
|||||||
);
|
);
|
||||||
|
|
||||||
btnStart.addEventListener('click', () => {
|
btnStart.addEventListener('click', () => {
|
||||||
hideOverlay();
|
if (duel && duel.isReady) {
|
||||||
game.start();
|
duel.startDuel(); // déclenche les deux parties via le serveur
|
||||||
updateButtons();
|
} else {
|
||||||
render();
|
startLocalGame(); // solo
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
btnPause.addEventListener('click', () => {
|
btnPause.addEventListener('click', () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user