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}