chessground12
Version:
Extended lishuuro.org Chess UI
102 lines • 3.63 kB
JavaScript
import { allPos, key2pos, pos2key } from './util';
function diff(a, b) {
return Math.abs(a - b);
}
function pawn(color) {
return (x1, y1, x2, y2) => diff(x1, x2) < 2 &&
(color === 'white'
? // allow 2 squares from first two ranks, for horde
y2 === y1 + 1 || (y1 <= 1 && y2 === y1 + 2 && x1 === x2)
: y2 === y1 - 1 || (y1 >= 6 && y2 === y1 - 2 && x1 === x2));
}
export const knight = (x1, y1, x2, y2) => {
const xd = diff(x1, x2);
const yd = diff(y1, y2);
return (xd === 1 && yd === 2) || (xd === 2 && yd === 1);
};
export const giraffe = (x1, y1, x2, y2) => {
const xd = diff(x1, x2);
const yd = diff(y1, y2);
return (xd === 1 && yd === 4) || (xd === 4 && yd === 1);
};
const bishop = (x1, y1, x2, y2) => {
return diff(x1, x2) === diff(y1, y2);
};
const rook = (x1, y1, x2, y2) => {
return x1 === x2 || y1 === y2;
};
export const queen = (x1, y1, x2, y2) => {
return bishop(x1, y1, x2, y2) || rook(x1, y1, x2, y2);
};
function king(color, rookFiles, canCastle) {
return (x1, y1, x2, y2) => (diff(x1, x2) < 2 && diff(y1, y2) < 2) ||
(canCastle &&
y1 === y2 &&
y1 === (color === 'white' ? 0 : 7) &&
((x1 === 4 && ((x2 === 2 && rookFiles.includes(0)) || (x2 === 6 && rookFiles.includes(7)))) ||
rookFiles.includes(x2)));
}
function rookFilesOf(pieces, color) {
const backrank = color === 'white' ? '1' : '8';
const files = [];
for (const [key, piece] of pieces) {
if (key[1] === backrank && piece.color === color && piece.role === 'r-piece') {
files.push(key2pos(key)[0]);
}
}
return files;
}
// capablanca king (different castling files from standard chess king)
// archbishop (knight + bishop)
const archbishop = (x1, y1, x2, y2) => {
return bishop(x1, y1, x2, y2) || knight(x1, y1, x2, y2);
};
// chancellor (knight + rook)
const chancellor = (x1, y1, x2, y2) => {
return rook(x1, y1, x2, y2) || knight(x1, y1, x2, y2);
};
export function premove(pieces, key, canCastle, geom, variant) {
const piece = pieces.get(key);
const role = piece.role;
const color = piece.color;
const pos = key2pos(key);
let mobility = () => false;
switch (variant) {
default:
switch (role) {
case 'p-piece':
mobility = pawn(color);
break; // pawn
case 'r-piece':
mobility = rook;
break; // rook
case 'n-piece':
mobility = knight;
break; // knight
case 'b-piece':
mobility = bishop;
break; // bishop
case 'q-piece':
mobility = queen;
break; // queen
case 'c-piece':
mobility = chancellor;
break; // chancellor
case 'h-piece': // S-chess hawk
case 'a-piece':
mobility = archbishop;
break; // archbishop
case 'g-piece':
mobility = giraffe;
break;
case 'k-piece':
mobility = king(color, rookFilesOf(pieces, color), canCastle);
break; // king
}
}
let keys = allPos(geom)
.filter(pos2 => (pos[0] !== pos2[0] || pos[1] !== pos2[1]) && mobility(pos[0], pos[1], pos2[0], pos2[1]))
.map(pos2key);
return keys;
}
//# sourceMappingURL=premove.js.map