Fix lobby: only show players who have joined

Changes:
- Added socket.join(LOBBY_ROOM) when player joins lobby
- Changed io.emit() to io.to(LOBBY_ROOM).emit() for all lobby events
- Players only see lobby events after they click JOIN LOBBY
- Fixed player list to update correctly when players join/ready
- Game now starts properly when all players are ready

Files modified:
- server/index.js: Use Socket.io rooms for lobby scoping
- public/js/app.js: Show lobby screen on player-joined event
- public/js/ui.js: Removed duplicate listener override
This commit is contained in:
2026-03-20 07:30:42 -07:00
parent e7917a338e
commit 833256d18f
3 changed files with 15 additions and 13 deletions
+4
View File
@@ -23,6 +23,10 @@ function setupNetworkListeners() {
// Player joined lobby // Player joined lobby
network.setListener('player-joined', (player) => { network.setListener('player-joined', (player) => {
ui.updatePlayerList(network.getAllPlayers()); ui.updatePlayerList(network.getAllPlayers());
// Show lobby screen if we're on the login screen
if (ui.screens.room.classList.contains('active')) {
ui.showScreen('lobby');
}
}); });
// Player left lobby // Player left lobby
-5
View File
@@ -57,11 +57,6 @@ class UIManager {
return; return;
} }
// Set listener for player joined event
network.setListener('player-joined', () => {
this.showScreen('lobby');
});
network.joinLobby(playerName); network.joinLobby(playerName);
} }
+11 -8
View File
@@ -34,12 +34,15 @@ const TETROMINO_KEYS = Object.keys(TETROMINOS);
const BOARD_WIDTH = 10; const BOARD_WIDTH = 10;
const BOARD_HEIGHT = 20; const BOARD_HEIGHT = 20;
const GARBAGE_COLOR = '#666666'; const GARBAGE_COLOR = '#666666';
const LOBBY_ROOM = 'global-lobby';
io.on('connection', (socket) => { io.on('connection', (socket) => {
console.log('Player connected:', socket.id); console.log('Player connected:', socket.id);
// Join global lobby // Join global lobby
socket.on('join-lobby', ({ playerName }) => { socket.on('join-lobby', ({ playerName }) => {
// Add socket to lobby room so they receive lobby events
socket.join(LOBBY_ROOM);
socket.data.playerName = playerName; socket.data.playerName = playerName;
const player = { const player = {
@@ -59,8 +62,8 @@ io.on('connection', (socket) => {
lobby.players.set(socket.id, player); lobby.players.set(socket.id, player);
// Broadcast to all clients // Broadcast only to players in the lobby room
io.emit('player-joined', { io.to(LOBBY_ROOM).emit('player-joined', {
player: { id: player.id, name: player.name }, player: { id: player.id, name: player.name },
players: getPlayersList() players: getPlayersList()
}); });
@@ -74,8 +77,8 @@ io.on('connection', (socket) => {
player.ready = true; player.ready = true;
// Broadcast updated player list // Broadcast only to players in the lobby room
io.emit('player-joined', { io.to(LOBBY_ROOM).emit('player-joined', {
player: { id: player.id, name: player.name, ready: player.ready }, player: { id: player.id, name: player.name, ready: player.ready },
players: getPlayersList() players: getPlayersList()
}); });
@@ -169,7 +172,7 @@ io.on('connection', (socket) => {
lobby.players.delete(socket.id); lobby.players.delete(socket.id);
io.emit('player-left', { io.to(LOBBY_ROOM).emit('player-left', {
playerId: socket.id, playerId: socket.id,
players: getPlayersList() players: getPlayersList()
}); });
@@ -321,7 +324,7 @@ function startGame() {
lobby.gameInterval = setInterval(() => gameTick(), 50); lobby.gameInterval = setInterval(() => gameTick(), 50);
io.emit('game-started', { io.to(LOBBY_ROOM).emit('game-started', {
players: getPlayersList(), players: getPlayersList(),
states: getStates() states: getStates()
}); });
@@ -348,7 +351,7 @@ function gameTick() {
} }
function broadcastState() { function broadcastState() {
io.emit('state-update', getStates()); io.to(LOBBY_ROOM).emit('state-update', getStates());
} }
function getStates() { function getStates() {
@@ -367,7 +370,7 @@ function getStates() {
function checkGameOver() { function checkGameOver() {
const activePlayers = Array.from(lobby.players.values()).filter(p => !p.eliminated); const activePlayers = Array.from(lobby.players.values()).filter(p => !p.eliminated);
if (activePlayers.length <= 1) { if (activePlayers.length <= 1) {
io.emit('game-over', { states: getStates() }); io.to(LOBBY_ROOM).emit('game-over', { states: getStates() });
if (lobby.gameInterval) { if (lobby.gameInterval) {
clearInterval(lobby.gameInterval); clearInterval(lobby.gameInterval);
lobby.gameInterval = null; lobby.gameInterval = null;