Split move doing from event handling

This commit is contained in:
Juhani Krekelä 2021-01-10 17:29:01 +02:00
parent 56d64c813e
commit e9f6480d90
1 changed files with 21 additions and 24 deletions

View File

@ -207,6 +207,13 @@
return; return;
} }
let ret = doMove(move);
if ('error' in ret) {
alert(ret.error);
}
}
function doMove(move) {
// Piece // Piece
let piece = move.slice(0, 1); let piece = move.slice(0, 1);
let index = 0; let index = 0;
@ -230,8 +237,7 @@
piece = 'P'; piece = 'P';
break; break;
default: default:
alert('Not a valid piece: ' + piece); return {error: 'Not a valid piece: ' + piece};
return;
} }
// Start square // Start square
@ -242,8 +248,7 @@
startLetter === '' || !'abcdefgh'.includes(startLetter) || startLetter === '' || !'abcdefgh'.includes(startLetter) ||
startNumber === '' || !'12345678'.includes(startNumber) startNumber === '' || !'12345678'.includes(startNumber)
) { ) {
alert('Not a valid coordinate: ' + startLetter + startNumber); return {error: 'Not a valid coordinate: ' + startLetter + startNumber};
return;
} }
// Capturing // Capturing
@ -261,8 +266,7 @@
endLetter === '' || !'abcdefgh'.includes(endLetter) || endLetter === '' || !'abcdefgh'.includes(endLetter) ||
endNumber === '' || !'12345678'.includes(endNumber) endNumber === '' || !'12345678'.includes(endNumber)
) { ) {
alert('Not a valid coordinate: ' + endLetter + endNumber); return {error: 'Not a valid coordinate: ' + endLetter + endNumber};
return;
} }
// Promotion // Promotion
@ -277,16 +281,13 @@
promotion = move.slice(index, index + 1); promotion = move.slice(index, index + 1);
break; break;
case 'K': case 'K':
alert('Cannot promote a piece to king'); return {error: 'Cannot promote a piece to king'};
return;
break; break;
case 'P': case 'P':
alert('Cannot promote a piece to pawn'); return {error: 'Cannot promote a piece to pawn'};
return;
break; break;
default: default:
alert('Unrecognized piece: ' + move.slice(index, index + 1)); return {error: 'Unrecognized piece: ' + move.slice(index, index + 1)};
return;
} }
index++; index++;
} }
@ -303,8 +304,7 @@
// TODO: Checkmate' // TODO: Checkmate'
break; break;
default: default:
alert('Unexpected contents at the end of the move: ' + move.slice(index)); return {error: 'Unexpected contents at the end of the move: ' + move.slice(index)};
return;
} }
// End of parsing, start of move construction // End of parsing, start of move construction
@ -321,20 +321,17 @@
// Are we moving the piece onto itself? // Are we moving the piece onto itself?
if (startLetter === endLetter && startNumber === endNumber) { if (startLetter === endLetter && startNumber === endNumber) {
alert('Start and end squares of the move cannot be identical'); return {error: 'Start and end squares of the move cannot be identical'};
return;
} }
// Are we moving the piece from where it is located? // Are we moving the piece from where it is located?
let startSquare = document.getElementById(startLetter + startNumber); let startSquare = document.getElementById(startLetter + startNumber);
if (startSquare.childNodes.length === 0) { if (startSquare.childNodes.length === 0) {
alert('No piece on square ' + startLetter + startNumber); return {error: 'No piece on square ' + startLetter + startNumber};
return;
} }
if (startSquare.childNodes[0].data !== renderedPiece) { if (startSquare.childNodes[0].data !== renderedPiece) {
let pieceNames = {'K': 'king', 'Q': 'vizier', 'R': 'rook', 'B': 'elephant', 'N': 'horse', 'P': 'pawn'}; let pieceNames = {'K': 'king', 'Q': 'vizier', 'R': 'rook', 'B': 'elephant', 'N': 'horse', 'P': 'pawn'};
alert((whiteMove ? 'White' : 'Black') + ' ' + pieceNames[piece] + ' not on square ' + startLetter + startNumber); return {error: (whiteMove ? 'White' : 'Black') + ' ' + pieceNames[piece] + ' not on square ' + startLetter + startNumber};
return;
} }
// TODO: Check piece is allowed to move like that // TODO: Check piece is allowed to move like that
@ -342,12 +339,10 @@
// Can the piece move to this location? // Can the piece move to this location?
let endSquare = document.getElementById(endLetter + endNumber); let endSquare = document.getElementById(endLetter + endNumber);
if (endSquare.childNodes.length !== 0 && !captures) { if (endSquare.childNodes.length !== 0 && !captures) {
alert('Square ' + endLetter + endNumber + ' is occupied, did you mean to capture?'); return {error: 'Square ' + endLetter + endNumber + ' is occupied, did you mean to capture?'};
return;
} }
if (endSquare.childNodes.length === 0 && captures) { if (endSquare.childNodes.length === 0 && captures) {
alert('Square ' + endLetter + endNumber + ' empty even though capture was specified'); return {error: 'Square ' + endLetter + endNumber + ' empty even though capture was specified'};
return;
} }
// Record our alterations to the table // Record our alterations to the table
@ -377,6 +372,8 @@
// Empty input field // Empty input field
document.getElementById('move').value = ''; document.getElementById('move').value = '';
return {}
} }
function undoMove() { function undoMove() {