-//https://www.chessvariants.com/large.dir/freeling.html
+// NOTE: initial setup differs from the original; see
+// https://www.chessvariants.com/large.dir/freeling.html
class GrandRules extends ChessRules
{
static getPpath(b)
const V = VariantRules;
const [sizeX,sizeY] = VariantRules.size;
const shift = (color == "w" ? -1 : 1);
- const startRanks = (color == "w" ? [sizeY-2,sizeY-3] : [1,2]);
- const lastRanks = (color == "w" ? [0,1,2] : [sizeY-1,sizeY-2,sizeY-3]);
+ const startRanks = (color == "w" ? [sizeX-2,sizeX-3] : [1,2]);
+ const lastRanks = (color == "w" ? [0,1,2] : [sizeX-1,sizeX-2,sizeX-3]);
if (x+shift >= 0 && x+shift < sizeX && x+shift != lastRanks[0])
{
{
// Two squares jump
moves.push(this.getBasicMove([x,y], [x+2*shift,y]));
- if (x == startRanks[0] && this.board[x+2*shift][y] == V.EMPTY)
+ if (x == startRanks[0] && this.board[x+3*shift][y] == V.EMPTY)
{
// 3-squares jump
moves.push(this.getBasicMove([x,y], [x+3*shift,y]));
}
}
// Captures
- if (y>0 && this.canTake([x,y], [x+shift,y-1]) && this.board[x+shift][y-1] != V.EMPTY)
+ if (y>0 && this.canTake([x,y], [x+shift,y-1])
+ && this.board[x+shift][y-1] != V.EMPTY)
+ {
moves.push(this.getBasicMove([x,y], [x+shift,y-1]));
- if (y<sizeY-1 && this.canTake([x,y], [x+shift,y+1]) && this.board[x+shift][y+1] != V.EMPTY)
+ }
+ if (y<sizeY-1 && this.canTake([x,y], [x+shift,y+1])
+ && this.board[x+shift][y+1] != V.EMPTY)
+ {
moves.push(this.getBasicMove([x,y], [x+shift,y+1]));
+ }
}
if (lastRanks.includes(x+shift))
{
// Promotion
- let promotionPieces = [V.ROOK,V.KNIGHT,V.BISHOP,V.QUEEN];
+ let promotionPieces = [V.ROOK,V.KNIGHT,V.BISHOP,V.QUEEN,V.MARSHALL,V.CARDINAL];
promotionPieces.forEach(p => {
if (!this.captures[color][p] || this.captures[color][p]==0)
return;
if (this.board[x+shift][y] == V.EMPTY)
moves.push(this.getBasicMove([x,y], [x+shift,y], {c:color,p:p}));
// Captures
- if (y>0 && this.canTake([x,y], [x+shift,y-1]) && this.board[x+shift][y-1] != V.EMPTY)
+ if (y>0 && this.canTake([x,y], [x+shift,y-1])
+ && this.board[x+shift][y-1] != V.EMPTY)
+ {
moves.push(this.getBasicMove([x,y], [x+shift,y-1], {c:color,p:p}));
- if (y<sizeY-1 && this.canTake([x,y], [x+shift,y+1]) && this.board[x+shift][y+1] != V.EMPTY)
+ }
+ if (y<sizeY-1 && this.canTake([x,y], [x+shift,y+1])
+ && this.board[x+shift][y+1] != V.EMPTY)
+ {
moves.push(this.getBasicMove([x,y], [x+shift,y+1], {c:color,p:p}));
+ }
});
}
return moves;
}
+ // TODO: different castle?
+
getPotentialMarshallMoves(sq)
{
const V = VariantRules;
{
const V = VariantRules;
return this.isAttackedBySlideNJump(sq, colors, V.MARSHALL, V.steps[V.ROOK])
- || this.isAttackedBySlideNJump(sq, colors, V.MARSHALL, V.steps[V.KNIGHT], "oneStep");
+ || this.isAttackedBySlideNJump(
+ sq, colors, V.MARSHALL, V.steps[V.KNIGHT], "oneStep");
}
isAttackedByCardinal(sq, colors)
{
const V = VariantRules;
return this.isAttackedBySlideNJump(sq, colors, V.CARDINAL, V.steps[V.BISHOP])
- || this.isAttackedBySlideNJump(sq, colors, V.CARDINAL, V.steps[V.KNIGHT], "oneStep");
+ || this.isAttackedBySlideNJump(
+ sq, colors, V.CARDINAL, V.steps[V.KNIGHT], "oneStep");
}
- play(move, ingame)
+ updateVariables(move)
{
- super.play(move, ingame);
+ super.updateVariables(move);
if (move.vanish.length==2 && move.appear.length==1
&& move.vanish[1].p != VariantRules.PAWN)
{
}
}
- undo(move)
+ unupdateVariables(move)
{
- super.undo(move);
+ super.unupdateVariables(move);
if (move.vanish.length==2 && move.appear.length==1
&& move.vanish[1].p != VariantRules.PAWN)
{
- // Capture: update this.captures
this.captures[move.vanish[1].c][move.vanish[1].p] =
Math.max(0, this.captures[move.vanish[1].c][move.vanish[1].p]-1);
}
);
}
+ static get SEARCH_DEPTH() { return 2; }
+
// TODO: this function could be generalized and shared better
static GenRandInitFen()
{
- let pieces = [new Array(10), new Array(10)];
+ let pieces = { "w": new Array(10), "b": new Array(10) };
// Shuffle pieces on first and last rank
- for (let c = 0; c <= 1; c++)
+ for (let c of ["w","b"])
{
let positions = _.range(10);
pieces[c][knight2Pos] = 'n';
pieces[c][rook2Pos] = 'r';
}
- let fen = pieces[0].join("") +
+ let fen = pieces["b"].join("") +
"/pppppppppp/10/10/10/10/10/10/PPPPPPPPPP/" +
- pieces[1].join("").toUpperCase() +
+ pieces["w"].join("").toUpperCase() +
" 1111";
return fen;
}