89 lines
2.8 KiB
JavaScript
89 lines
2.8 KiB
JavaScript
const Room = require('../schemas/room');
|
|
const { getPawnPositionAfterMove } = require('../utils/functions');
|
|
|
|
module.exports = (io, socket) => {
|
|
const req = socket.request;
|
|
|
|
const handleMovePawn = async pawnId => {
|
|
const room = await getRoom();
|
|
const pawn = room.getPawn(pawnId);
|
|
if (isMoveValid(pawn, room)) {
|
|
const newPositionOfMovedPawn = getPawnPositionAfterMove(room.rolledNumber, pawn);
|
|
room.changePositionOfPawn(pawn, newPositionOfMovedPawn);
|
|
room.beatPawns(newPositionOfMovedPawn, req.session.color);
|
|
handleChangeOfPlayer(room);
|
|
}
|
|
};
|
|
|
|
const handleRollDice = async () => {
|
|
const rolledNumber = rollDice();
|
|
const room = await updateRoom({ rolledNumber: rolledNumber });
|
|
if (!canPlayerMove(room, rolledNumber)) {
|
|
handleChangeOfPlayer(room);
|
|
}
|
|
};
|
|
|
|
const rollDice = () => {
|
|
const rolledNumber = Math.ceil(Math.random() * 6);
|
|
sendToPlayersRolledNumber(rolledNumber);
|
|
return rolledNumber;
|
|
};
|
|
|
|
const canPlayerMove = (room, rolledNumber) => {
|
|
const playerPawns = room.getPlayerPawns(req.session.color);
|
|
for (const pawn of playerPawns) {
|
|
if (pawn.canMove(rolledNumber)) return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
const isMoveValid = (pawn, room) => {
|
|
if (req.session.color !== pawn.color) {
|
|
return false;
|
|
}
|
|
if (req.session.playerId !== room.getCurrentlyMovingPlayer()._id.toString()) {
|
|
return false;
|
|
}
|
|
return true;
|
|
};
|
|
|
|
const handleChangeOfPlayer = async room => {
|
|
room.changeMovingPlayer();
|
|
room.timeoutID = setTimeout(makeRandomMove, 15000, room);
|
|
await updateRoom(room);
|
|
};
|
|
|
|
const makeRandomMove = async room => {
|
|
if (room.rolledNumber === null) room.rolledNumber = rollDice();
|
|
const pawnsThatCanMove = room.getPawnsThatCanMove()
|
|
if (pawnsThatCanMove.length > 0) {
|
|
const randomPawn = pawnsThatCanMove[Math.floor(Math.random() * pawnsThatCanMove.length)];
|
|
room.movePawn(randomPawn);
|
|
}
|
|
await handleChangeOfPlayer(room);
|
|
};
|
|
|
|
Room.watch().on('change', async () => {
|
|
sendToPlayersData(await getRoom());
|
|
});
|
|
|
|
const getRoom = async () => {
|
|
return await Room.findOne({ _id: req.session.roomId }).exec();
|
|
};
|
|
|
|
const updateRoom = async room => {
|
|
return await Room.findOneAndUpdate({ _id: req.session.roomId }, room).exec();
|
|
};
|
|
|
|
const sendToPlayersRolledNumber = rolledNumber => {
|
|
io.to(req.session.roomId).emit('game:roll', rolledNumber);
|
|
};
|
|
|
|
const sendToPlayersData = room => {
|
|
io.to(req.session.roomId).emit('room:data', JSON.stringify(room));
|
|
};
|
|
|
|
socket.on('game:roll', handleRollDice);
|
|
socket.on('game:move', handleMovePawn);
|
|
};
|