From cccfb71c40706c1a4ec1ccf92c951aa3c0c0d528 Mon Sep 17 00:00:00 2001 From: Samplasion Date: Fri, 15 Jan 2021 20:23:03 +0100 Subject: [PATCH] Fix an infinite ticket glitch and add functionality to the Ready mechanic --- common/types.ts | 11 +++++++++-- server/routines/rooms.ts | 12 +++++++++--- src/pages/choose-cartelle.tsx | 2 +- src/pages/join-room.tsx | 9 +++++---- src/pages/waiting-for-players.tsx | 12 +++++++++--- 5 files changed, 33 insertions(+), 13 deletions(-) diff --git a/common/types.ts b/common/types.ts index 041f415..5c12b4b 100644 --- a/common/types.ts +++ b/common/types.ts @@ -40,5 +40,12 @@ export interface Room { }; export enum RoomJoinError { NoSuchRoom, - GameHasStarted -}; \ No newline at end of file + GameHasStarted, + RoomIsFull +}; +export const MAX_PLAYERS = 8; +export enum GameStartError { + TooFewPlayers, + TooManyPlayers, + NotReady +} \ No newline at end of file diff --git a/server/routines/rooms.ts b/server/routines/rooms.ts index 2a8a051..3aba34d 100644 --- a/server/routines/rooms.ts +++ b/server/routines/rooms.ts @@ -1,6 +1,6 @@ import { Socket } from "socket.io"; import randomstring from "randomstring"; -import { PracticalTombolaAction, Room, RoomJoinError, SocketID, SocketWrapper, StrippedPlayer, TombolaAction } from "../../common/types"; +import { GameStartError, MAX_PLAYERS, PracticalTombolaAction, Room, RoomJoinError, SocketID, SocketWrapper, StrippedPlayer, TombolaAction } from "../../common/types"; import cartelle from "../cartelle"; import { ServerEventNames } from "../../common/events"; @@ -228,8 +228,14 @@ export function startGame(socket: Socket, id: SocketID) { if (!room) return; - if (room.players.length == 1) { - socket.emit("startGameError"); + if (room.players.length <= 1) { + socket.emit("startGameError", GameStartError.TooFewPlayers); + return; + } else if (room.players.length >= MAX_PLAYERS) { + socket.emit("startGameError", GameStartError.TooManyPlayers); + return; + } else if (!room.players.every(player => player.ready)) { + socket.emit("startGameError", GameStartError.NotReady); return; } diff --git a/src/pages/choose-cartelle.tsx b/src/pages/choose-cartelle.tsx index fefe159..5d48f96 100644 --- a/src/pages/choose-cartelle.tsx +++ b/src/pages/choose-cartelle.tsx @@ -16,11 +16,11 @@ export default function ChooseCartelle({ socket, cartelle: allCartelle }: { sock setCartelle(cartelle.filter(c => cartella !== c)); } function addCartella(cartella: number) { - socket.emit("chooseCartella", cartella); if (cartelle.length >= 5) { setOpen(true); return false; } + socket.emit("chooseCartella", cartella); setCartelle([...cartelle, cartella]); return true; } diff --git a/src/pages/join-room.tsx b/src/pages/join-room.tsx index cd5c3db..de73ad1 100644 --- a/src/pages/join-room.tsx +++ b/src/pages/join-room.tsx @@ -4,6 +4,7 @@ import { useInput } from "../hooks/useInput"; import { useHistory } from "react-router-dom"; import Heading from "../components/Heading"; import Modal from "../components/Modal"; +import { RoomJoinError } from "../../common/types"; interface JoinRoomProps { socket: Socket; @@ -22,11 +23,11 @@ export const JoinRoom: React.FunctionComponent = ({ socket, setHo function joinRoom(evt: React.MouseEvent, name: string, key: string) { console.log(name, key.toUpperCase()); socket.emit("joinRoom", name, key.toUpperCase()); - socket.on("joinRoomError", (err: 0 | 1 | 2) => { + socket.on("joinRoomError", (err: RoomJoinError) => { switch (err) { - case 0: setModalContent("Questa stanza non esiste!"); break; - case 1: setModalContent("In quella stanza la partita è già iniziata."); break; - case 2: setModalContent("La stanza è piena."); break; + case RoomJoinError.NoSuchRoom: setModalContent("Questa stanza non esiste!"); break; + case RoomJoinError.GameHasStarted: setModalContent("In quella stanza la partita è già iniziata."); break; + case RoomJoinError.RoomIsFull: setModalContent("La stanza è piena."); break; } setOpen(true); }); diff --git a/src/pages/waiting-for-players.tsx b/src/pages/waiting-for-players.tsx index a39f04e..84e7431 100644 --- a/src/pages/waiting-for-players.tsx +++ b/src/pages/waiting-for-players.tsx @@ -3,7 +3,7 @@ import React from "react"; import Heading from "../components/Heading"; import { useHistory } from "react-router-dom"; import Modal from "../components/Modal"; -import { StrippedPlayer } from "../../common/types"; +import { GameStartError, StrippedPlayer } from "../../common/types"; interface WaitingForPlayersProps { socket: Socket; @@ -15,6 +15,7 @@ interface WaitingForPlayersProps { export const WaitingForPlayers: React.FunctionComponent = ({ socket, socketID, gameKey, host }) => { const [players, setPlayers] = React.useState([]); const [open, setOpen] = React.useState(false); + const [content, setContent] = React.useState(""); const history = useHistory(); if (!gameKey) @@ -28,8 +29,13 @@ export const WaitingForPlayers: React.FunctionComponent socket.on("startingGame", (givesTabellone: boolean) => { history.push(givesTabellone ? "/tabellone" : "/choose-cartelle"); }); - socket.on("startGameError", () => { + socket.on("startGameError", (error: GameStartError) => { setOpen(true); + switch (error) { + case GameStartError.TooFewPlayers: setContent("Sei da solo. Non ti aspetterai mica di poter giocare da solo?"); break; + case GameStartError.TooManyPlayers: setContent("Siete più di otto giocatori. Non sarete troppi?"); break; + case GameStartError.NotReady: setContent("Non tutti sono pronti. Non avere fretta!"); break; + } }); socket.on("disconnect", () => window.location.href = window.location.origin + "/") }, []); // eslint-disable-line @@ -66,7 +72,7 @@ export const WaitingForPlayers: React.FunctionComponent open={open} setOpen={setOpen} > - Sei da solo. Non ti aspetterai mica di poter giocare da solo? + {content} )