Commit | Line | Data |
---|---|---|
c322a844 BA |
1 | import { ChessRules } from "@/base_rules"; |
2 | ||
92240cf0 | 3 | export const VariantRules = class ThreechecksRules extends ChessRules { |
e71161fb BA |
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)); | |
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) { | |
b627d118 BA |
28 | // TODO: !!this.checkFlags condition for printDiagram, but clearly not good. |
29 | // This is just a temporary fix. | |
30 | if (b[1] == 'k' && this.checkFlags && this.checkFlags[b[0]] > 0) | |
92240cf0 | 31 | return "Threechecks/" + b[0] + 'k_' + this.checkFlags[b[0]]; |
e71161fb BA |
32 | return b; |
33 | } | |
34 | ||
35 | updateVariables(move) { | |
36 | super.updateVariables(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() { | |
51 | const randFen = ChessRules.GenRandInitFen(); | |
52 | // Add check flags (at 0) | |
53 | return randFen.replace(" w 0 1111", " w 0 111100"); | |
54 | } | |
55 | ||
56 | getFlagsFen() { | |
57 | let fen = super.getFlagsFen(); | |
58 | // Add check flags | |
59 | for (let c of ["w", "b"]) | |
60 | fen += this.checkFlags[c]; | |
61 | return fen; | |
62 | } | |
63 | ||
64 | evalPosition() { | |
65 | const baseEval = super.evalPosition(); | |
66 | // Take number of checks into account | |
67 | return baseEval/5 - this.checkFlags["w"] + this.checkFlags["b"]; | |
c322a844 BA |
68 | } |
69 | }; |