update
[xogo.git] / variants / Coregal / class.js
CommitLineData
061c078d 1import ChessRules from "/base_rules.js";
3ca47832 2import {FenUtil} from "/utils/setupPieces.js"
5c1c7bce 3
061c078d 4export default class CoregalRules extends ChessRules {
5c1c7bce 5
5c1c7bce
BA
6 genRandInitBaseFen() {
7 const s = FenUtil.setupPieces(
8 ['r', 'n', 'b', 'l', 'k', 'b', 'n', 'r'],
9 {
10 randomness: this.options["randomness"],
11 between: [{p1: 'k', p2: 'r'}, {p1: 'l', p2: 'r'}],
12 diffCol: ['b'],
dcfaab5d
BA
13 // 'k' and 'l' useful only to get relative position
14 flags: ['r', 'k', 'l']
5c1c7bce
BA
15 }
16 );
3ca47832
BA
17 // Re-arrange flags: king + royal queen positions are only
18 // useful to know ordering, and thus allowed castles.
19 let flags = "";
20 let relPos = { 'w': {}, 'b': {} };
21 for (let c of [0, 1]) {
22 const col = (c == 0 ? 'w' : 'b');
23 let first = "";
24 for (let i=4*c; i<4*(c+1); i++) {
25 const pos = parseInt(flags.charAt(i), 10);
26 const symb = s[col][pos];
27 if (['k', 'l'].includes(symb)) {
28 if (!first) {
29 relPos[col][symb] = '0'; //left
30 first = symb;
31 }
32 else
33 relPos[col][symb] = '1'; //right
34 }
35 else
36 flags += flags.charAt(i);
37 }
38 }
5c1c7bce
BA
39 return {
40 fen: s.b.join("") + "/pppppppp/8/8/8/8/PPPPPPPP/" +
41 s.w.join("").toUpperCase(),
3ca47832
BA
42 o: {
43 flags: flags + flags, //duplicate: one for each royal piece
44 relPos: (
45 relPos['w']['k'] + relPos['w']['l'] +
46 relPos['b']['k'] + relPos['b']['l']
47 )
48 }
49 };
50 }
51
52 getPartFen(o) {
53 return (Object.assign(
54 {"relpos": o.relPos},
55 super.getPartFen(o)
56 ));
57 }
58
59 setOtherVariables(fenParsed, pieceArray) {
60
61//TODO: issue, relPos is set at init but doesn't persist --> see base_rules.js line 263
62console.log(fenParsed);
63 super.setOtherVariables(fenParsed, pieceArray);
64 this.relPos = {
65 'w': {
66 'k': fenParsed.relpos[0],
67 'l': fenParsed.relpos[1]
68 },
69 'b': {
70 'k': fenParsed.relpos[2],
71 'l': fenParsed.relpos[3]
72 }
5c1c7bce
BA
73 };
74 }
75
76 pieces() {
77 let res = super.pieces();
78 res['l'] = JSON.parse(JSON.stringify(res['q']));
dcfaab5d 79 // TODO: CSS royal queen symbol (with cross?)
5c1c7bce
BA
80 res['l']["class"] = "royal_queen";
81 return res;
82 }
83
84 setFlags(fenflags) {
dcfaab5d 85 this.castleFlags = {
3ca47832
BA
86 k: {
87 w: [0, 1].map(i => parseInt(fenflags.charAt(i), 10)),
88 b: [2, 3].map(i => parseInt(fenflags.charAt(i), 10))
89 },
90 l: {
91 w: [4, 5].map(i => parseInt(fenflags.charAt(i), 10)),
92 b: [6, 7].map(i => parseInt(fenflags.charAt(i), 10))
93 }
dcfaab5d 94 };
3ca47832
BA
95 }
96
97 getFlagsFen() {
98 return ['k', 'l'].map(p => {
99 return ['w', 'b'].map(c => {
100 return this.castleFlags[p][c].map(x => x.toString(10)).join("");
101 }).join("")
102 }).join("");
5c1c7bce
BA
103 }
104
105 isKing(x, y, p) {
106 if (!p)
107 p = this.getPiece(x, y);
3ca47832 108 return ['k', 'l'].includes(p); //no cannibal mode
5c1c7bce
BA
109 }
110
111 getCastleMoves([x, y]) {
dcfaab5d
BA
112 const c = this.getColor(x, y),
113 p = this.getPiece(x, y);
5c1c7bce
BA
114 // Relative position of the selected piece: left or right ?
115 // If left: small castle left, large castle right.
116 // If right: usual situation.
5c1c7bce 117 const finalSquares = [
3ca47832
BA
118 this.relPos[c][p] == '0' ? [1, 2] : [2, 3], //0 == left
119 this.relPos[c][p] == '1' ? [6, 5] : [5, 4] //1 == right
5c1c7bce 120 ];
dcfaab5d 121 const moves =
3ca47832 122 super.getCastleMoves([x, y], finalSquares, null, this.castleFlags[p][c]);
5c1c7bce
BA
123 return moves;
124 }
125
3ca47832
BA
126 updateCastleFlags(move) {
127 super.updateCastleFlags(move, this.castleFlags['k'], 'k');
128 super.updateCastleFlags(move, this.castleFlags['l'], 'l');
129 }
dcfaab5d 130
5c1c7bce 131};