101 lines
2.8 KiB
TypeScript
Executable File
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!);
|
|
}
|
|
}
|