Fix parseInt() usage, rename Doubleorda --> Ordamirror, implement Clorange variant
[vchess.git] / client / src / variants / Threechecks.js
1 import { ChessRules } from "@/base_rules";
2
3 export class ThreechecksRules extends ChessRules {
4 static IsGoodFlags(flags) {
5 // 4 for castle + 2 for checks (0,1 or 2)
6 return !!flags.match(/^[01]{4,4}[012]{2,2}$/);
7 }
8
9 setFlags(fenflags) {
10 super.setFlags(fenflags); //castleFlags
11 this.checkFlags = { w: 0, b: 0 };
12 const flags = fenflags.substr(4); //skip first 4 digits, for castle
13 for (let c of ["w", "b"]) {
14 this.checkFlags[c] = parseInt(flags.charAt(c == "w" ? 0 : 1), 10);
15 }
16 }
17
18 aggregateFlags() {
19 return [this.castleFlags, this.checkFlags];
20 }
21
22 disaggregateFlags(flags) {
23 this.castleFlags = flags[0];
24 this.checkFlags = flags[1];
25 }
26
27 getPpath(b) {
28 // TODO: !!this.checkFlags condition for printDiagram, but it's not good.
29 // This is just a temporary fix.
30 if (b[1] == 'k' && !!this.checkFlags && this.checkFlags[b[0]] > 0)
31 return "Threechecks/" + b[0] + 'k_' + this.checkFlags[b[0]];
32 return b;
33 }
34
35 postPlay(move) {
36 super.postPlay(move);
37 // Does this move give check?
38 const oppCol = this.turn;
39 if (this.underCheck(oppCol))
40 this.checkFlags[oppCol]++;
41 }
42
43 getCurrentScore() {
44 const color = this.turn;
45 if (this.checkFlags[color] >= 3)
46 return color == "w" ? "0-1" : "1-0";
47 return super.getCurrentScore();
48 }
49
50 static GenRandInitFen(randomness) {
51 // Add check flags (at 0)
52 return ChessRules.GenRandInitFen(randomness).slice(0, -2) + "00";
53 }
54
55 getFlagsFen() {
56 let fen = super.getFlagsFen();
57 // Add check flags
58 for (let c of ["w", "b"]) fen += this.checkFlags[c];
59 return fen;
60 }
61
62 evalPosition() {
63 const baseEval = super.evalPosition();
64 // Take number of checks into account
65 return baseEval/5 - this.checkFlags["w"] + this.checkFlags["b"];
66 }
67 };