4031462cd53baf9172d8098d26bbf0444f49cef9
1 class DarkRules
extends ChessRules
3 // Standard rules, in the shadow
6 super.setOtherVariables(fen
);
7 const [sizeX
,sizeY
] = [V
.size
.x
,V
.size
.y
];
9 "w": doubleArray(sizeX
,sizeY
),
10 "b": doubleArray(sizeX
,sizeY
)
12 // Setup enlightened: squares reachable by each side
13 // (TODO: one side would be enough ?)
14 this.updateEnlightened();
19 // Initialize with pieces positions (which are seen)
20 for (let i
=0; i
<V
.size
.x
; i
++)
22 for (let j
=0; j
<V
.size
.y
; j
++)
24 this.enlightened
["w"][i
][j
] = false;
25 this.enlightened
["b"][i
][j
] = false;
26 if (this.board
[i
][j
] != V
.EMPTY
)
27 this.enlightened
[this.getColor(i
,j
)][i
][j
] = true;
30 const currentTurn
= this.turn
;
32 const movesWhite
= this.getAllValidMoves();
34 const movesBlack
= this.getAllValidMoves();
35 this.turn
= currentTurn
;
36 for (let move of movesWhite
)
37 this.enlightened
["w"][move.end
.x
][move.end
.y
] = true;
38 for (let move of movesBlack
)
39 this.enlightened
["b"][move.end
.x
][move.end
.y
] = true;
44 if (this.kingPos
[this.turn
][0] < 0)
46 return true; //TODO: is it right?
51 return false; //there is no check
56 const c
= this.getOppCol(this.turn
); //opponent
57 const saveKingPos
= this.kingPos
[c
]; //king might be taken
59 // The only way to be "under check" is to have lost the king (thus game over)
60 let res
= this.kingPos
[c
][0] < 0
61 ? [JSON
.parse(JSON
.stringify(saveKingPos
))]
69 // Update kings positions
70 const piece
= move.vanish
[0].p
;
71 const c
= move.vanish
[0].c
;
72 if (piece
== V
.KING
&& move.appear
.length
> 0)
74 this.kingPos
[c
][0] = move.appear
[0].x
;
75 this.kingPos
[c
][1] = move.appear
[0].y
;
77 if (move.vanish
.length
>= 2 && move.vanish
[1].p
== V
.KING
)
79 // We took opponent king !
80 const oppCol
= this.getOppCol(c
);
81 this.kingPos
[oppCol
] = [-1,-1];
84 // Update moves for both colors:
85 this.updateEnlightened();
88 unupdateVariables(move)
90 super.unupdateVariables(move);
91 const c
= move.vanish
[0].c
;
92 const oppCol
= this.getOppCol(c
);
93 if (this.kingPos
[oppCol
][0] < 0)
95 // Last move took opponent's king
96 for (let psq
of move.vanish
)
100 this.kingPos
[oppCol
] = [psq
.x
, psq
.y
];
106 // Update moves for both colors:
107 this.updateEnlightened();
112 // No valid move: our king disappeared
113 return this.turn
== "w" ? "0-1" : "1-0";
116 static get THRESHOLD_MATE()
118 return 500; //checkmates evals may be slightly below 1000
122 const VariantRules
= DarkRules
;