code wiki / _hdl_build / nx_mp_relay.nx
nx_mp_relay.nx source
↩ module page · 48 lines · 2052 B
1// nx_mp_relay.nx -- sovereign DAEMON-SIDE player-state relay serializer for multiplayer pixelmon.
2// The daemon receives each player's POSTed snapshot (rr_post over nx_room_relay) and, on a /roster GET,
3// serializes the OTHER live players in that room into ONE response body that the browser hands straight to
4// the wasm (gi_net_ingest_roster parses it). Record format = [len:1 byte][frame bytes], matching the wasm
5// parser exactly. Composes nx_room_relay; pure buffer ops (no syscalls) so it drops into any socket daemon
6// (nx_arcade_serve / vroom). The browser host does only memcpy + one wasm call -- zero net logic in JS.
7// license_tier: ORIGINAL
8import "nx_room_relay.nx"
9
10// serialize OTHER live peers in room `rm` (not self_pr, seen within ttl) into `out` as [len:1][frame] records.
11// returns total bytes written. Caller (the daemon) sends this as the /roster response body.
12func mp_roster_body(st: *i64, arena: *u8, slotb: i64, rm: i64, self_pr: i64, now: i64, ttl: i64, out: *u8) -> i64 {
13 let n: i64 = rr_nslots(st)
14 var o: i64 = 0
15 var i: i64 = 0
16 while i < n {
17 if rr_room(st, i) == rm {
18 if rr_peer(st, i) != self_pr {
19 if (now - rr_seen(st, i)) <= ttl {
20 var fl: i64 = rr_flen(st, i)
21 if fl > 255 { fl = 255 } // 1-byte length prefix
22 out[o] = fl as u8
23 o = o + 1
24 var k: i64 = 0
25 while k < fl { out[o + k] = arena[i * slotb + k]; k = k + 1 }
26 o = o + fl
27 }
28 }
29 }
30 i = i + 1
31 }
32 return o
33}
34
35// count the records in a serialized roster body (the wasm does this inline; exposed for the daemon/gate).
36func mp_roster_count(body: *u8, total: i64) -> i64 {
37 var o: i64 = 0
38 var c: i64 = 0
39 var go: i64 = 1
40 while go == 1 {
41 if o >= total { go = 0 } else {
42 let fl: i64 = body[o] as i64
43 o = o + 1 + fl
44 c = c + 1
45 }
46 }
47 return c
48}