nx_desktop_craft.nx source
↩ module page · 217 lines · 9007 B
1// nx_desktop_craft.nx -- NISHI CRAFT native: the generated 3D voxel world in a real desktop window,
2// ZERO wasm / ZERO JS / ZERO third-party anything -- the same nx_wasm_craft organ the browser page
3// runs, on the shared nx_desktop_game surface. This is the no-webassembly path the operator asked
4// for; the Nishi Browser launches exactly this binary when a page carries the nishi-game marker.
5// `nx_desktop_craft selftest` proves the whole pipeline against the real X server with no human.
6// license_tier: ORIGINAL
7import "nx_syscalls.nx"
8import "nx_wasm_craft.nx"
9import "nx_desktop_game.nx"
10const K_MAGIC_1000000: i64 = 1000000
11const K_MAGIC_4096: i64 = 4096
12const K_MAGIC_20260728: i64 = 20260728
13const K_MAGIC_40000: i64 = 40000
14const K_MAGIC_3000: i64 = 3000
15
16func dcw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
17func dcn(v: i64) -> i64 {
18 let t: *u8 = sys_mmap(32) as *u8
19 var m: i64 = v; var w2: i64 = 0
20 if m<0 { t[w2]=45 as u8; w2=w2+1; m=0-m }
21 if m==0 { t[w2]=48 as u8; sys_write(1,t,w2+1); return 0 }
22 let d: *u8 = sys_mmap(32) as *u8
23 var k: i64=0
24 while m>0 { d[k]=(48+(m%10)) as u8; m=m/10; k=k+1 }
25 var j: i64=0
26 while j<k { t[w2]=d[k-1-j]; w2=w2+1; j=j+1 }
27 sys_write(1,t,w2); return 0
28}
29
30// world persistence: the save IMAGE is built/validated by the organ; this surface only moves bytes
31func dc_save_world(base: i64) -> i64 {
32 let n: i64 = wc_save_build(base)
33 let fd: i64 = sys_openat_wr("knowledge/nx_craft_world.sav\x00" as *u8, 0x1a4)
34 if fd < 0 { return 0 - 1 }
35 var off: i64 = 0
36 while off < n {
37 let w2: i64 = sys_write(fd, ((base + O_SAVE + off)) as *u8, n - off)
38 if w2 <= 0 { sys_close(fd); return 0 - 1 }
39 off = off + w2
40 }
41 sys_close(fd)
42 return n
43}
44func dc_load_world(base: i64) -> i64 {
45 let lp: *i64 = sys_mmap(16) as *i64
46 let buf: *u8 = sys_read_file("knowledge/nx_craft_world.sav\x00" as *u8, lp)
47 if lp[0] != SAVE_LEN { return 0 - 1 }
48 let dst: *u8 = (base + O_SAVE) as *u8
49 var i: i64 = 0
50 while i < SAVE_LEN { dst[i] = buf[i]; i = i + 1 }
51 return wc_save_apply(base)
52}
53
54func dc_ms(ts: *i64) -> i64 {
55 sys_clock_gettime_mono(ts)
56 return ts[0]*1000 + ts[1]/K_MAGIC_1000000
57}
58
59func main(argc: i64, argv: *i64) -> i64 {
60 var selftest: i64 = 0
61 var bench: i64 = 0
62 if argc > 1 {
63 let a1: *u8 = argv[1] as *u8
64 if a1[0] == 0x73 { selftest = 1 }
65 if a1[0] == 0x62 { bench = 1 }
66 }
67 if bench == 1 {
68 // NATIVE RENDER BENCH: the honest numbers for the fast surface (no window, pure CPU)
69 let bb: i64 = sys_mmap(CRAFT_BYTES + K_MAGIC_4096) as i64
70 init_impl(bb, K_MAGIC_20260728)
71 let sb: *i64 = wst(bb)
72 var qq: i64 = 1
73 while qq <= 2 {
74 sb[S_Q] = qq
75 var wu: i64 = 0
76 while wu < 3 { render_impl(bb); wu = wu + 1 }
77 let tsb: *i64 = sys_mmap(32) as *i64
78 let t0: i64 = dc_ms(tsb)
79 var fr: i64 = 0
80 while fr < 40 { step_impl(bb); render_impl(bb); fr = fr + 1 }
81 let t1: i64 = dc_ms(tsb)
82 dcw("BENCH q=" as *u8); dcn(qq)
83 dcw(" 40 frames in " as *u8); dcn(t1 - t0)
84 dcw("ms = " as *u8); dcn((t1 - t0)/40)
85 dcw("ms/frame (" as *u8)
86 var fps: i64 = 0
87 if t1 > t0 { fps = K_MAGIC_40000/(t1 - t0) }
88 dcn(fps); dcw(" fps)\n" as *u8)
89 qq = qq + 1
90 }
91 return 0
92 }
93 let sout: *i64 = sys_mmap(64) as *i64
94 if dg_setup("NISHI CRAFT - SOVEREIGN 3D NATIVE" as *u8, 33, W, H, sout) < 0 {
95 dcw("nx_desktop_craft: X11 setup failed\n" as *u8)
96 return 2
97 }
98 let conn: *X11Conn = sout[0] as *X11Conn
99 let wid: i64 = sout[1]
100 let gc: i64 = sout[2]
101 let frc: i64 = sout[3]
102 let vk_table: *i64 = sys_mmap(NX_X11_KEYMAP_N*8) as *i64
103 let kpk: i64 = nx_x11_load_keymap(conn, vk_table)
104
105 let base: i64 = sys_mmap(CRAFT_BYTES + K_MAGIC_4096) as i64
106 init_impl(base, K_MAGIC_20260728)
107 if selftest == 0 {
108 if dc_load_world(base) == 0 { dcw("world loaded from knowledge/nx_craft_world.sav\n" as *u8) }
109 }
110 let s: *i64 = wst(base)
111 let zbuf: *u8 = sys_mmap(W*H*4 + K_MAGIC_4096)
112 let ev: *u8 = sys_mmap(64)
113 let pfd: *u8 = sys_mmap(16)
114 let mctx: *i64 = sys_mmap(64) as *i64
115
116 if selftest == 1 {
117 var pass: i64 = 0
118 let total: i64 = 7
119 dcw("=== nx_desktop_craft selftest (native 3D world, REAL X server, no wasm) ===\n" as *u8)
120 dcw("S1 setup flush rc=" as *u8); dcn(frc)
121 dcw(" depth=" as *u8); dcn(conn.root_depth); dcw("\n" as *u8)
122 if frc == 0 { pass = pass + 1 }
123
124 let kc_w: i64 = dg_kc_for(vk_table, 87)
125 let kc_e: i64 = dg_kc_for(vk_table, 69)
126 dcw("S2 keymap kpk=" as *u8); dcn(kpk)
127 dcw(" keycode(w)=" as *u8); dcn(kc_w)
128 dcw(" keycode(e)=" as *u8); dcn(kc_e); dcw("\n" as *u8)
129 if kpk > 0 { if kc_w > 0 { if kc_e > 0 { pass = pass + 1 } } }
130
131 render_impl(base)
132 let pout: *i64 = sys_mmap(64) as *i64
133 let prc: i64 = dg_prove_surface(conn, wid, gc, wfb(base), W, H, zbuf, pout)
134 dcw("S3 blit bands=" as *u8); dcn(pout[0])
135 dcw(" flush rc=" as *u8); dcn(pout[1]); dcw("\n" as *u8)
136 if prc == 0 { if pout[0] > 0 { if pout[1] == 0 { pass = pass + 1 } } }
137 dcw("S4 round-trip bytes=" as *u8); dcn(pout[2])
138 dcw(" mismatched-BGR=" as *u8); dcn(pout[3])
139 dcw("/" as *u8); dcn(W*H*3); dcw("\n" as *u8)
140 if pout[2] >= W*H*4 { if pout[3] == 0 { pass = pass + 1 } }
141
142 // S5 a synthetic 'w' through the REAL server walks the camera via the same path a finger uses
143 let z0: i64 = s[S_CZ]
144 nx_x11_send_key(conn, wid, kc_w, 1)
145 dg_poll_in(pfd, conn.fd, 300)
146 dg_pump2(conn, wid, W, H, winp(base), ev, pfd, vk_table, mctx)
147 var f2: i64 = 0
148 while f2 < 5 { step_impl(base); f2 = f2 + 1 }
149 let z1: i64 = s[S_CZ]
150 nx_x11_send_key(conn, wid, kc_w, 0)
151 dg_poll_in(pfd, conn.fd, 300)
152 dg_pump2(conn, wid, W, H, winp(base), ev, pfd, vk_table, mctx)
153 step_impl(base)
154 let z2: i64 = s[S_CZ]
155 dcw("S5 synthetic-w camz " as *u8); dcn(z0)
156 dcw(" -> " as *u8); dcn(z1)
157 dcw(" release-> " as *u8); dcn(z2); dcw("\n" as *u8)
158 if z1 != z0 { if z2 == z1 { pass = pass + 1 } }
159
160 // S6 MOUSELOOK through the REAL server: two synthetic MotionNotify events (init + delta)
161 // -> relative delta into the look channel -> step turns the camera
162 let yaw0: i64 = s[S_YAW]
163 nx_x11_send_motion(conn, wid, W/2, H/2)
164 nx_x11_send_motion(conn, wid, W/2 + 40, H/2 + 10)
165 dg_poll_in(pfd, conn.fd, 300)
166 dg_pump2(conn, wid, W, H, winp(base), ev, pfd, vk_table, mctx)
167 step_impl(base)
168 let yaw1: i64 = s[S_YAW]
169 dcw("S6 synthetic-motion yaw " as *u8); dcn(yaw0)
170 dcw(" -> " as *u8); dcn(yaw1)
171 dcw(" (delta " as *u8); dcn(yaw1 - yaw0); dcw(", want 240)\n" as *u8)
172 if yaw1 - yaw0 == 240 { pass = pass + 1 }
173
174 // S7 PERSISTENCE through the FILE surface: edit -> save -> fresh world -> load -> edit is back
175 s[S_PITCH] = 0 - K_MAGIC_3000
176 apply2_impl(base, 0, 0, 0, 0, 0, 0, 0, 0, 0)
177 tick_impl(base, 4)
178 let shx: i64 = s[S_HX]
179 let shy: i64 = s[S_HY]
180 let shz: i64 = s[S_HZ]
181 let sn: i64 = dc_save_world(base)
182 init_impl(base, K_MAGIC_20260728)
183 let gone: i64 = vget(base, shx, shy, shz)
184 let lrc: i64 = dc_load_world(base)
185 let backv: i64 = vget(base, shx, shy, shz)
186 dcw("S7 save n=" as *u8); dcn(sn)
187 dcw(" fresh-had=" as *u8); dcn(gone)
188 dcw(" load rc=" as *u8); dcn(lrc)
189 dcw(" after-load=" as *u8); dcn(backv)
190 dcw(" broken=" as *u8); dcn(s[S_BROKEN]); dcw(" (edit must survive)\n" as *u8)
191 if sn > 0 { if gone != 0 { if lrc == 0 { if backv == 0 { if s[S_BROKEN] == 1 {
192 pass = pass + 1 } } } } }
193
194 dcw("nx_desktop_craft selftest: " as *u8); dcn(pass); dcw("/" as *u8); dcn(total); dcw("\n" as *u8)
195 if pass == total {
196 dcw("VERDICT GREEN -- the generated 3D world runs NATIVE in a desktop window, no wasm\n" as *u8)
197 sys_exit(0)
198 }
199 dcw("VERDICT RED\n" as *u8)
200 sys_exit(1)
201 }
202
203 dcw("NISHI CRAFT native window up (WASD move, MOUSE look, L/R-click break/place, space jump, ESC quits)\n" as *u8)
204 var quit: i64 = 0
205 while quit == 0 {
206 quit = dg_pump2(conn, wid, W, H, winp(base), ev, pfd, vk_table, mctx)
207 if quit == 0 {
208 step_impl(base)
209 render_impl(base)
210 if dg_blit(conn, wid, gc, wfb(base), W, H, zbuf) < 0 { quit = 1 }
211 dg_poll_in(pfd, conn.fd, DG_FRAME_MS)
212 }
213 }
214 if dc_save_world(base) > 0 { dcw("world saved to knowledge/nx_craft_world.sav\n" as *u8) }
215 dcw("bye\n" as *u8)
216 return 0
217}