wip
This commit is contained in:
@@ -19,51 +19,68 @@ export default function(request: websocket.request, connection: websocket.connec
|
||||
switch (msg.type) {
|
||||
case 'set':
|
||||
if (msg.pos == null) return;
|
||||
const pos = msg.pos;
|
||||
|
||||
const game = await Game.findOne({ _id: gameId });
|
||||
|
||||
const o = new Othello();
|
||||
|
||||
game.logs.forEach(log => {
|
||||
o.set(log.color, log.pos);
|
||||
});
|
||||
|
||||
const myColor = game.black_user_id.equals(user._id) ? 'black' : 'white';
|
||||
const opColor = myColor == 'black' ? 'white' : 'black';
|
||||
|
||||
if (!o.canReverse(myColor, pos)) return;
|
||||
o.set(myColor, pos);
|
||||
|
||||
let turn;
|
||||
if (o.getPattern(opColor).length > 0) {
|
||||
turn = myColor == 'black' ? game.white_user_id : game.black_user_id;
|
||||
} else {
|
||||
turn = myColor == 'black' ? game.black_user_id : game.white_user_id;
|
||||
}
|
||||
|
||||
const log = {
|
||||
at: new Date(),
|
||||
color: myColor,
|
||||
pos
|
||||
};
|
||||
|
||||
await Game.update({
|
||||
_id: gameId
|
||||
}, {
|
||||
$set: {
|
||||
turn_user_id: turn
|
||||
},
|
||||
$push: {
|
||||
logs: log
|
||||
}
|
||||
});
|
||||
|
||||
publishOthelloGameStream(gameId, 'set', {
|
||||
color: myColor,
|
||||
pos
|
||||
});
|
||||
set(msg.pos);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
async function set(pos) {
|
||||
const game = await Game.findOne({ _id: gameId });
|
||||
|
||||
if (game.is_ended) return;
|
||||
|
||||
const o = new Othello();
|
||||
|
||||
game.logs.forEach(log => {
|
||||
o.set(log.color, log.pos);
|
||||
});
|
||||
|
||||
const myColor = game.black_user_id.equals(user._id) ? 'black' : 'white';
|
||||
const opColor = myColor == 'black' ? 'white' : 'black';
|
||||
|
||||
if (!o.canReverse(myColor, pos)) return;
|
||||
o.set(myColor, pos);
|
||||
|
||||
let turn;
|
||||
if (o.getPattern(opColor).length > 0) {
|
||||
turn = myColor == 'black' ? game.white_user_id : game.black_user_id;
|
||||
} else if (o.getPattern(myColor).length > 0) {
|
||||
turn = myColor == 'black' ? game.black_user_id : game.white_user_id;
|
||||
} else {
|
||||
turn = null;
|
||||
}
|
||||
|
||||
const isEnded = turn === null;
|
||||
|
||||
let winner;
|
||||
if (isEnded) {
|
||||
const blackCount = o.board.filter(s => s == 'black').length;
|
||||
const whiteCount = o.board.filter(s => s == 'white').length;
|
||||
winner = blackCount == whiteCount ? null : blackCount > whiteCount ? game.black_user_id : game.white_user_id;
|
||||
}
|
||||
|
||||
const log = {
|
||||
at: new Date(),
|
||||
color: myColor,
|
||||
pos
|
||||
};
|
||||
|
||||
await Game.update({
|
||||
_id: gameId
|
||||
}, {
|
||||
$set: {
|
||||
turn_user_id: turn,
|
||||
is_ended: isEnded,
|
||||
winner_id: winner
|
||||
},
|
||||
$push: {
|
||||
logs: log
|
||||
}
|
||||
});
|
||||
|
||||
publishOthelloGameStream(gameId, 'set', {
|
||||
color: myColor,
|
||||
pos
|
||||
});
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user