added conditions when pawn can move

This commit is contained in:
Wenszel 2021-04-29 22:17:49 +02:00
parent 063a0790c2
commit 13ddc71c2b
6 changed files with 60 additions and 18 deletions

View File

@ -11,8 +11,18 @@ router.get('/roll', function (req, res){
router.post('/move', function (req, res){ router.post('/move', function (req, res){
RoomModel.findOne({_id: req.session.roomId}, function (err, doc){ RoomModel.findOne({_id: req.session.roomId}, function (err, doc){
if(doc){ if(doc){
// Updating position
const updatedPawn = doc.pawns.findIndex(pawn => pawn._id == req.body.pawnId); const updatedPawn = doc.pawns.findIndex(pawn => pawn._id == req.body.pawnId);
doc.pawns[updatedPawn].position = req.body.position; doc.pawns[updatedPawn].position = req.body.position;
// Capturing a pawn
const pawnsOnPos = doc.pawns.filter( pawn => pawn.position == req.body.position);
pawnsOnPos.forEach( pawn => {
if(pawn.color !== req.session.color){
const index = doc.pawns.findIndex(i => i._id === pawn._id);
doc.pawns[index].position = doc.pawns[index].basePos;
}
});
// Updating moving player
const index = doc.players.findIndex( player => player.nowMoving === true); const index = doc.players.findIndex( player => player.nowMoving === true);
const roomSize = doc.players.length; const roomSize = doc.players.length;
doc.players[index].nowMoving = false; doc.players[index].nowMoving = false;
@ -21,6 +31,7 @@ router.post('/move', function (req, res){
}else{ }else{
doc.players[index+1].nowMoving = true; doc.players[index+1].nowMoving = true;
} }
// Updating timer
doc.nextMoveTime = Date.now()+30000; doc.nextMoveTime = Date.now()+30000;
RoomModel.findOneAndUpdate({_id: req.session.roomId}, doc, function(err, doc){ RoomModel.findOneAndUpdate({_id: req.session.roomId}, doc, function(err, doc){
res.send("Correctly Moved!"); res.send("Correctly Moved!");

View File

@ -18,7 +18,7 @@ var changeReadyState = (req, res, exit) =>{
} }
if(updatedPlayers.filter(player => player.ready).length >= 2){ if(updatedPlayers.filter(player => player.ready).length >= 2){
updatedDoc.started = true; updatedDoc.started = true;
updatedDoc.nextMoveTime = Date.now()+15; updatedDoc.nextMoveTime = Date.now()+30000;
updatedDoc.players[0].nowMoving = true; updatedDoc.players[0].nowMoving = true;
} }

View File

@ -8,6 +8,7 @@ function getStartPositions(){
const startPositions = []; const startPositions = [];
for( let i = 0; i < 16; i++){ for( let i = 0; i < 16; i++){
let pawn = {}; let pawn = {};
pawn.basePos = i;
pawn.position = i; pawn.position = i;
if(i < 4) pawn.color = colors[0]; if(i < 4) pawn.color = colors[0];
else if(i < 8) pawn.color = colors[1]; else if(i < 8) pawn.color = colors[1];
@ -104,7 +105,6 @@ router.get('/', function(req,res){
if(err){ if(err){
res.status(500).send(err) res.status(500).send(err)
}else{ }else{
console.log(docs.nextMoveTime);
res.send(docs); res.send(docs);
} }
}); });

View File

@ -15,6 +15,7 @@ var RoomSchema = new Schema({
}], }],
pawns: [{ pawns: [{
color: String, color: String,
basePos: Number,
position: Number, position: Number,
}], }],
}); });

View File

@ -19,7 +19,31 @@ const Map = ({ pawns, nowMoving, rolledNumber }) => {
} }
const canvasRef = useRef(null); const canvasRef = useRef(null);
const checkIfPawnCanMove = pawn => {
// If is in base
if((rolledNumber === 1 || rolledNumber === 6) && pawn.position === pawn.basePos){
return true;
// Other situations: pawn is on map or pawn is in end positions
}else if(pawn.position !== pawn.basePos){
switch (pawn.color){
case 'red':
if(pawn.position + rolledNumber <= 72) return true;
break;
case 'blue':
if(pawn.position + rolledNumber <= 77) return true;
break;
case 'green':
if(pawn.position + rolledNumber <= 82) return true;
break;
case 'yellow':
if(pawn.position + rolledNumber <= 87) return true;
break;
}
}else{
return false;
}
}
const handleCanvasClick = event => { const handleCanvasClick = event => {
// If hint pawn exist it means that pawn can move // If hint pawn exist it means that pawn can move
if(hintPawn){ if(hintPawn){
@ -40,34 +64,38 @@ const Map = ({ pawns, nowMoving, rolledNumber }) => {
} }
} }
const getHintPawnPosition = (pawn) => { const getHintPawnPosition = (pawn) => {
/* // Based on color (because specific color have specific base and end positions)
Based on color (because specific color have specific base positions)
first if for each colors handle situation when pawn is in base
next if pawn is in the end or will go in there
else if pawn is on map
*/
let { position } = pawn; let { position } = pawn;
switch (context.color){ switch (context.color){
case 'red': case 'red':
// When in base
if(position >= 0 && position <= 3){ if(position >= 0 && position <= 3){
return 16; return 16;
}else if(position > 15 && position + rolledNumber <= 66){ // Ending move
return position + rolledNumber; }else if(position + rolledNumber === 72){
return 88;
// Normal move
}else{ }else{
return 67 + (position + rolledNumber - 66); return position + rolledNumber;
} }
case 'blue': case 'blue':
if(position >= 4 && position <= 7){ if(position >= 4 && position <= 7){
console.log("1")
return 55; return 55;
}else if(position+rolledNumber>55 || position+rolledNumber <= 53){ }else if(position < 67 && position + rolledNumber > 67){
return position + rolledNumber; console.log("2")
return position + rolledNumber - 67 + 16
}else if(position <= 53 && position + rolledNumber >= 54){
console.log(71 + position + rolledNumber - 54)
return 71 + position + rolledNumber - 54;
}else{ }else{
return 71 + (position + rolledNumber - 53); console.log("4")
return position + rolledNumber;
} }
case 'green': case 'green':
if(position >= 8 && position <= 11){ if(position >= 8 && position <= 11){
return 42; return 42;
}else if(position + rolledNumber > 42 || position+rolledNumber <= 40){ }else if(position+rolledNumber < 66 && (position + rolledNumber > 42 || position+rolledNumber <= 40)){
return position + rolledNumber; return position + rolledNumber;
}else{ }else{
return 76 - (position + rolledNumber - 40) return 76 - (position + rolledNumber - 40)
@ -75,7 +103,7 @@ const Map = ({ pawns, nowMoving, rolledNumber }) => {
case 'yellow': case 'yellow':
if(position >= 12 && position <= 15){ if(position >= 12 && position <= 15){
return 29; return 29;
}else if(position + rolledNumber > 29 || position+rolledNumber <= 27){ }else if(position+rolledNumber < 66 && (position + rolledNumber > 29 || position+rolledNumber <= 27)){
return position + rolledNumber; return position + rolledNumber;
}else{ }else{
return 82 + (position + rolledNumber - 27) return 82 + (position + rolledNumber - 27)
@ -103,6 +131,7 @@ const Map = ({ pawns, nowMoving, rolledNumber }) => {
*/ */
if (ctx.isPointInPath(pawn.circle, x, y) && context.color == pawn.color && (pawn.position>15 || rolledNumber === 1 || rolledNumber === 6)) { if (ctx.isPointInPath(pawn.circle, x, y) && context.color == pawn.color && (pawn.position>15 || rolledNumber === 1 || rolledNumber === 6)) {
const pawnPosition = getHintPawnPosition(pawn); const pawnPosition = getHintPawnPosition(pawn);
setBlinking(false);
// Checks if pawn can make a move // Checks if pawn can make a move
if(pawnPosition){ if(pawnPosition){
canvas.style.cursor = "pointer"; canvas.style.cursor = "pointer";
@ -124,7 +153,7 @@ const Map = ({ pawns, nowMoving, rolledNumber }) => {
image.onload = function() { image.onload = function() {
ctx.drawImage(image, 0 , 0); ctx.drawImage(image, 0 , 0);
pawns.forEach( (pawn, index) => { pawns.forEach( (pawn, index) => {
if(nowMoving && rolledNumber && blinking && pawn.color === context.color){ if(nowMoving && rolledNumber && blinking && pawn.color === context.color && checkIfPawnCanMove(pawn)){
pawns[index].circle = paintPawn(ctx, positions[pawn.position].x, positions[pawn.position].y, 'white'); pawns[index].circle = paintPawn(ctx, positions[pawn.position].x, positions[pawn.position].y, 'white');
}else{ }else{
pawns[index].circle = paintPawn(ctx, positions[pawn.position].x, positions[pawn.position].y, pawn.color); pawns[index].circle = paintPawn(ctx, positions[pawn.position].x, positions[pawn.position].y, pawn.color);

View File

@ -110,6 +110,7 @@ const positions = [
{x: 230, y: 107}, {x: 230, y: 107},
{x: 230, y: 138}, {x: 230, y: 138},
{x: 230, y: 169}, //87 {x: 230, y: 169}, //87
{x: -50, y: -50} // 88
]; ];
export default positions; export default positions;