1 import { ChessRules
} from "@/base_rules";
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}$/);
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));
19 return [this.castleFlags
, this.checkFlags
];
22 disaggregateFlags(flags
) {
23 this.castleFlags
= flags
[0];
24 this.checkFlags
= flags
[1];
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]];
37 // Does this move give check?
38 const oppCol
= this.turn
;
39 if (this.underCheck(oppCol
))
40 this.checkFlags
[oppCol
]++;
44 const color
= this.turn
;
45 if (this.checkFlags
[color
] >= 3)
46 return color
== "w" ? "0-1" : "1-0";
47 return super.getCurrentScore();
50 static GenRandInitFen(randomness
) {
51 // Add check flags (at 0)
52 return ChessRules
.GenRandInitFen(randomness
).slice(0, -2) + "00";
56 let fen
= super.getFlagsFen();
58 for (let c
of ["w", "b"]) fen
+= this.checkFlags
[c
];
63 const baseEval
= super.evalPosition();
64 // Take number of checks into account
65 return baseEval
/5 - this.checkFlags
["w"] + this.checkFlags
["b"];