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}