From d75ee3fcff1206193c7487bc9f52dc4f6898b1b6 Mon Sep 17 00:00:00 2001 From: Gareth Latty Date: Sat, 4 Jan 2020 03:03:54 +0000 Subject: [PATCH] Fix hot-joining games. --- client/src/elm/MassiveDecks/Game.elm | 16 ++++++++++++++++ client/src/elm/MassiveDecks/Pages/Lobby.elm | 13 +++++++++---- server/src/ts/games/game.ts | 5 ++++- server/src/ts/index.ts | 9 +++++++++ 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/client/src/elm/MassiveDecks/Game.elm b/client/src/elm/MassiveDecks/Game.elm index dc88000..4ac9e00 100644 --- a/client/src/elm/MassiveDecks/Game.elm +++ b/client/src/elm/MassiveDecks/Game.elm @@ -1,6 +1,7 @@ module MassiveDecks.Game exposing ( applyGameEvent , applyGameStarted + , hotJoinPlayer , init , subscriptions , update @@ -571,6 +572,21 @@ applyGameStarted lobby round hand = init game hand Round.noPick +hotJoinPlayer : User.Id -> Model -> Model +hotJoinPlayer player model = + let + oldGame = + model.game + + game = + { oldGame + | players = oldGame.players |> Dict.insert player { score = 0 } + , playerOrder = oldGame.playerOrder ++ [ player ] + } + in + { model | game = game } + + {- Private -} diff --git a/client/src/elm/MassiveDecks/Pages/Lobby.elm b/client/src/elm/MassiveDecks/Pages/Lobby.elm index d6d1364..53b3ac6 100644 --- a/client/src/elm/MassiveDecks/Pages/Lobby.elm +++ b/client/src/elm/MassiveDecks/Pages/Lobby.elm @@ -171,10 +171,10 @@ update shared msg model = Events.Presence { user, state } -> let - newUsers = + ( newUsers, game ) = case state of Events.UserJoined { name, privilege, control } -> - Dict.insert + ( Dict.insert user { name = name , presence = User.Joined @@ -184,10 +184,14 @@ update shared msg model = , control = control } lobby.users + , lobby.game |> Maybe.map (Game.hotJoinPlayer user) + ) Events.UserLeft -> - lobby.users + ( lobby.users |> Dict.update user (Maybe.map (\u -> { u | presence = User.Left })) + , lobby.game + ) message = case state of @@ -197,7 +201,8 @@ update shared msg model = Events.UserLeft -> UserLeft user in - addNotification message { model | lobby = Just { lobby | users = newUsers } } + addNotification message + { model | lobby = Just { lobby | users = newUsers, game = game } } Events.PrivilegeSet { user, privilege } -> let diff --git a/server/src/ts/games/game.ts b/server/src/ts/games/game.ts index 3f5ea32..88ff0ff 100644 --- a/server/src/ts/games/game.ts +++ b/server/src/ts/games/game.ts @@ -83,7 +83,10 @@ export class Game { rules: Rules ): Game & { round: round.Playing } { const gameDecks = decks.decks(templates); - const playerOrder = Array.from(users.keys()); + const playerOrder = wu(users.entries()) + .filter(([id, user]) => user.role === "Player") + .map(([id, _]) => id) + .toArray(); const czar = playerOrder[0]; const playerMap = new Map( wu(playerOrder).map(id => [ diff --git a/server/src/ts/index.ts b/server/src/ts/index.ts index 77a17f1..89c59c7 100644 --- a/server/src/ts/index.ts +++ b/server/src/ts/index.ts @@ -19,6 +19,7 @@ import { InvalidLobbyPasswordError } from "./errors/authentication"; import { UsernameAlreadyInUseError } from "./errors/registration"; import * as event from "./event"; import * as presenceChanged from "./events/lobby-event/presence-changed"; +import { Player } from "./games/player"; import * as change from "./lobby/change"; import { GameCode } from "./lobby/game-code"; import * as logging from "./logging"; @@ -130,6 +131,14 @@ async function main(): Promise { const id = lobby.nextUserId.toString(); lobby.nextUserId += 1; lobby.users.set(id, newUser); + const game = lobby.game; + if (game !== undefined && newUser.role === "Player") { + game.playerOrder.push(id); + game.players.set( + id, + new Player(game.decks.responses.draw(game.rules.handSize)) + ); + } return { change: { lobby,