1
0
forked from sent/waves
waves-fork/public/assets/g/chess/js/board-actions.js
2025-04-09 17:11:14 -05:00

264 lines
5.9 KiB
JavaScript

function updateEngineSkill() {
if (engineSkill != parseInt($('#game-difficulty-skill-value').text())) {
engineSkill = parseInt($('#game-difficulty-skill-value').text());
stockfish.postMessage('setoption name skill level value ' + engineSkill);
console.log('Skill level is ' + engineSkill + ' (setoption name skill level value ' + engineSkill + ')');
}
}
function gameHistoryAddMove(position) {
var moves = [position];
if (!localStorage.getItem('boardHistory')) {
localStorage.setItem('boardHistory', JSON.stringify(moves));
return;
}
moves = JSON.parse(localStorage.getItem('boardHistory'));
moves.push(position);
localStorage.setItem('boardHistory', JSON.stringify(moves));
}
function gameHistoryGet() {
return JSON.parse(localStorage.getItem('boardHistory'));
}
function gameHistoryClear() {
localStorage.removeItem('boardHistory', '');
}
// Load custom board from FEN string
function loadBoard(fen, fromHistory = false) {
var gameValidation = game.validate_fen(fen);
if (!gameValidation.valid) {
console.log('Error ' + gameValidation.error_number + ': ' + gameValidation.error);
alert('Error ' + gameValidation.error_number + ': ' + gameValidation.error);
return;
};
if (fromHistory) {
board.position(fen);
return;
}
$('#btn-take-back').addClass('hidden');
setDesktopBoard();
gameEnd = false;
board.position(fen);
game = new Chess(fen);
if (game.turn() == 'w') {
firstTurn = 'player';
$('#game-turn').text('White turn.');
$('#game-first-turn span').removeClass('active');
$('#game-first-turn .player').addClass('active');
}
if (game.turn() == 'b') {
firstTurn = 'computer';
$('#game-turn').text('Black turn.');
$('#game-first-turn span').removeClass('active');
$('#game-first-turn .computer').addClass('active');
}
$('#btn-start-game').removeClass('hidden');
$('#btn-start-game').click(function() {
$('#btn-start-game').addClass('hidden');
console.log('Turn: ' + firstTurn);
if (firstTurn == 'player') {
$('#board').removeClass('locked');
}
if (firstTurn == 'computer' && !engineDisabled) {
$('#board').addClass('locked');
updateEngineSkill();
stockfish.postMessage('position fen ' + board.fen() + ' ' + game.turn());
stockfish.postMessage('go depth ' + engineSkill);
}
startTimer();
$('#game-state').addClass('hidden');
});
}
// make opponent turn
function opponentTurn() {
console.log('Opponent turn.');
stopTimer();
if (promotionEvent) {
console.log('Debug 13');
board.position(game.fen());
gameHistoryAddMove(game.fen());
promotionEvent = false;
}
$('#board').addClass('locked');
console.log('Game started: ' + gameStarted);
if (!gameStarted) {
gameStarted = true;
$('#btn-choose-white-side, #btn-choose-black-side').addClass('locked');
}
console.log('Game end (1): ' + gameEnd);
if (engineDisabled) {
if(togglePlayer) {
checkPositions('computer');
} else {
checkPositions('player');
}
togglePlayer = !togglePlayer;
} else {
checkPositions('computer');
togglePlayer = true;
}
console.log('Game end (2): ' + gameEnd);
if (gameEnd) {
console.log('The game is finished.');
return;
}
$('#btn-take-back').addClass('disabled');
console.log('Engine: position fen ' + game.fen());
if (!engineDisabled) {
updateEngineSkill();
setTimeout(function() {
stockfish.postMessage('position fen ' + game.fen());
stockfish.postMessage('go depth ' + engineSkill);
}, 500);
startTimer();
}
}
// make pawn promotion to queen or whatever
function makePromotion(source, target, promotion) {
game.undo();
game.move({
from: source,
to: target,
promotion: promotion
});
}
// check sides and player turn if it was changed manually
function checkTurn() {
console.log('player side ' + playerSide);
console.log('game turn ' + game.turn());
console.log('first turn ' + firstTurn);
if (firstTurn == 'player') {
if (playerSide == 'w') {
game.setTurn('w');
}
if (playerSide == 'b') {
game.setTurn('b');
}
}
if (firstTurn == 'computer') {
if (playerSide == 'w') {
game.setTurn('b');
}
if (playerSide == 'b') {
game.setTurn('w');
}
}
console.log('game turn ' + game.turn());
}
function checkPositions(turn) {
console.log('Checking positions', turn);
if (game.in_checkmate()) {
postEndGame();
$('#game-state').text('Checkmate').removeClass('hidden');
}
else if (game.in_draw()) {
postEndGame();
$('#game-state').text('The game has ended in a draw.').removeClass('hidden');
}
else if (game.in_stalemate()) {
postEndGame();
$('#game-state').text('The game has ended in a stalemate (draw).').removeClass('hidden');
}
else if (game.in_check()) {
$('#board').removeClass('locked');
$('#game-turn').addClass('hidden');
$('#game-state').text('Check!').removeClass('hidden');
}
else {
if (turn == 'player') {
$('#board').removeClass('locked');
$('#game-turn').text('It\'s your turn!');
$('#game-state').text('It\'s your turn!').removeClass('hidden');
}
if (turn == 'computer') {
if(engineDisabled) {
$('#board').removeClass('locked');
$('#game-turn').text('It\'s player 2 turn!');
$('#game-state').text('It\'s player 2 turn!').removeClass('hidden');
} else {
$('#board').addClass('locked');
$('#game-turn').text('It\'s the engine\'s turn...');
$('#game-state').text('It\'s the engine\'s turn...').removeClass('hidden');
}
}
}
}
function postEndGame() {
gameEnd = true;
document.getElementById("btn-switch-sides").disabled = true;
$('#btn-switch-sides').addClass('disabled');
document.getElementById("btn-show-hint").disabled = true;
$('#btn-show-hint').addClass('disabled');
$('#game-turn').addClass('hidden');
return;
}