code wiki / _hdl_build / nx_wasm_mineworld_mp_gate.nx

nx_wasm_mineworld_mp_gate.nx source

↩ module page · 144 lines · 6687 B

1// nx_wasm_mineworld_mp_gate.nx -- NATIVE gate for MineWorld MULTIPLAYER (GTA-online rung 1): peer avatars + 2// the FULL netstate/relay round-trip, composing the PROVEN pets stack (nx_pets_netstate frames + nx_room_relay 3// rr_* + nx_mp_relay roster serialization = exactly what nx_mp_serve runs live). 4// T1 AVATAR RENDER: a set peer changes the frame; peers_clear restores it byte-identical. 5// T2 RELAY ROUND-TRIP: A+B post packed frames into room 42; A's roster = exactly B's record; unpack == posted. 6// T3 INGEST->RENDER: the roster body fed through net_ingest_roster_at -> peer table == B -> avatar visible 7// (frame differs; PNG knowledge/nx_mineworld_mp.png for the eyeball). 8// T4 LIAR-KILL: corrupt magic -> frame REJECTED, 0 peers, frame back to baseline. 9// T5 NEGATIVE-COORD round-trip: an infinite-world west-of-origin position survives pack->relay->unpack exact. 10// license_tier: ORIGINAL expect_exit: 0 11import "nx_syscalls.nx" 12import "nx_f32_hw.nx" 13import "nx_png.nx" 14import "nx_wasm_mineworld.nx" 15import "nx_mp_relay.nx" 16 17func hw(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 18func pn(v: i64) -> i64 { 19 let b: *u8 = sys_mmap(32) as *u8 20 var x: i64 = v 21 var neg: i64 = 0 22 if x < 0 { neg = 1; x = 0 - x } 23 var i: i64 = 31 24 if x == 0 { b[i] = 48 as u8; i = i - 1 } 25 while x > 0 { b[i] = (48 + x % 10) as u8; x = x / 10; i = i - 1 } 26 if neg == 1 { b[i] = 45 as u8; i = i - 1 } 27 sys_write(1, (b as i64 + i + 1) as *u8, 31 - i) 28 return 0 29} 30func fbsum(base: i64) -> i64 { 31 let fb: *i64 = (base + fb_off()) as *i64 32 var s: i64 = 0 33 var i: i64 = 0 34 while i < ww() * hh() { s = s * 31 + fb[i]; i = i + 1 } 35 return s 36} 37func rend(base: i64, cgx: i64, cgz: i64) -> i64 { 38 let eye: i64 = terrain_h0(cgx, cgz) + 8 39 let camx256: i64 = cgx * 256 + 128 40 let camy256: i64 = eye * 256 41 let camz256: i64 = cgz * 256 + 128 42 let camx: i64 = f32_div(f32_of(camx256), f32_of(256)) 43 let camy: i64 = f32_div(f32_of(camy256), f32_of(256)) 44 let camz: i64 = f32_div(f32_of(camz256), f32_of(256)) 45 build_R(base, 1000, 0, 927, 0 - 375) 46 render_at(base, camx, camy, camz, cgx, cgz) 47 return 0 48} 49 50func main() -> i64 { 51 let base: i64 = sys_mmap(mem_bytes()) as i64 52 var fails: i64 = 0 53 54 // peer B's true state: ahead of the (30,30) camera, feet on the ground at (30,38) 55 let xB: i64 = 30 * 256 + 128 56 let yB: i64 = terrain_h0(30, 38) * 256 + 410 57 let zB: i64 = 38 * 256 + 128 58 let wB: i64 = 777 59 60 // ---- T1 avatar render + clear ---- 61 rend(base, 30, 30) 62 let c0: i64 = fbsum(base) 63 peer_set_at(base, 0, xB, yB, zB, wB) 64 rend(base, 30, 30) 65 let c1: i64 = fbsum(base) 66 peers_clear_at(base) 67 rend(base, 30, 30) 68 let c2: i64 = fbsum(base) 69 if c1 != c0 { if c2 == c0 { hw("T1 PASS avatar renders + clears (frame differs, restores byte-identical)\n" as *u8) } } 70 if c1 == c0 { hw("T1 FAIL avatar not visible\n" as *u8); fails = fails + 1 } 71 if c2 != c0 { hw("T1 FAIL peers_clear left state\n" as *u8); fails = fails + 1 } 72 73 // ---- T2 relay round-trip (the live nx_mp_serve stack, in-process) ---- 74 let N: i64 = 64 75 let SB: i64 = 64 76 let st: *i64 = sys_mmap((2 + 5 * N) * 8) as *i64 77 let arena: *u8 = sys_mmap(N * SB) 78 rr_init(st, N, SB) 79 let f: *i64 = sys_mmap(10 * 8) as *i64 80 let bufA: *u8 = sys_mmap(64) 81 let bufB: *u8 = sys_mmap(64) 82 f[0] = 111; f[1] = 222; f[2] = 333; f[3] = 44; f[4] = 55; f[5] = 0; f[6] = 0; f[7] = 0; f[8] = 0; f[9] = 0 83 ps_pack(bufA, f) 84 f[0] = xB; f[1] = yB; f[2] = zB; f[3] = wB; f[4] = 0 - 130 85 ps_pack(bufB, f) 86 rr_post(st, arena, 42, 1, 1000, 1000, bufA, 28) 87 rr_post(st, arena, 42, 2, 1000, 1000, bufB, 28) 88 let body: *u8 = sys_mmap(4096) 89 let bl: i64 = mp_roster_body(st, arena, SB, 42, 1, 1000, 8000, body) 90 var t2: i64 = 1 91 if bl != 29 { hw("T2 sub: roster bytes=" as *u8); pn(bl); hw(" want 29\n" as *u8); t2 = 0 } 92 if mp_roster_count(body, bl) != 1 { t2 = 0 } 93 let g: *i64 = sys_mmap(10 * 8) as *i64 94 if ps_unpack((body as i64 + 1) as *u8, 28, g) != 1 { t2 = 0 } 95 if g[0] != xB { t2 = 0 } 96 if g[1] != yB { t2 = 0 } 97 if g[2] != zB { t2 = 0 } 98 if g[3] != wB { t2 = 0 } 99 if g[4] != 0 - 130 { t2 = 0 } 100 if t2 == 1 { hw("T2 PASS relay round-trip: A's roster = exactly B's frame (incl negative pitch)\n" as *u8) } 101 else { hw("T2 FAIL relay round-trip\n" as *u8); fails = fails + 1 } 102 103 // ---- T3 ingest -> peer table -> render ---- 104 let inb: *u8 = (base + net_in_off()) as *u8 105 var k: i64 = 0 106 while k < bl { inb[k] = body[k]; k = k + 1 } 107 let nset: i64 = net_ingest_roster_at(base, bl) 108 var t3: i64 = 1 109 if nset != 1 { hw("T3 sub: ingested=" as *u8); pn(nset); hw(" want 1\n" as *u8); t3 = 0 } 110 rend(base, 30, 30) 111 let c3: i64 = fbsum(base) 112 if c3 == c0 { hw("T3 sub: ingested avatar not visible\n" as *u8); t3 = 0 } 113 if c3 != c1 { hw("T3 sub: ingested frame != direct peer_set frame\n" as *u8); t3 = 0 } 114 write_png((base + fb_off()) as *i64, ww(), hh(), "knowledge/nx_mineworld_mp.png" as *u8) 115 if t3 == 1 { hw("T3 PASS roster ingest -> avatar renders (frame == direct-set frame) + PNG\n" as *u8) } 116 else { hw("T3 FAIL ingest\n" as *u8); fails = fails + 1 } 117 118 // ---- T4 liar-kill: corrupt magic -> rejected ---- 119 inb[1] = 88 as u8 // 'X' breaks PS_MAGIC1 120 let nbad: i64 = net_ingest_roster_at(base, bl) 121 rend(base, 30, 30) 122 let c4: i64 = fbsum(base) 123 if nbad == 0 { if c4 == c0 { hw("T4 PASS bad-magic frame rejected (0 peers, baseline frame)\n" as *u8) } } 124 if nbad != 0 { hw("T4 FAIL bad frame accepted\n" as *u8); fails = fails + 1 } 125 if c4 != c0 { hw("T4 FAIL frame not baseline after reject\n" as *u8); fails = fails + 1 } 126 127 // ---- T5 negative-coord round-trip (infinite world west/south of origin) ---- 128 f[0] = 0 - 99999; f[1] = 2560; f[2] = 0 - 5; f[3] = 0 - 314; f[4] = 0 129 ps_pack(bufA, f) 130 rr_post(st, arena, 43, 7, 2000, 2000, bufA, 28) 131 let bl2: i64 = mp_roster_body(st, arena, SB, 43, 99, 2000, 8000, body) 132 var t5: i64 = 1 133 if bl2 != 29 { t5 = 0 } 134 if ps_unpack((body as i64 + 1) as *u8, 28, g) != 1 { t5 = 0 } 135 if g[0] != 0 - 99999 { t5 = 0 } 136 if g[2] != 0 - 5 { t5 = 0 } 137 if g[3] != 0 - 314 { t5 = 0 } 138 if t5 == 1 { hw("T5 PASS negative-coord state survives pack->relay->unpack exact\n" as *u8) } 139 else { hw("T5 FAIL negative-coord round-trip\n" as *u8); fails = fails + 1 } 140 141 if fails == 0 { hw("VERDICT GREEN: mineworld-mp 5/5 (PNG knowledge/nx_mineworld_mp.png)\n" as *u8) } 142 else { hw("VERDICT RED fails=" as *u8); pn(fails); hw("\n" as *u8) } 143 return fails 144}