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}