add support for resignation
This commit is contained in:
parent
85375530a9
commit
2e6764ffb5
|
|
@ -149,6 +149,7 @@
|
|||
<input id="cb_notify" type="checkbox"><label for="cb_notify">Notify</label>
|
||||
<button id="cb_undo" type="button" disabled="true">Undo</button>
|
||||
<button id="cb_redo" type="button" disabled="true">Redo</button>
|
||||
<button id="cb_resign" type="button" disabled="true">Resign</button>
|
||||
<button id="cb_reset" type="button">Reset</button>
|
||||
<button id="cb_pass" type="button">Pass</button>
|
||||
<span id="cb_message"></span><br>
|
||||
|
|
|
|||
68
js/chess.js
68
js/chess.js
|
|
@ -39,11 +39,11 @@ function cloneJSON(obj){
|
|||
}
|
||||
|
||||
function isLight(side){
|
||||
return side[0] === 'l';
|
||||
return side === 'l' || side === 'light';
|
||||
}
|
||||
|
||||
function isDark(side){
|
||||
return side[0] === 'd';
|
||||
return side === 'd' || side === 'dark';
|
||||
}
|
||||
|
||||
function normalizeSide(side){
|
||||
|
|
@ -161,9 +161,20 @@ function hasMoved(board, side, where){
|
|||
}
|
||||
}
|
||||
|
||||
function gameEnded(board){
|
||||
if (!board.move) {
|
||||
return false;
|
||||
} else if (board.move.took === 'k') {
|
||||
return board.move.side;
|
||||
} else if (board.move.resign) {
|
||||
return otherSide(board.move.side);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function legalMoves(board, side, type, from, canCapture){
|
||||
if (board.move && board.move.took === 'k') {
|
||||
/* checkmate, the game is over */
|
||||
if (gameEnded(board)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
|
|
@ -428,6 +439,10 @@ function renderHistory(currentBoard) {
|
|||
const board = list.pop();
|
||||
const move = board.move;
|
||||
|
||||
if (move.resign) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (move.from === 'phantom') {
|
||||
result += SHY + '*';
|
||||
} else {
|
||||
|
|
@ -511,6 +526,17 @@ function renderHistory(currentBoard) {
|
|||
}
|
||||
}
|
||||
|
||||
let winner = gameEnded(currentBoard);
|
||||
if (winner) {
|
||||
if (isLight(winner)) {
|
||||
result += ' 1-0';
|
||||
} else if (isDark(winner)) {
|
||||
result += ' 0-1';
|
||||
} else {
|
||||
result += ' \u00bd-\u00bd'; /* 1/2-1/2 */
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
@ -600,10 +626,14 @@ function renderBoard(board){
|
|||
}
|
||||
|
||||
let msg = '';
|
||||
if (board.move && board.move.took === 'k') {
|
||||
msg = (isDark(board.move.side) ? 'Dark' : 'Light') + ' player won!';
|
||||
let winner = gameEnded(board);
|
||||
if (winner) {
|
||||
if (board.move.resign) {
|
||||
msg += (isLight(board.move.side) ? 'Light' : 'Dark') + ' player resigned. ';
|
||||
}
|
||||
msg += (isLight(winner) ? 'Light' : 'Dark') + ' player won!';
|
||||
} else {
|
||||
msg = (isDark(board.player) ? 'Dark' : 'Light') + " player's turn";
|
||||
msg += (isLight(board.player) ? 'Light' : 'Dark') + " player's turn.";
|
||||
}
|
||||
$('#cb_message').text(msg);
|
||||
|
||||
|
|
@ -632,7 +662,13 @@ function setVisibleBoard(board){
|
|||
const liveBoard = $('#cb_board').data('board');
|
||||
$('#cb_undo').attr('disabled', liveBoard.prior ? false : true);
|
||||
$('#cb_redo').attr('disabled', liveBoard.subsequent ? false : true);
|
||||
if (gameEnded(liveBoard)) {
|
||||
$('#cb_pass').attr('disabled', true);
|
||||
$('#cb_resign').attr('disabled', true);
|
||||
} else {
|
||||
$('#cb_pass').attr('disabled', liveBoard.phantom ? true : false);
|
||||
$('#cb_resign').attr('disabled', false);
|
||||
}
|
||||
$('#cb_nav_last').attr('disabled', true);
|
||||
$('#cb_board').addClass('cb-live');
|
||||
$('#cb_board').removeClass('cb-archive');
|
||||
|
|
@ -640,6 +676,7 @@ function setVisibleBoard(board){
|
|||
$('#cb_undo').attr('disabled', true);
|
||||
$('#cb_redo').attr('disabled', true);
|
||||
$('#cb_pass').attr('disabled', true);
|
||||
$('#cb_resign').attr('disabled', true);
|
||||
$('#cb_board .ui-draggable').draggable('disable');
|
||||
$('#cb_nav_last').attr('disabled', false);
|
||||
$('#cb_board').removeClass('cb-live');
|
||||
|
|
@ -693,7 +730,8 @@ function putMeta(){
|
|||
let lightName = $('#cb_light_name').val();
|
||||
let darkName = $('#cb_dark_name').val();
|
||||
let meta = gun.get(PacoSakoUUID).get('meta').get(gameId);
|
||||
let stat = (board.move && board.move.took === 'k') ? 'mate' : null;
|
||||
let winner = gameEnded(board);
|
||||
let stat = !winner ? null : (board.move.took === 'k') ? 'mate' : 'ended';
|
||||
meta.put({
|
||||
gameId: gameId,
|
||||
lightName: lightName,
|
||||
|
|
@ -955,7 +993,7 @@ $(function (){
|
|||
|
||||
$('#cb_pass').on('click', function(){
|
||||
let board = $('#cb_board').data('board');
|
||||
if (!board.phantom) {
|
||||
if (!gameEnded(board) && !board.phantom) {
|
||||
let newBoard = cloneJSON(board);
|
||||
newBoard.prior = board;
|
||||
newBoard.move = { side: board.player, pass: true };
|
||||
|
|
@ -965,6 +1003,18 @@ $(function (){
|
|||
}
|
||||
});
|
||||
|
||||
$('#cb_resign').on('click', function(){
|
||||
let board = $('#cb_board').data('board');
|
||||
if (!gameEnded(board)) {
|
||||
let newBoard = cloneJSON(board);
|
||||
newBoard.prior = board;
|
||||
newBoard.move = { side: board.player, resign: true };
|
||||
newBoard.player = otherSide(board.player);
|
||||
newBoard.timestamp = new Date().getTime();
|
||||
putState(newBoard);
|
||||
}
|
||||
});
|
||||
|
||||
$('#cb_select_game').on('change', function(){
|
||||
let optIndex = $('#cb_select_game')[0].selectedIndex;
|
||||
if (optIndex === 0) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue