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

141 lines
3.2 KiB
JavaScript

// init board desktop
function setDesktopBoard(position = false, sparePieces = false) {
gameEnd = false;
// mode to set chess figures in custom position
if (sparePieces) {
board = ChessBoard('board', {
draggable: true,
dropOffBoard: 'trash',
sparePieces: true,
pieceTheme: 'img/pieces/{piece}.svg'
});
return;
}
// init board with preloaded position (fen)
if (position == false) {
position = 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1';
} else {
console.log('Custom: ' + position);
}
// game rules control object
game = new Chess(position);
var onDragStart = function(source, piece) {
// do not pick up pieces if the game is over or if it's not that side's turn
if (game.game_over() === true ||
(game.turn() === 'w' && piece.search(/^b/) !== -1) ||
(game.turn() === 'b' && piece.search(/^w/) !== -1)) {
return false;
}
};
var onDrop = function(source, target, piece, newPos, oldPos, orientation) {
removeGreySquares();
if (!gameStarted) {
gameStarted = true;
$('#btn-choose-white-side, #btn-choose-black-side').addClass('locked');
}
// see if the move is legal
var move = game.move({
from: source,
to: target,
promotion: 'q'
});
// illegal move
if (move === null) {
console.log('Player illegal move.');
return 'snapback';
}
promotionPos = newPos;
moveSource = source;
moveTarget = target;
// promotion move
if (move.promotion != undefined) {
$('#game-promotion').removeClass('hidden');
$('#board').addClass('locked');
console.log('Paused for promotion.');
return;
}
dumpLog(false);
listMoves();
opponentTurn();
};
var onMouseoverSquare = function(square, piece) {
// get list of possible moves for this square
var moves = game.moves({
square: square,
verbose: true
});
// skip if there are no moves available for this square
if (moves.length === 0) return;
// highlight the square they moused over
greySquare(square);
// highlight the possible squares for this piece
for (var i = 0; i < moves.length; i++) {
greySquare(moves[i].to);
}
};
var onMouseoutSquare = function(square, piece) {
removeGreySquares();
};
var onSnapEnd = function() {
board.position(game.fen());
gameHistoryAddMove(game.fen());
if (game.history().length > 0) $('#btn-take-back').removeClass('disabled');
};
board = ChessBoard('board', {
position: position,
draggable: true,
showNotation: true,
onDragStart: onDragStart,
dropOffBoard: 'snapback',
onDrop: onDrop,
onMouseoutSquare: onMouseoutSquare,
onMouseoverSquare: onMouseoverSquare,
onSnapEnd: onSnapEnd,
pieceTheme: 'img/pieces/{piece}.svg'
});
gameHistoryClear();
// field highlight functions
var removeGreySquares = function() {
$('#board .square-55d63').css('background', '');
};
var greySquare = function(square) {
var squareEl = $('#board .square-' + square), background = '#fbe3e7';
if (squareEl.hasClass('black-3c85d') === true) background = '#f7c5cd';
squareEl.css('background', background);
};
};