diff --git a/index.html b/index.html
index b17038f..1f2b64b 100644
--- a/index.html
+++ b/index.html
@@ -149,6 +149,7 @@
+
diff --git a/js/chess.js b/js/chess.js
index be18fcb..a526934 100644
--- a/js/chess.js
+++ b/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);
- $('#cb_pass').attr('disabled', liveBoard.phantom ? true : false);
+ 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) {