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}