bbc35a467d42588869fc2c849e856a408234fc28
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
) {
65 super.setOtherVariables(fenParsed
);
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(color
, x
, y
);
80 res
['l'] = JSON
.parse(JSON
.stringify(res
['q']));
81 // TODO: CSS royal queen symbol (with cross?)
82 res
['l']["class"] = "royal_queen";
83 res
['='] = {"class": "castle"}; //for castle display
90 w: [0, 1].map(i
=> parseInt(fenflags
.charAt(i
), 10)),
91 b: [2, 3].map(i
=> parseInt(fenflags
.charAt(i
), 10))
94 w: [4, 5].map(i
=> parseInt(fenflags
.charAt(i
), 10)),
95 b: [6, 7].map(i
=> parseInt(fenflags
.charAt(i
), 10))
101 return ['k', 'l'].map(p
=> {
102 return ['w', 'b'].map(c
=> {
103 return this.castleFlags
[p
][c
].map(x
=> x
.toString(10)).join("");
110 p
= this.getPiece(x
, y
);
111 return ['k', 'l'].includes(p
); //no cannibal mode
114 getCastleMoves([x
, y
]) {
115 const c
= this.getColor(x
, y
),
116 p
= this.getPiece(x
, y
);
117 // Relative position of the selected piece: left or right ?
118 // If left: small castle left, large castle right.
119 // If right: usual situation.
120 const finalSquares
= [
121 this.relPos
[c
][p
] == '0' ? [1, 2] : [2, 3], //0 == left
122 this.relPos
[c
][p
] == '1' ? [6, 5] : [5, 4] //1 == right
125 super.getCastleMoves([x
, y
], finalSquares
, null, this.castleFlags
[p
][c
]);
127 moves
.forEach(m
=> m
.choice
= '='); //required (for display)
131 updateCastleFlags(move) {
132 super.updateCastleFlags(move, this.castleFlags
['k'], 'k');
133 super.updateCastleFlags(move, this.castleFlags
['l'], 'l');