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}