gomoku/src/messages/draw.ts

83 lines
2.3 KiB
TypeScript
Executable File

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);
}