getPotentialMovesFrom([x, y]) {
// At subTurn == 2, jailers aren't effective (Jeff K)
+ const piece = this.getPiece(x, y);
+ const L = this.sentryPush.length;
if (this.subTurn == 1) {
const jsq = this.isImmobilized([x, y]);
if (!!jsq) {
let moves = [];
// Special pass move if king:
- if (this.getPiece(x, y) == V.KING) {
+ if (piece == V.KING) {
moves.push(
new Move({
appear: [],
})
);
}
+ else if (piece == V.LANCER && !!this.sentryPush[L-1]) {
+ // A pushed lancer next to the jailer: reorient
+ const color = this.getColor(x, y);
+ const curDir = this.board[x][y].charAt(1);
+ Object.keys(V.LANCER_DIRS).forEach(k => {
+ moves.push(
+ new Move({
+ appear: [{ x: x, y: y, c: color, p: k }],
+ vanish: [{ x: x, y: y, c: color, p: curDir }],
+ start: { x: x, y: y },
+ end: { x: jsq[0], y: jsq[1] }
+ })
+ );
+ });
+ }
return moves;
}
}
let moves = [];
- switch (this.getPiece(x, y)) {
+ switch (piece) {
case V.JAILER:
moves = this.getPotentialJailerMoves([x, y]);
break;
moves = super.getPotentialMovesFrom([x, y]);
break;
}
- const L = this.sentryPush.length;
if (!!this.sentryPush[L-1]) {
- // Delete moves walking back on sentry push path
+ // Delete moves walking back on sentry push path,
+ // only if not a pawn, and the piece is the pushed one.
+ const pl = this.sentryPush[L-1].length;
+ const finalPushedSq = this.sentryPush[L-1][pl-1];
moves = moves.filter(m => {
if (
m.vanish[0].p != V.PAWN &&
+ m.start.x == finalPushedSq.x && m.start.y == finalPushedSq.y &&
this.sentryPush[L-1].some(sq => sq.x == m.end.x && sq.y == m.end.y)
) {
return false;
absDeltaX = Math.abs(deltaX);
const deltaY = y2 - y1,
absDeltaY = Math.abs(deltaY);
- const step = [ deltaX / absDeltaX, deltaY / absDeltaY ];
+ const step = [ deltaX / absDeltaX || 0, deltaY / absDeltaY || 0 ];
if (
// Check that the step is a priori valid:
(absDeltaX != absDeltaY && deltaX != 0 && deltaY != 0) ||
return false;
}
let sq = [ x1 + step[0], y1 + step[1] ];
- while (sq[0] != x2 && sq[1] != y2) {
+ while (sq[0] != x2 || sq[1] != y2) {
if (
// NOTE: no need to check OnBoard in this special case
(!lancer && this.board[sq[0]][sq[1]] != V.EMPTY) ||
return (!choice.second ? choice : [choice, choice.second]);
}
+ // For moves notation:
+ static get LANCER_DIRNAMES() {
+ return {
+ 'c': "N",
+ 'd': "NE",
+ 'e': "E",
+ 'f': "SE",
+ 'g': "S",
+ 'h': "SW",
+ 'm': "W",
+ 'o': "NW"
+ };
+ }
+
getNotation(move) {
// Special case "king takes jailer" is a pass move
if (move.appear.length == 0 && move.vanish.length == 0) return "pass";
+ let notation = undefined;
if (this.subTurn == 2) {
// Do not consider appear[1] (sentry) for sentry pushes
const simpleMove = {
start: move.start,
end: move.end
};
- return super.getNotation(simpleMove);
- }
- return super.getNotation(move);
+ notation = super.getNotation(simpleMove);
+ } else notation = super.getNotation(move);
+ if (Object.keys(V.LANCER_DIRNAMES).includes(move.vanish[0].p))
+ // Lancer: add direction info
+ notation += "=" + V.LANCER_DIRNAMES[move.appear[0].p];
+ return notation;
}
};