+ // Build switch move between squares x1,y1 and x2,y2
+ getSwitchMove_s([x1,y1],[x2,y2])
+ {
+ const c = this.getColor(x1,y1); //same as color at square 2
+ const p1 = this.getPiece(x1,y1);
+ const p2 = this.getPiece(x2,y2);
+ const V = VariantRules;
+ if (p1 == V.KING && p2 == V.ROOK)
+ return []; //avoid duplicate moves (potential conflict with castle)
+ let move = new Move({
+ appear: [
+ new PiPo({x:x2,y:y2,c:c,p:p1}),
+ new PiPo({x:x1,y:y1,c:c,p:p2})
+ ],
+ vanish: [
+ new PiPo({x:x1,y:y1,c:c,p:p1}),
+ new PiPo({x:x2,y:y2,c:c,p:p2})
+ ],
+ start: {x:x1,y:y1},
+ end: {x:x2,y:y2}
+ });
+ // Move completion: promote switched pawns (as in Magnetic)
+ const sizeX = VariantRules.size[0];
+ const lastRank = (c == "w" ? 0 : sizeX-1);
+ let moves = [];
+ if ((p1==V.PAWN && x2==lastRank) || (p2==V.PAWN && x1==lastRank))
+ {
+ const idx = (p1==V.PAWN ? 0 : 1);
+ move.appear[idx].p = V.ROOK;
+ moves.push(move);
+ for (let piece of [V.KNIGHT, V.BISHOP, V.QUEEN])
+ {
+ let cmove = JSON.parse(JSON.stringify(move));
+ cmove.appear[idx].p = piece;
+ moves.push(cmove);
+ }
+ if (idx == 1)
+ {
+ // Swap moves[i].appear[0] and [1] for moves presentation [TODO...]
+ moves.forEach(m => {
+ let tmp = m.appear[0];
+ m.appear[0] = m.appear[1];
+ m.appear[1] = tmp;
+ });
+ }
+ }
+ else //other cases
+ moves.push(move);
+ return moves;
+ }