1 import ChessRules
from "/base_rules.js";
2 import {FenUtil
} from "/utils/setupPieces.js"
4 export default class CoregalRules
extends ChessRules
{
7 const s
= FenUtil
.setupPieces(
8 ['r', 'n', 'b', 'l', 'k', 'b', 'n', 'r'],
10 randomness: this.options
["randomness"],
11 between: [{p1: 'k', p2: 'r'}, {p1: 'l', p2: 'r'}],
13 // 'k' and 'l' useful only to get relative position
14 flags: ['r', 'k', 'l']
17 // Re-arrange flags: king + royal queen positions are only
18 // useful to know ordering, and thus allowed castles.
20 let relPos
= { 'w': {}, 'b': {} };
21 for (let c
of [0, 1]) {
22 const col
= (c
== 0 ? 'w' : 'b');
24 for (let i
=4*c
; i
<4*(c
+1); i
++) {
25 const pos
= parseInt(s
.flags
.charAt(i
), 10);
26 const symb
= s
[col
][pos
];
27 if (['k', 'l'].includes(symb
)) {
29 relPos
[col
][symb
] = '0'; //left
33 relPos
[col
][symb
] = '1'; //right
36 flags
+= s
.flags
.charAt(i
);
40 fen: s
.b
.join("") + "/pppppppp/8/8/8/8/PPPPPPPP/" +
41 s
.w
.join("").toUpperCase(),
43 flags: flags
+ flags
, //duplicate: one for each royal piece
44 relPos: this.getRelposFen(relPos
)
50 return (Object
.assign(
51 {"relpos": o
.init
? o
.relPos : this.getRelposFen()},
56 getRelposFen(relPos
) {
57 relPos
= relPos
|| this.relPos
;
59 relPos
['w']['k'] + relPos
['w']['l'] +
60 relPos
['b']['k'] + relPos
['b']['l']
64 setOtherVariables(fenParsed
, pieceArray
) {
65 super.setOtherVariables(fenParsed
, pieceArray
);
68 'k': fenParsed
.relpos
[0],
69 'l': fenParsed
.relpos
[1]
72 'k': fenParsed
.relpos
[2],
73 'l': fenParsed
.relpos
[3]
79 let res
= super.pieces();
80 res
['l'] = JSON
.parse(JSON
.stringify(res
['q']));
81 // TODO: CSS royal queen symbol (with cross?)
82 res
['l']["class"] = "royal_queen";
89 w: [0, 1].map(i
=> parseInt(fenflags
.charAt(i
), 10)),
90 b: [2, 3].map(i
=> parseInt(fenflags
.charAt(i
), 10))
93 w: [4, 5].map(i
=> parseInt(fenflags
.charAt(i
), 10)),
94 b: [6, 7].map(i
=> parseInt(fenflags
.charAt(i
), 10))
100 return ['k', 'l'].map(p
=> {
101 return ['w', 'b'].map(c
=> {
102 return this.castleFlags
[p
][c
].map(x
=> x
.toString(10)).join("");
109 p
= this.getPiece(x
, y
);
110 return ['k', 'l'].includes(p
); //no cannibal mode
113 getCastleMoves([x
, y
]) {
114 const c
= this.getColor(x
, y
),
115 p
= this.getPiece(x
, y
);
116 // Relative position of the selected piece: left or right ?
117 // If left: small castle left, large castle right.
118 // If right: usual situation.
119 const finalSquares
= [
120 this.relPos
[c
][p
] == '0' ? [1, 2] : [2, 3], //0 == left
121 this.relPos
[c
][p
] == '1' ? [6, 5] : [5, 4] //1 == right
124 super.getCastleMoves([x
, y
], finalSquares
, null, this.castleFlags
[p
][c
]);
128 updateCastleFlags(move) {
129 super.updateCastleFlags(move, this.castleFlags
['k'], 'k');
130 super.updateCastleFlags(move, this.castleFlags
['l'], 'l');