83 lines
2.3 KiB
TypeScript
Executable File
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);
|
|
}
|