diff --git a/client/public/game/lobbies.js b/client/public/game/lobbies.js index 89efa33..7af95fe 100644 --- a/client/public/game/lobbies.js +++ b/client/public/game/lobbies.js @@ -74,8 +74,9 @@ function drawLobby(lobby) lobbyDiv.innerHTML += `
${localeString('visibility')}: ${lobby.visibility}
${localeString('status')}: ${lobby.state}`; lobbyDiv.innerHTML += `
${localeString('ready')}`; - lobbyDiv.innerHTML += ``; - + lobbyDiv.innerHTML += ``; + lobbyDiv.innerHTML += `` + const checkbox = document.querySelector('#lobby-input-ready'); checkbox.addEventListener('change', () => { if (checkbox.checked) socket.emit('lobby-user-ready'); @@ -257,6 +258,14 @@ socket.on('lobby-update', obj => { if (obj.state === 'user-unready') pageLog(`${obj.updateuser.username} ${localeString('user-is-unready')}`); + + if (obj.state === 'game-ready') + document.querySelector('#button-start-game').disabled = false; + + if (obj.state === 'game-unready') + document.querySelector('#button-start-game').disabled = true; + + }); function leaveLobby() diff --git a/server/src/lobbies.js b/server/src/lobbies.js index 6aac25a..c9914af 100644 --- a/server/src/lobbies.js +++ b/server/src/lobbies.js @@ -71,13 +71,13 @@ function IsUserInLobby(useruid) function IsLobbyReady(lobbyuid) { - if (!Lobbies[lobbyuid]) return false; - if (!Lobbies[lobbyuid].players.length <= 1) return false; - - const arePlayersReady = Lobbies[lobbyuid].players.every(e => e.ready) - - + if (!Lobbies[lobbyuid]) return false; + // only support 2-4 players + // https://en.wikipedia.org/wiki/Scrabble + if (Lobbies[lobbyuid].players.length <= 1) return false; + if (Lobbies[lobbyuid].players.length > 4) return false; + return Lobbies[lobbyuid].players.every(e => e.ready); } @@ -189,7 +189,6 @@ function UserUnReady(useruid, callback) if (Lobbies[lobbyuid].players[player].uid === useruid) Lobbies[lobbyuid].players[player].ready = false; - callback(GetUserByUID(useruid), GetLobbyByUserUID(useruid), 'user-unready'); return true; } @@ -226,6 +225,10 @@ function UserLeaveLobby(useruid, callback) callback(Registrar.GetUserByUID(useruid), lobby, 'lobby-leave'); + // if the user leaving the lobby caused the game to be unready, emit + if (!IsLobbyReady(lobby.uid)) + callback(Registrar.GetUserByUID(useruid), lobby, 'game-unready'); + return true; } diff --git a/server/src/socketserver.js b/server/src/socketserver.js index 1da1d11..e004e29 100644 --- a/server/src/socketserver.js +++ b/server/src/socketserver.js @@ -250,18 +250,25 @@ function LobbyLeave(socket, args) function LobbyUserReady(socket, args) { const user = Game.Registrar.GetUserbyConnection(socket.id); + const lobby = Game.Lobbies.GetLobbyByUserUID(user.uid); + if (!Game.Lobbies.UserReady(user.uid, LobbyUpdateCallback)) return; Logger.debug(`USER ${user.uid} (${Game.Registrar.GetUserByUID(user.uid).username}) READY`); + + if (Game.Lobbies.IsLobbyReady(lobby.uid)) LobbyUpdateCallback(user, lobby, 'game-ready'); } function LobbyUserUnReady(socket, args) { const user = Game.Registrar.GetUserbyConnection(socket.id); - + const lobby = Game.Lobbies.GetLobbyByUserUID(user.uid); + if (!Game.Lobbies.UserUnReady(user.uid, LobbyUpdateCallback)) return; Logger.debug(`USER ${user.uid} (${Game.Registrar.GetUserByUID(user.uid).username}) UNREADY`); + + if (!Game.Lobbies.IsLobbyReady(lobby.uid)) LobbyUpdateCallback(user, lobby, 'game-unready'); } function LobbyGameBegin(socket, args) @@ -290,9 +297,11 @@ function HandleDisconnect(socket, args) * * lobby-deregister * lobby-join + * lobby-leave * user-ready * user-unready - * lobby-leave + * game-ready + * game-unready */ function LobbyUpdateCallback(user, lobby, state) { @@ -302,6 +311,7 @@ function LobbyUpdateCallback(user, lobby, state) updateuser: Game.Registrar.GetSafeUserByUID(user.uid), lobby: lobby }); + Game.Lobbies.IsLobbyReady(lobby.uid) } module.exports = {