chessground
Version:
Multipurpose chess UI, for lichess.org web and mobile
84 lines (73 loc) • 1.95 kB
JavaScript
var util = require('./util');
function diff(a, b) {
return Math.abs(a - b);
}
function pawn(color, x1, y1, x2, y2) {
return diff(x1, x2) < 2 && (
color === 'white' ? (
y2 === y1 + 1 || (y1 === 2 && y2 === 4 && x1 === x2)
) : (
y2 === y1 - 1 || (y1 === 7 && y2 === 5 && x1 === x2)
)
);
}
function knight(x1, y1, x2, y2) {
var xd = diff(x1, x2);
var yd = diff(y1, y2);
return (xd === 1 && yd === 2) || (xd === 2 && yd === 1);
}
function bishop(x1, y1, x2, y2) {
return diff(x1, x2) === diff(y1, y2);
}
function rook(x1, y1, x2, y2) {
return x1 === x2 || y1 === y2;
}
function queen(x1, y1, x2, y2) {
return bishop(x1, y1, x2, y2) || rook(x1, y1, x2, y2);
}
function king(color, rookFiles, x1, y1, x2, y2) {
return (
diff(x1, x2) < 2 && diff(y1, y2) < 2
) || (
y1 === y2 && y1 === (color === 'white' ? 1 : 8) && (
(x1 === 5 && (x2 === 3 || x2 === 7)) || util.containsX(rookFiles, x2)
)
);
}
function rookFilesOf(pieces, color) {
return Object.keys(pieces).filter(function(key) {
var piece = pieces[key];
return piece && piece.color === color && piece.role === 'rook';
}).map(function(key) {
return util.key2pos(key)[0];
});
}
function compute(pieces, key) {
var piece = pieces[key];
var pos = util.key2pos(key);
var mobility;
switch (piece.role) {
case 'pawn':
mobility = pawn.bind(null, piece.color);
break;
case 'knight':
mobility = knight
break;
case 'bishop':
mobility = bishop
break;
case 'rook':
mobility = rook
break;
case 'queen':
mobility = queen
break;
case 'king':
mobility = king.bind(null, piece.color, rookFilesOf(pieces, piece.color))
break;
}
return util.allPos.filter(function(pos2) {
return (pos[0] !== pos2[0] || pos[1] !== pos2[1]) && mobility(pos[0], pos[1], pos2[0], pos2[1]);
}).map(util.pos2key);
}
module.exports = compute;