Fix hot-joining games.

This commit is contained in:
Gareth Latty
2020-01-04 03:03:54 +00:00
parent aa0d3a4b5b
commit d75ee3fcff
4 changed files with 38 additions and 5 deletions
+16
View File
@@ -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 -}
+9 -4
View File
@@ -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
+4 -1
View File
@@ -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 => [
+9
View File
@@ -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<void> {
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,