code wiki / _hdl_build / nx_game_loop_gate.nx

nx_game_loop_gate.nx source

↩ module page · 102 lines · 4012 B

1// nx_game_loop_gate.nx -- a COMPLETE game loop on the sovereign 3D engine: a player pursues + collects creatures, 2// win when all collected. Scripted playthrough (player steps toward the nearest creature each frame, captures on 3// contact) rendered as a 3x2 sheet -> sovereign PNG. Mirrors the dungeon/tactics "scripted input -> playthrough -> 4// victory" proof, now in 3D. Win frame gets a green banner. exit 0 = ran. license_tier: ORIGINAL 5import "nx_syscalls.nx" 6import "nx_voxel_world.nx" 7import "nx_png.nx" 8 9const SW: i64 = 960 10const SH: i64 = 720 11const NC: i64 = 4 12 13func giabs(a: i64) -> i64 { if a < 0 { return 0 - a } return a } 14func mk(seed: i64, n: i64, water: i64, maxh: i64, latsp: i64, 15 psin: i64, pcos: i64, ysin: i64, ycos: i64, push: i64, focal: i64, style: i64) -> *i64 { 16 let s: *i64 = sys_mmap(12 * 8) as *i64 17 s[0] = seed; s[1] = n; s[2] = water; s[3] = maxh; s[4] = latsp 18 s[5] = psin; s[6] = pcos; s[7] = ysin; s[8] = ycos; s[9] = push; s[10] = focal; s[11] = style 19 return s 20} 21 22func main() -> i64 { 23 let fb: *i64 = sys_mmap(world_fb_bytes()) as *i64 24 let zb: *i64 = sys_mmap(world_fb_bytes()) as *i64 25 let sheet: *i64 = sys_mmap(SW * SH * 8) as *i64 26 var s: i64 = 0 27 while s < SW * SH { sheet[s] = world_sky(); s = s + 1 } 28 let R: *i64 = sys_mmap(128) as *i64 29 let sp: *i64 = mk(7, 14, 1, 6, 4, 574, 819, 574, 819, 24, 300, 0) 30 31 let cx: *i64 = sys_mmap(NC * 8) as *i64 32 let cz: *i64 = sys_mmap(NC * 8) as *i64 33 let cc: *i64 = sys_mmap(NC * 8) as *i64 34 let cap: *i64 = sys_mmap(NC * 8) as *i64 35 cx[0] = 4; cz[0] = 2; cc[0] = 226 + 70 * 256 + 70 * 65536 36 cx[1] = 7; cz[1] = 4; cc[1] = 180 + 90 * 256 + 226 * 65536 37 cx[2] = 3; cz[2] = 6; cc[2] = 240 + 170 * 256 + 60 * 65536 38 cx[3] = 8; cz[3] = 7; cc[3] = 235 + 120 * 256 + 190 * 65536 39 var t: i64 = 0 40 while t < NC { cap[t] = 0; t = t + 1 } 41 var px: i64 = 1 42 var pz: i64 = 1 43 var score: i64 = 0 44 45 var f: i64 = 0 46 while f < 9 { 47 render_world(sp, fb, zb) 48 build_cam(sp, R) 49 var k: i64 = 0 50 while k < NC { 51 if cap[k] == 0 { 52 world_obox(sp, fb, zb, R, cx[k], world_height(sp, cx[k], cz[k]), cz[k], 1, 2, 1, cc[k], 0) 53 } 54 k = k + 1 55 } 56 // player = a bright white pillar. 57 world_obox(sp, fb, zb, R, px, world_height(sp, px, pz), pz, 1, 3, 1, 245 + 245 * 256 + 245 * 65536, 0) 58 // composite frame f. 59 let qx: i64 = (f % 3) * 320 60 let qy: i64 = (f / 3) * 240 61 var y: i64 = 0 62 while y < 240 { 63 var x: i64 = 0 64 while x < 320 { 65 var c: i64 = fb[y * 320 + x] 66 if score >= NC { if y < 12 { c = 40 + 180 * 256 + 70 * 65536 } } // WIN banner 67 sheet[(qy + y) * SW + (qx + x)] = c 68 x = x + 1 69 } 70 y = y + 1 71 } 72 // UPDATE: head toward nearest uncaptured creature (2 steps), capture on contact. 73 var best: i64 = 0 - 1 74 var bestd: i64 = 99999 75 k = 0 76 while k < NC { 77 if cap[k] == 0 { 78 let d: i64 = giabs(px - cx[k]) + giabs(pz - cz[k]) 79 if d < bestd { bestd = d; best = k } 80 } 81 k = k + 1 82 } 83 if best >= 0 { 84 var st: i64 = 0 85 while st < 3 { 86 if px < cx[best] { px = px + 1 } else { 87 if px > cx[best] { px = px - 1 } else { 88 if pz < cz[best] { pz = pz + 1 } else { 89 if pz > cz[best] { pz = pz - 1 } 90 } 91 } 92 } 93 st = st + 1 94 } 95 if px == cx[best] { if pz == cz[best] { cap[best] = 1; score = score + 1 } } 96 } 97 f = f + 1 98 } 99 write_png(sheet, SW, SH, "web_assets/_game_build/game_loop.png" as *u8) 100 if score < NC { return 1 } // GREEN only if the playthrough reached victory 101 return 0 102}