Fix hot-joining games.
This commit is contained in:
@@ -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 -}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 => [
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user