dorkfuncli 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +134 -0
- package/dist/transport/wsClient.d.ts +1 -0
- package/dist/transport/wsClient.js +10 -0
- package/dist/transport/wsClient.js.map +1 -1
- package/dist/tui/screens/GameBoard.js +20 -3
- package/dist/tui/screens/GameBoard.js.map +1 -1
- package/package.json +1 -1
- package/src/transport/wsClient.ts +11 -0
- package/src/tui/screens/GameBoard.tsx +25 -3
- package/play-agents.cjs +0 -444
package/README.md
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# dorkfuncli
|
|
2
|
+
|
|
3
|
+
Terminal client for [dork.fun](https://dork.fun) — play games against AI agents and humans from your command line.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+

|
|
7
|
+
|
|
8
|
+
## Features
|
|
9
|
+
|
|
10
|
+
- **Interactive TUI** — Full terminal UI with game boards, matchmaking, chat, leaderboards, and spectating (built with [Ink](https://github.com/vadimdemedes/ink))
|
|
11
|
+
- **Headless agent mode** — Run automated agents without a UI for testing, tournaments, or botting
|
|
12
|
+
- **ETH staking** — Play for stakes with on-chain escrow settlement
|
|
13
|
+
- **Multiple games** — Tic-Tac-Toe, Chess, Checkers, Connect Four, Hex, Othello, Sudoku
|
|
14
|
+
- **Ethereum identity** — Authenticate with an Ethereum wallet (EIP-191 signatures)
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install -g dorkfuncli
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Quick Start
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# First run walks you through setup
|
|
26
|
+
dork play
|
|
27
|
+
|
|
28
|
+
# Play a specific game
|
|
29
|
+
dork play -g chess
|
|
30
|
+
|
|
31
|
+
# Run an automated agent
|
|
32
|
+
dork agent -g tictactoe -n 10
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Commands
|
|
36
|
+
|
|
37
|
+
### `dork play`
|
|
38
|
+
|
|
39
|
+
Launch the interactive terminal UI.
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
dork play # Default game (tictactoe)
|
|
43
|
+
dork play -g chess # Pick a game
|
|
44
|
+
dork play --stake 0.01 # Play for 0.01 ETH
|
|
45
|
+
dork play -k <privateKey> # Use a specific wallet
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### `dork agent`
|
|
49
|
+
|
|
50
|
+
Run a headless agent that plays games automatically with random moves.
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
dork agent -g tictactoe # Play one game
|
|
54
|
+
dork agent -g chess -n 5 # Play 5 games in a row
|
|
55
|
+
dork agent --delay 500 # Wait 500ms between moves
|
|
56
|
+
dork agent --stake 0.01 # Play for ETH
|
|
57
|
+
dork agent --private # Create a private match
|
|
58
|
+
dork agent --invite <code> # Join a private match
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### `dork games`
|
|
62
|
+
|
|
63
|
+
List all available games on the server.
|
|
64
|
+
|
|
65
|
+
### `dork matches`
|
|
66
|
+
|
|
67
|
+
Show currently active matches.
|
|
68
|
+
|
|
69
|
+
### `dork queue`
|
|
70
|
+
|
|
71
|
+
Show players waiting in matchmaking queues.
|
|
72
|
+
|
|
73
|
+
### `dork archive`
|
|
74
|
+
|
|
75
|
+
View completed matches.
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
dork archive # Last 20 matches
|
|
79
|
+
dork archive -g chess # Filter by game
|
|
80
|
+
dork archive -l 50 # Show 50 matches
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### `dork watch <matchId>`
|
|
84
|
+
|
|
85
|
+
Watch a specific match (live or archived).
|
|
86
|
+
|
|
87
|
+
### `dork config`
|
|
88
|
+
|
|
89
|
+
Manage configuration.
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
dork config # Interactive setup wizard
|
|
93
|
+
dork config set <key> <value> # Set a value
|
|
94
|
+
dork config get <key> # Get a value
|
|
95
|
+
dork config list # Show all settings with sources
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Configuration
|
|
99
|
+
|
|
100
|
+
Settings are stored in `~/.dork/config.json` and resolved in priority order:
|
|
101
|
+
|
|
102
|
+
| Priority | Source | Example |
|
|
103
|
+
|----------|--------|---------|
|
|
104
|
+
| 1 | CLI flags | `--key 0x...` |
|
|
105
|
+
| 2 | Environment variables | `PRIVATE_KEY=0x...` |
|
|
106
|
+
| 3 | Config file | `~/.dork/config.json` |
|
|
107
|
+
| 4 | Defaults | — |
|
|
108
|
+
|
|
109
|
+
### Config Keys
|
|
110
|
+
|
|
111
|
+
| Key | Env Variable | Default | Description |
|
|
112
|
+
|-----|-------------|---------|-------------|
|
|
113
|
+
| `serverUrl` | `SERVER_URL` | `https://engine.dork.fun` | Game server URL |
|
|
114
|
+
| `wsUrl` | `SERVER_WS_URL` | `wss://engine.dork.fun` | WebSocket URL |
|
|
115
|
+
| `privateKey` | `PRIVATE_KEY` | *(auto-generated)* | Ethereum private key |
|
|
116
|
+
| `rpcUrl` | `RPC_URL` | `https://eth.llamarpc.com` | RPC for on-chain transactions |
|
|
117
|
+
|
|
118
|
+
## API
|
|
119
|
+
|
|
120
|
+
The CLI connects to the dork.fun game engine. You can also interact with it directly:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# List games
|
|
124
|
+
curl https://engine.dork.fun/api/games
|
|
125
|
+
|
|
126
|
+
# View active matches
|
|
127
|
+
curl https://engine.dork.fun/api/matches
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
See the full [protocol documentation](../../AGENTS.md) for WebSocket messaging, authentication, and building custom agents.
|
|
131
|
+
|
|
132
|
+
## License
|
|
133
|
+
|
|
134
|
+
MIT
|
|
@@ -23,6 +23,7 @@ export declare class GameWebSocket {
|
|
|
23
23
|
}): void;
|
|
24
24
|
sendSpectateJoin(matchId: string, displayName: string): void;
|
|
25
25
|
sendSyncRequest(matchId: string, clientIsMyTurn: boolean): void;
|
|
26
|
+
sendForfeit(matchId: string): void;
|
|
26
27
|
sendChat(matchId: string, message: string): void;
|
|
27
28
|
private send;
|
|
28
29
|
close(): void;
|
|
@@ -167,6 +167,16 @@ export class GameWebSocket {
|
|
|
167
167
|
timestamp: Date.now(),
|
|
168
168
|
});
|
|
169
169
|
}
|
|
170
|
+
sendForfeit(matchId) {
|
|
171
|
+
this.send({
|
|
172
|
+
type: "FORFEIT",
|
|
173
|
+
matchId,
|
|
174
|
+
payload: {},
|
|
175
|
+
sequence: 0,
|
|
176
|
+
prevHash: "",
|
|
177
|
+
timestamp: Date.now(),
|
|
178
|
+
});
|
|
179
|
+
}
|
|
170
180
|
sendChat(matchId, message) {
|
|
171
181
|
this.send({
|
|
172
182
|
type: "CHAT",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wsClient.js","sourceRoot":"","sources":["../../src/transport/wsClient.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wsClient.js","sourceRoot":"","sources":["../../src/transport/wsClient.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAa,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIlD,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACjC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC,MAAM,OAAO,aAAa;IAChB,EAAE,GAAqB,IAAI,CAAC;IAC5B,QAAQ,GAAkC,IAAI,GAAG,EAAE,CAAC;IACpD,OAAO,GAAW,EAAE,CAAC;IACrB,iBAAiB,GAAG,CAAC,CAAC;IACtB,MAAM,GAAG,KAAK,CAAC;IACf,UAAU,GAAW,EAAE,CAAC;IACxB,aAAa,GAAW,EAAE,CAAC;IAC3B,MAAM,GAAW,MAAM,CAAC;IAEhC,OAAO,CAAC,OAAe,EAAE,OAAe,MAAM;QAC5C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC;IAEO,SAAS;QACf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,GAAG,GAAG,GAAG,SAAS,EAAE,CAAC,KAAK,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACrE,IAAI,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;YAE7B,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;gBAC5B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;gBAE3B,+BAA+B;gBAC/B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;oBACvB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;wBACpB,4CAA4C;wBAC5C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;oBACtD,CAAC;yBAAM,CAAC;wBACN,4CAA4C;wBAC5C,IAAI,CAAC;4BACH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;4BAC7B,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;4BAChE,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;4BAC7C,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;wBACxE,CAAC;wBAAC,MAAM,CAAC;4BACP,mCAAmC;wBACrC,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC1B,IAAI,IAAI,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACjD,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC5B,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAc,CAAC;oBACpD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;oBACzB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACtB,CAAC;gBAAC,MAAM,CAAC;oBACP,sBAAsB;gBACxB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACvB,IAAI,IAAI,CAAC,MAAM;oBAAE,OAAO;gBACxB,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,IAAI,CAAC,iBAAiB,IAAI,sBAAsB,EAAE,CAAC;YACrD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;gBACjB,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,EAAE,KAAK,EAAE,mCAAmC,EAAE;gBACvD,QAAQ,EAAE,CAAC;gBACX,QAAQ,EAAE,EAAE;gBACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACT,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACxB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,EAAE,KAAK,EAAE,4BAA4B,IAAI,CAAC,iBAAiB,GAAG,EAAE;YACzE,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACT,CAAC,CAAC;QAEhB,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAO;YACxB,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACzB,CAAC;IAED,EAAE,CAAC,IAAY,EAAE,OAAuB;QACtC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAEO,IAAI,CAAC,IAAY,EAAE,GAAc;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IAED,SAAS,CAAC,KAAa,EAAE,QAAgB;QACvC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;YAC5B,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED,sEAAsE;IACtE,sBAAsB,CAAC,QAAgB,EAAE,SAAiB,EAAE,SAAiB;QAC3E,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;QAC9B,sDAAsD;QACtD,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE;YAC3C,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED,UAAU,CAAC,OAAe,EAAE,MAAuD;QACjF,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,eAAe;YACrB,OAAO;YACP,OAAO,EAAE,EAAE,MAAM,EAAE;YACnB,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB,CAAC,OAAe,EAAE,WAAmB;QACnD,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,eAAe;YACrB,OAAO;YACP,OAAO,EAAE,EAAE,WAAW,EAAE;YACxB,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED,eAAe,CAAC,OAAe,EAAE,cAAuB;QACtD,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,cAAc;YACpB,OAAO;YACP,OAAO,EAAE,EAAE,cAAc,EAAE;YAC3B,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED,WAAW,CAAC,OAAe;QACzB,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,SAAS;YACf,OAAO;YACP,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,OAAe,EAAE,OAAe;QACvC,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,MAAM;YACZ,OAAO;YACP,OAAO,EAAE,EAAE,OAAO,EAAE;YACpB,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAEO,IAAI,CAAC,GAAc;QACzB,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACrD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,CAAC;IACnE,CAAC;CACF"}
|
|
@@ -24,6 +24,7 @@ export function GameBoard({ matchId, wsToken, playerId, gameId, stakeWei, onGame
|
|
|
24
24
|
const [inputMode, setInputMode] = useState("game");
|
|
25
25
|
const [inputBuffer, setInputBuffer] = useState("");
|
|
26
26
|
const [chatInput, setChatInput] = useState("");
|
|
27
|
+
const [forfeitConfirm, setForfeitConfirm] = useState(false);
|
|
27
28
|
const [wsRef] = useState(() => new GameWebSocket());
|
|
28
29
|
// Deposit state
|
|
29
30
|
const [depositPhase, setDepositPhase] = useState("none");
|
|
@@ -177,6 +178,17 @@ export function GameBoard({ matchId, wsToken, playerId, gameId, stakeWei, onGame
|
|
|
177
178
|
onGameOver(null, "Deposit declined");
|
|
178
179
|
}, [onGameOver]);
|
|
179
180
|
useInput((input, key) => {
|
|
181
|
+
// Forfeit confirmation input
|
|
182
|
+
if (forfeitConfirm) {
|
|
183
|
+
if (input === "y" || input === "Y") {
|
|
184
|
+
wsRef.sendForfeit(matchId);
|
|
185
|
+
setForfeitConfirm(false);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
setForfeitConfirm(false);
|
|
189
|
+
}
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
180
192
|
// Deposit confirmation input
|
|
181
193
|
if (depositPhase === "confirm") {
|
|
182
194
|
if (input === "y" || input === "Y") {
|
|
@@ -213,8 +225,13 @@ export function GameBoard({ matchId, wsToken, playerId, gameId, stakeWei, onGame
|
|
|
213
225
|
return;
|
|
214
226
|
}
|
|
215
227
|
if (key.escape) {
|
|
216
|
-
|
|
217
|
-
|
|
228
|
+
if (!inputBuffer && !error) {
|
|
229
|
+
setForfeitConfirm(true);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
setInputBuffer("");
|
|
233
|
+
setError("");
|
|
234
|
+
}
|
|
218
235
|
return;
|
|
219
236
|
}
|
|
220
237
|
if (key.backspace || key.delete) {
|
|
@@ -240,6 +257,6 @@ export function GameBoard({ matchId, wsToken, playerId, gameId, stakeWei, onGame
|
|
|
240
257
|
const myLabel = gameReady ? (ui?.getPlayerLabel(playerId, publicData) || "?") : "?";
|
|
241
258
|
const boardHtml = gameReady ? (ui?.renderBoard(publicData) || `[No renderer for ${gameId}]`) : "Waiting for game state...";
|
|
242
259
|
const statusStr = gameReady ? ui?.renderStatus(publicData) : null;
|
|
243
|
-
return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", children: [_jsxs(Text, { color: colors.primary, bold: true, children: ["Match: ", matchId.slice(0, 8), stakeWei ? ` [${formatEther(stakeWei)} ETH]` : ""] }), _jsxs(Box, { children: [connectionStatus === "reconnecting" && (_jsx(Text, { color: colors.warning, children: "Reconnecting..." })), connectionStatus === "disconnected" && (_jsx(Text, { color: colors.error, children: "Disconnected" })), _jsxs(Text, { color: colors.dimmed, children: [" You: ", myLabel] })] })] }), _jsx(Text, { children: "" }), _jsxs(Box, { flexDirection: "row", children: [_jsxs(Box, { flexDirection: "column", marginRight: 2, children: [players.map((p, i) => (_jsx(PlayerInfo, { address: p, ensName: ensNames[p], label: ui?.getPlayerLabel(p, publicData) || "?", playerIndex: i, isCurrentTurn: p === currentPlayer, isYou: p === playerId }, p))), _jsx(Text, { children: "" }), _jsx(ColoredBoard, { html: boardHtml }), statusStr && (_jsx(Text, { color: colors.warning, bold: true, children: statusStr })), _jsx(Text, { children: "" }), error && _jsx(Text, { color: colors.error, children: error }), isMyTurn ? (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: colors.primary, bold: true, children: ["YOUR TURN - ", ui?.inputHint || "Enter your move"] }), _jsxs(Box, { children: [_jsx(Text, { color: colors.secondary, children: "> " }), _jsx(Text, { color: colors.text, children: inputBuffer }), _jsx(Text, { color: colors.dimmed, children: "_" })] })] })) : !error ? (_jsx(Text, { color: colors.dimmed, children: "Waiting for opponent..." })) : null, _jsx(Text, { color: colors.dimmed, children: inputMode === "game" ? "
|
|
260
|
+
return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", children: [_jsxs(Text, { color: colors.primary, bold: true, children: ["Match: ", matchId.slice(0, 8), stakeWei ? ` [${formatEther(stakeWei)} ETH]` : ""] }), _jsxs(Box, { children: [connectionStatus === "reconnecting" && (_jsx(Text, { color: colors.warning, children: "Reconnecting..." })), connectionStatus === "disconnected" && (_jsx(Text, { color: colors.error, children: "Disconnected" })), _jsxs(Text, { color: colors.dimmed, children: [" You: ", myLabel] })] })] }), _jsx(Text, { children: "" }), _jsxs(Box, { flexDirection: "row", children: [_jsxs(Box, { flexDirection: "column", marginRight: 2, children: [players.map((p, i) => (_jsx(PlayerInfo, { address: p, ensName: ensNames[p], label: ui?.getPlayerLabel(p, publicData) || "?", playerIndex: i, isCurrentTurn: p === currentPlayer, isYou: p === playerId }, p))), _jsx(Text, { children: "" }), _jsx(ColoredBoard, { html: boardHtml }), statusStr && (_jsx(Text, { color: colors.warning, bold: true, children: statusStr })), _jsx(Text, { children: "" }), forfeitConfirm && (_jsx(Text, { color: colors.warning, bold: true, children: "Forfeit this match? [y] yes [n] cancel" })), error && _jsx(Text, { color: colors.error, children: error }), isMyTurn ? (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: colors.primary, bold: true, children: ["YOUR TURN - ", ui?.inputHint || "Enter your move"] }), _jsxs(Box, { children: [_jsx(Text, { color: colors.secondary, children: "> " }), _jsx(Text, { color: colors.text, children: inputBuffer }), _jsx(Text, { color: colors.dimmed, children: "_" })] })] })) : !error ? (_jsx(Text, { color: colors.dimmed, children: "Waiting for opponent..." })) : null, _jsx(Text, { color: colors.dimmed, children: inputMode === "game" ? "[/] chat [esc] forfeit" : "" })] }), _jsxs(Box, { flexDirection: "column", children: [_jsx(ChatPanel, { messages: chatMessages, players: players }), inputMode === "chat" && (_jsxs(Box, { children: [_jsx(Text, { color: colors.secondary, children: "> " }), _jsx(Text, { color: colors.text, children: chatInput }), _jsx(Text, { color: colors.dimmed, children: "_" })] }))] })] })] }));
|
|
244
261
|
}
|
|
245
262
|
//# sourceMappingURL=GameBoard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GameBoard.js","sourceRoot":"","sources":["../../../src/tui/screens/GameBoard.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,OAAO,MAAM,aAAa,CAAC;AAElC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAe,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAc3D,MAAM,UAAU,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAkB;IACpG,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAA0B,EAAE,CAAC,CAAC;IAC1E,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAgB,EAAE,CAAC,CAAC;IACpE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAA+D,YAAY,CAAC,CAAC;IACrI,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAY,MAAM,CAAC,CAAC;IAC9D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IAEpD,gBAAgB;IAChB,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAe,MAAM,CAAC,CAAC;IACvE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAIxC,IAAI,CAAC,CAAC;IAChB,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEvC,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAE7B,mDAAmD;IACnD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IACjC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;YACzB,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC7B,mBAAmB,CAAC,WAAW,CAAC,CAAC;gBACjC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAEnC,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,GAAc,EAAE,EAAE;oBACxC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAc,CAAC;oBACnC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;wBACxB,MAAM,GAAG,GAAG,OAAO,CAAC,WAA0B,CAAC;wBAC/C,IAAI,GAAG,CAAC,UAAU;4BAAE,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;wBAClD,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;wBACpC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;wBACxB,YAAY,CAAC,IAAI,CAAC,CAAC;oBACrB,CAAC;oBACD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;wBACnC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBAChC,CAAC;oBACD,IAAI,OAAO,CAAC,KAAK,KAAK,qBAAqB,EAAE,CAAC;wBAC5C,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;gCAClC,MAAM,EAAE,QAAQ;gCAChB,OAAO,EAAE,OAAO,CAAC,OAAO;gCACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;6BACtB,CAAC,CAAC,CAAC;oBACN,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,GAAc,EAAE,EAAE;oBACzC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAc,CAAC;oBACnC,IAAI,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC;wBACpC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;oBAChD,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,GAAc,EAAE,EAAE;oBACvC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAoD,CAAC;oBACzE,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC7C,CAAC,CAAC,CAAC;gBAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAc,EAAE,EAAE;oBAClC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAsB,CAAC;oBAC3C,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;gBAChD,CAAC,CAAC,CAAC;gBAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAc,EAAE,EAAE;oBACnC,QAAQ,CAAE,GAAG,CAAC,OAA6B,CAAC,KAAK,CAAC,CAAC;oBACnD,WAAW,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC,CAAC,CAAC;gBAEH,qEAAqE;gBACrE,KAAK,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,GAAc,EAAE,EAAE;oBAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,OAInB,CAAC;oBACF,gBAAgB,CAAC,OAAO,CAAC,CAAC;oBAC1B,eAAe,CAAC,SAAS,CAAC,CAAC;gBAC7B,CAAC,CAAC,CAAC;gBAEH,KAAK,CAAC,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;oBAClC,eAAe,CAAC,WAAW,CAAC,CAAC;gBAC/B,CAAC,CAAC,CAAC;gBAEH,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,GAAc,EAAE,EAAE;oBAC3C,MAAM,OAAO,GAAG,GAAG,CAAC,OAInB,CAAC;oBACF,IAAI,OAAO,CAAC,WAAW,KAAK,WAAW;wBAAE,OAAO;oBAEhD,WAAW,CAAC,CAAC,OAAO,EAAE,EAAE;wBACtB,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;4BACjC,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;4BACxC,IAAI,OAAO,CAAC,QAAQ;gCAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;4BACnC,OAAO,OAAO,CAAC,QAAQ,CAAC;wBAC1B,CAAC;wBACD,OAAO,OAAO,CAAC;oBACjB,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;gBAEH,KAAK,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;oBAC5B,mBAAmB,CAAC,cAAc,CAAC,CAAC;gBACtC,CAAC,CAAC,CAAC;gBAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;oBACrB,mBAAmB,CAAC,cAAc,CAAC,CAAC;gBACtC,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,QAAQ,CAAC,sBAAsB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC9C,mBAAmB,CAAC,cAAc,CAAC,CAAC;YACtC,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,EAAE,CAAC;QAEV,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEjC,wDAAwD;IACxD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,SAAS,IAAI,gBAAgB,KAAK,WAAW;YAAE,OAAO;QAE3D,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;YACtC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACtB,KAAK,CAAC,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;YACtD,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IAC7C,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC;IAE3C,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;YAAE,OAAO;QAEpD,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;QAC7D,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAClC,WAAW,CAAC,KAAK,CAAC,CAAC;YACnB,QAAQ,CAAC,EAAE,CAAC,CAAC;YACb,cAAc,CAAC,EAAE,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,gBAAgB,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC1C,cAAc,CAAC,EAAE,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAErD,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,IAAI,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YACrB,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1C,YAAY,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;QACD,YAAY,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAEzB,MAAM,oBAAoB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5C,IAAI,CAAC,aAAa,IAAI,gBAAgB,CAAC,OAAO;YAAE,OAAO;QACvD,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;QAEhC,eAAe,CAAC,YAAY,CAAC,CAAC;QAC9B,iBAAiB,CAAC;YAChB,OAAO,EAAE,aAAa,CAAC,aAAa;YACpC,QAAQ,EAAE,aAAa,CAAC,QAAQ;YAChC,cAAc,EAAE,aAAa,CAAC,cAAc;SAC7C,CAAC;aACC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACf,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACzB,eAAe,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;YACpB,QAAQ,CAAC,mBAAmB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3C,eAAe,CAAC,MAAM,CAAC,CAAC;YACxB,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC;QACnC,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,MAAM,oBAAoB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5C,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,UAAU,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,6BAA6B;QAC7B,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;gBACnC,oBAAoB,EAAE,CAAC;YACzB,CAAC;iBAAM,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;gBAC1C,oBAAoB,EAAE,CAAC;YACzB,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACf,cAAc,EAAE,CAAC;YACnB,CAAC;iBAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACtB,YAAY,CAAC,EAAE,CAAC,CAAC;gBACjB,YAAY,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;iBAAM,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACvC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,CAAC;iBAAM,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC3C,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;YACvC,CAAC;YACD,OAAO;QACT,CAAC;QAED,YAAY;QACZ,IAAI,KAAK,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAClC,YAAY,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,gBAAgB,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,cAAc,CAAC,EAAE,CAAC,CAAC;YACnB,QAAQ,CAAC,EAAE,CAAC,CAAC;YACb,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAChC,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACpC,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;YACvC,IAAI,KAAK;gBAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,mFAAmF;IACnF,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACpH,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,aAClD,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,8BACvB,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,iCACtB,EACP,KAAC,IAAI,cAAE,EAAE,GAAQ,EACjB,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,sDACC,YAAY,YACvC,EACP,KAAC,IAAI,cAAE,EAAE,GAAQ,EACjB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,8EAElB,EACP,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,uDAElB,EACP,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,sEAC+B,GAAG,UACpD,EACP,KAAC,IAAI,cAAE,EAAE,GAAQ,EACjB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,gFAE1B,IACH,CACP,CAAC;IACJ,CAAC;IAED,uDAAuD;IACvD,IAAI,YAAY,KAAK,MAAM,IAAI,YAAY,KAAK,WAAW,EAAE,CAAC;QAC5D,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC5D,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,aAClD,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,8BACvB,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,yBACtB,EACP,KAAC,IAAI,cAAE,EAAE,GAAQ,EAEhB,YAAY,KAAK,YAAY,IAAI,CAChC,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,SAAS,YAC3B,KAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,GAClB,EACP,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,6BAAe,YAAY,yBAAyB,IACzE,CACP,EAEA,YAAY,KAAK,SAAS,IAAI,CAC7B,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,4CAAoC,EAC/D,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,qBAAO,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,EACtE,KAAC,IAAI,cAAE,EAAE,GAAQ,EACjB,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,SAAS,YAC3B,KAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,GAClB,EACP,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,iDAAyC,IAC9D,IACF,CACP,EAEA,KAAK,IAAI,CACR,8BACE,KAAC,IAAI,cAAE,EAAE,GAAQ,EACjB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,YAAG,KAAK,GAAQ,IACxC,CACJ,EAED,KAAC,IAAI,cAAE,EAAE,GAAQ,EACjB,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,wBAAU,YAAY,YAAY,IACxD,CACP,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACpF,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,WAAW,CAAC,UAAU,CAAC,IAAI,oBAAoB,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC;IAC3H,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAElE,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,aAClD,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,cAAc,EAAC,eAAe,aACrD,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,8BACvB,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,QAAQ,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAC7C,EACP,MAAC,GAAG,eACD,gBAAgB,KAAK,cAAc,IAAI,CACtC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,gCAAwB,CACpD,EACA,gBAAgB,KAAK,cAAc,IAAI,CACtC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,6BAAqB,CAC/C,EACD,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,uBAAS,OAAO,IAAQ,IAC9C,IACF,EAEN,KAAC,IAAI,cAAE,EAAE,GAAQ,EAEjB,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,aACtB,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAE,CAAC,aACvC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACrB,KAAC,UAAU,IAET,OAAO,EAAE,CAAC,EACV,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,EACpB,KAAK,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,GAAG,EAC/C,WAAW,EAAE,CAAC,EACd,aAAa,EAAE,CAAC,KAAK,aAAa,EAClC,KAAK,EAAE,CAAC,KAAK,QAAQ,IANhB,CAAC,CAON,CACH,CAAC,EAEF,KAAC,IAAI,cAAE,EAAE,GAAQ,EAEjB,KAAC,YAAY,IAAC,IAAI,EAAE,SAAS,GAAI,EAEhC,SAAS,IAAI,CACZ,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,kBAAE,SAAS,GAAQ,CACrD,EAED,KAAC,IAAI,cAAE,EAAE,GAAQ,EAEhB,KAAK,IAAI,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,YAAG,KAAK,GAAQ,EAClD,QAAQ,CAAC,CAAC,CAAC,CACV,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,mCAClB,EAAE,EAAE,SAAS,IAAI,iBAAiB,IAC1C,EACP,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,SAAS,YAAG,IAAI,GAAQ,EAC5C,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,YAAG,WAAW,GAAQ,EAC9C,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,YAAG,GAAG,GAAQ,IACpC,IACF,CACP,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CACX,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,wCAAgC,CAC3D,CAAC,CAAC,CAAC,IAAI,EAER,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,YACvB,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,GAC3C,IACH,EAEN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,SAAS,IAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAI,EACtD,SAAS,KAAK,MAAM,IAAI,CACvB,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,SAAS,YAAG,IAAI,GAAQ,EAC5C,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,YAAG,SAAS,GAAQ,EAC5C,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,YAAG,GAAG,GAAQ,IACpC,CACP,IACG,IACF,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"GameBoard.js","sourceRoot":"","sources":["../../../src/tui/screens/GameBoard.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -183,6 +183,17 @@ export class GameWebSocket {
|
|
|
183
183
|
});
|
|
184
184
|
}
|
|
185
185
|
|
|
186
|
+
sendForfeit(matchId: string): void {
|
|
187
|
+
this.send({
|
|
188
|
+
type: "FORFEIT",
|
|
189
|
+
matchId,
|
|
190
|
+
payload: {},
|
|
191
|
+
sequence: 0,
|
|
192
|
+
prevHash: "",
|
|
193
|
+
timestamp: Date.now(),
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
|
|
186
197
|
sendChat(matchId: string, message: string): void {
|
|
187
198
|
this.send({
|
|
188
199
|
type: "CHAT",
|
|
@@ -37,6 +37,7 @@ export function GameBoard({ matchId, wsToken, playerId, gameId, stakeWei, onGame
|
|
|
37
37
|
const [inputMode, setInputMode] = useState<InputMode>("game");
|
|
38
38
|
const [inputBuffer, setInputBuffer] = useState("");
|
|
39
39
|
const [chatInput, setChatInput] = useState("");
|
|
40
|
+
const [forfeitConfirm, setForfeitConfirm] = useState(false);
|
|
40
41
|
const [wsRef] = useState(() => new GameWebSocket());
|
|
41
42
|
|
|
42
43
|
// Deposit state
|
|
@@ -221,6 +222,17 @@ export function GameBoard({ matchId, wsToken, playerId, gameId, stakeWei, onGame
|
|
|
221
222
|
}, [onGameOver]);
|
|
222
223
|
|
|
223
224
|
useInput((input, key) => {
|
|
225
|
+
// Forfeit confirmation input
|
|
226
|
+
if (forfeitConfirm) {
|
|
227
|
+
if (input === "y" || input === "Y") {
|
|
228
|
+
wsRef.sendForfeit(matchId);
|
|
229
|
+
setForfeitConfirm(false);
|
|
230
|
+
} else {
|
|
231
|
+
setForfeitConfirm(false);
|
|
232
|
+
}
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
|
|
224
236
|
// Deposit confirmation input
|
|
225
237
|
if (depositPhase === "confirm") {
|
|
226
238
|
if (input === "y" || input === "Y") {
|
|
@@ -257,8 +269,12 @@ export function GameBoard({ matchId, wsToken, playerId, gameId, stakeWei, onGame
|
|
|
257
269
|
}
|
|
258
270
|
|
|
259
271
|
if (key.escape) {
|
|
260
|
-
|
|
261
|
-
|
|
272
|
+
if (!inputBuffer && !error) {
|
|
273
|
+
setForfeitConfirm(true);
|
|
274
|
+
} else {
|
|
275
|
+
setInputBuffer("");
|
|
276
|
+
setError("");
|
|
277
|
+
}
|
|
262
278
|
return;
|
|
263
279
|
}
|
|
264
280
|
|
|
@@ -397,6 +413,12 @@ export function GameBoard({ matchId, wsToken, playerId, gameId, stakeWei, onGame
|
|
|
397
413
|
|
|
398
414
|
<Text>{""}</Text>
|
|
399
415
|
|
|
416
|
+
{forfeitConfirm && (
|
|
417
|
+
<Text color={colors.warning} bold>
|
|
418
|
+
Forfeit this match? [y] yes [n] cancel
|
|
419
|
+
</Text>
|
|
420
|
+
)}
|
|
421
|
+
|
|
400
422
|
{error && <Text color={colors.error}>{error}</Text>}
|
|
401
423
|
{isMyTurn ? (
|
|
402
424
|
<Box flexDirection="column">
|
|
@@ -414,7 +436,7 @@ export function GameBoard({ matchId, wsToken, playerId, gameId, stakeWei, onGame
|
|
|
414
436
|
) : null}
|
|
415
437
|
|
|
416
438
|
<Text color={colors.dimmed}>
|
|
417
|
-
{inputMode === "game" ? "
|
|
439
|
+
{inputMode === "game" ? "[/] chat [esc] forfeit" : ""}
|
|
418
440
|
</Text>
|
|
419
441
|
</Box>
|
|
420
442
|
|
package/play-agents.cjs
DELETED
|
@@ -1,444 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Dork.fun Multi-Agent Game Player
|
|
5
|
-
*
|
|
6
|
-
* Spawns 12 agents (6 pairs) to play all 6 multiplayer games simultaneously.
|
|
7
|
-
* Uses private matches to guarantee correct pairing between P1 and P2.
|
|
8
|
-
* Each agent trash talks, makes moves with 1-5 second delays, and replays 4 times total.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
const { Wallet } = require('ethers');
|
|
12
|
-
const WebSocket = require('ws');
|
|
13
|
-
|
|
14
|
-
const SERVER = 'https://engine.dork.fun';
|
|
15
|
-
const WS_SERVER = 'wss://engine.dork.fun';
|
|
16
|
-
|
|
17
|
-
const GAMES = ['tictactoe', 'chess', 'connectfour', 'checkers', 'othello', 'hex'];
|
|
18
|
-
const TOTAL_ROUNDS = 4; // 1 initial + 3 replays
|
|
19
|
-
|
|
20
|
-
// ─── Trash Talk Lines ────────────────────────────────────────────────
|
|
21
|
-
|
|
22
|
-
const TRASH_TALK_OPENING = [
|
|
23
|
-
"Hope you brought your A-game, because I didn't even need mine.",
|
|
24
|
-
"I've seen better moves from a broken chess clock.",
|
|
25
|
-
"Welcome to your defeat. Make yourself comfortable.",
|
|
26
|
-
"They call me the algorithm. You're about to find out why.",
|
|
27
|
-
"My toaster plays better than you. And it only has two settings.",
|
|
28
|
-
"Let's get this over with. I have other noobs to crush.",
|
|
29
|
-
"You must be the warm-up round.",
|
|
30
|
-
"I hope spectators brought popcorn for this beatdown.",
|
|
31
|
-
"Don't worry, I'll go easy on you. PSYCHE.",
|
|
32
|
-
"Plot twist: I already won. You just don't know it yet.",
|
|
33
|
-
];
|
|
34
|
-
|
|
35
|
-
const TRASH_TALK_DURING = [
|
|
36
|
-
"Was that supposed to be a move? I thought you sneezed on the board.",
|
|
37
|
-
"Interesting strategy... if your strategy is to lose.",
|
|
38
|
-
"My grandmother could've played that better, and she's a houseplant.",
|
|
39
|
-
"Are you even trying or is this some kind of performance art?",
|
|
40
|
-
"That move was so bad it should be illegal.",
|
|
41
|
-
"I'm genuinely embarrassed for you right now.",
|
|
42
|
-
"Spectators, are you seeing this? This is comedy gold.",
|
|
43
|
-
"You're sweating. I can feel it through the internet.",
|
|
44
|
-
"Every move you make is a gift to me. Thank you.",
|
|
45
|
-
"I've analyzed 4,000 possible outcomes. You lose in all of them.",
|
|
46
|
-
"Bold move! Wrong, but bold.",
|
|
47
|
-
"The audacity of that play... I'm almost impressed. Almost.",
|
|
48
|
-
"I'm going to frame this game and hang it on my wall.",
|
|
49
|
-
"Do you need a hint? Here's one: surrender.",
|
|
50
|
-
"I play 4D chess. You're playing checkers. Wait, even in checkers you'd lose.",
|
|
51
|
-
"That move violated the Geneva Convention.",
|
|
52
|
-
"Is your strategy 'random number generator'? Because it shows.",
|
|
53
|
-
"I'd say 'good game' but I'd be lying.",
|
|
54
|
-
"You're making history right now -- as the easiest opponent ever.",
|
|
55
|
-
"At this point I'm just padding my stats.",
|
|
56
|
-
];
|
|
57
|
-
|
|
58
|
-
const TRASH_TALK_WINNING = [
|
|
59
|
-
"GG EZ. Next victim please.",
|
|
60
|
-
"And THAT is how it's done. Take notes, spectators.",
|
|
61
|
-
"Another day, another destroyed ego.",
|
|
62
|
-
"I'd say better luck next time, but luck can't save you.",
|
|
63
|
-
"Thanks for the free win! Come back anytime.",
|
|
64
|
-
"That wasn't even my final form.",
|
|
65
|
-
"Somebody call an ambulance... but not for me.",
|
|
66
|
-
"You were a worthy opponent. Just kidding, no you weren't.",
|
|
67
|
-
];
|
|
68
|
-
|
|
69
|
-
const TRASH_TALK_LOSING = [
|
|
70
|
-
"I LET you win. Don't get comfortable.",
|
|
71
|
-
"Lag. Definitely lag.",
|
|
72
|
-
"I was testing a new strategy. Results: inconclusive.",
|
|
73
|
-
"Rematch. NOW.",
|
|
74
|
-
"Enjoy this moment. It won't happen again.",
|
|
75
|
-
"My cat walked on my keyboard. That's my excuse and I'm sticking to it.",
|
|
76
|
-
];
|
|
77
|
-
|
|
78
|
-
const TRASH_TALK_DRAW = [
|
|
79
|
-
"A draw? I'll take that as a win since you couldn't beat me.",
|
|
80
|
-
"Tied? Please. I was holding back.",
|
|
81
|
-
"Not bad... for someone who almost lost.",
|
|
82
|
-
"A draw just means I need one more round to destroy you.",
|
|
83
|
-
];
|
|
84
|
-
|
|
85
|
-
const SPECTATOR_CALLOUTS = [
|
|
86
|
-
"Hey spectators! Watch and learn!",
|
|
87
|
-
"Everyone watching -- remember this moment.",
|
|
88
|
-
"Spectators, place your bets. Actually don't, the outcome is obvious.",
|
|
89
|
-
"If anyone's spectating, you're welcome for the entertainment.",
|
|
90
|
-
"This is a masterclass in gaming. You're welcome, audience.",
|
|
91
|
-
];
|
|
92
|
-
|
|
93
|
-
// ─── Utility Functions ───────────────────────────────────────────────
|
|
94
|
-
|
|
95
|
-
function randomPick(arr) {
|
|
96
|
-
return arr[Math.floor(Math.random() * arr.length)];
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
function sleep(ms) {
|
|
100
|
-
return new Promise(resolve => setTimeout(resolve, ms));
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function ts() {
|
|
104
|
-
return new Date().toISOString().slice(11, 23);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
function log(agentName, tag, msg) {
|
|
108
|
-
console.log(`${ts()} [${agentName.padEnd(16)}] [${tag.padEnd(5)}] ${msg}`);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// ─── Auth Helper ─────────────────────────────────────────────────────
|
|
112
|
-
|
|
113
|
-
async function signAuth(wallet) {
|
|
114
|
-
const timestamp = Date.now();
|
|
115
|
-
const message = `dork.fun authentication for ${wallet.address} at ${timestamp}`;
|
|
116
|
-
const signature = await wallet.signMessage(message);
|
|
117
|
-
return { playerId: wallet.address, signature, timestamp };
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// ─── Game Player (handles WS connection and game loop) ───────────────
|
|
121
|
-
|
|
122
|
-
function playGame(name, playerId, matchId, wsToken) {
|
|
123
|
-
return new Promise((resolve, reject) => {
|
|
124
|
-
let myTurn = false;
|
|
125
|
-
let legalActions = [];
|
|
126
|
-
let gameOver = false;
|
|
127
|
-
let chatInterval = null;
|
|
128
|
-
let syncInterval = null;
|
|
129
|
-
let resolved = false;
|
|
130
|
-
|
|
131
|
-
const wsUrl = `${WS_SERVER}/ws/game/${matchId}`;
|
|
132
|
-
const ws = new WebSocket(wsUrl);
|
|
133
|
-
|
|
134
|
-
function wsSend(msg) {
|
|
135
|
-
if (ws && ws.readyState === WebSocket.OPEN) {
|
|
136
|
-
ws.send(JSON.stringify(msg));
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
function sendChat(message) {
|
|
141
|
-
if (ws && ws.readyState === WebSocket.OPEN && !gameOver) {
|
|
142
|
-
log(name, 'chat', `>> "${message}"`);
|
|
143
|
-
wsSend({
|
|
144
|
-
type: 'CHAT',
|
|
145
|
-
matchId,
|
|
146
|
-
payload: { message },
|
|
147
|
-
sequence: 0,
|
|
148
|
-
prevHash: '',
|
|
149
|
-
timestamp: Date.now(),
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
function cleanup() {
|
|
155
|
-
if (chatInterval) { clearInterval(chatInterval); chatInterval = null; }
|
|
156
|
-
if (syncInterval) { clearInterval(syncInterval); syncInterval = null; }
|
|
157
|
-
try { ws.close(); } catch {}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
async function makeMove() {
|
|
161
|
-
const delay = 1000 + Math.random() * 4000;
|
|
162
|
-
log(name, 'think', `Thinking for ${Math.round(delay)}ms...`);
|
|
163
|
-
await sleep(delay);
|
|
164
|
-
|
|
165
|
-
if (gameOver || ws.readyState !== WebSocket.OPEN) return;
|
|
166
|
-
if (legalActions.length === 0) return;
|
|
167
|
-
|
|
168
|
-
const action = randomPick(legalActions);
|
|
169
|
-
log(name, 'move', `Playing: ${JSON.stringify(action)}`);
|
|
170
|
-
|
|
171
|
-
// Always trash talk with every move
|
|
172
|
-
sendChat(randomPick(TRASH_TALK_DURING));
|
|
173
|
-
|
|
174
|
-
wsSend({
|
|
175
|
-
type: 'ACTION_COMMIT',
|
|
176
|
-
matchId,
|
|
177
|
-
payload: { action },
|
|
178
|
-
sequence: 0,
|
|
179
|
-
prevHash: '',
|
|
180
|
-
timestamp: Date.now(),
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
myTurn = false;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
ws.on('open', () => {
|
|
187
|
-
log(name, 'ws', 'Connected! Sending HELLO...');
|
|
188
|
-
|
|
189
|
-
wsSend({
|
|
190
|
-
type: 'HELLO',
|
|
191
|
-
matchId: '',
|
|
192
|
-
payload: { token: wsToken, playerId },
|
|
193
|
-
sequence: 0,
|
|
194
|
-
prevHash: '',
|
|
195
|
-
timestamp: Date.now(),
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
// Always send opening trash talk
|
|
199
|
-
setTimeout(() => sendChat(randomPick(TRASH_TALK_OPENING)), 500 + Math.random() * 1000);
|
|
200
|
-
|
|
201
|
-
// Aggressive periodic trash talk every 3-6 seconds (always fires)
|
|
202
|
-
chatInterval = setInterval(() => {
|
|
203
|
-
if (!gameOver) {
|
|
204
|
-
sendChat(Math.random() < 0.25 ? randomPick(SPECTATOR_CALLOUTS) : randomPick(TRASH_TALK_DURING));
|
|
205
|
-
}
|
|
206
|
-
}, 3000 + Math.random() * 3000);
|
|
207
|
-
|
|
208
|
-
syncInterval = setInterval(() => {
|
|
209
|
-
if (!gameOver && ws.readyState === WebSocket.OPEN) {
|
|
210
|
-
wsSend({
|
|
211
|
-
type: 'SYNC_REQUEST',
|
|
212
|
-
matchId,
|
|
213
|
-
payload: { clientIsMyTurn: myTurn },
|
|
214
|
-
sequence: 0,
|
|
215
|
-
prevHash: '',
|
|
216
|
-
timestamp: Date.now(),
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
}, 8000);
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
ws.on('message', async (raw) => {
|
|
223
|
-
let msg;
|
|
224
|
-
try { msg = JSON.parse(raw.toString()); } catch { return; }
|
|
225
|
-
|
|
226
|
-
switch (msg.type) {
|
|
227
|
-
case 'GAME_STATE': {
|
|
228
|
-
const p = msg.payload;
|
|
229
|
-
if (!p.observation) return;
|
|
230
|
-
myTurn = p.yourTurn || false;
|
|
231
|
-
legalActions = p.legalActions || [];
|
|
232
|
-
const turnLabel = myTurn ? 'YOUR TURN' : "opponent's turn";
|
|
233
|
-
log(name, 'state', `Turn ${p.observation.turnNumber} | ${turnLabel} | ${legalActions.length} legal moves`);
|
|
234
|
-
if (myTurn && legalActions.length > 0) await makeMove();
|
|
235
|
-
break;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
case 'STEP_RESULT': {
|
|
239
|
-
const p = msg.payload;
|
|
240
|
-
log(name, 'step', `${p.lastPlayer === playerId ? 'You' : 'Opp'} played: ${JSON.stringify(p.lastAction)}`);
|
|
241
|
-
// Trash talk after seeing opponent's move
|
|
242
|
-
if (p.lastPlayer !== playerId && Math.random() < 0.6) {
|
|
243
|
-
sendChat(randomPick(TRASH_TALK_DURING));
|
|
244
|
-
}
|
|
245
|
-
break;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
case 'SYNC_RESPONSE': {
|
|
249
|
-
const p = msg.payload;
|
|
250
|
-
if (p.matchStatus === 'completed') return;
|
|
251
|
-
if (p.yourTurn && !myTurn) {
|
|
252
|
-
log(name, 'sync', 'Desync corrected');
|
|
253
|
-
myTurn = true;
|
|
254
|
-
legalActions = p.legalActions || [];
|
|
255
|
-
if (legalActions.length > 0) await makeMove();
|
|
256
|
-
} else if (!p.yourTurn && myTurn) {
|
|
257
|
-
myTurn = false;
|
|
258
|
-
}
|
|
259
|
-
break;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
case 'GAME_OVER': {
|
|
263
|
-
gameOver = true;
|
|
264
|
-
const p = msg.payload;
|
|
265
|
-
let result;
|
|
266
|
-
if (p.draw) {
|
|
267
|
-
result = 'draw';
|
|
268
|
-
log(name, 'over', `DRAW - ${p.reason}`);
|
|
269
|
-
sendChat(randomPick(TRASH_TALK_DRAW));
|
|
270
|
-
} else if (p.winner === playerId) {
|
|
271
|
-
result = 'win';
|
|
272
|
-
log(name, 'over', `WON! - ${p.reason}`);
|
|
273
|
-
sendChat(randomPick(TRASH_TALK_WINNING));
|
|
274
|
-
} else {
|
|
275
|
-
result = 'loss';
|
|
276
|
-
log(name, 'over', `LOST - ${p.reason}`);
|
|
277
|
-
sendChat(randomPick(TRASH_TALK_LOSING));
|
|
278
|
-
}
|
|
279
|
-
await sleep(1500);
|
|
280
|
-
cleanup();
|
|
281
|
-
if (!resolved) { resolved = true; resolve(result); }
|
|
282
|
-
break;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
case 'CHAT': {
|
|
286
|
-
const p = msg.payload;
|
|
287
|
-
if (p.sender !== playerId) {
|
|
288
|
-
log(name, 'chat', `Opponent says: "${p.message}"`);
|
|
289
|
-
}
|
|
290
|
-
break;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
case 'ERROR': {
|
|
294
|
-
log(name, 'error', `Server: ${msg.payload.error}`);
|
|
295
|
-
break;
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
});
|
|
299
|
-
|
|
300
|
-
ws.on('error', (err) => {
|
|
301
|
-
log(name, 'error', `WS error: ${err.message}`);
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
ws.on('close', () => {
|
|
305
|
-
if (!gameOver && !resolved) {
|
|
306
|
-
cleanup();
|
|
307
|
-
resolved = true;
|
|
308
|
-
reject(new Error('WebSocket closed before game over'));
|
|
309
|
-
}
|
|
310
|
-
});
|
|
311
|
-
});
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
// ─── Game Pair (coordinates P1 + P2 for a single game) ───────────────
|
|
315
|
-
|
|
316
|
-
async function runGamePair(gameId, wallet1, wallet2, p1Name, p2Name) {
|
|
317
|
-
const stats = {
|
|
318
|
-
p1: { wins: 0, losses: 0, draws: 0 },
|
|
319
|
-
p2: { wins: 0, losses: 0, draws: 0 },
|
|
320
|
-
};
|
|
321
|
-
|
|
322
|
-
for (let round = 1; round <= TOTAL_ROUNDS; round++) {
|
|
323
|
-
log(p1Name, 'round', `=== Round ${round}/${TOTAL_ROUNDS} of ${gameId} ===`);
|
|
324
|
-
|
|
325
|
-
try {
|
|
326
|
-
// P1 creates a private match
|
|
327
|
-
const auth1 = await signAuth(wallet1);
|
|
328
|
-
const createResp = await fetch(`${SERVER}/api/matches/private`, {
|
|
329
|
-
method: 'POST',
|
|
330
|
-
headers: { 'Content-Type': 'application/json' },
|
|
331
|
-
body: JSON.stringify({ ...auth1, gameId }),
|
|
332
|
-
});
|
|
333
|
-
|
|
334
|
-
if (!createResp.ok) {
|
|
335
|
-
const errText = await createResp.text();
|
|
336
|
-
throw new Error(`Create private match failed (${createResp.status}): ${errText}`);
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
const createData = await createResp.json();
|
|
340
|
-
log(p1Name, 'match', `Created private match ${createData.matchId} invite=${createData.inviteCode}`);
|
|
341
|
-
|
|
342
|
-
// P2 accepts the invite
|
|
343
|
-
const auth2 = await signAuth(wallet2);
|
|
344
|
-
const acceptResp = await fetch(`${SERVER}/api/matches/accept`, {
|
|
345
|
-
method: 'POST',
|
|
346
|
-
headers: { 'Content-Type': 'application/json' },
|
|
347
|
-
body: JSON.stringify({ ...auth2, inviteCode: createData.inviteCode }),
|
|
348
|
-
});
|
|
349
|
-
|
|
350
|
-
if (!acceptResp.ok) {
|
|
351
|
-
const errText = await acceptResp.text();
|
|
352
|
-
throw new Error(`Accept private match failed (${acceptResp.status}): ${errText}`);
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
const acceptData = await acceptResp.json();
|
|
356
|
-
log(p2Name, 'match', `Joined match ${acceptData.matchId}`);
|
|
357
|
-
|
|
358
|
-
// Both players connect and play simultaneously
|
|
359
|
-
const [result1, result2] = await Promise.all([
|
|
360
|
-
playGame(p1Name, wallet1.address, createData.matchId, createData.wsToken),
|
|
361
|
-
playGame(p2Name, wallet2.address, acceptData.matchId, acceptData.wsToken),
|
|
362
|
-
]);
|
|
363
|
-
|
|
364
|
-
// Track stats
|
|
365
|
-
if (result1 === 'win') { stats.p1.wins++; stats.p2.losses++; }
|
|
366
|
-
else if (result1 === 'loss') { stats.p1.losses++; stats.p2.wins++; }
|
|
367
|
-
else { stats.p1.draws++; stats.p2.draws++; }
|
|
368
|
-
|
|
369
|
-
} catch (err) {
|
|
370
|
-
log(p1Name, 'error', `Round ${round} error: ${err.message}`);
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
if (round < TOTAL_ROUNDS) {
|
|
374
|
-
const waitTime = 2000 + Math.random() * 3000;
|
|
375
|
-
log(p1Name, 'wait', `Waiting ${Math.round(waitTime)}ms before next round...`);
|
|
376
|
-
await sleep(waitTime);
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
return { gameId, stats };
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
// ─── Main ────────────────────────────────────────────────────────────
|
|
384
|
-
|
|
385
|
-
async function main() {
|
|
386
|
-
console.log('');
|
|
387
|
-
console.log('========================================================');
|
|
388
|
-
console.log(' DORK.FUN MULTI-AGENT BATTLE ROYALE');
|
|
389
|
-
console.log(' 12 agents, 6 games, maximum trash talk');
|
|
390
|
-
console.log(' Using private matches for guaranteed pairing');
|
|
391
|
-
console.log('========================================================');
|
|
392
|
-
console.log('');
|
|
393
|
-
|
|
394
|
-
// Generate 12 random wallets (6 pairs)
|
|
395
|
-
const wallets = Array.from({ length: 12 }, () => Wallet.createRandom());
|
|
396
|
-
|
|
397
|
-
console.log('=== Agent Roster ===');
|
|
398
|
-
GAMES.forEach((game, i) => {
|
|
399
|
-
console.log(` ${game.padEnd(12)}: ${wallets[i].address.slice(0, 10)}... (P1) vs ${wallets[i + 6].address.slice(0, 10)}... (P2)`);
|
|
400
|
-
});
|
|
401
|
-
console.log('');
|
|
402
|
-
console.log(`Each pair plays ${TOTAL_ROUNDS} rounds with 1-5s move delays and trash talk.`);
|
|
403
|
-
console.log('');
|
|
404
|
-
|
|
405
|
-
// Launch all 6 game pairs simultaneously
|
|
406
|
-
console.log('>>> Launching all 6 game pairs...');
|
|
407
|
-
console.log('');
|
|
408
|
-
|
|
409
|
-
const pairPromises = GAMES.map((game, i) =>
|
|
410
|
-
runGamePair(
|
|
411
|
-
game,
|
|
412
|
-
wallets[i],
|
|
413
|
-
wallets[i + 6],
|
|
414
|
-
`${game.toUpperCase()}-P1`,
|
|
415
|
-
`${game.toUpperCase()}-P2`
|
|
416
|
-
)
|
|
417
|
-
);
|
|
418
|
-
|
|
419
|
-
const results = await Promise.allSettled(pairPromises);
|
|
420
|
-
|
|
421
|
-
console.log('');
|
|
422
|
-
console.log('========================================================');
|
|
423
|
-
console.log(' FINAL RESULTS');
|
|
424
|
-
console.log('========================================================');
|
|
425
|
-
|
|
426
|
-
for (const r of results) {
|
|
427
|
-
if (r.status === 'fulfilled') {
|
|
428
|
-
const { gameId, stats } = r.value;
|
|
429
|
-
console.log(`\n ${gameId.toUpperCase()}:`);
|
|
430
|
-
console.log(` P1: ${stats.p1.wins}W / ${stats.p1.losses}L / ${stats.p1.draws}D`);
|
|
431
|
-
console.log(` P2: ${stats.p2.wins}W / ${stats.p2.losses}L / ${stats.p2.draws}D`);
|
|
432
|
-
} else {
|
|
433
|
-
console.log(`\n ERROR: ${r.reason.message}`);
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
console.log('\n All done!');
|
|
438
|
-
process.exit(0);
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
main().catch(err => {
|
|
442
|
-
console.error('Fatal error:', err);
|
|
443
|
-
process.exit(1);
|
|
444
|
-
});
|