boardgame.io
Version:
library for turn-based games
86 lines (75 loc) • 2.24 kB
text/typescript
import { InitializeGame } from '../core/initialize';
import type { Server, State, Game } from '../types';
/**
* Creates a new match metadata object.
*/
export const createMetadata = ({
game,
unlisted,
setupData,
numPlayers,
}: {
game: Game;
numPlayers: number;
setupData?: any;
unlisted?: boolean;
}): Server.MatchData => {
const metadata: Server.MatchData = {
gameName: game.name,
unlisted: !!unlisted,
players: {},
createdAt: Date.now(),
updatedAt: Date.now(),
};
if (setupData !== undefined) metadata.setupData = setupData;
for (let playerIndex = 0; playerIndex < numPlayers; playerIndex++) {
metadata.players[playerIndex] = { id: playerIndex };
}
return metadata;
};
/**
* Creates initial state and metadata for a new match.
* If the provided `setupData` doesn’t pass the game’s validation,
* an error object is returned instead.
*/
export const createMatch = ({
game,
numPlayers,
setupData,
unlisted,
}: {
game: Game;
numPlayers: number;
setupData: any;
unlisted: boolean;
}):
| { metadata: Server.MatchData; initialState: State }
| { setupDataError: string } => {
if (!numPlayers || typeof numPlayers !== 'number') numPlayers = 2;
const setupDataError =
game.validateSetupData && game.validateSetupData(setupData, numPlayers);
if (setupDataError !== undefined) return { setupDataError };
const metadata = createMetadata({ game, numPlayers, setupData, unlisted });
const initialState = InitializeGame({ game, numPlayers, setupData });
return { metadata, initialState };
};
/**
* Given players, returns the count of players.
*/
export const getNumPlayers = (players: Server.MatchData['players']): number =>
Object.keys(players).length;
/**
* Given players, tries to find the ID of the first player that can be joined.
* Returns `undefined` if there’s no available ID.
*/
export const getFirstAvailablePlayerID = (
players: Server.MatchData['players']
): string | undefined => {
const numPlayers = getNumPlayers(players);
// Try to get the first index available
for (let i = 0; i < numPlayers; i++) {
if (typeof players[i].name === 'undefined' || players[i].name === null) {
return String(i);
}
}
};