-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgauntlet.ts
98 lines (81 loc) · 2.6 KB
/
gauntlet.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import { PlayerId, Winner } from "./common/gameSlice.js";
import { MissionName, missions } from "./server/Mission.js";
import Player from "./server/Player.js";
import { createGame } from "./server/game.js";
import { Worker, isMainThread, parentPort } from "worker_threads";
function createPlayer(name: MissionName, player: PlayerId) {
const result = missions[name as MissionName](player, name == "Random Citizens" ? 2 : 1);
result.timeout = false;
return result;
}
function runGame(names: [MissionName, MissionName]): Promise<Winner> {
return new Promise((resolve) => {
const worker = new Worker("./gauntlet.js");
worker.postMessage(names);
worker.on("message", (winner: Winner) => {
resolve(winner);
worker.terminate();
});
});
}
if (!isMainThread) {
parentPort?.on("message", (names: [MissionName, MissionName]) => {
const players: [Player, Player] = [createPlayer(names[0], 0), createPlayer(names[1], 1)];
createGame(players, (winner) => parentPort?.postMessage(winner));
});
}
if (isMainThread) {
const names = Object.keys(missions).filter((name) => name != "Random") as MissionName[];
async function results() {
const records: {
[name: string]: {
wins: number;
losses: number;
draws: number;
};
} = {};
const promises: Promise<any>[] = [];
for (const name1 of names) {
for (const name2 of names) {
for (let i = 0; i < 1; i++) {
if (name1 == name2) {
continue;
}
promises.push(
runGame([name1, name2]).then((winner) => {
const verbs: { [key in Winner]: string } = {
[0]: "wins",
[1]: "loses",
draw: "draws",
};
console.log(`${name1} ${verbs[winner]} against ${name2}`);
for (const name of [name1, name2]) {
if (!(name in records)) {
records[name] = { wins: 0, losses: 0, draws: 0 };
}
}
if (winner == 0) {
records[name1].wins++;
records[name2].losses++;
}
if (winner == 1) {
records[name1].losses++;
records[name2].wins++;
}
if (winner == "draw") {
records[name1].draws++;
records[name2].draws++;
}
})
);
}
}
}
await Promise.all(promises);
console.log();
for (const [name, record] of Object.entries(records)) {
console.log(name, record);
}
}
results();
}