From 2e6764ffb5d42a75c7d86724d27f25ffb7d0cf78 Mon Sep 17 00:00:00 2001 From: Jesse McDonald Date: Sun, 15 Mar 2020 15:57:17 -0500 Subject: [PATCH] add support for resignation --- index.html | 1 + js/chess.js | 70 +++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 61 insertions(+), 10 deletions(-) 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) {