import { PlayerConnection } from '../player-connection'; import { broadcastBoard } from '../view/board-renderer'; import { broadcastButtons } from '../view/button-renderer'; import { broadcastSound } from '../view/sound-renderer'; import { broadcastAnimation } from '../view/animation-renderer'; import { broadcastTitle } from '../view/title-renderer'; import { GameServer } from '../game-server'; import { ActionType, Message } from './messages'; export interface DrawMessage extends Message { action: ActionType; } export function handleDrawMessage( server: GameServer, conn: PlayerConnection, message: DrawMessage, ): void { if (server.gomoku.status !== 'playing') { conn.sendMessage( 'error', 'You can only perform this action in an active game.', ); return; } switch (message.action) { case 'request': handleRequestDraw(server, conn); break; case 'accept': if (!server.drawRequesterId) { conn.sendMessage('error', 'No draw has been requested.'); return; } handleAcceptDraw(server); break; case 'decline': if (!server.drawRequesterId) { conn.sendMessage('error', 'No draw has been requested.'); return; } handleDeclineDraw(server); break; case 'cancel': if (server.drawRequesterId !== conn.id) { conn.sendMessage('error', 'You are not the one who requested a draw.'); return; } handleCancelDrawRequest(server); break; } } function handleRequestDraw(server: GameServer, conn: PlayerConnection): void { if (server.takebackRequesterId) { conn.sendMessage('error', 'A takeback has already been requested.'); return; } server.drawRequesterId = conn.id; broadcastButtons(server); } function handleAcceptDraw(server: GameServer): void { server.gomoku.declareDraw(); server.drawRequesterId = null; broadcastBoard(server); broadcastButtons(server); broadcastTitle(server); broadcastSound(server, 'draw'); broadcastAnimation(server, 'draw'); } function handleDeclineDraw(server: GameServer): void { server.drawRequesterId = null; broadcastButtons(server); } function handleCancelDrawRequest(server: GameServer): void { server.drawRequesterId = null; broadcastButtons(server); }