Browse Source

Fix an infinite ticket glitch and add functionality to the Ready mechanic

master
Samplasion 3 years ago
parent
commit
cccfb71c40
5 changed files with 33 additions and 13 deletions
  1. +9
    -2
      common/types.ts
  2. +9
    -3
      server/routines/rooms.ts
  3. +1
    -1
      src/pages/choose-cartelle.tsx
  4. +5
    -4
      src/pages/join-room.tsx
  5. +9
    -3
      src/pages/waiting-for-players.tsx

+ 9
- 2
common/types.ts View File

@ -40,5 +40,12 @@ export interface Room {
};
export enum RoomJoinError {
NoSuchRoom,
GameHasStarted
};
GameHasStarted,
RoomIsFull
};
export const MAX_PLAYERS = 8;
export enum GameStartError {
TooFewPlayers,
TooManyPlayers,
NotReady
}

+ 9
- 3
server/routines/rooms.ts View File

@ -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;
}


+ 1
- 1
src/pages/choose-cartelle.tsx View File

@ -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;
}


+ 5
- 4
src/pages/join-room.tsx View File

@ -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<JoinRoomProps> = ({ socket, setHo
function joinRoom(evt: React.MouseEvent<Element, 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);
});


+ 9
- 3
src/pages/waiting-for-players.tsx View File

@ -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<WaitingForPlayersProps> = ({ socket, socketID, gameKey, host }) => {
const [players, setPlayers] = React.useState<StrippedPlayer[]>([]);
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<WaitingForPlayersProps>
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<WaitingForPlayersProps>
open={open}
setOpen={setOpen}
>
Sei da solo. Non ti aspetterai mica di poter giocare da solo?
{content}
</Modal>
</>
)

Loading…
Cancel
Save