@bountyboard/arcade-sdk 1.3.0 → 1.4.1
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/CHANGELOG.md +19 -1
- package/README.md +8 -8
- package/dist/global.js +4 -1
- package/dist/multiplayer.cjs +4 -1
- package/dist/multiplayer.cjs.map +1 -1
- package/dist/multiplayer.js +4 -1
- package/dist/multiplayer.js.map +1 -1
- package/docs/external-authoritative-servers.md +21 -21
- package/docs/game-design-playbook.md +25 -25
- package/docs/llms.txt +147 -102
- package/docs/relay-rooms.md +22 -22
- package/package.json +2 -2
package/docs/relay-rooms.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# Relay rooms
|
|
2
2
|
|
|
3
|
-
Relay rooms are the
|
|
4
|
-
multiplayer approved gets them automatically: hosted lobbies, shareable
|
|
5
|
-
codes, public quick match, reconnect handling, and message fan
|
|
6
|
-
registering a server module or running any backend. The same
|
|
7
|
-
drives all tiers, so a game can start on relay rooms and
|
|
8
|
-
refereed module or an external authoritative server later without
|
|
9
|
-
rewrites.
|
|
3
|
+
Relay rooms are the multiplayer tier that needs no server code. Every game with
|
|
4
|
+
SDK multiplayer approved gets them automatically: hosted lobbies, shareable
|
|
5
|
+
invite codes, public quick match, reconnect handling, and message fan out,
|
|
6
|
+
without registering a server module or running any backend. The same
|
|
7
|
+
`joinRoom()` API drives all tiers, so a game can start on relay rooms and
|
|
8
|
+
graduate to a refereed module or an external authoritative server later without
|
|
9
|
+
client rewrites.
|
|
10
10
|
|
|
11
11
|
## What the server owns (and what it refuses to)
|
|
12
12
|
|
|
@@ -15,13 +15,13 @@ The relay server authoritatively owns everything it can own *generically*:
|
|
|
15
15
|
- the roster and seat cap,
|
|
16
16
|
- host designation and succession,
|
|
17
17
|
- admission (signed tickets, room binding, per-seat connection caps),
|
|
18
|
-
- message fan
|
|
18
|
+
- message fan out with rate and size guardrails.
|
|
19
19
|
|
|
20
20
|
It deliberately does not interpret game payloads, so it cannot referee them.
|
|
21
|
-
Relay outcomes are client
|
|
21
|
+
Relay outcomes are client trusted: relay rooms never emit `match_end`, never
|
|
22
22
|
report results to Bounty Board, and never feed win/loss records or
|
|
23
|
-
leaderboards. Games that need authoritative results
|
|
24
|
-
recorded, or reward
|
|
23
|
+
leaderboards. Games that need authoritative results (anything ranked,
|
|
24
|
+
recorded, or reward adjacent) must use a refereed Bounty hosted module or a
|
|
25
25
|
registered external authority instead.
|
|
26
26
|
|
|
27
27
|
## Joining
|
|
@@ -39,7 +39,7 @@ const room = await joinRoom({
|
|
|
39
39
|
- `code` joins a friend's room.
|
|
40
40
|
- `match: true` enters the game's open public room, or founds one.
|
|
41
41
|
|
|
42
|
-
All three go through the standard signed
|
|
42
|
+
All three go through the standard signed ticket flow; nothing about relay
|
|
43
43
|
rooms weakens admission.
|
|
44
44
|
|
|
45
45
|
### Room size
|
|
@@ -52,7 +52,7 @@ next arrival re-founds it. Ship the same `roomSize` from every client of
|
|
|
52
52
|
your game so matchmade rooms are founded consistently.
|
|
53
53
|
|
|
54
54
|
Quick match fills rooms to the founded size. Because matchmaking reserves
|
|
55
|
-
seats conservatively, a burst of simultaneous quick
|
|
55
|
+
seats conservatively, a burst of simultaneous quick match joins can briefly
|
|
56
56
|
overshoot a small room; losers of that race receive `room_full` and the SDK
|
|
57
57
|
automatically retries into the next room.
|
|
58
58
|
|
|
@@ -61,7 +61,7 @@ automatically retries into the next room.
|
|
|
61
61
|
`room.send(payload)` relays `payload` to **every** player in the room,
|
|
62
62
|
including the sender. There are no private messages: every client sees every
|
|
63
63
|
payload, so never send secrets (hidden roles, private hands) through a relay
|
|
64
|
-
room. Payload semantics are entirely yours
|
|
64
|
+
room. Payload semantics are entirely yours. The server never reads them.
|
|
65
65
|
|
|
66
66
|
Messages are batched per server tick and delivered through `room.on('event')`:
|
|
67
67
|
|
|
@@ -78,7 +78,7 @@ room.on('event', event => {
|
|
|
78
78
|
});
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
-
Guardrails (over
|
|
81
|
+
Guardrails (traffic over the limit is dropped silently; the state snapshot's
|
|
82
82
|
`dropped` counter is the debugging breadcrumb):
|
|
83
83
|
|
|
84
84
|
| Limit | Value |
|
|
@@ -101,9 +101,9 @@ grace keeps both the seat and the host role, so a brief network blip does not
|
|
|
101
101
|
thrash host succession.
|
|
102
102
|
|
|
103
103
|
Use the host as your game's coordinator: it can own spawn timing, level
|
|
104
|
-
seeds, or authoritative
|
|
105
|
-
model
|
|
106
|
-
couch
|
|
104
|
+
seeds, or authoritative enough game state for casual play. Remember the trust
|
|
105
|
+
model. A modified client can lie, which is acceptable for casual co-op and
|
|
106
|
+
couch style games and not acceptable for anything with stakes.
|
|
107
107
|
|
|
108
108
|
## State snapshots
|
|
109
109
|
|
|
@@ -123,12 +123,12 @@ current.
|
|
|
123
123
|
Relay rooms never settle: there is no `end` event, and a room lives while it
|
|
124
124
|
has players (seats survive a 15-second reconnect grace). Implement your own
|
|
125
125
|
notion of rounds or matches in game messages, and call `room.leave()` when
|
|
126
|
-
the player exits
|
|
126
|
+
the player exits. Leaving is immediate and never reconnects.
|
|
127
127
|
|
|
128
128
|
## Graduating to a refereed tier
|
|
129
129
|
|
|
130
|
-
If your game outgrows client trust
|
|
131
|
-
paid
|
|
130
|
+
If your game outgrows client trust (ranked results, tournaments, anything
|
|
131
|
+
paid), the ticket flow, room codes, and quick match all stay the same; the
|
|
132
132
|
room's simulation moves server-side. Contact Bounty Board about a refereed
|
|
133
|
-
Bounty
|
|
133
|
+
Bounty hosted module, or keep your own server and register it under the
|
|
134
134
|
external authority contract (see `external-authoritative-servers.md`).
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bountyboard/arcade-sdk",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Bounty Board Arcade SDK
|
|
3
|
+
"version": "1.4.1",
|
|
4
|
+
"description": "Bounty Board Arcade SDK: leaderboards, cloud saves, rewarded ads, A/B variants, and multiplayer rooms for games on bountyboard.gg",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bountyboard",
|
|
7
7
|
"arcade",
|