IPVGO: Support scripts playing against each other as each color on "No AI" boards (#1917)

This is a big change with a *lot* of moving parts.

The largest part of it is enabling scripts to `playAsWhite` as a parameter to many Go functions. In the implementation, this involved a significant rewrite of `opponentNextTurn` promise handling.

A number of other changes and bugfixes are included:
* Fixes the issue where handicap stones are added on game load.
* Better typing for error callbacks.
* Throw errors instead of deadlocking on bad cheat usage.
* Return always-resolved gameOver promise after game end
* Added a new `resetStats` api function.

---------

Co-authored-by: David Walker <d0sboots@gmail.com>
This commit is contained in:
Michael Ficocelli
2025-02-02 23:47:16 -05:00
committed by GitHub
parent de6b202341
commit c8d2c9f769
30 changed files with 502 additions and 263 deletions
+7 -3
View File
@@ -63,18 +63,22 @@ export const GoHistoryPage = (): React.ReactElement => {
<Table sx={{ display: "table", mb: 1, width: "100%" }}>
<TableBody>
<TableRow>
<TableCell className={classes.cellNone}>Wins:</TableCell>
<TableCell className={classes.cellNone}>
Wins:{faction === GoOpponent.none ? " (Black / White)" : ""}
</TableCell>
<TableCell className={classes.cellNone}>
{data.wins} / {data.losses + data.wins}
</TableCell>
</TableRow>
<TableRow>
<TableCell className={classes.cellNone}>Current winstreak:</TableCell>
<TableCell className={classes.cellNone}>
Current winstreak{faction === GoOpponent.none ? " for black" : ""}:
</TableCell>
<TableCell className={classes.cellNone}>{data.winStreak}</TableCell>
</TableRow>
<TableRow>
<TableCell className={`${classes.cellNone} ${classes.cellBottomPadding}`}>
Highest winstreak:
Highest winstreak{faction === GoOpponent.none ? " for black" : ""}:
</TableCell>
<TableCell className={`${classes.cellNone} ${classes.cellBottomPadding}`}>
{data.highestWinStreak}