Cleaner fen generation + first draft of Apocalypse + a few fixes
[xogo.git] / variants / Giveaway / class.js
1 import ChessRules from "/base_rules.js";
2 import {ArrayFun} from "/utils/array.js";
3 import {Random} from "/utils/alea.js";
4
5 export default class GiveawayRules extends ChessRules {
6
7 static get Options() {
8 return {
9 select: [
10 {
11 label: "Mode",
12 variable: "mode",
13 defaut: "suicide",
14 options: [
15 {label: "Suicide", value: "suicide"},
16 {label: "Losers", value: "losers"}
17 ]
18 }
19 ].concat(C.Options.select),
20 input: C.Options.input.filter(i => i.variable == "pawnfall"),
21 styles: [
22 "atomic", "cannibal", "cylinder", "dark",
23 "madrasi", "rifle", "teleport", "zen"
24 ]
25 };
26 }
27
28 get hasFlags() {
29 return this.options["mode"] == "losers";
30 }
31
32 get pawnPromotions() {
33 let res = ['q', 'r', 'n', 'b'];
34 if (this.options["mode"] == "suicide")
35 res.push('k');
36 return res;
37 }
38
39 genRandInitBaseFen() {
40 if (this.options["mode"] == "losers")
41 return super.genRandInitBaseFen();
42
43 let fen = "";
44 if (this.options["randomness"] == 0)
45 fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0";
46 else {
47 let pieces = { w: new Array(8), b: new Array(8) };
48 for (let c of ["w", "b"]) {
49 if (c == 'b' && this.options["randomness"] == 1) {
50 pieces['b'] = pieces['w'];
51 break;
52 }
53 // Get random squares for every piece, totally freely
54 let positions = Random.shuffle(ArrayFun.range(8));
55 const composition = ['b', 'b', 'r', 'r', 'n', 'n', 'k', 'q'];
56 const rem2 = positions[0] % 2;
57 if (rem2 == positions[1] % 2) {
58 // Fix bishops (on different colors)
59 for (let i=2; i<8; i++) {
60 if (positions[i] % 2 != rem2) {
61 [positions[1], positions[i]] = [positions[i], positions[1]];
62 break;
63 }
64 }
65 }
66 for (let i = 0; i < 8; i++)
67 pieces[c][positions[i]] = composition[i];
68 }
69 fen = (
70 pieces["b"].join("") +
71 "/pppppppp/8/8/8/8/PPPPPPPP/" +
72 pieces["w"].join("").toUpperCase() +
73 " w 0"
74 );
75 }
76 return { fen: fen, o: {} };
77 }
78
79 constructor(o) {
80 o.options["capture"] = true;
81 super(o);
82 }
83
84 underCheck(square, oppCol) {
85 if (this.options["mode"] == "suicide")
86 return false;
87 return super.underCheck(square, oppCol);
88 }
89
90 getCurrentScore() {
91 if (this.atLeastOneMove(this.turn))
92 return "*";
93 // No valid move: the side who cannot move wins
94 return (this.turn == "w" ? "1-0" : "0-1");
95 }
96
97 };