code wiki / _hdl_build / nx_sprite_forge_gate.nx
nx_sprite_forge_gate.nx source
↩ module page · 73 lines · 4357 B
1import "nx_gate_gn.nx"
2import "nx_gate_base.nx"
3// nx_sprite_forge_gate.nx -- proves THE BUILDER (nx_sprite_forge): forge three DISTINCT detailed characters
4// from spec DATA alone (knight / skeleton / mage), 3x-upscaled for a clear look -> knowledge/nx_sprite_forge.png.
5// T1 FORGED + DETAILED: the knight has a steel body + a bright central breastplate ridge (real shading).
6// T2 DATA-DRIVEN VARIETY: same forge, different spec data -> skeleton (bone) and mage (blue robe) read distinct.
7// T3 DETERMINISM: same spec -> identical pixels (no float).
8// expect_exit: 0 license_tier: ORIGINAL
9import "nx_sprite_forge.nx"
10import "nx_png.nx"
11import "nx_syscalls.nx"
12
13func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
14" as *u8); return ok }
15func lum(c: i64) -> i64 { return (c & 255) + ((c>>8)&255) + ((c>>16)&255) }
16
17func main() -> i64 {
18 gw("=== nx_sprite_forge_gate: THE sprite BUILDER -- forge detailed characters from spec data ===\n" as *u8)
19 var pass: i64 = 0; var total: i64 = 0
20 let W: i64 = 220; let H: i64 = 112
21 let fb: *i64 = sys_mmap(W*H*8) as *i64
22 var p: i64 = 0; while p < W*H { fb[p] = gx_rgb(38, 40, 48); p = p + 1 }
23 let buf: *i64 = sys_mmap(64*8) as *i64
24 let fy: i64 = 100
25 let nk: i64 = sf_spec_knight(buf); sf_forge(fb, W, H, 45, fy, buf, nk)
26 let ns: i64 = sf_spec_skeleton(buf); sf_forge(fb, W, H, 110, fy, buf, ns)
27 let nm: i64 = sf_spec_mage(buf); sf_forge(fb, W, H, 175, fy, buf, nm)
28
29 // 3x upscale for a clear eyeball
30 let DW: i64 = W*3; let DH: i64 = H*3
31 let big: *i64 = sys_mmap(DW*DH*8) as *i64
32 var y: i64 = 0
33 while y < H {
34 var x: i64 = 0
35 while x < W {
36 let c: i64 = fb[y*W + x]
37 var oy: i64 = 0
38 while oy < 3 { var ox: i64 = 0; while ox < 3 { big[(y*3+oy)*DW + (x*3+ox)] = c; ox = ox + 1 } oy = oy + 1 }
39 x = x + 1
40 }
41 y = y + 1
42 }
43 write_png(big, DW, DH, "knowledge/nx_sprite_forge.png" as *u8)
44 gw(" (live evidence: PNG knowledge/nx_sprite_forge.png -- knight | skeleton | mage, all from spec data, 3x)\n" as *u8)
45
46 // T1: knight forged + detailed (steel torso + bright central ridge)
47 let kbody: i64 = fb[(fy-45)*W + (45+4)] // steel body, off the central ridge + ab-lines
48 let kridge: i64 = fb[(fy-45)*W + 45] // central breastplate ridge highlight
49 var t1ok: i64=1; if lum(kbody) < 200 {t1ok=0} if lum(kridge) <= lum(kbody) + 40 {t1ok=0}
50 total=total+1; if t1ok==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
51 gw("T1 forged+detailed: knight steel body (lum=" as *u8); gn(lum(kbody)); gw(") + a bright breastplate ridge (lum=" as *u8); gn(lum(kridge)); gw(")\n" as *u8)
52
53 // T2: data-driven variety -- distinct palettes from distinct specs
54 let sbody: i64 = fb[(fy-40)*W + 110] // skeleton: bone -> R > B
55 let mbody: i64 = fb[(fy-40)*W + 175] // mage: robe -> B > R
56 var t2ok: i64=1
57 if (sbody & 255) <= ((sbody>>16)&255) {t2ok=0} // skeleton bone: R > B
58 if (mbody & 255) >= ((mbody>>16)&255) {t2ok=0} // mage robe: B > R
59 total=total+1; if t2ok==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
60 gw("T2 data-driven variety: skeleton bone (R=" as *u8); gn(sbody&255); gw(">B=" as *u8); gn((sbody>>16)&255); gw("), mage robe (B=" as *u8); gn((mbody>>16)&255); gw(">R=" as *u8); gn(mbody&255); gw(")\n" as *u8)
61
62 // T3: determinism
63 let fb2: *i64 = sys_mmap(W*H*8) as *i64
64 var q: i64 = 0; while q < W*H { fb2[q] = gx_rgb(38,40,48); q = q + 1 }
65 let nk2: i64 = sf_spec_knight(buf); sf_forge(fb2, W, H, 45, fy, buf, nk2)
66 var t3ok: i64=1; if fb2[(fy-46)*W + 45] != fb[(fy-46)*W + 45] {t3ok=0}
67 total=total+1; if t3ok==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
68 gw("T3 deterministic: same spec -> identical pixels (no float)\n" as *u8)
69
70 gw("\n=== nx_sprite_forge_gate " as *u8); gn(pass); gw("/" as *u8); gn(total)
71 if pass == total { gw(" GREEN (the ecosystem forges detailed, varied characters from spec data -- the builder, not a sprite)\n" as *u8); sys_exit(0); return 0 }
72 gw(" RED\n" as *u8); sys_exit(1); return 1
73}