1 class AntikingRules
extends ChessRules
6 return b
[1]=='a' ? "Antiking/"+b : b
;
9 static get ANTIKING() { return 'a'; }
13 super.initVariables(fen
);
14 this.antikingPos
= {'w':[-1,-1], 'b':[-1,-1]};
15 const position
= fen
.split(" ")[0].split("/");
16 for (let i
=0; i
<position
.length
; i
++)
19 for (let j
=0; j
<position
[i
].length
; j
++)
21 switch (position
[i
].charAt(j
))
24 this.antikingPos
['b'] = [i
,k
];
27 this.antikingPos
['w'] = [i
,k
];
30 let num
= parseInt(position
[i
].charAt(j
));
39 canTake([x1
,y1
], [x2
,y2
])
41 const piece1
= this.getPiece(x1
,y1
);
42 const piece2
= this.getPiece(x2
,y2
);
43 const color1
= this.getColor(x1
,y1
);
44 const color2
= this.getColor(x2
,y2
);
45 return !["a","A"].includes(piece2
) &&
46 ((piece1
!= "a" && color1
!= color2
) || (piece1
== "a" && color1
== color2
));
49 getPotentialMovesFrom([x
,y
])
51 switch (this.getPiece(x
,y
))
53 case VariantRules
.ANTIKING:
54 return this.getPotentialAntikingMoves([x
,y
]);
56 return super.getPotentialMovesFrom([x
,y
]);
60 getPotentialAntikingMoves(sq
)
62 return this.getSlideNJumpMoves(sq
, VariantRules
.steps
[VariantRules
.QUEEN
], "oneStep");
65 isAttacked(sq
, colors
)
67 return (super.isAttacked(sq
, colors
) || this.isAttackedByAntiking(sq
, colors
));
70 isAttackedByKing([x
,y
], colors
)
72 if (this.getPiece(x
,y
) == VariantRules
.ANTIKING
)
73 return false; //antiking is not attacked by king
74 return this.isAttackedBySlideNJump([x
,y
], colors
,
75 VariantRules
.KING
, VariantRules
.steps
[VariantRules
.QUEEN
], "oneStep");
78 isAttackedByAntiking([x
,y
], colors
)
80 if (this.getPiece(x
,y
) == VariantRules
.KING
)
81 return false; //king is not attacked by antiking
82 return this.isAttackedBySlideNJump([x
,y
], colors
,
83 VariantRules
.ANTIKING
, VariantRules
.steps
[VariantRules
.QUEEN
], "oneStep");
89 const oppCol
= this.getOppCol(c
);
91 let res
= this.isAttacked(this.kingPos
[c
], oppCol
)
92 || !this.isAttacked(this.antikingPos
[c
], oppCol
);
99 let res
= super.getCheckSquares(move);
102 if (!this.isAttacked(this.antikingPos
[c
], this.getOppCol(c
)))
103 res
.push(JSON
.parse(JSON
.stringify(this.antikingPos
[c
])));
108 updateVariables(move)
110 super.updateVariables(move);
111 const piece
= this.getPiece(move.start
.x
,move.start
.y
);
112 const c
= this.getColor(move.start
.x
,move.start
.y
);
113 // Update antiking position
114 if (piece
== VariantRules
.ANTIKING
)
116 this.antikingPos
[c
][0] = move.appear
[0].x
;
117 this.antikingPos
[c
][1] = move.appear
[0].y
;
121 unupdateVariables(move)
123 super.unupdateVariables(move);
124 const c
= this.getColor(move.start
.x
,move.start
.y
);
125 if (this.getPiece(move.start
.x
,move.start
.y
) == VariantRules
.ANTIKING
)
126 this.antikingPos
[c
] = [move.start
.x
, move.start
.y
];
131 const color
= this.turn
;
132 const oppCol
= this.getOppCol(color
);
133 if (!this.isAttacked(this.kingPos
[color
], oppCol
)
134 && this.isAttacked(this.antikingPos
[color
], oppCol
))
138 return color
== "w" ? "0-1" : "1-0";
141 // Pieces values (TODO: use Object.assign() + ChessRules.VALUES ?)
142 static get VALUES() {
154 static GenRandInitFen()
156 let randFen
= ChessRules
.GenRandInitFen();
158 let antikingPos
= _
.random(7);
159 let ranks23
= "pppppppp/" + (antikingPos
>0?antikingPos:"") + "A" + (antikingPos
<7?7-antikingPos:"");
160 randFen
= randFen
.replace("pppppppp/8", ranks23
);
162 antikingPos
= _
.random(7);
163 ranks23
= (antikingPos
>0?antikingPos:"") + "a" + (antikingPos
<7?7-antikingPos:"") + "/PPPPPPPP";
164 randFen
= randFen
.replace("8/PPPPPPPP", ranks23
);