54 lines
1.2 KiB
TypeScript
54 lines
1.2 KiB
TypeScript
|
|
import type { FloriferousPlayer } from './floriferous-player';
|
||
|
|
import { nanoid } from 'nanoid';
|
||
|
|
|
||
|
|
export interface FloriferousGameParams {
|
||
|
|
playedTs?: Date;
|
||
|
|
id?: string;
|
||
|
|
players?: FloriferousPlayer[];
|
||
|
|
}
|
||
|
|
|
||
|
|
export class FloriferousGame {
|
||
|
|
readonly id: string;
|
||
|
|
readonly playedTs: Date;
|
||
|
|
private _players: FloriferousPlayer[] = [];
|
||
|
|
|
||
|
|
constructor({ id = nanoid(), playedTs = new Date(), players = [] }: FloriferousGameParams = {}) {
|
||
|
|
this.id = id;
|
||
|
|
this.playedTs = playedTs;
|
||
|
|
this._players = players;
|
||
|
|
}
|
||
|
|
|
||
|
|
addPlayer(player: FloriferousPlayer): void {
|
||
|
|
this._players.push(player);
|
||
|
|
}
|
||
|
|
|
||
|
|
addPlayers(players: FloriferousPlayer[]): void {
|
||
|
|
players.forEach((player) => {
|
||
|
|
this.addPlayer(player);
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
get players(): FloriferousPlayer[] {
|
||
|
|
return this._players;
|
||
|
|
}
|
||
|
|
|
||
|
|
get winner(): string | undefined {
|
||
|
|
if (this._players.length === 0) {
|
||
|
|
return undefined;
|
||
|
|
}
|
||
|
|
const playersSortedByScore = this._players.sort((a, b) => {
|
||
|
|
return b.score - a.score;
|
||
|
|
});
|
||
|
|
|
||
|
|
if (playersSortedByScore[0].score === playersSortedByScore[1].score) {
|
||
|
|
const playersSortedByRowAtEndOfGame = this._players.sort((a, b) => {
|
||
|
|
return a.rowAtEndOfGame - b.rowAtEndOfGame;
|
||
|
|
});
|
||
|
|
|
||
|
|
return playersSortedByRowAtEndOfGame[0].name;
|
||
|
|
}
|
||
|
|
|
||
|
|
return playersSortedByScore[0].name;
|
||
|
|
}
|
||
|
|
}
|