import { PlayerConnection } from '../player-connection'; import { broadcastBoard } from '../view/board-renderer'; import { broadcastButtons } from '../view/button-renderer'; import { broadcastSound, broadcastSoundToPlayer } from '../view/sound-renderer'; import { broadcastTitle } from '../view/title-renderer'; import { GameServer } from '../game-server'; import { Message } from './messages'; export interface MakeMoveMessage extends Message { row: number; col: number; } export function handleMakeMove( server: GameServer, conn: PlayerConnection, message: MakeMoveMessage, ): void { const { row, col } = message; if (server.gomoku.status !== 'playing') { conn.sendMessage( 'error', 'You cannot play a move while the game is not ongoing!', ); return; } var playerColor; if (server.blackPlayerId === conn.id) { playerColor = 'black'; } else if (server.whitePlayerId == conn.id) { playerColor = 'white'; } else { conn.sendMessage( 'error', 'You are not a player in this game, you cannot make a move!', ); return; } if (server.gomoku.currentPlayerColor !== playerColor) { conn.sendMessage('error', "It's not your turn"); return; } if (server.takebackRequesterId || server.drawRequesterId) { server.takebackRequesterId = null; server.drawRequesterId = null; broadcastButtons(server); } const stateBeforeMove = server.gomoku.status; const result = server.gomoku.makeMove(playerColor, row, col); if (result.success) { broadcastBoard(server); broadcastTitle(server); // We only need to re-send buttons when the game state changes if (stateBeforeMove != server.gomoku.status) { broadcastButtons(server); } // Broadcast sounds if (server.gomoku.status === 'playing') { broadcastSound(server, 'move'); } else { const whiteConn = server.whitePlayerId ? server.connections.get(server.whitePlayerId) : null; const blackConn = server.blackPlayerId ? server.connections.get(server.blackPlayerId) : null; switch (server.gomoku.winnerColor) { case 'draw': broadcastSound(server, 'draw'); case 'white': if (whiteConn) { broadcastSoundToPlayer(whiteConn, 'victory'); } if (blackConn) { broadcastSoundToPlayer(blackConn, 'defeat'); } break; case 'black': if (whiteConn) { broadcastSoundToPlayer(whiteConn, 'defeat'); } if (blackConn) { broadcastSoundToPlayer(blackConn, 'victory'); } break; } } console.log( `Move made in game ${server.id} by ${conn.id}: (${row}, ${col})`, ); } else { conn.sendMessage('error', result.error!); } }