1 import {Random
} from "/utils/alea.js";
3 export const FenUtil
= {
5 // arg o (constraints): "between" with p1 and p2.
6 // "flags", "diffCol": array of pieceType
7 setupRow: function(arr
, o
) {
8 let res
= JSON
.parse(JSON
.stringify(arr
));
10 res
= Random
.shuffle(arr
);
13 res
.forEach((p
, i
) => {
14 if (o
.flags
.includes(p
))
18 if (o
.randomness
>= 1) {
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
;
28 choice2
= Random
.randInt(arr
.length
);
32 o
.diffCol
.includes(choice2
) ||
33 (choice2
- choice1
) % 2 != 0
35 res
[choice1
] = res
[choice2
];
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"];
49 res
[firstP2
] = o
.between
["p1"];
51 res
[lastP2
] = o
.between
["p1"];
55 return {fen: res
, flags: flags
};
58 setupPieces: function(arr
, o
) {
59 const row1
= FenUtil
.setupRow(arr
, o
);
60 const row2
= o
.randomness
== 2 ? FenUtil
.setupRow(arr
, o
) : row1
;
64 flags: row1
.flags
+ row2
.flags