From 2b1523018bd22e82a99d31e509e811ba3e8be598 Mon Sep 17 00:00:00 2001 From: Sam Maselli Date: Wed, 6 Dec 2023 23:35:41 -0500 Subject: [PATCH 1/4] remove compile errors for typescript --- .vscode/settings.json | 1 - client/src/components/ChatMessage.tsx | 107 +++++------ client/src/components/StyledText.tsx | 15 +- client/src/game/gameManager.d.tsx | 3 +- client/src/game/gameManager.tsx | 34 ++-- client/src/game/gameState.d.tsx | 9 +- client/src/game/gameState.tsx | 30 ++- client/src/game/messageListener.tsx | 179 +++++++++++------- client/src/index.tsx | 2 +- client/src/menu/game/GameScreen.tsx | 33 ++-- client/src/menu/game/HeaderMenu.tsx | 15 +- .../menu/game/gameScreenContent/ChatMenu.tsx | 29 +-- .../game/gameScreenContent/GraveyardMenu.tsx | 16 +- .../game/gameScreenContent/PlayerListMenu.tsx | 32 ++-- .../game/gameScreenContent/RoleSpecific.tsx | 14 +- .../RoleSpecificMenus/LargeAmnesiacMenu.tsx | 29 +-- .../RoleSpecificMenus/LargeDoomsayerMenu.tsx | 25 +-- .../RoleSpecificMenus/LargeForgerMenu.tsx | 14 +- .../SmallRoleSpecificMenu.tsx | 14 +- .../menu/game/gameScreenContent/WikiMenu.tsx | 14 +- .../menu/game/gameScreenContent/WillMenu.tsx | 47 +++-- client/src/menu/lobby/LobbyMenu.tsx | 55 ++++-- client/src/menu/lobby/LobbyPhaseTimePane.tsx | 28 +-- client/src/menu/lobby/LobbyPlayerList.tsx | 20 +- client/src/menu/lobby/LobbyRolePane.tsx | 18 +- client/src/menu/lobby/lobbyExcludedRoles.tsx | 20 +- client/src/menu/main/StartMenu.tsx | 6 +- 27 files changed, 474 insertions(+), 335 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 51a93732e..8b1f8aee1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,7 +7,6 @@ "entriy", "inno", "killable", - "Maselli", "necronomicon", "repr", "Retributionist", diff --git a/client/src/components/ChatMessage.tsx b/client/src/components/ChatMessage.tsx index 70f0b37ab..d3aaefa2d 100644 --- a/client/src/components/ChatMessage.tsx +++ b/client/src/components/ChatMessage.tsx @@ -25,11 +25,13 @@ export default function ChatElement(props: {message: ChatMessage}): ReactElement } if ( - find(GAME_MANAGER.gameState.myName ?? "").test(message.text) || + GAME_MANAGER.state.stateType === "game" && + (find(GAME_MANAGER.state.myName ?? "").test(message.text) || ( - GAME_MANAGER.gameState.myIndex !== null && - find("" + (GAME_MANAGER.gameState.myIndex + 1)).test(message.text) - ) + GAME_MANAGER.state.stateType === "game" && + GAME_MANAGER.state.myIndex !== null && + find("" + (GAME_MANAGER.state.myIndex + 1)).test(message.text) + )) ) { style += " mention"; @@ -54,12 +56,26 @@ export default function ChatElement(props: {message: ChatMessage}): ReactElement return {text}; } +function playerListToString(playerList: PlayerIndex[]): string { + + return playerList.map((playerIndex) => { + if(GAME_MANAGER.state.stateType === "game") + return GAME_MANAGER.state.players[playerIndex].toString(); + else + return "ERROR: outside game" + }).join(", "); +} + export function translateChatMessage(message: ChatMessage): string { + if(GAME_MANAGER.state.stateType !== "game"){ + return "ERROR: outside game" + } + switch (message.type) { case "normal": if(message.messageSender.type === "player"){ return translate("chatMessage.normal", - GAME_MANAGER.gameState.players[message.messageSender.player].toString(), + GAME_MANAGER.state.players[message.messageSender.player].toString(), message.text ); } else { @@ -70,14 +86,14 @@ export function translateChatMessage(message: ChatMessage): string { } case "whisper": return translate("chatMessage.whisper", - GAME_MANAGER.gameState.players[message.fromPlayerIndex].toString(), - GAME_MANAGER.gameState.players[message.toPlayerIndex].toString(), + GAME_MANAGER.state.players[message.fromPlayerIndex].toString(), + GAME_MANAGER.state.players[message.toPlayerIndex].toString(), message.text ); case "broadcastWhisper": return translate("chatMessage.broadcastWhisper", - GAME_MANAGER.gameState.players[message.whisperer].toString(), - GAME_MANAGER.gameState.players[message.whisperee].toString(), + GAME_MANAGER.state.players[message.whisperer].toString(), + GAME_MANAGER.state.players[message.whisperee].toString(), ); case "roleAssignment": return translate("chatMessage.roleAssignment", @@ -109,7 +125,7 @@ export function translateChatMessage(message: ChatMessage): string { } return translate(message.grave.will.length === 0 ? "chatMessage.playerDied.noWill": "chatMessage.playerDied", - GAME_MANAGER.gameState.players[message.grave.playerIndex].toString(), + GAME_MANAGER.state.players[message.grave.playerIndex].toString(), graveRoleString, deathCause ); @@ -128,30 +144,30 @@ export function translateChatMessage(message: ChatMessage): string { case "voted": if (message.votee !== null) { return translate("chatMessage.voted", - GAME_MANAGER.gameState.players[message.voter].toString(), - GAME_MANAGER.gameState.players[message.votee].toString(), + GAME_MANAGER.state.players[message.voter].toString(), + GAME_MANAGER.state.players[message.votee].toString(), ); } else { return translate("chatMessage.voted.cleared", - GAME_MANAGER.gameState.players[message.voter].toString(), + GAME_MANAGER.state.players[message.voter].toString(), ); } case "playerOnTrial": return translate("chatMessage.playerOnTrial", - GAME_MANAGER.gameState.players[message.playerIndex].toString(), + GAME_MANAGER.state.players[message.playerIndex].toString(), ); case "judgementVote": return translate("chatMessage.judgementVote", - GAME_MANAGER.gameState.players[message.voterPlayerIndex].toString(), + GAME_MANAGER.state.players[message.voterPlayerIndex].toString(), ); case "judgementVerdict": return translate("chatMessage.judgementVerdict", - GAME_MANAGER.gameState.players[message.voterPlayerIndex].toString(), + GAME_MANAGER.state.players[message.voterPlayerIndex].toString(), translate("verdict."+message.verdict.toLowerCase()) ); case "trialVerdict": return translate("chatMessage.trialVerdict", - GAME_MANAGER.gameState.players[message.playerOnTrial].toString(), + GAME_MANAGER.state.players[message.playerOnTrial].toString(), message.innocent>=message.guilty?translate("verdict.innocent"):translate("verdict.guilty"), message.innocent, message.guilty @@ -159,35 +175,32 @@ export function translateChatMessage(message: ChatMessage): string { case "targeted": if (message.targets.length > 0) { return translate("chatMessage.targeted", - GAME_MANAGER.gameState.players[message.targeter].toString(), - message.targets.map((target) => GAME_MANAGER.gameState.players[target].toString()).join(", ") - ); + GAME_MANAGER.state.players[message.targeter].toString(), + playerListToString(message.targets)); } else { return translate("chatMessage.targeted.cleared", - GAME_MANAGER.gameState.players[message.targeter].toString(), + GAME_MANAGER.state.players[message.targeter].toString(), ); } case "mayorRevealed": return translate("chatMessage.mayorRevealed", - GAME_MANAGER.gameState.players[message.playerIndex].toString(), + GAME_MANAGER.state.players[message.playerIndex].toString(), ); case "jailedTarget": return translate("chatMessage.jailedTarget", - GAME_MANAGER.gameState.players[message.playerIndex].toString(), + GAME_MANAGER.state.players[message.playerIndex].toString(), ); case "jailedSomeone": return translate("chatMessage.jailedSomeone", - GAME_MANAGER.gameState.players[message.playerIndex].toString() + GAME_MANAGER.state.players[message.playerIndex].toString() ); case "deputyKilled": return translate("chatMessage.deputyKilled", - GAME_MANAGER.gameState.players[message.shotIndex].toString() + GAME_MANAGER.state.players[message.shotIndex].toString() ); case "jailorDecideExecute": if (message.targets.length > 0) { - return translate("chatMessage.jailorDecideExecute", - message.targets.map((target) => GAME_MANAGER.gameState.players[target].toString()).join(", ") - ); + return translate("chatMessage.jailorDecideExecute", playerListToString(message.targets)); } else { return translate("chatMessage.jailorDecideExecute.nobody"); } @@ -200,21 +213,13 @@ export function translateChatMessage(message: ChatMessage): string { if (message.players.length === 0) { return translate("chatMessage.lookoutResult.nobody"); } else { - return translate("chatMessage.lookoutResult", - message.players.map(playerIndex => - GAME_MANAGER.gameState.players[playerIndex].toString() - ).join(", ") - ); + return translate("chatMessage.lookoutResult", playerListToString(message.players)); } case "spyMafiaVisit": if (message.players.length === 0) { return translate("chatMessage.spyMafiaVisit.nobody"); } else { - return translate("chatMessage.spyMafiaVisit", - message.players.map(playerIndex => - GAME_MANAGER.gameState.players[playerIndex].toString() - ).join(", ") - ); + return translate("chatMessage.spyMafiaVisit", playerListToString(message.players)); } case "spyBug": return translate("chatMessage.spyBug."+message.bug); @@ -222,22 +227,14 @@ export function translateChatMessage(message: ChatMessage): string { if (message.players.length === 0) { return translate("chatMessage.trackerResult.nobody"); } else { - return translate("chatMessage.trackerResult", - message.players.map(playerIndex => - GAME_MANAGER.gameState.players[playerIndex].toString() - ).join(", ") - ); + return translate("chatMessage.trackerResult", playerListToString(message.players)); } case "seerResult": return translate("chatMessage.seerResult." + (message.enemies ? "enemies" : "friends")); case "psychicEvil": - return translate("chatMessage.psychicEvil",message.players.map(playerIndex => - GAME_MANAGER.gameState.players[playerIndex].toString() - ).join(", ")); + return translate("chatMessage.psychicEvil", playerListToString(message.players)); case "psychicGood": - return translate("chatMessage.psychicGood",message.players.map(playerIndex => - GAME_MANAGER.gameState.players[playerIndex].toString() - ).join(", ")); + return translate("chatMessage.psychicGood", playerListToString(message.players)); case "playerRoleAndWill": return translate("chatMessage.playersRoleAndWill", translate("role."+message.role+".name"), @@ -251,23 +248,19 @@ export function translateChatMessage(message: ChatMessage): string { translate("chatMessage.consigliereResult.role", translate("role."+message.role+".name")), visitedNobody ? translate("chatMessage.consigliereResult.visited.nobody") - : translate("chatMessage.consigliereResult.visited", - message.visited.map((playerIndex) => GAME_MANAGER.gameState.players[playerIndex].toString()).join(", "), - ), + : translate("chatMessage.consigliereResult.visited", playerListToString(message.visited)), visitedByNobody ? translate("chatMessage.consigliereResult.visitedBy.nobody") - : translate("chatMessage.consigliereResult.visitedBy", - message.visitedBy.map((playerIndex) => GAME_MANAGER.gameState.players[playerIndex].toString()).join(", "), - ) + : translate("chatMessage.consigliereResult.visitedBy", playerListToString(message.visitedBy)) ); case "silenced": return translate("chatMessage.silenced"); case "mediumSeance": - return translate("chatMessage.mediumSeance", GAME_MANAGER.gameState.players[message.player].toString()); + return translate("chatMessage.mediumSeance", GAME_MANAGER.state.players[message.player].toString()); case "witchedYou": return translate("chatMessage.witchedYou" + (message.immune ? ".immune" : "")); case "playerWithNecronomicon": - return translate("chatMessage.playerWithNecronomicon", GAME_MANAGER.gameState.players[message.playerIndex].toString()); + return translate("chatMessage.playerWithNecronomicon", GAME_MANAGER.state.players[message.playerIndex].toString()); case "deputyShotSomeoneSurvived": case "deathCollectedSouls": case "arsonistCleanedSelf": diff --git a/client/src/components/StyledText.tsx b/client/src/components/StyledText.tsx index 653f5badc..e205634b1 100644 --- a/client/src/components/StyledText.tsx +++ b/client/src/components/StyledText.tsx @@ -91,13 +91,14 @@ function getKeywordData(): KeywordDataMap { const DATA = require("../resources/keywords.json"); - for(const player of GAME_MANAGER.gameState.players) { - keywordData[player.toString()] = [ - { style: "keyword-player-number", replacement: (player.index + 1).toString() }, - { replacement: " " }, - { style: "keyword-player", replacement: player.name } - ]; - } + if(GAME_MANAGER.state.stateType === "game") + for(const player of GAME_MANAGER.state.players) { + keywordData[player.toString()] = [ + { style: "keyword-player-number", replacement: (player.index + 1).toString() }, + { replacement: " " }, + { style: "keyword-player", replacement: player.name } + ]; + } for(const role of Object.keys(ROLES)){ const data = DATA["faction." + getFactionFromRole(role as Role)]; diff --git a/client/src/game/gameManager.d.tsx b/client/src/game/gameManager.d.tsx index 7d3e9b07b..956327dc0 100644 --- a/client/src/game/gameManager.d.tsx +++ b/client/src/game/gameManager.d.tsx @@ -19,8 +19,7 @@ export type GameManager = { playerId: number | null, - // state: State, - gameState: GameState, + state: State, server: Server, listeners: StateListener[], diff --git a/client/src/game/gameManager.tsx b/client/src/game/gameManager.tsx index a2e6387fd..d9d3cd2dc 100644 --- a/client/src/game/gameManager.tsx +++ b/client/src/game/gameManager.tsx @@ -1,4 +1,3 @@ -import { createGameState } from "./gameState"; import Anchor from "./../menu/Anchor"; import StartMenu from "./../menu/main/StartMenu"; import GAME_MANAGER from "./../index"; @@ -18,11 +17,9 @@ export function createGameManager(): GameManager { roomCode: null, playerId: null, - // state: { - // stateType: "outsideLobby" - // }, - - gameState : createGameState(), + state: { + stateType: "outsideLobby" + }, server : createServer(), @@ -54,7 +51,7 @@ export function createGameManager(): GameManager { }, leaveGame() { - if (this.gameState.inGame) { + if (this.state.stateType === "game") { this.server.sendPacket({type: "leave"}); } // Set URL to main menu and refresh @@ -216,16 +213,21 @@ export function createGameManager(): GameManager { }, tick(timePassedMs) { - if (!gameManager.gameState.ongoing) return; - - const newTimeLeft = gameManager.gameState.timeLeftMs - timePassedMs; - if (Math.floor(newTimeLeft / 1000) < Math.floor(gameManager.gameState.timeLeftMs / 1000)) { - gameManager.invokeStateListeners("tick"); - } - gameManager.gameState.timeLeftMs = newTimeLeft; - if (gameManager.gameState.timeLeftMs < 0) { - gameManager.gameState.timeLeftMs = 0; + if (gameManager.state.stateType === "game"){ + if (!gameManager.state.still_ticking) return; + + const newTimeLeft = gameManager.state.timeLeftMs - timePassedMs; + if (Math.floor(newTimeLeft / 1000) < Math.floor(gameManager.state.timeLeftMs / 1000)) { + gameManager.invokeStateListeners("tick"); + } + gameManager.state.timeLeftMs = newTimeLeft; + if (gameManager.state.timeLeftMs < 0) { + gameManager.state.timeLeftMs = 0; + } } + + + }, } return gameManager; diff --git a/client/src/game/gameState.d.tsx b/client/src/game/gameState.d.tsx index 15a3257e1..d41d9bab3 100644 --- a/client/src/game/gameState.d.tsx +++ b/client/src/game/gameState.d.tsx @@ -13,11 +13,14 @@ export type OutsideLobbyState = { export type LobbyState = { stateType: "lobby" + myName: string | null, + host: boolean, + roleList: RoleOutline[], excludedRoles: RoleOutline[], phaseTimes: PhaseTimes, - players: Map, + players: Player[]//Map, } export type LobbyPlayer = { name: string, @@ -27,8 +30,6 @@ export type LobbyPlayer = { type GameState = { stateType: "game" - inGame: boolean; - myName: string | null, myIndex: PlayerIndex | null, host: boolean, @@ -55,7 +56,7 @@ type GameState = { excludedRoles: RoleOutline[], phaseTimes: PhaseTimes - ongoing: boolean + still_ticking: boolean } export default GameState; diff --git a/client/src/game/gameState.tsx b/client/src/game/gameState.tsx index 6e9e77e7a..b46c8486e 100644 --- a/client/src/game/gameState.tsx +++ b/client/src/game/gameState.tsx @@ -1,10 +1,32 @@ -import GameState, { Player } from "./gameState.d" +import GameState, { LobbyState, Player } from "./gameState.d" + + +export function createLobbyState(): LobbyState { + return { + stateType: "lobby", + + myName: null, + host: false, + + roleList: [], + excludedRoles: [], + phaseTimes: { + morning: 5, + discussion: 45, + voting: 30, + testimony: 20, + judgement: 20, + evening: 7, + night: 37, + }, + + players: [],//new Map(), + } +} export function createGameState(): GameState { return { stateType: "game", - - inGame: false, myName: null, myIndex: null, @@ -40,7 +62,7 @@ export function createGameState(): GameState { night: 37, }, - ongoing: true, + still_ticking: true, } } diff --git a/client/src/game/messageListener.tsx b/client/src/game/messageListener.tsx index a794d78d4..feda2b23f 100644 --- a/client/src/game/messageListener.tsx +++ b/client/src/game/messageListener.tsx @@ -1,5 +1,5 @@ -import { createPlayer } from "./gameState"; +import { createGameState, createLobbyState, createPlayer } from "./gameState"; import Anchor from "./../menu/Anchor"; import LobbyMenu from "./../menu/lobby/LobbyMenu"; import StartMenu from "./../menu/main/StartMenu"; @@ -15,12 +15,13 @@ export default function messageListener(packet: ToClientPacket){ console.log(JSON.stringify(packet, null, 2)); switch(packet.type) { case "acceptJoin": - GAME_MANAGER.gameState.inGame = packet.inGame; GAME_MANAGER.playerId = packet.playerId; if(packet.inGame){ Anchor.setContent(GameScreen.createDefault()); + GAME_MANAGER.state = createGameState(); }else{ Anchor.setContent(); + GAME_MANAGER.state = createLobbyState(); } break; case "rejectJoin": @@ -63,30 +64,48 @@ export default function messageListener(packet: ToClientPacket){ case "acceptHost": GAME_MANAGER.roomCode = packet.roomCode.toString(18); GAME_MANAGER.playerId = packet.playerId; - GAME_MANAGER.gameState.host = true; + if(GAME_MANAGER.state.stateType !== "outsideLobby") + GAME_MANAGER.state.host = true; Anchor.setContent(); break; /* In Lobby/Game */ case "yourName": - GAME_MANAGER.gameState.myName = packet.name; + if(GAME_MANAGER.state.stateType !== "outsideLobby") + GAME_MANAGER.state.myName = packet.name; break; case "yourPlayerIndex": - GAME_MANAGER.gameState.myIndex = packet.playerIndex; + if(GAME_MANAGER.state.stateType === "game") + GAME_MANAGER.state.myIndex = packet.playerIndex; break; case "players": - GAME_MANAGER.gameState.players = []; - for(let i = 0; i < packet.players.length; i++){ - if (GAME_MANAGER.gameState.players.length > i) { - GAME_MANAGER.gameState.players[i].name = packet.players[i][1]; - GAME_MANAGER.gameState.players[i].id = packet.players[i][0]; - } else { - GAME_MANAGER.gameState.players.push(createPlayer(packet.players[i][1], i, packet.players[i][0])); + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////// Split into two different player messages, or find out how to understand both + if(GAME_MANAGER.state.stateType !== "outsideLobby"){ + GAME_MANAGER.state.players = []; + for(let i = 0; i < packet.players.length; i++){ + if (GAME_MANAGER.state.players.length > i) { + GAME_MANAGER.state.players[i].name = packet.players[i][1]; + GAME_MANAGER.state.players[i].id = packet.players[i][0]; + } else { + GAME_MANAGER.state.players.push(createPlayer(packet.players[i][1], i, packet.players[i][0])); + } } } + break; case "kickPlayer": + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //COMPLETLY BROKEN if(packet.playerId === GAME_MANAGER.playerId){ GAME_MANAGER.leaveGame(); } @@ -94,113 +113,145 @@ export default function messageListener(packet: ToClientPacket){ // Anchor.setContent() break; case "startGame": - GAME_MANAGER.gameState.inGame = true; + GAME_MANAGER.state = createGameState(); Anchor.setContent(GameScreen.createDefault()); break; case "roleList": //list of role list entriy - GAME_MANAGER.gameState.roleList = packet.roleList; + if(GAME_MANAGER.state.stateType !== "outsideLobby") + GAME_MANAGER.state.roleList = packet.roleList; break; case "roleOutline": //role list entriy - GAME_MANAGER.gameState.roleList[packet.index] = packet.roleOutline; + if(GAME_MANAGER.state.stateType !== "outsideLobby") + GAME_MANAGER.state.roleList[packet.index] = packet.roleOutline; break; case "phaseTime": - GAME_MANAGER.gameState.phaseTimes[packet.phase as keyof typeof GAME_MANAGER.gameState.phaseTimes] = packet.time; + if(GAME_MANAGER.state.stateType !== "outsideLobby") + GAME_MANAGER.state.phaseTimes[packet.phase as keyof typeof GAME_MANAGER.state.phaseTimes] = packet.time; break; case "phaseTimes": - GAME_MANAGER.gameState.phaseTimes = packet.phaseTimeSettings; + if(GAME_MANAGER.state.stateType !== "outsideLobby") + GAME_MANAGER.state.phaseTimes = packet.phaseTimeSettings; break; case "excludedRoles": - GAME_MANAGER.gameState.excludedRoles = packet.roles; + if(GAME_MANAGER.state.stateType !== "outsideLobby") + GAME_MANAGER.state.excludedRoles = packet.roles; break; case "youAreHost": - GAME_MANAGER.gameState.host = true; - Anchor.pushInfo("You are host", "The previous host left and you have become the host.") + if(GAME_MANAGER.state.stateType !== "outsideLobby"){ + GAME_MANAGER.state.host = true; + Anchor.pushInfo("You are host", "The previous host left and you have become the host.") + } break; case "phase": - GAME_MANAGER.gameState.phase = packet.phase; - GAME_MANAGER.gameState.dayNumber = packet.dayNumber; - GAME_MANAGER.gameState.timeLeftMs = packet.secondsLeft * 1000; + if(GAME_MANAGER.state.stateType === "game"){ + GAME_MANAGER.state.phase = packet.phase; + GAME_MANAGER.state.dayNumber = packet.dayNumber; + GAME_MANAGER.state.timeLeftMs = packet.secondsLeft * 1000; + } break; case "playerOnTrial": - GAME_MANAGER.gameState.playerOnTrial = packet.playerIndex; + if(GAME_MANAGER.state.stateType === "game") + GAME_MANAGER.state.playerOnTrial = packet.playerIndex; break; case "playerAlive": - for(let i = 0; i < GAME_MANAGER.gameState.players.length && i < packet.alive.length; i++){ - GAME_MANAGER.gameState.players[i].alive = packet.alive[i]; + if(GAME_MANAGER.state.stateType === "game"){ + for(let i = 0; i < GAME_MANAGER.state.players.length && i < packet.alive.length; i++){ + GAME_MANAGER.state.players[i].alive = packet.alive[i]; + } } break; case "playerVotes": - for(let i = 0; i < GAME_MANAGER.gameState.players.length; i++){ - GAME_MANAGER.gameState.players[i].numVoted = 0; - } - for(let [playerIndex, numVoted] of Object.entries(packet.votesForPlayer)){ - GAME_MANAGER.gameState.players[Number.parseInt(playerIndex)].numVoted = numVoted; + if(GAME_MANAGER.state.stateType === "game"){ + for(let i = 0; i < GAME_MANAGER.state.players.length; i++){ + GAME_MANAGER.state.players[i].numVoted = 0; + } + for(let [playerIndex, numVoted] of Object.entries(packet.votesForPlayer)){ + GAME_MANAGER.state.players[Number.parseInt(playerIndex)].numVoted = numVoted; + } } break; case "yourButtons": - for(let i = 0; i < GAME_MANAGER.gameState.players.length && i < packet.buttons.length; i++){ - GAME_MANAGER.gameState.players[i].buttons = packet.buttons[i]; + if(GAME_MANAGER.state.stateType === "game"){ + for(let i = 0; i < GAME_MANAGER.state.players.length && i < packet.buttons.length; i++){ + GAME_MANAGER.state.players[i].buttons = packet.buttons[i]; + } } break; case "yourRoleLabels": - for (const [key, value] of Object.entries(packet.roleLabels)) { - if( - GAME_MANAGER.gameState.players !== undefined && - GAME_MANAGER.gameState.players[Number.parseInt(key)] !== undefined - ) - GAME_MANAGER.gameState.players[Number.parseInt(key)].roleLabel = value as Role; + if(GAME_MANAGER.state.stateType === "game"){ + for (const [key, value] of Object.entries(packet.roleLabels)) { + if( + GAME_MANAGER.state.players !== undefined && + GAME_MANAGER.state.players[Number.parseInt(key)] !== undefined + ) + GAME_MANAGER.state.players[Number.parseInt(key)].roleLabel = value as Role; + } } break; case "yourPlayerTags": - for (const [key, value] of Object.entries(packet.playerTags)) { - GAME_MANAGER.gameState.players[Number.parseInt(key)].playerTags = value as Tag[]; + if(GAME_MANAGER.state.stateType === "game"){ + for (const [key, value] of Object.entries(packet.playerTags)) { + GAME_MANAGER.state.players[Number.parseInt(key)].playerTags = value as Tag[]; + } } break; case "yourWill": - GAME_MANAGER.gameState.will = packet.will; + if(GAME_MANAGER.state.stateType === "game") + GAME_MANAGER.state.will = packet.will; break; case "yourNotes": - GAME_MANAGER.gameState.notes = packet.notes; + if(GAME_MANAGER.state.stateType === "game") + GAME_MANAGER.state.notes = packet.notes; break; case "yourDeathNote": - GAME_MANAGER.gameState.deathNote = packet.deathNote ?? ""; + if(GAME_MANAGER.state.stateType === "game") + GAME_MANAGER.state.deathNote = packet.deathNote ?? ""; break; case "yourRoleState": - if(GAME_MANAGER.gameState.roleState?.role!== packet.roleState.role){ - GameScreen.instance?.closeMenu(ContentMenus.RoleSpecificMenu); + if(GAME_MANAGER.state.stateType === "game"){ + if(GAME_MANAGER.state.roleState?.role!== packet.roleState.role){ + GameScreen.instance?.closeMenu(ContentMenus.RoleSpecificMenu); + } + GAME_MANAGER.state.roleState = packet.roleState; } - GAME_MANAGER.gameState.roleState = packet.roleState; break; case "yourTarget": - GAME_MANAGER.gameState.targets = packet.playerIndices; + if(GAME_MANAGER.state.stateType === "game") + GAME_MANAGER.state.targets = packet.playerIndices; break; case "yourVoting": - GAME_MANAGER.gameState.voted = packet.playerIndex; + if(GAME_MANAGER.state.stateType === "game") + GAME_MANAGER.state.voted = packet.playerIndex; break; case "yourJudgement": - GAME_MANAGER.gameState.judgement = packet.verdict; + if(GAME_MANAGER.state.stateType === "game") + GAME_MANAGER.state.judgement = packet.verdict; break; case "addChatMessages": - GAME_MANAGER.gameState.chatMessages = GAME_MANAGER.gameState.chatMessages.concat(packet.chatMessages); + if(GAME_MANAGER.state.stateType === "game") + GAME_MANAGER.state.chatMessages = GAME_MANAGER.state.chatMessages.concat(packet.chatMessages); break; case "addGrave": - GAME_MANAGER.gameState.graves.push(packet.grave); + if(GAME_MANAGER.state.stateType === "game") + GAME_MANAGER.state.graves.push(packet.grave); break; case "gameOver": - GAME_MANAGER.gameState.ongoing = false; - switch(packet.reason) { - case "ReachedMaxDay": - // alert("Game Over: Reached the maximum day!"); - console.log("incoming message response not implemented " + packet.type + ": " + packet.reason); - console.log(packet); - break; - default: - // alert("Game ended for an unknown reason!"); - console.log("incoming message response not implemented " + packet.type + ": " + packet.reason); - console.log(packet); - break; + if(GAME_MANAGER.state.stateType === "game"){ + GAME_MANAGER.state.still_ticking = false; + switch(packet.reason) { + case "ReachedMaxDay": + // alert("Game Over: Reached the maximum day!"); + console.log("incoming message response not implemented " + packet.type + ": " + packet.reason); + console.log(packet); + break; + default: + // alert("Game ended for an unknown reason!"); + console.log("incoming message response not implemented " + packet.type + ": " + packet.reason); + console.log(packet); + break; + } } break; default: diff --git a/client/src/index.tsx b/client/src/index.tsx index 22140d459..eaef496fd 100644 --- a/client/src/index.tsx +++ b/client/src/index.tsx @@ -31,7 +31,7 @@ function route(url: Location) { const roomCode = new URLSearchParams(url.search).get("code"); if (roomCode !== null) { - GAME_MANAGER.gameState = createGameState(); + GAME_MANAGER.state = createGameState(); GAME_MANAGER.tryJoinGame(roomCode); } else if (url.pathname.startsWith('/wiki')) { const page = url.pathname.substring(6); diff --git a/client/src/menu/game/GameScreen.tsx b/client/src/menu/game/GameScreen.tsx index 721e0d219..462d5b113 100644 --- a/client/src/menu/game/GameScreen.tsx +++ b/client/src/menu/game/GameScreen.tsx @@ -59,21 +59,24 @@ export default class GameScreen extends React.Component{ - this.setState({ - gameState: GAME_MANAGER.gameState, - }); + if(GAME_MANAGER.state.stateType === "game") + this.setState({ + gameState: GAME_MANAGER.state, + }); } } componentDidMount() { @@ -154,13 +157,17 @@ export default class GameScreen extends React.Component
- +
diff --git a/client/src/menu/game/HeaderMenu.tsx b/client/src/menu/game/HeaderMenu.tsx index 4d1167ed8..cd7ad3a17 100644 --- a/client/src/menu/game/HeaderMenu.tsx +++ b/client/src/menu/game/HeaderMenu.tsx @@ -22,13 +22,15 @@ export default class HeaderMenu extends React.Component { - this.setState({ - gameState: GAME_MANAGER.gameState, - }); + if(GAME_MANAGER.state.stateType === "game") + this.setState({ + gameState: GAME_MANAGER.state, + }); }; } componentDidMount() { @@ -39,6 +41,7 @@ export default class HeaderMenu extends React.Component { let atTop = this.messageSection !== null && this.messageSection.scrollTop >= this.messageSection.scrollHeight - this.messageSection.clientHeight - 100; - this.setState({ - gameState: GAME_MANAGER.gameState - }, () => { - if(this.messageSection !== null && atTop){ - this.messageSection.scrollTop = this.messageSection.scrollHeight; - } - }); + + + if(GAME_MANAGER.state.stateType === "game") + this.setState({ + gameState: GAME_MANAGER.state + }, () => { + if(this.messageSection !== null && atTop){ + this.messageSection.scrollTop = this.messageSection.scrollHeight; + } + }); }; this.messageSection = null; } diff --git a/client/src/menu/game/gameScreenContent/GraveyardMenu.tsx b/client/src/menu/game/gameScreenContent/GraveyardMenu.tsx index 2588d6a75..3b21cec94 100644 --- a/client/src/menu/game/gameScreenContent/GraveyardMenu.tsx +++ b/client/src/menu/game/gameScreenContent/GraveyardMenu.tsx @@ -21,14 +21,16 @@ export default class GraveyardMenu extends React.Component{ - this.setState({ - gameState: GAME_MANAGER.gameState - }) + if(GAME_MANAGER.state.stateType === "game") + this.setState({ + gameState: GAME_MANAGER.state + }); }; } componentDidMount() { diff --git a/client/src/menu/game/gameScreenContent/PlayerListMenu.tsx b/client/src/menu/game/gameScreenContent/PlayerListMenu.tsx index 0e7236422..b6b30e843 100644 --- a/client/src/menu/game/gameScreenContent/PlayerListMenu.tsx +++ b/client/src/menu/game/gameScreenContent/PlayerListMenu.tsx @@ -25,23 +25,30 @@ export default class PlayerListMenu extends React.Component{ + if(GAME_MANAGER.state.stateType !== "game"){ + return; + } + let playerFilter = this.state.playerFilter; if(type==="phase"){ - if(!Anchor.isMobile() && (GAME_MANAGER.gameState.myIndex===null || GAME_MANAGER.gameState.players[GAME_MANAGER.gameState.myIndex].alive)){ - if(GAME_MANAGER.gameState.phase === "night"){ + if(!Anchor.isMobile() && (GAME_MANAGER.state.myIndex===null || GAME_MANAGER.state.players[GAME_MANAGER.state.myIndex].alive)){ + if(GAME_MANAGER.state.phase === "night"){ playerFilter = "usable" - }else if(GAME_MANAGER.gameState.phase === "morning"){ + }else if(GAME_MANAGER.state.phase === "morning"){ playerFilter = "living"; } } } this.setState({ - gameState: GAME_MANAGER.gameState, + gameState: GAME_MANAGER.state, playerFilter: playerFilter }) }; @@ -139,11 +146,14 @@ export default class PlayerListMenu extends React.Component {((player) => { if(player.buttons.target) { - return - } else if (this.state.gameState.phase === "night" && this.state.gameState.targets.includes(player.index)) { - let newTargets = [...GAME_MANAGER.gameState.targets]; + } else if (GAME_MANAGER.state.stateType === "game" && this.state.gameState.phase === "night" && this.state.gameState.targets.includes(player.index)) { + let newTargets = [...GAME_MANAGER.state.targets]; newTargets.splice(newTargets.indexOf(player.index), 1); return - - {Anchor.isMobile() ||

{GAME_MANAGER.gameState.myName!}

} - - {Anchor.isMobile() &&

{GAME_MANAGER.gameState.myName!}

} - + console.log(GAME_MANAGER.state.stateType); + + if(GAME_MANAGER.state.stateType !== "outsideLobby") + console.log(GAME_MANAGER.state); + + if(GAME_MANAGER.state.stateType !== "outsideLobby") + return
+ + + {Anchor.isMobile() ||

{GAME_MANAGER.state.myName!}

} + + {Anchor.isMobile() &&

{GAME_MANAGER.state.myName!}

} +
+ else + return
+ + +
+ } function RoomCodeButton(props: {}): JSX.Element { diff --git a/client/src/menu/lobby/LobbyPhaseTimePane.tsx b/client/src/menu/lobby/LobbyPhaseTimePane.tsx index b2be02583..bbf58a6d4 100644 --- a/client/src/menu/lobby/LobbyPhaseTimePane.tsx +++ b/client/src/menu/lobby/LobbyPhaseTimePane.tsx @@ -22,23 +22,27 @@ export default class LobbyPhaseTimePane extends React.Component<{}, PhaseTimePan constructor(props: {}) { super(props); - let initialPhaseTimes = GAME_MANAGER.gameState.phaseTimes ?? {...PHASE_TIME_MODES.get("Classic")!}; + let initialPhaseTimes = {...PHASE_TIME_MODES.get("Classic")!}; + if(GAME_MANAGER.state.stateType === "lobby"){ + initialPhaseTimes = GAME_MANAGER.state.phaseTimes; + } - this.state = { - mode: this.determineModeFromPhaseTimes(initialPhaseTimes), - advancedEditing: false, - phaseTimes: initialPhaseTimes, - host: GAME_MANAGER.gameState.host - }; + if(GAME_MANAGER.state.stateType === "lobby") + this.state = { + mode: this.determineModeFromPhaseTimes(initialPhaseTimes), + advancedEditing: false, + phaseTimes: initialPhaseTimes, + host: GAME_MANAGER.state.host + }; this.listener = (type)=>{ - if(type==="phaseTime" || type==="phaseTimes") + if(GAME_MANAGER.state.stateType === "lobby" && (type==="phaseTime" || type==="phaseTimes")) this.setState({ - mode: this.determineModeFromPhaseTimes(GAME_MANAGER.gameState.phaseTimes), - phaseTimes: GAME_MANAGER.gameState.phaseTimes + mode: this.determineModeFromPhaseTimes(GAME_MANAGER.state.phaseTimes), + phaseTimes: GAME_MANAGER.state.phaseTimes }); - else if (type === "youAreHost") { - this.setState({ host: GAME_MANAGER.gameState.host }); + else if (GAME_MANAGER.state.stateType === "lobby" && type === "youAreHost") { + this.setState({ host: GAME_MANAGER.state.host }); } } } diff --git a/client/src/menu/lobby/LobbyPlayerList.tsx b/client/src/menu/lobby/LobbyPlayerList.tsx index 09859a270..b110f94b1 100644 --- a/client/src/menu/lobby/LobbyPlayerList.tsx +++ b/client/src/menu/lobby/LobbyPlayerList.tsx @@ -17,16 +17,18 @@ export default class LobbyPlayerList extends React.Component<{}, PlayerListState constructor(props: {}) { super(props); - this.state = { - enteredName: "", - players: GAME_MANAGER.gameState.players, - host: GAME_MANAGER.gameState.host - }; + if(GAME_MANAGER.state.stateType === "lobby") + this.state = { + enteredName: "", + players: GAME_MANAGER.state.players, + host: GAME_MANAGER.state.host + }; this.listener = ()=>{ - this.setState({ - players: GAME_MANAGER.gameState.players, - host: GAME_MANAGER.gameState.host - }); + if(GAME_MANAGER.state.stateType === "lobby") + this.setState({ + players: GAME_MANAGER.state.players, + host: GAME_MANAGER.state.host + }); } } componentDidMount() { diff --git a/client/src/menu/lobby/LobbyRolePane.tsx b/client/src/menu/lobby/LobbyRolePane.tsx index 44c6c19a4..1272ea130 100644 --- a/client/src/menu/lobby/LobbyRolePane.tsx +++ b/client/src/menu/lobby/LobbyRolePane.tsx @@ -17,16 +17,18 @@ export default class LobbyRolePane extends React.Component<{}, RolePaneState> { constructor(props: {}){ super(props); - this.state = { - roleList: GAME_MANAGER.gameState.roleList, - host: GAME_MANAGER.gameState.host - } + if(GAME_MANAGER.state.stateType === "lobby") + this.state = { + roleList: GAME_MANAGER.state.roleList, + host: GAME_MANAGER.state.host + } this.listener = () => { - this.setState({ - roleList: GAME_MANAGER.gameState.roleList, - host: GAME_MANAGER.gameState.host - }); + if(GAME_MANAGER.state.stateType === "lobby") + this.setState({ + roleList: GAME_MANAGER.state.roleList, + host: GAME_MANAGER.state.host + }); }; } componentDidMount() { diff --git a/client/src/menu/lobby/lobbyExcludedRoles.tsx b/client/src/menu/lobby/lobbyExcludedRoles.tsx index bfa7fdb88..d6f0342b6 100644 --- a/client/src/menu/lobby/lobbyExcludedRoles.tsx +++ b/client/src/menu/lobby/lobbyExcludedRoles.tsx @@ -22,17 +22,19 @@ export default class LobbyExcludedRoles extends React.Component<{}, ExcludedRole constructor(props: {}){ super(props); - this.state = { - excludedRoles: GAME_MANAGER.gameState.excludedRoles, - roleOutline: {type:"any"}, - host: GAME_MANAGER.gameState.host - } + if(GAME_MANAGER.state.stateType === "lobby") + this.state = { + excludedRoles: GAME_MANAGER.state.excludedRoles, + roleOutline: {type:"any"}, + host: GAME_MANAGER.state.host + } this.listener = () => { - this.setState({ - excludedRoles: GAME_MANAGER.gameState.excludedRoles, - host: GAME_MANAGER.gameState.host - }); + if(GAME_MANAGER.state.stateType === "lobby") + this.setState({ + excludedRoles: GAME_MANAGER.state.excludedRoles, + host: GAME_MANAGER.state.host + }); }; } componentDidMount() { diff --git a/client/src/menu/main/StartMenu.tsx b/client/src/menu/main/StartMenu.tsx index 1bf8f9517..79c87f5fe 100644 --- a/client/src/menu/main/StartMenu.tsx +++ b/client/src/menu/main/StartMenu.tsx @@ -1,6 +1,6 @@ import React from "react"; import GAME_MANAGER from "../../index"; -import { createGameState } from "../../game/gameState"; +import { createLobbyState } from "../../game/gameState"; import Anchor from "../Anchor"; import "../../index.css" import "./startMenu.css" @@ -20,12 +20,12 @@ export default class StartMenu extends React.Component); } private async hostGameButton() { - GAME_MANAGER.gameState = createGameState(); + GAME_MANAGER.state = createLobbyState(); Anchor.setContent(LoadingScreen.create("host")); From b473008f1376810c633cce2c4acf30a21acc293c Mon Sep 17 00:00:00 2001 From: Sam Maselli Date: Sat, 9 Dec 2023 17:23:18 -0500 Subject: [PATCH 2/4] remove accept host message --- client/src/game/gameState.d.tsx | 3 +++ client/src/game/messageListener.tsx | 21 +++++++++-------- client/src/game/packet.tsx | 8 +++---- client/src/index.tsx | 1 - client/src/menu/lobby/LobbyMenu.tsx | 5 ----- server/src/listener.rs | 4 ++-- server/src/lobby.rs | 35 ++++++++++++++++++++++------- server/src/packet.rs | 4 +--- 8 files changed, 46 insertions(+), 35 deletions(-) diff --git a/client/src/game/gameState.d.tsx b/client/src/game/gameState.d.tsx index d41d9bab3..a9331b53f 100644 --- a/client/src/game/gameState.d.tsx +++ b/client/src/game/gameState.d.tsx @@ -10,9 +10,12 @@ export type OutsideLobbyState = { stateType: "outsideLobby" } + +//Change this to use PlayerID for player map and playerID for who I AM instead of myName and host export type LobbyState = { stateType: "lobby" + // myId: number | null, myName: string | null, host: boolean, diff --git a/client/src/game/messageListener.tsx b/client/src/game/messageListener.tsx index feda2b23f..3a4b2dcfc 100644 --- a/client/src/game/messageListener.tsx +++ b/client/src/game/messageListener.tsx @@ -12,17 +12,23 @@ import { Role } from "./roleState.d"; export default function messageListener(packet: ToClientPacket){ - console.log(JSON.stringify(packet, null, 2)); + // console.log(JSON.stringify(packet, null, 2)); + console.log(packet.type); + + switch(packet.type) { case "acceptJoin": - GAME_MANAGER.playerId = packet.playerId; if(packet.inGame){ - Anchor.setContent(GameScreen.createDefault()); GAME_MANAGER.state = createGameState(); + Anchor.setContent(GameScreen.createDefault()); }else{ - Anchor.setContent(); GAME_MANAGER.state = createLobbyState(); + Anchor.setContent(); } + GAME_MANAGER.roomCode = packet.roomCode.toString(18); + GAME_MANAGER.playerId = packet.playerId; + if(GAME_MANAGER.state.stateType === "lobby" || GAME_MANAGER.state.stateType === "game") + GAME_MANAGER.state.host = packet.host; break; case "rejectJoin": switch(packet.reason) { @@ -61,13 +67,6 @@ export default function messageListener(packet: ToClientPacket){ break; } break; - case "acceptHost": - GAME_MANAGER.roomCode = packet.roomCode.toString(18); - GAME_MANAGER.playerId = packet.playerId; - if(GAME_MANAGER.state.stateType !== "outsideLobby") - GAME_MANAGER.state.host = true; - Anchor.setContent(); - break; /* In Lobby/Game */ diff --git a/client/src/game/packet.tsx b/client/src/game/packet.tsx index ae2c71585..3c56652f8 100644 --- a/client/src/game/packet.tsx +++ b/client/src/game/packet.tsx @@ -7,16 +7,14 @@ import { DoomsayerGuess } from "../menu/game/gameScreenContent/RoleSpecificMenus export type ToClientPacket = { type: "acceptJoin", + roomCode: number, inGame: boolean, playerId: number, + host: boolean, } | { type: "rejectJoin", reason: string /* TODO RejectJoinReason */ -} | { - type: "acceptHost", - roomCode: number, - playerId: number, -} | +} | // Lobby { type: "yourName", diff --git a/client/src/index.tsx b/client/src/index.tsx index eaef496fd..d168b97a1 100644 --- a/client/src/index.tsx +++ b/client/src/index.tsx @@ -18,7 +18,6 @@ export default GAME_MANAGER; GAME_MANAGER.addStateListener((type) => { switch (type) { case "acceptJoin": - case "acceptHost": window.history.pushState({}, document.title, `?code=${GAME_MANAGER.roomCode}`); } }) diff --git a/client/src/menu/lobby/LobbyMenu.tsx b/client/src/menu/lobby/LobbyMenu.tsx index 8752ecd4f..de0bdcca6 100644 --- a/client/src/menu/lobby/LobbyMenu.tsx +++ b/client/src/menu/lobby/LobbyMenu.tsx @@ -69,11 +69,6 @@ export default class LobbyMenu extends React.Component - {Anchor.isMobile() ||

{GAME_MANAGER.state.myName!}

} + {Anchor.isMobile() ||

{ + GAME_MANAGER.getMyName() ?? "" + }

} - {Anchor.isMobile() &&

{GAME_MANAGER.state.myName!}

} + {Anchor.isMobile() &&

{ + GAME_MANAGER.getMyName() ?? "" + }

} else return
diff --git a/client/src/menu/lobby/LobbyPhaseTimePane.tsx b/client/src/menu/lobby/LobbyPhaseTimePane.tsx index bbf58a6d4..6d7ff124b 100644 --- a/client/src/menu/lobby/LobbyPhaseTimePane.tsx +++ b/client/src/menu/lobby/LobbyPhaseTimePane.tsx @@ -32,7 +32,7 @@ export default class LobbyPhaseTimePane extends React.Component<{}, PhaseTimePan mode: this.determineModeFromPhaseTimes(initialPhaseTimes), advancedEditing: false, phaseTimes: initialPhaseTimes, - host: GAME_MANAGER.state.host + host: GAME_MANAGER.getMyHost() ?? false }; this.listener = (type)=>{ @@ -41,8 +41,8 @@ export default class LobbyPhaseTimePane extends React.Component<{}, PhaseTimePan mode: this.determineModeFromPhaseTimes(GAME_MANAGER.state.phaseTimes), phaseTimes: GAME_MANAGER.state.phaseTimes }); - else if (GAME_MANAGER.state.stateType === "lobby" && type === "youAreHost") { - this.setState({ host: GAME_MANAGER.state.host }); + else if (GAME_MANAGER.state.stateType === "lobby" && type === "playersHost") { + this.setState({ host: GAME_MANAGER.getMyHost() ?? false }); } } } diff --git a/client/src/menu/lobby/LobbyPlayerList.tsx b/client/src/menu/lobby/LobbyPlayerList.tsx index b110f94b1..d22a5e311 100644 --- a/client/src/menu/lobby/LobbyPlayerList.tsx +++ b/client/src/menu/lobby/LobbyPlayerList.tsx @@ -2,13 +2,13 @@ import React from "react"; import translate from "../../game/lang"; import GAME_MANAGER from "../../index"; import "./lobbyMenu.css"; -import { Player } from "../../game/gameState.d"; +import { LobbyPlayer, PlayerID } from "../../game/gameState.d"; import { StateListener } from "../../game/gameManager.d"; import StyledText from "../../components/StyledText"; type PlayerListState = { enteredName: string, - players: Player[], + players: Map, host: boolean } @@ -21,13 +21,13 @@ export default class LobbyPlayerList extends React.Component<{}, PlayerListState this.state = { enteredName: "", players: GAME_MANAGER.state.players, - host: GAME_MANAGER.state.host + host: GAME_MANAGER.getMyHost() ?? false }; this.listener = ()=>{ if(GAME_MANAGER.state.stateType === "lobby") this.setState({ players: GAME_MANAGER.state.players, - host: GAME_MANAGER.state.host + host: GAME_MANAGER.getMyHost() ?? false }); } } @@ -55,12 +55,17 @@ export default class LobbyPlayerList extends React.Component<{}, PlayerListState )} renderPlayers() { + + let out = []; + for(let [id, player] of this.state.players.entries()){ + out.push(
  • + {player.name} +
  • ) + } + + return
      - {this.state.players.map((player, i)=>{ - return
    1. - {player.toString()} -
    2. - })} + {out}
    } diff --git a/client/src/menu/lobby/LobbyRolePane.tsx b/client/src/menu/lobby/LobbyRolePane.tsx index 1272ea130..8e6369d82 100644 --- a/client/src/menu/lobby/LobbyRolePane.tsx +++ b/client/src/menu/lobby/LobbyRolePane.tsx @@ -20,14 +20,14 @@ export default class LobbyRolePane extends React.Component<{}, RolePaneState> { if(GAME_MANAGER.state.stateType === "lobby") this.state = { roleList: GAME_MANAGER.state.roleList, - host: GAME_MANAGER.state.host + host: GAME_MANAGER.getMyHost() ?? false } this.listener = () => { if(GAME_MANAGER.state.stateType === "lobby") this.setState({ roleList: GAME_MANAGER.state.roleList, - host: GAME_MANAGER.state.host + host: GAME_MANAGER.getMyHost() ?? false }); }; } diff --git a/client/src/menu/lobby/lobbyExcludedRoles.tsx b/client/src/menu/lobby/lobbyExcludedRoles.tsx index d6f0342b6..a6508ae4e 100644 --- a/client/src/menu/lobby/lobbyExcludedRoles.tsx +++ b/client/src/menu/lobby/lobbyExcludedRoles.tsx @@ -26,14 +26,14 @@ export default class LobbyExcludedRoles extends React.Component<{}, ExcludedRole this.state = { excludedRoles: GAME_MANAGER.state.excludedRoles, roleOutline: {type:"any"}, - host: GAME_MANAGER.state.host + host: GAME_MANAGER.getMyHost() ?? false } this.listener = () => { if(GAME_MANAGER.state.stateType === "lobby") this.setState({ excludedRoles: GAME_MANAGER.state.excludedRoles, - host: GAME_MANAGER.state.host + host: GAME_MANAGER.getMyHost() ?? false }); }; } diff --git a/server/src/game/mod.rs b/server/src/game/mod.rs index 0d2023b1f..ac491edf1 100644 --- a/server/src/game/mod.rs +++ b/server/src/game/mod.rs @@ -95,6 +95,7 @@ impl Game { player_ref.send_join_game_data(&mut game); } + //on role creation needs to be called after all players roles are known for player_ref in PlayerReference::all_players(&game){ let role_data_copy = player_ref.role_state(&game).clone(); player_ref.set_role(&mut game, role_data_copy); diff --git a/server/src/game/player/player_send_packet.rs b/server/src/game/player/player_send_packet.rs index 2a3805d35..acbdb1878 100644 --- a/server/src/game/player/player_send_packet.rs +++ b/server/src/game/player/player_send_packet.rs @@ -42,9 +42,11 @@ impl PlayerReference{ pub fn send_join_game_data(&self, game: &mut Game){ // General self.send_packets(game, vec![ + ToClientPacket::GamePlayers{ + players: PlayerReference::all_players(game).into_iter().map(|p|p.name(game).clone()).collect() + }, ToClientPacket::ExcludedRoles { roles: game.settings.excluded_roles.clone() }, ToClientPacket::RoleList {role_list: game.settings.role_list.clone()}, - ToClientPacket::Phase { phase: game.current_phase().phase(), seconds_left: game.phase_machine.time_remaining.as_secs(), @@ -76,9 +78,6 @@ impl PlayerReference{ self.requeue_chat_messages(game); self.send_packets(game, vec![ - ToClientPacket::YourName{ - name: self.name(game).clone() - }, ToClientPacket::YourPlayerIndex { player_index: self.index() }, @@ -105,12 +104,11 @@ impl PlayerReference{ }, ToClientPacket::YourNotes{ notes: self.notes(game).clone() + }, + ToClientPacket::YourButtons{ + buttons: AvailableButtons::from_player(game, *self) } ]); - - - let buttons = AvailableButtons::from_player(game, *self); - self.send_packet(game, ToClientPacket::YourButtons{buttons}); } diff --git a/server/src/lobby.rs b/server/src/lobby.rs index 03be19bde..8f5a5439d 100644 --- a/server/src/lobby.rs +++ b/server/src/lobby.rs @@ -44,7 +44,6 @@ impl LobbyPlayer { } pub fn set_host(&mut self) { self.host = true; - self.sender.send(ToClientPacket::YouAreHost); } pub fn send(&self, message: ToClientPacket) { @@ -85,8 +84,6 @@ impl Lobby { if let Some(player) = players.get_mut(&player_id){ player.name = name.clone(); } - - send.send(ToClientPacket::YourName{name}); Self::send_players_lobby(players); }, @@ -130,11 +127,11 @@ impl Lobby { game: Game::new(settings.clone(), game_players), players: player_indices, }; - let LobbyState::Game { game, players } = &mut self.lobby_state else { + let LobbyState::Game { game, players: _player } = &mut self.lobby_state else { unreachable!("LobbyState::Game was set to be to LobbyState::Game in the previous line"); }; - Lobby::send_players_game(game, players); + Lobby::send_players_game(game); }, ToServerPacket::KickPlayer{player_id: kicked_player_id} => { let LobbyState::Lobby { players, .. } = &mut self.lobby_state else { @@ -250,19 +247,25 @@ impl Lobby { let name = name_validation::sanitize_name("".to_string(), players); - let new_player = LobbyPlayer::new(name.clone(), send.clone(), players.is_empty()); + let mut new_player = LobbyPlayer::new(name.clone(), send.clone(), players.is_empty()); let arbitrary_player_id: PlayerID = - players - .iter() - .map(|(i,_)|*i) - .fold(0u32, u32::max) as PlayerID + 1u32 ; + players + .iter() + .map(|(i,_)|*i) + .fold(0u32, u32::max) as PlayerID + 1u32; + + //if there are no hosts, make this player the host + if !players.iter().any(|p|p.1.host) { + new_player.set_host(); + } + players.insert(arbitrary_player_id, new_player); settings.role_list.push(RoleOutline::Any); - send.send(ToClientPacket::AcceptJoin{room_code: self.room_code, in_game: false, player_id: arbitrary_player_id, host: true}); + - send.send(ToClientPacket::YourName { name: name }); + send.send(ToClientPacket::AcceptJoin{room_code: self.room_code, in_game: false, player_id: arbitrary_player_id}); Self::send_players_lobby(players); @@ -283,17 +286,15 @@ impl Lobby { new_id = id + 1; } } + + send.send(ToClientPacket::AcceptJoin{room_code: self.room_code, in_game: true, player_id: new_id}); + let game_player = GamePlayer{ player_index: player_ref.index(), host: false, }; players.insert(new_id, game_player); player_ref.connect(game, send.clone()); - - send.send(ToClientPacket::AcceptJoin{room_code: self.room_code, in_game: true, player_id: new_id, host: false}); - - Lobby::send_players_game(game, players); - return Ok(new_id); } @@ -397,7 +398,7 @@ impl Lobby { fn send_players_lobby(players: &HashMap){ - let packet = ToClientPacket::Players { + let packet = ToClientPacket::LobbyPlayers { players: players.iter().map(|p| { (*p.0, p.1.name.clone()) }).collect() @@ -405,24 +406,25 @@ impl Lobby { for player in players.iter() { player.1.send(packet.clone()); } + + //send hosts + let hosts: Vec = players.iter().filter(|p|p.1.host).map(|p|*p.0).collect(); + let packet = ToClientPacket::PlayersHost { hosts }; + for player in players.iter() { + player.1.send(packet.clone()); + } } - fn send_players_game(game: &mut Game, players: &HashMap){ + fn send_players_game(game: &mut Game){ - let mut players: Vec<_> = players.iter().collect(); - players.sort_by(|a,b|{ - a.1.player_index.cmp(&b.1.player_index) - }); + let players: Vec = PlayerReference::all_players(game).into_iter().map(|p| + p.name(game).clone() + ).collect(); - let players: Vec<_> = players.iter().map(|p| { - (*p.0, PlayerReference::new_unchecked(p.1.player_index).name(game).to_owned()) - }).collect(); - - let packet = ToClientPacket::Players { + let packet = ToClientPacket::GamePlayers{ players }; - for player_ref in PlayerReference::all_players(game){ player_ref.send_packet(game, packet.clone()); } diff --git a/server/src/packet.rs b/server/src/packet.rs index 4afc4daae..5af3e02e3 100644 --- a/server/src/packet.rs +++ b/server/src/packet.rs @@ -35,18 +35,22 @@ use crate::{game::{ pub enum ToClientPacket{ // Pre lobby #[serde(rename_all = "camelCase")] - AcceptJoin{room_code: RoomCode, in_game: bool, player_id: PlayerID, host: bool}, + AcceptJoin{room_code: RoomCode, in_game: bool, player_id: PlayerID}, RejectJoin{reason: RejectJoinReason}, // Lobby - YourName{name: String}, - Players{players: Vec<(PlayerID, String)>}, + #[serde(rename_all = "camelCase")] + YourId{player_id: PlayerID}, + #[serde(rename_all = "camelCase")] + LobbyPlayers{players: HashMap}, #[serde(rename_all = "camelCase")] KickPlayer{player_id: PlayerID}, + #[serde(rename_all = "camelCase")] RejectStart{reason: RejectStartReason}, - YouAreHost, + PlayersHost{hosts: Vec}, StartGame, + GamePlayers{players: Vec}, #[serde(rename_all = "camelCase")] RoleList{role_list: RoleList}, #[serde(rename_all = "camelCase")] From 4c0d4f82135afbef13708e81c54e6e6e1f044f92 Mon Sep 17 00:00:00 2001 From: Sam Maselli Date: Sun, 17 Dec 2023 20:52:04 -0500 Subject: [PATCH 4/4] make disconnected state --- client/src/game/gameManager.tsx | 2 +- client/src/game/gameState.d.tsx | 6 ++++-- client/src/game/messageListener.tsx | 10 +++++----- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/client/src/game/gameManager.tsx b/client/src/game/gameManager.tsx index 28ef1504c..e8660c76a 100644 --- a/client/src/game/gameManager.tsx +++ b/client/src/game/gameManager.tsx @@ -18,7 +18,7 @@ export function createGameManager(): GameManager { playerId: null, state: { - stateType: "outsideLobby" + stateType: "disconnected" }, getMyName() { diff --git a/client/src/game/gameState.d.tsx b/client/src/game/gameState.d.tsx index c1ec15b58..5e7e6ed56 100644 --- a/client/src/game/gameState.d.tsx +++ b/client/src/game/gameState.d.tsx @@ -4,9 +4,11 @@ import { Role, RoleState } from "./roleState.d"; import { RoleOutline } from "./roleListState.d"; -export type State = { +export type State = Disconnected | OutsideLobbyState | LobbyState | GameState; -} & (OutsideLobbyState | LobbyState | GameState); +export type Disconnected = { + stateType: "disconnected" +} export type OutsideLobbyState = { stateType: "outsideLobby" diff --git a/client/src/game/messageListener.tsx b/client/src/game/messageListener.tsx index 367a8dae0..0974c0d43 100644 --- a/client/src/game/messageListener.tsx +++ b/client/src/game/messageListener.tsx @@ -140,24 +140,24 @@ export default function messageListener(packet: ToClientPacket){ break; case "roleList": //list of role list entriy - if(GAME_MANAGER.state.stateType !== "outsideLobby") + if(GAME_MANAGER.state.stateType === "lobby" || GAME_MANAGER.state.stateType === "game") GAME_MANAGER.state.roleList = packet.roleList; break; case "roleOutline": //role list entriy - if(GAME_MANAGER.state.stateType !== "outsideLobby") + if(GAME_MANAGER.state.stateType === "lobby" || GAME_MANAGER.state.stateType === "game") GAME_MANAGER.state.roleList[packet.index] = packet.roleOutline; break; case "phaseTime": - if(GAME_MANAGER.state.stateType !== "outsideLobby") + if(GAME_MANAGER.state.stateType === "lobby" || GAME_MANAGER.state.stateType === "game") GAME_MANAGER.state.phaseTimes[packet.phase as keyof typeof GAME_MANAGER.state.phaseTimes] = packet.time; break; case "phaseTimes": - if(GAME_MANAGER.state.stateType !== "outsideLobby") + if(GAME_MANAGER.state.stateType === "lobby" || GAME_MANAGER.state.stateType === "game") GAME_MANAGER.state.phaseTimes = packet.phaseTimeSettings; break; case "excludedRoles": - if(GAME_MANAGER.state.stateType !== "outsideLobby") + if(GAME_MANAGER.state.stateType === "lobby" || GAME_MANAGER.state.stateType === "game") GAME_MANAGER.state.excludedRoles = packet.roles; break; case "phase":