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}