code wiki / _hdl_build / nx_game_room_gate.nx
nx_game_room_gate.nx source
↩ module page · 137 lines · 7906 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"
18import "nx_gate_verdict.nx"
19
20func setf(f: *i64, x: i64, y: i64, z: i64, yaw: i64, pitch: i64, sp: i64, caught: i64, act: i64, anim: i64, flags: i64) -> i64 {
21 f[0]=x; f[1]=y; f[2]=z; f[3]=yaw; f[4]=pitch
22 f[5]=sp; f[6]=caught; f[7]=act; f[8]=anim; f[9]=flags
23 return 0
24}
25func inlist(out: *i64, c: i64, id: i64) -> i64 {
26 var i: i64 = 0; while i < c { if out[i] == id { return 1 } i = i + 1 }
27 return 0
28}
29// first byte of a target peer's latest frame on a channel, or -1 if absent/stale
30func chan_byte0(st: *i64, arena: *u8, sb: i64, rm: i64, pr: i64, now: i64, ttl: i64) -> i64 {
31 let s: i64 = rr_live(st, rm, pr, now, ttl)
32 if s < 0 { return 0 - 1 }
33 return (arena[s*sb] as i64)
34}
35
36func main() -> i64 {
37 g_puts("nx_game_room gate (unified sovereign game+comms room: state+chat+audio+video)\n" as *u8)
38 var pass: i64 = 0; var total: i64 = 0
39
40 let N: i64 = 8
41 let SBS: i64 = 64 // state
42 let SBC: i64 = 128 // chat
43 let SBA: i64 = 256 // audio
44 let SBV: i64 = 512 // video
45 // four independent channel relays
46 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)
47 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)
48 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)
49 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)
50
51 let ROOM: i64 = 0x6A37
52 let ROOM2: i64 = 0x1234
53 let NOW: i64 = 1000; let TTL: i64 = 8000
54
55 // payload buffers
56 let p1: *u8 = sys_mmap(SBS); let f1: *i64 = sys_mmap(10*8) as *i64
57 setf(f1, 11, 4, 22, 64, 0, 2, 1, 0, 0, 0); ps_pack(p1, f1) // P1 game-state
58 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 }
59 let aud1: *u8 = sys_mmap(SBA); i=0; while i<20 { aud1[i]=(200+i) as u8; i=i+1 } // PCM-ish
60 let vid1: *u8 = sys_mmap(SBV); i=0; while i<30 { vid1[i]=(50+i) as u8; i=i+1 } // video frame
61 let chat2: *u8 = sys_mmap(SBC); chat2[0]=121 as u8; chat2[1]=111 as u8 // "yo"
62 let p3: *u8 = sys_mmap(SBS); let f3: *i64 = sys_mmap(10*8) as *i64
63 setf(f3, 77, 4, 5, 0, 0, 3, 0, 0, 0, 0); ps_pack(p3, f3) // P3 state (other room)
64
65 let P1: i64=1; let P2: i64=2; let P3: i64=3; let P4: i64=4; let P5: i64=5
66
67 // P1 "does all": post into all four channels of ROOM
68 rr_post(s_st, s_ar, ROOM, P1, NOW, 1, p1, 28)
69 rr_post(c_st, c_ar, ROOM, P1, NOW, 1, chat1, 8)
70 rr_post(a_st, a_ar, ROOM, P1, NOW, 1, aud1, 20)
71 rr_post(v_st, v_ar, ROOM, P1, NOW, 1, vid1, 30)
72 // P2 "chat only" in ROOM
73 rr_post(c_st, c_ar, ROOM, P2, NOW, 1, chat2, 2)
74 // P3 state-only in ROOM2 (the other room)
75 rr_post(s_st, s_ar, ROOM2, P3, NOW, 1, p3, 28)
76
77 let out: *i64 = sys_mmap(N*8) as *i64
78 let dec: *i64 = sys_mmap(10*8) as *i64
79
80 // 1) UNIFIED -- P4 (in ROOM) reads game-state + chat + audio + video
81 var r1: i64 = 1
82 let cs: i64 = rr_roster(s_st, ROOM, P4, NOW, TTL, out); if cs != 1 { r1=0 } else { if out[0]!=P1 {r1=0} }
83 let sB: i64 = rr_live(s_st, ROOM, P1, NOW, TTL)
84 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} }
85 let cc: i64 = rr_roster(c_st, ROOM, P4, NOW, TTL, out); if cc != 2 { r1=0 }
86 let ca: i64 = rr_roster(a_st, ROOM, P4, NOW, TTL, out); if ca != 1 { r1=0 }
87 let cv: i64 = rr_roster(v_st, ROOM, P4, NOW, TTL, out); if cv != 1 { r1=0 }
88 pass = pass + g_check("UNIFIED: one room delivers state+chat+audio+video" as *u8, r1); total=total+1
89
90 // 2) SELECTIVE -- chat-only P2 is in chat roster but NOT audio/video (opt-in per channel)
91 var r2: i64 = 1
92 rr_roster(c_st, ROOM, P4, NOW, TTL, out); if inlist(out, 2, P2)!=1 { r2=0 }
93 rr_roster(a_st, ROOM, P4, NOW, TTL, out); if inlist(out, 1, P2)!=0 { r2=0 }
94 rr_roster(v_st, ROOM, P4, NOW, TTL, out); if inlist(out, 1, P2)!=0 { r2=0 }
95 pass = pass + g_check("SELECTIVE: chat-only peer absent from audio/video (opt-in)" as *u8, r2); total=total+1
96
97 // 3) ISOLATION (neg) -- P5 in ROOM2 sees only ROOM2's state (P3), none of ROOM's channels
98 var r3: i64 = 1
99 let s2: i64 = rr_roster(s_st, ROOM2, P5, NOW, TTL, out); if s2!=1 { r3=0 } else { if out[0]!=P3 {r3=0} }
100 if rr_roster(c_st, ROOM2, P5, NOW, TTL, out)!=0 { r3=0 }
101 if rr_roster(a_st, ROOM2, P5, NOW, TTL, out)!=0 { r3=0 }
102 if rr_roster(v_st, ROOM2, P5, NOW, TTL, out)!=0 { r3=0 }
103 // and ROOM's state roster must NOT contain the ROOM2 peer P3
104 rr_roster(s_st, ROOM, P4, NOW, TTL, out); if inlist(out, 1, P3)!=0 { r3=0 }
105 pass = pass + g_check("ISOLATION: other room sees none of this room's channels" as *u8, r3); total=total+1
106
107 // 4) NO CROSS-CHANNEL BLEED (neg) -- each channel carries only its own payload for P1
108 var r4: i64 = 1
109 let bs: i64 = chan_byte0(s_st, s_ar, SBS, ROOM, P1, NOW, TTL) // state -> 'P' 0x50
110 let bc: i64 = chan_byte0(c_st, c_ar, SBC, ROOM, P1, NOW, TTL) // chat -> 'h' 104
111 let ba: i64 = chan_byte0(a_st, a_ar, SBA, ROOM, P1, NOW, TTL) // audio -> 200
112 let bv: i64 = chan_byte0(v_st, v_ar, SBV, ROOM, P1, NOW, TTL) // video -> 50
113 if bs != 0x50 { r4=0 }
114 if bc != 104 { r4=0 }
115 if ba != 200 { r4=0 }
116 if bv != 50 { r4=0 }
117 pass = pass + g_check("NO BLEED: state/chat/audio/video each carry own payload" as *u8, r4); total=total+1
118
119 // 5) ANTI-TAUTOLOGY / ghost (neg) -- distinct rooms carry distinct state; ghost absent
120 var r5: i64 = 1
121 let s3: i64 = rr_live(s_st, ROOM2, P3, NOW, TTL)
122 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} }
123 if dec[0]==11 { r5=0 } // ROOM2 state (77) != ROOM state (11)
124 if rr_find(s_st, ROOM, 99) >= 0 { r5=0 } // ghost peer 99 absent
125 pass = pass + g_check("anti-tautology: distinct rooms distinct state; ghost absent" as *u8, r5); total=total+1
126
127 g_puts("---- game-room gate: passed " as *u8); g_pn(pass); g_puts(" / " as *u8); g_pn(total); g_puts(" ----\n" as *u8)
128 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
129 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
130 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
131 let ctr__dry: *i64 = gv_ctr()
132 ctr__dry[0] = pass
133 ctr__dry[1] = total
134 let rc__dry: i64 = gv_verdict("GAME-ROOM-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8)
135 sys_exit(rc__dry)
136 return rc__dry
137}