code wiki / (root) / nx_desktop_breeders.nx

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}