diff --git a/backend/src/types.d.ts b/backend/src/types.d.ts index a75b4e8..c295160 100644 --- a/backend/src/types.d.ts +++ b/backend/src/types.d.ts @@ -34,14 +34,14 @@ type GameEvent = type: 'DRAW_CARD'; playerId: string; data: { - card: UNOCard; + cardId: string; }; } | { type: 'THROW_CARD'; playerId: string; data: { - card: UNOCard; + cardId: string; }; }; diff --git a/backend/src/uno-game-engine/engine.ts b/backend/src/uno-game-engine/engine.ts index 2db1fa0..72a2cc8 100644 --- a/backend/src/uno-game-engine/engine.ts +++ b/backend/src/uno-game-engine/engine.ts @@ -45,7 +45,8 @@ export class GameEngine { } nextPlayer() { this.currentPlayerIndex = - (this.currentPlayerIndex + this.direction) % this.players.length; + (this.players.length + this.currentPlayerIndex + this.direction) % + this.players.length; } drawCardFromDeck(player: Player, numCards = 1): EventResult { try { diff --git a/backend/src/uno-game-engine/events/throwCard.ts b/backend/src/uno-game-engine/events/throwCard.ts index 8c61a96..a4cfef2 100644 --- a/backend/src/uno-game-engine/events/throwCard.ts +++ b/backend/src/uno-game-engine/events/throwCard.ts @@ -1,15 +1,12 @@ -import { registerEventHandler } from '../gameEvents'; +import { getPlayer, getPlayerCard, registerEventHandler } from '../gameEvents'; import { GameEngine } from '../engine'; +import assert from 'assert'; -function findPlayer(game: GameEngine, playerId: string) { - return game.players.find((p) => p.id === playerId); -} - -function findCard(player, cardId: string) { - return player.cards.find((c) => c.id === cardId); -} - -function canThrowCard(game: GameEngine, player, card): EventResult { +function canThrowCard( + game: GameEngine, + player: Player, + card: UNOCard +): EventResult { const { currentPlayerIndex, players } = game; const currentPlayer = players[currentPlayerIndex]; @@ -39,12 +36,14 @@ function canThrowCard(game: GameEngine, player, card): EventResult { } export function throwCard(game: GameEngine, event: GameEvent): EventResult { - const player = findPlayer(game, event.playerId); + // validate the event so that typescript knows that event is of type 'THROW_CARD' + assert(event.type === 'THROW_CARD', 'Invalid event type'); + const player = getPlayer(game, event.playerId); if (!player) { return { type: 'ERROR', message: 'Player not found' }; } - const card = findCard(player, event.data.card.id); + const card = getPlayerCard(player, event.data.cardId); if (!card) { return { type: 'ERROR', message: 'Card not found' }; } diff --git a/backend/src/uno-game-engine/gameEvents.ts b/backend/src/uno-game-engine/gameEvents.ts index e8126b8..38712bf 100644 --- a/backend/src/uno-game-engine/gameEvents.ts +++ b/backend/src/uno-game-engine/gameEvents.ts @@ -20,3 +20,13 @@ export function handleEvent(game: GameEngine, event: GameEvent): EventResult { } return handler(game, event); } + +// some utility functions shared by event handlers + +export function getPlayer(game: GameEngine, playerId: string) { + return game.players.find((p) => p.id === playerId); +} + +export function getPlayerCard(player: Player, cardId: string) { + return player.cards.find((c) => c.id === cardId); +}