Add Giveaway. Preparing for Chakart a little more
[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 genRandInitFen(seed) {
40 if (this.options["randomness"] == 0) {
41 return (
42 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 {"enpassant":"-"}'
43 );
44 }
45
46 Random.setSeed(seed);
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
54 // Get random squares for every piece, totally freely
55 let positions = Random.shuffle(ArrayFun.range(8));
56 const composition = ['b', 'b', 'r', 'r', 'n', 'n', 'k', 'q'];
57 const rem2 = positions[0] % 2;
58 if (rem2 == positions[1] % 2) {
59 // Fix bishops (on different colors)
60 for (let i=2; i<8; i++) {
61 if (positions[i] % 2 != rem2) {
62 [positions[1], positions[i]] = [positions[i], positions[1]];
63 break;
64 }
65 }
66 }
67 for (let i = 0; i < 8; i++)
68 pieces[c][positions[i]] = composition[i];
69 }
70 return (
71 pieces["b"].join("") +
72 "/pppppppp/8/8/8/8/PPPPPPPP/" +
73 pieces["w"].join("").toUpperCase() +
74 // En-passant allowed, but no flags
75 ' w 0 {"enpassant":"-"}'
76 );
77 }
78
79 constructor(o) {
80 o.options["capture"] = true;
81 super(o);
82 }
83
84 underCheck([x, y], oppCol) {
85 if (this.options["mode"] == "suicide")
86 return false;
87 return super.underCheck([x, y], oppCol);
88 }
89
90 getCurrentScore() {
91 if (this.atLeastOneMove()) return "*";
92 // No valid move: the side who cannot move wins
93 return (this.turn == "w" ? "1-0" : "0-1");
94 }
95
96 };