ludo-web-multiplayer/backend/handlers/gameHandler.js

45 lines
1.7 KiB
JavaScript

const { getRoom, updateRoom } = require('../services/roomService');
const { sendToPlayersRolledNumber, sendWinner } = require('../socket/emits');
const { rollDice, isMoveValid } = require('./handlersFunctions');
module.exports = socket => {
const req = socket.request;
const handleMovePawn = async pawnId => {
const room = await getRoom(req.session.roomId);
if (room.winner) return;
const pawn = room.getPawn(pawnId);
if (isMoveValid(req.session, pawn, room)) {
const newPositionOfMovedPawn = pawn.getPositionAfterMove(room.rolledNumber);
room.changePositionOfPawn(pawn, newPositionOfMovedPawn);
room.beatPawns(newPositionOfMovedPawn, req.session.color);
// If player rolled a 6 they get another turn: keep same player but reset turn timer
if (room.rolledNumber !== 6) {
room.changeMovingPlayer();
} else {
room.resetTurnForSamePlayer();
}
const winner = room.getWinner();
if (winner) {
room.endGame(winner);
sendWinner(room._id.toString(), winner);
}
await updateRoom(room);
}
};
const handleRollDice = async () => {
const rolledNumber = rollDice();
sendToPlayersRolledNumber(req.session.roomId, rolledNumber);
const room = await updateRoom({ _id: req.session.roomId, rolledNumber: rolledNumber });
const player = room.getPlayer(req.session.playerId);
if (!player.canMove(room, rolledNumber)) {
room.changeMovingPlayer();
await updateRoom(room);
}
};
socket.on('game:roll', handleRollDice);
socket.on('game:move', handleMovePawn);
};