4c286e1dea5b2fe1270600ebe607040bdf027ad9
1 class MagneticRules
extends ChessRules
5 return undefined; //no en-passant
8 getPotentialMovesFrom([x
,y
])
10 let standardMoves
= super.getPotentialMovesFrom([x
,y
]);
12 standardMoves
.forEach(m
=> {
13 let newMove_s
= this.applyMagneticLaws(m
);
14 if (newMove_s
.length
== 1)
15 moves
.push(newMove_s
[0]);
17 moves
= moves
.concat(moves
, newMove_s
);
22 // Complete a move with magnetic actions
23 // TODO: job is done multiple times for (normal) promotions.
24 applyMagneticLaws(move)
26 const V
= VariantRules
;
27 if (move.appear
[0].p
== V
.KING
&& move.appear
.length
==1)
28 return [move]; //kings are not charged
29 const aIdx
= (move.appear
[0].p
!= V
.KING
? 0 : 1); //if castling, rook is charged
30 const [x
,y
] = [move.appear
[aIdx
].x
, move.appear
[aIdx
].y
];
31 const color
= this.turn
;
32 const lastRank
= (color
=="w" ? 0 : 7);
33 const standardMove
= JSON
.parse(JSON
.stringify(move));
34 this.play(standardMove
);
35 const [sizeX
,sizeY
] = V
.size
;
36 for (let step
of [[-1,0],[1,0],[0,-1],[0,1]])
38 let [i
,j
] = [x
+step
[0],y
+step
[1]];
39 while (i
>=0 && i
<sizeX
&& j
>=0 && j
<sizeY
)
41 if (this.board
[i
][j
] != V
.EMPTY
)
43 // Found something. Same color or not?
44 if (this.getColor(i
,j
) != color
)
47 if ((Math
.abs(i
-x
)>=2 || Math
.abs(j
-y
)>=2) && this.getPiece(i
,j
) != V
.KING
)
70 if (this.getPiece(i
,j
) != V
.KING
)
72 // Push it until we meet an obstacle or edge of the board
73 let [ii
,jj
] = [i
+step
[0],j
+step
[1]];
74 while (ii
>=0 && ii
<sizeX
&& jj
>=0 && jj
<sizeY
)
76 if (this.board
[ii
][jj
] != V
.EMPTY
)
83 if (Math
.abs(ii
-i
)>=1 || Math
.abs(jj
-j
)>=1)
110 this.undo(standardMove
);
112 // Scan move for pawn (max 1) on 8th rank
113 for (let i
=1; i
<move.appear
.length
; i
++)
115 if (move.appear
[i
].p
==V
.PAWN
&& move.appear
[i
].x
==lastRank
)
117 move.appear
[i
].p
= V
.ROOK
;
119 for (let piece
of [V
.KNIGHT
, V
.BISHOP
, V
.QUEEN
])
121 let cmove
= JSON
.parse(JSON
.stringify(move));
122 cmove
.appear
[i
].p
= piece
;
125 // Swap appear[i] and appear[0] for moves presentation (TODO: this is awkward)
127 let tmp
= m
.appear
[0];
128 m
.appear
[0] = m
.appear
[i
];
134 if (moves
.length
== 0) //no pawn on 8th rank
139 // TODO: verify this assertion
142 return true; //always at least one possible move
147 return false; //there is no check
150 getCheckSquares(move)
152 const c
= this.getOppCol(this.turn
); //opponent
153 const saveKingPos
= this.kingPos
[c
]; //king might be taken
155 // The only way to be "under check" is to have lost the king (thus game over)
156 let res
= this.kingPos
[c
][0] < 0
157 ? [ JSON
.parse(JSON
.stringify(saveKingPos
)) ]
163 updateVariables(move)
165 super.updateVariables(move);
166 const c
= this.getColor(move.start
.x
,move.start
.y
);
167 if (c
!= this.getColor(move.end
.x
,move.end
.y
)
168 && this.board
[move.end
.x
][move.end
.y
] != VariantRules
.EMPTY
169 && this.getPiece(move.end
.x
,move.end
.y
) == VariantRules
.KING
)
171 // We took opponent king !
172 const oppCol
= this.getOppCol(c
);
173 this.kingPos
[oppCol
] = [-1,-1];
174 this.castleFlags
[oppCol
] = [false,false];
178 unupdateVariables(move)
180 super.unupdateVariables(move);
181 const c
= this.getColor(move.start
.x
,move.start
.y
);
182 const oppCol
= this.getOppCol(c
);
183 if (this.kingPos
[oppCol
][0] < 0)
185 // Last move took opponent's king
186 for (let psq
of move.vanish
)
190 this.kingPos
[oppCol
] = [psq
.x
, psq
.y
];
199 if (this.checkRepetition())
202 const color
= this.turn
;
203 // TODO: do we need "atLeastOneMove()"?
204 if (this.atLeastOneMove() && this.kingPos
[color
][0] >= 0)
207 return this.checkGameEnd();
212 // No valid move: our king disappeared
213 return this.turn
== "w" ? "0-1" : "1-0";