x: ['b', 'k'],
y: ['q', 'q'],
z: ['q', 'k'],
- '_': ['k', 'k']
+ '@': ['k', 'k']
};
}
for (let i = 0; i < row.length; i++) {
const lowR = row[i].toLowerCase();
const readNext = !(ChessRules.PIECES.includes(lowR));
- if (!!(lowR.match(/[a-z_]/))) {
+ if (!!(lowR.match(/[a-z@]/))) {
sumElts++;
if (lowR == 'k') kings[row[i]]++;
else if (readNext) {
const c = fenRows[i].charAt(j);
const lowR = c.toLowerCase();
const readNext = !(ChessRules.PIECES.includes(lowR));
- if (!!(lowR.match(/[a-z_]/))) {
+ if (!!(lowR.match(/[a-z@]/))) {
if (lowR == 'k') this.kingPos[c == 'k' ? 'b' : 'w'] = [i, k];
else if (readNext) {
const up = this.getUnionPieces(fenRows[i][++j], lowR);
// Transformation computed without taking union into account
const up = this.getUnionPieces(initColor, initPiece);
let args = [tr.p, up[oppCol]];
- if (['a', 'v'].includes(initColor)) args = args.reverse();
+ if (
+ ['a', 'v'].includes(initColor) ||
+ // HACK: "ba" piece = two pawns, black controling.
+ // If promoting, must artificially imagine color was 'a':
+ (initPiece == 'a' && initColor == 'b')
+ ) {
+ args = args.reverse();
+ }
const capturer = (['a', 'b'].includes(initColor) ? 'b' : 'w');
const cp = this.getUnionCode(args[0], args[1], capturer);
tr.c = cp.c;
r.piece == newState.piece &&
(
r.square.x == newState.square.x &&
- r.square.y == newState.square.y &&
+ r.square.y == newState.square.y
) &&
r.position == newState.position
);