gomoku/src/messages/make-move.ts

101 lines
2.8 KiB
TypeScript
Executable File

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