code wiki / _hdl_build / nx_game_room_gate.nx
nx_game_room_gate.nx source
↩ module page · 129 lines · 7463 B
1// nx_game_room_gate.nx -- proves the UNIFIED game+comms room: one sovereign room
2// (one room hash) carries MANY independent channels over nx_room_relay -- player-state
3// (game), chat (text), audio (PCM), video (frames) -- all server-relay, NO WebRTC/STUN/
4// TURN/WebSocket. This is the keystone of "do video OR audio OR chat OR all, in the game":
5// join one room, opt into whichever channels you want. Each channel = its own relay
6// instance keyed by the SAME room hash, so they coexist by construction.
7// 1) UNIFIED: a peer in the room reads game-state + chat + audio + video for the room
8// 2) SELECTIVE: a chat-only peer appears in chat roster but NOT in audio/video (opt-in)
9// 3) ISOLATION (neg): a peer in another room sees none of these channels
10// 4) NO CROSS-CHANNEL BLEED (neg): each channel carries only its own payload
11// 5) anti-tautology / ghost (neg): distinct rooms carry distinct state; ghost absent
12// Built nx_cc_sovereign -> nxasm_x86 (no gcc, no .sh). Reuses nx_room_relay + nx_pets_netstate.
13// license_tier: ORIGINAL
14import "nx_syscalls.nx"
15import "nx_gate_emit_lib.nx"
16import "nx_room_relay.nx"
17import "nx_pets_netstate.nx"
18
19func setf(f: *i64, x: i64, y: i64, z: i64, yaw: i64, pitch: i64, sp: i64, caught: i64, act: i64, anim: i64, flags: i64) -> i64 {
20 f[0]=x; f[1]=y; f[2]=z; f[3]=yaw; f[4]=pitch
21 f[5]=sp; f[6]=caught; f[7]=act; f[8]=anim; f[9]=flags
22 return 0
23}
24func inlist(out: *i64, c: i64, id: i64) -> i64 {
25 var i: i64 = 0; while i < c { if out[i] == id { return 1 } i = i + 1 }
26 return 0
27}
28// first byte of a target peer's latest frame on a channel, or -1 if absent/stale
29func chan_byte0(st: *i64, arena: *u8, sb: i64, rm: i64, pr: i64, now: i64, ttl: i64) -> i64 {
30 let s: i64 = rr_live(st, rm, pr, now, ttl)
31 if s < 0 { return 0 - 1 }
32 return (arena[s*sb] as i64)
33}
34
35func main() -> i64 {
36 g_puts("nx_game_room gate (unified sovereign game+comms room: state+chat+audio+video)\n" as *u8)
37 var pass: i64 = 0; var total: i64 = 0
38
39 let N: i64 = 8
40 let SBS: i64 = 64 // state
41 let SBC: i64 = 128 // chat
42 let SBA: i64 = 256 // audio
43 let SBV: i64 = 512 // video
44 // four independent channel relays
45 let s_st: *i64 = sys_mmap((2+5*N)*8) as *i64; let s_ar: *u8 = sys_mmap(N*SBS); rr_init(s_st, N, SBS)
46 let c_st: *i64 = sys_mmap((2+5*N)*8) as *i64; let c_ar: *u8 = sys_mmap(N*SBC); rr_init(c_st, N, SBC)
47 let a_st: *i64 = sys_mmap((2+5*N)*8) as *i64; let a_ar: *u8 = sys_mmap(N*SBA); rr_init(a_st, N, SBA)
48 let v_st: *i64 = sys_mmap((2+5*N)*8) as *i64; let v_ar: *u8 = sys_mmap(N*SBV); rr_init(v_st, N, SBV)
49
50 let ROOM: i64 = 0x6A37
51 let ROOM2: i64 = 0x1234
52 let NOW: i64 = 1000; let TTL: i64 = 8000
53
54 // payload buffers
55 let p1: *u8 = sys_mmap(SBS); let f1: *i64 = sys_mmap(10*8) as *i64
56 setf(f1, 11, 4, 22, 64, 0, 2, 1, 0, 0, 0); ps_pack(p1, f1) // P1 game-state
57 let chat1: *u8 = sys_mmap(SBC); let h: *u8 = "hi there" as *u8; var i: i64=0; while i<8 { chat1[i]=h[i]; i=i+1 }
58 let aud1: *u8 = sys_mmap(SBA); i=0; while i<20 { aud1[i]=(200+i) as u8; i=i+1 } // PCM-ish
59 let vid1: *u8 = sys_mmap(SBV); i=0; while i<30 { vid1[i]=(50+i) as u8; i=i+1 } // video frame
60 let chat2: *u8 = sys_mmap(SBC); chat2[0]=121 as u8; chat2[1]=111 as u8 // "yo"
61 let p3: *u8 = sys_mmap(SBS); let f3: *i64 = sys_mmap(10*8) as *i64
62 setf(f3, 77, 4, 5, 0, 0, 3, 0, 0, 0, 0); ps_pack(p3, f3) // P3 state (other room)
63
64 let P1: i64=1; let P2: i64=2; let P3: i64=3; let P4: i64=4; let P5: i64=5
65
66 // P1 "does all": post into all four channels of ROOM
67 rr_post(s_st, s_ar, ROOM, P1, NOW, 1, p1, 28)
68 rr_post(c_st, c_ar, ROOM, P1, NOW, 1, chat1, 8)
69 rr_post(a_st, a_ar, ROOM, P1, NOW, 1, aud1, 20)
70 rr_post(v_st, v_ar, ROOM, P1, NOW, 1, vid1, 30)
71 // P2 "chat only" in ROOM
72 rr_post(c_st, c_ar, ROOM, P2, NOW, 1, chat2, 2)
73 // P3 state-only in ROOM2 (the other room)
74 rr_post(s_st, s_ar, ROOM2, P3, NOW, 1, p3, 28)
75
76 let out: *i64 = sys_mmap(N*8) as *i64
77 let dec: *i64 = sys_mmap(10*8) as *i64
78
79 // 1) UNIFIED -- P4 (in ROOM) reads game-state + chat + audio + video
80 var r1: i64 = 1
81 let cs: i64 = rr_roster(s_st, ROOM, P4, NOW, TTL, out); if cs != 1 { r1=0 } else { if out[0]!=P1 {r1=0} }
82 let sB: i64 = rr_live(s_st, ROOM, P1, NOW, TTL)
83 if sB < 0 { r1=0 } else { ps_unpack((s_ar + sB*SBS) as *u8, rr_flen(s_st,sB), dec); if dec[0]!=11 {r1=0} }
84 let cc: i64 = rr_roster(c_st, ROOM, P4, NOW, TTL, out); if cc != 2 { r1=0 }
85 let ca: i64 = rr_roster(a_st, ROOM, P4, NOW, TTL, out); if ca != 1 { r1=0 }
86 let cv: i64 = rr_roster(v_st, ROOM, P4, NOW, TTL, out); if cv != 1 { r1=0 }
87 pass = pass + g_check("UNIFIED: one room delivers state+chat+audio+video" as *u8, r1); total=total+1
88
89 // 2) SELECTIVE -- chat-only P2 is in chat roster but NOT audio/video (opt-in per channel)
90 var r2: i64 = 1
91 rr_roster(c_st, ROOM, P4, NOW, TTL, out); if inlist(out, 2, P2)!=1 { r2=0 }
92 rr_roster(a_st, ROOM, P4, NOW, TTL, out); if inlist(out, 1, P2)!=0 { r2=0 }
93 rr_roster(v_st, ROOM, P4, NOW, TTL, out); if inlist(out, 1, P2)!=0 { r2=0 }
94 pass = pass + g_check("SELECTIVE: chat-only peer absent from audio/video (opt-in)" as *u8, r2); total=total+1
95
96 // 3) ISOLATION (neg) -- P5 in ROOM2 sees only ROOM2's state (P3), none of ROOM's channels
97 var r3: i64 = 1
98 let s2: i64 = rr_roster(s_st, ROOM2, P5, NOW, TTL, out); if s2!=1 { r3=0 } else { if out[0]!=P3 {r3=0} }
99 if rr_roster(c_st, ROOM2, P5, NOW, TTL, out)!=0 { r3=0 }
100 if rr_roster(a_st, ROOM2, P5, NOW, TTL, out)!=0 { r3=0 }
101 if rr_roster(v_st, ROOM2, P5, NOW, TTL, out)!=0 { r3=0 }
102 // and ROOM's state roster must NOT contain the ROOM2 peer P3
103 rr_roster(s_st, ROOM, P4, NOW, TTL, out); if inlist(out, 1, P3)!=0 { r3=0 }
104 pass = pass + g_check("ISOLATION: other room sees none of this room's channels" as *u8, r3); total=total+1
105
106 // 4) NO CROSS-CHANNEL BLEED (neg) -- each channel carries only its own payload for P1
107 var r4: i64 = 1
108 let bs: i64 = chan_byte0(s_st, s_ar, SBS, ROOM, P1, NOW, TTL) // state -> 'P' 0x50
109 let bc: i64 = chan_byte0(c_st, c_ar, SBC, ROOM, P1, NOW, TTL) // chat -> 'h' 104
110 let ba: i64 = chan_byte0(a_st, a_ar, SBA, ROOM, P1, NOW, TTL) // audio -> 200
111 let bv: i64 = chan_byte0(v_st, v_ar, SBV, ROOM, P1, NOW, TTL) // video -> 50
112 if bs != 0x50 { r4=0 }
113 if bc != 104 { r4=0 }
114 if ba != 200 { r4=0 }
115 if bv != 50 { r4=0 }
116 pass = pass + g_check("NO BLEED: state/chat/audio/video each carry own payload" as *u8, r4); total=total+1
117
118 // 5) ANTI-TAUTOLOGY / ghost (neg) -- distinct rooms carry distinct state; ghost absent
119 var r5: i64 = 1
120 let s3: i64 = rr_live(s_st, ROOM2, P3, NOW, TTL)
121 if s3 < 0 { r5=0 } else { ps_unpack((s_ar + s3*SBS) as *u8, rr_flen(s_st,s3), dec); if dec[0]!=77 {r5=0} }
122 if dec[0]==11 { r5=0 } // ROOM2 state (77) != ROOM state (11)
123 if rr_find(s_st, ROOM, 99) >= 0 { r5=0 } // ghost peer 99 absent
124 pass = pass + g_check("anti-tautology: distinct rooms distinct state; ghost absent" as *u8, r5); total=total+1
125
126 g_puts("---- game-room gate: passed " as *u8); g_pn(pass); g_puts(" / " as *u8); g_pn(total); g_puts(" ----\n" as *u8)
127 if pass == total { g_puts("verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
128 g_puts("verdict=RED\n" as *u8); sys_exit(1); return 1
129}