nx_desktop_breeders.nx source
↩ module page · 121 lines · 4974 B
1// nx_desktop_breeders.nx -- F1105 platform-desktop-native rung 1: an INTERACTIVE WINDOWED SOVEREIGN
2// CLIENT. NISHI BREEDERS in a real desktop window (WSLg/X11) with live keyboard play -- no browser,
3// no JS, no libX11, no wasm. MIGRATED onto the shared nx_desktop_game surface the moment a second
4// native client (craft) needed the same machinery; acceptance = this selftest's 5/5 held bit-for-bit
5// (S4 zero-mismatch round trip, S5 synthetic-d px 176->206).
6// license_tier: ORIGINAL
7import "nx_syscalls.nx"
8import "nx_wasm_breeders.nx"
9import "nx_desktop_game.nx"
10const K_MAGIC_20260727: i64 = 20260727
11const K_MAGIC_4096: i64 = 4096
12
13func dbw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
14func dbn(v: i64) -> i64 {
15 let t: *u8 = sys_mmap(32) as *u8
16 var m: i64 = v; var w2: i64 = 0
17 if m<0 { t[w2]=45 as u8; w2=w2+1; m=0-m }
18 if m==0 { t[w2]=48 as u8; sys_write(1,t,w2+1); return 0 }
19 let d: *u8 = sys_mmap(32) as *u8
20 var k: i64=0
21 while m>0 { d[k]=(48+(m%10)) as u8; m=m/10; k=k+1 }
22 var j: i64=0
23 while j<k { t[w2]=d[k-1-j]; w2=w2+1; j=j+1 }
24 sys_write(1,t,w2); return 0
25}
26
27func main(argc: i64, argv: *i64) -> i64 {
28 var selftest: i64 = 0
29 if argc > 1 {
30 let a1: *u8 = argv[1] as *u8
31 if a1[0] == 0x73 { selftest = 1 }
32 }
33 let sout: *i64 = sys_mmap(64) as *i64
34 if dg_setup("NISHI BREEDERS - SOVEREIGN DESKTOP" as *u8, 34, W, H, sout) < 0 {
35 dbw("nx_desktop_breeders: X11 setup failed\n" as *u8)
36 return 2
37 }
38 let conn: *X11Conn = sout[0] as *X11Conn
39 let wid: i64 = sout[1]
40 let gc: i64 = sout[2]
41 let frc: i64 = sout[3]
42 let vk_table: *i64 = sys_mmap(NX_X11_KEYMAP_N*8) as *i64
43 let kpk: i64 = nx_x11_load_keymap(conn, vk_table)
44
45 let base: i64 = sys_mmap(WORDS*8) as i64
46 init_impl(base, K_MAGIC_20260727)
47 let s: *i64 = st(base)
48 let zbuf: *u8 = sys_mmap(W*H*4 + K_MAGIC_4096)
49 let ev: *u8 = sys_mmap(64)
50 let pfd: *u8 = sys_mmap(16)
51
52 if selftest == 1 {
53 var pass: i64 = 0
54 let total: i64 = 5
55 dbw("=== nx_desktop_breeders selftest (REAL X server, no human) ===\n" as *u8)
56 dbw("S1 connect+window+map flush rc=" as *u8); dbn(frc)
57 dbw(" depth=" as *u8); dbn(conn.root_depth)
58 dbw(" maxreq=" as *u8); dbn(conn.max_req_words); dbw("\n" as *u8)
59 if frc == 0 { pass = pass + 1 }
60
61 let kc_d: i64 = dg_kc_for(vk_table, 68)
62 let kc_w: i64 = dg_kc_for(vk_table, 87)
63 dbw("S2 keymap kpk=" as *u8); dbn(kpk)
64 dbw(" keycode(d)=" as *u8); dbn(kc_d)
65 dbw(" keycode(w)=" as *u8); dbn(kc_w); dbw("\n" as *u8)
66 if kpk > 0 { if kc_d > 0 { if kc_w > 0 { pass = pass + 1 } } }
67
68 render_impl(base)
69 let pout: *i64 = sys_mmap(64) as *i64
70 let prc: i64 = dg_prove_surface(conn, wid, gc, fb(base), W, H, zbuf, pout)
71 dbw("S3 blit bands=" as *u8); dbn(pout[0])
72 dbw(" post-blit flush rc=" as *u8); dbn(pout[1]); dbw("\n" as *u8)
73 if prc == 0 { if pout[0] > 0 { if pout[1] == 0 { pass = pass + 1 } } }
74 dbw("S4 get-image bytes=" as *u8); dbn(pout[2])
75 dbw(" mismatched-BGR-bytes=" as *u8); dbn(pout[3])
76 dbw("/" as *u8); dbn(W*H*3); dbw("\n" as *u8)
77 if pout[2] >= W*H*4 { if pout[3] == 0 { pass = pass + 1 } }
78
79 // S5 synthetic 'd' through the REAL server drives the player through the SAME event path
80 let x0: i64 = s[S_PX]
81 nx_x11_send_key(conn, wid, kc_d, 1)
82 dg_poll_in(pfd, conn.fd, 300)
83 dg_pump(conn, inp(base), ev, pfd, vk_table)
84 var f2: i64 = 0
85 while f2 < 5 { step_impl(base); f2 = f2 + 1 }
86 let x1: i64 = s[S_PX]
87 nx_x11_send_key(conn, wid, kc_d, 0)
88 dg_poll_in(pfd, conn.fd, 300)
89 dg_pump(conn, inp(base), ev, pfd, vk_table)
90 step_impl(base)
91 step_impl(base)
92 let x2: i64 = s[S_PX]
93 dbw("S5 synthetic-d px " as *u8); dbn(x0)
94 dbw(" -> " as *u8); dbn(x1)
95 dbw(" release-> " as *u8); dbn(x2); dbw("\n" as *u8)
96 if x1 > x0 { if x2 == x1 { pass = pass + 1 } }
97
98 dbw("nx_desktop_breeders selftest: " as *u8); dbn(pass); dbw("/" as *u8); dbn(total); dbw("\n" as *u8)
99 if pass == total {
100 dbw("VERDICT GREEN -- a sovereign game window on a real desktop, played by the wire\n" as *u8)
101 sys_exit(0)
102 }
103 dbw("VERDICT RED\n" as *u8)
104 sys_exit(1)
105 }
106
107 // interactive: play until ESC or the window dies
108 dbw("NISHI BREEDERS desktop window up (WASD/arrows move, E interact, B breed, ESC quits)\n" as *u8)
109 var quit: i64 = 0
110 while quit == 0 {
111 quit = dg_pump(conn, inp(base), ev, pfd, vk_table)
112 if quit == 0 {
113 step_impl(base)
114 render_impl(base)
115 if dg_blit(conn, wid, gc, fb(base), W, H, zbuf) < 0 { quit = 1 }
116 dg_poll_in(pfd, conn.fd, DG_FRAME_MS)
117 }
118 }
119 dbw("bye\n" as *u8)
120 return 0
121}