Fix FenUtil.setupPieces and Antiking variants
[xogo.git] / utils / setupPieces.js
CommitLineData
f3824309
BA
1import {Random} from "/utils/alea.js";
2
0cef7bb4 3export const FenUtil = {
f3824309
BA
4
5 // arg o (constraints): "between" with p1 and p2.
6 // "flags", "diffCol": array of pieceType
0cef7bb4 7 setupRow: function(arr, o) {
7c038235 8 let res = JSON.parse(JSON.stringify(arr));
f3824309
BA
9 if (o.randomness >= 1)
10 res = Random.shuffle(arr);
11 let flags = "";
12 if (o.flags) {
13 res.forEach((p, i) => {
14 if (o.flags.includes(p))
15 flags += i;
16 });
17 }
10c9010b
BA
18 if (o.randomness >= 1) {
19 if (o.diffCol) {
20 o.diffCol.forEach(p => {
21 // Pieces of type p on different colors:
22 const firstP = res.indexOf(p),
23 lastP = res.lastIndexOf(p);
24 if ((firstP - lastP) % 2 != 0) {
25 const choice1 = Random.randBool() ? firstP : lastP;
26 let choice2;
27 do {
28 choice2 = Random.randInt(arr.length);
29 }
30 while (
31 choice2 == choice1 ||
32 o.diffCol.includes(choice2) ||
33 (choice2 - choice1) % 2 != 0
34 );
35 res[choice1] = res[choice2];
36 res[choice2] = p;
0adfbdb5 37 }
10c9010b
BA
38 });
39 }
40 if (o.between) {
41 // Locate p1. If appearing first, exchange with first p2.
42 // If appearing last, exchange with last p2.
43 const p1 = res.indexOf(o.between["p1"]);
44 const firstP2 = res.indexOf(o.between["p2"]),
45 lastP2 = res.lastIndexOf(o.between["p2"]);
46 if (p1 < firstP2 || p1 > lastP2) {
47 res[p1] = o.between["p2"];
48 if (p1 < firstP2)
49 res[firstP2] = o.between["p1"];
50 else //p1 > lastP2
51 res[lastP2] = o.between["p1"];
0adfbdb5 52 }
0adfbdb5 53 }
f3824309 54 }
f3824309 55 return {fen: res, flags: flags};
0cef7bb4 56 },
f3824309 57
0cef7bb4 58 setupPieces: function(arr, o) {
0adfbdb5
BA
59 const row1 = FenUtil.setupRow(arr, o);
60 const row2 = o.randomness == 2 ? FenUtil.setupRow(arr, o) : row1;
f3824309 61 return {
7c038235 62 w: row1.fen,
0adfbdb5
BA
63 b: row2.fen,
64 flags: row1.flags + row2.flags
65 };
f3824309 66 }
7c038235 67
f3824309 68};