code wiki / _hdl_build / nx_craft_dunes_gate_t70.nx
nx_craft_dunes_gate_t70.nx source
↩ module page · 134 lines · 6560 B
1// Private actual-engine qualification. No network, production data or hardware writes.
2import "nx_wasm_craft_dunes_t70.nx"
3import "nx_gate_verdict.nx"
4func dg_equal(a: *u8,b: *u8,n: i64) -> i64 {
5 var i: i64 = 0
6 while i < n { if a[i] != b[i] { return 0 }; i = i + 1 }
7 return 1
8}
9func dg_copy(a: *u8,b: *u8,n: i64) -> i64 {
10 var i: i64 = 0
11 while i < n { a[i] = b[i]; i = i + 1 }
12 return n
13}
14func dg_legacy_q(base: i64,x: i64,z: i64,seed: i64) -> i64 {
15 let sp: *i64 = wsp(base)
16 return wclamp(sp[P_TBASE]*256 + wnoise(x,z,16,seed)*sp[P_TAMP1] + wnoise(x,z,5,seed+7)*sp[P_TAMP2],256,(WY-8)*256)
17}
18func dg_hq_parity(base: i64) -> i64 {
19 let s: *i64 = wst(base)
20 var errors: i64 = 0; var z: i64 = 0
21 while z < WZ {
22 var x: i64 = 0
23 while x < WX {
24 let wanted: i64 = wsp_beach_ocean_q(wsp(base),x+s[S_WOX],z+s[S_WOZ],wheight_qe(base,x+s[S_WOX],z+s[S_WOZ],s[S_SEED]))
25 if hq_get(base,x,z) != wanted { errors = errors + 1 }
26 x = x + 1
27 }
28 z = z + 1
29 }
30 return errors
31}
32func main() -> i64 {
33 let arena: *u8 = sys_mmap(CRAFT_EXT_TOTAL)
34 let capture: *u8 = sys_mmap(CRAFT_EXT_TOTAL)
35 if (arena as i64) <= 0 || (capture as i64) <= 0 { return 3 }
36 let base: i64 = arena as i64
37 let sp: *i64 = wsp(base); let s: *i64 = wst(base)
38 let ctr: *i64 = gv_ctr()
39 gv_head("DUNES / actual shared heightfield and contact" as *u8)
40 gv_check_eq("slot fits existing spec allocation",WC_SPECN*8,O_EJRN-O_SPEC,ctr)
41 gv_check_eq("one gen-time allowlist admits dune slot",genp_gen_ok(P_DUNE),1,ctr)
42 gv_check_eq("allowlist census",genp_gen_count(),GA_ADMITTED,ctr)
43 var identity: i64 = 0; var other_bad: i64 = 0
44 while identity < 4 {
45 wc_spec(base,identity)
46 if identity != 2 { if sp[P_DUNE] != 0 { other_bad = other_bad + 1 } }
47 identity = identity + 1
48 }
49 gv_check_eq("other identities retain disabled dune data",other_bad,0,ctr)
50 wc_spec(base,2)
51 gv_check_eq("Beach explicitly enables reviewed recipe",sp[P_DUNE],BEACH_DUNE_RECIPE,ctr)
52 gv_check_eq("Beach packed recipe valid",wc_dune_valid(sp[P_DUNE]),1,ctr)
53 gv_check_eq("negative packed data refused",wc_dune_valid(0-1),0,ctr)
54 gv_check_eq("reserved bits refused",wc_dune_valid(WC_DUNE_PACK_MAX+1),0,ctr)
55 gv_check_eq("sub-grid wavelength refused",wc_dune_valid(768+(3 << WC_DUNE_WAVE_SHIFT)),0,ctr)
56 var bad: i64 = 0; var changed: i64 = 0; var varied: i64 = 0
57 var minrelief: i64 = BEACH_DUNE_AMPLITUDE_Q8; var maxrelief: i64 = 0
58 var maxstep: i64 = 0; var z: i64 = 0-32
59 while z < 128 {
60 var x: i64 = 0-32
61 while x < 128 {
62 let a: i64 = wc_dune_q(sp,x,z,123)
63 let b: i64 = wc_dune_q(sp,x,z,321)
64 if a < 0 || a > BEACH_DUNE_AMPLITUDE_Q8 { bad = bad + 1 }
65 if a < minrelief { minrelief = a }; if a > maxrelief { maxrelief = a }
66 if a != b { varied = varied + 1 }
67 var step: i64 = a-wc_dune_q(sp,x+1,z,123)
68 if step < 0 { step = 0-step }
69 if step > maxstep { maxstep = step }
70 if z >= 100 { if a != 0 { bad = bad + 1 } }
71 let enabled: i64 = wheight_q(base,x,z,123)
72 sp[P_DUNE] = 0
73 let disabled: i64 = wheight_q(base,x,z,123)
74 if disabled != dg_legacy_q(base,x,z,123) { bad = bad + 1 }
75 let raw: i64 = wclamp(sp[P_TBASE]+wnoise(x,z,16,123)*sp[P_TAMP1]/256+wnoise(x,z,5,130)*sp[P_TAMP2]/256,1,WY-8)
76 if wheight_raw(base,x,z,123) != raw { bad = bad + 1 }
77 sp[P_DUNE] = BEACH_DUNE_RECIPE
78 if enabled != disabled { changed = changed + 1 }
79 if wheight_raw(base,x,z,123) != (enabled+128)/256 { bad = bad + 1 }
80 x = x + 1
81 }
82 z = z + 1
83 }
84 gv_check_eq("25600 signed-coordinate samples bounded and disabled baseline exact",bad,0,ctr)
85 gv_check("enabled geometry changes sampled terrain" as *u8,changed > 0,ctr)
86 gv_check("seed changes dune shape" as *u8,varied > 0,ctr)
87 gv_kv("changed_samples",changed); gv_kv("seed_changed_samples",varied)
88 gv_kv("relief_min_q8",minrelief); gv_kv("relief_max_q8",maxrelief); gv_kv("max_sampled_x_step_q8",maxstep)
89 let boot_start: i64 = sys_clock_now_us()
90 init_impl_v(base,2,20260728)
91 gv_kv("enabled_boot_us",sys_clock_now_us()-boot_start)
92 gv_check_eq("initial complete HQ matches absolute native terrain",dg_hq_parity(base),0,ctr)
93 let floor: i64 = wc_surface_source(base,s[S_CX],s[S_CZ])
94 gv_check_eq("player feet start on admitted support",s[S_CY]-EYE,wc_contact_floor_q(base,s[S_CX],s[S_CZ],WY-1),ctr)
95 gv_check_eq("standing player body is clear",wc_player_position_clear(base,s[S_CX],s[S_CY],s[S_CZ]),1,ctr)
96 let mobs0: *i64 = mobp(base); var k: i64 = 0; var npc_bad: i64 = 0
97 while k < en_count(mobs0) {
98 let h: i64 = en_nth(mobs0,k)
99 let mx: i64 = en_get(mobs0,h,MC_X); let mz: i64 = en_get(mobs0,h,MC_Z)
100 if en_get(mobs0,h,MC_Y) != wc_contact_floor_q(base,mx,mz,WY-1) { npc_bad = npc_bad + 1 }
101 k = k + 1
102 }
103 gv_check("actual NPC contact population nonempty" as *u8,k > 0,ctr)
104 gv_check_eq("actual initial NPC roots match native contact",npc_bad,0,ctr); gv_kv("npc_count",k)
105 let shift_start: i64 = sys_clock_now_us()
106 wc_shift(base,16,0-16)
107 gv_kv("enabled_shift_us",sys_clock_now_us()-shift_start)
108 gv_check_eq("shifted complete HQ matches same absolute surface",dg_hq_parity(base),0,ctr)
109 dg_copy(capture,(base+O_HQ) as *u8,WX*WZ*8)
110 wc_hq_restore(base)
111 gv_check_eq("derived restore produces exact shifted HQ bytes",dg_equal(capture,(base+O_HQ) as *u8,WX*WZ*8),1,ctr)
112 wc_edit(base,32,24,32,6)
113 let save_bytes: i64 = wc_save_build(base)
114 dg_copy(capture,(base+O_SAVE) as *u8,save_bytes)
115 init_impl_v(base,2,999)
116 dg_copy((base+O_SAVE) as *u8,capture,save_bytes)
117 gv_check_eq("same recipe save loads through bounded native door",wc_save_apply_bytes(base,save_bytes),0,ctr)
118 gv_check_eq("saved seed and origin regenerate complete HQ",dg_hq_parity(base),0,ctr)
119 gv_check_eq("saved edit and journal survive",ej_get(base,48,24,16),6,ctr)
120 // Existing save format omits spec. Retain that boundary, do not claim cross-recipe migration.
121 gv_kv("save_recipe_identity_persisted",0)
122 let gp: *i64 = wgp(base)
123 gp[0] = GENP_MAGIC; gp[1] = 1; gp[2] = P_DUNE; gp[3] = 0
124 let baseline_start: i64 = sys_clock_now_us()
125 init_impl_v(base,2,20260728)
126 gv_kv("disabled_boot_us",sys_clock_now_us()-baseline_start)
127 gv_check_eq("gen-time override disables Beach relief before generation",sp[P_DUNE],0,ctr)
128 gv_check_eq("override application count",s[S_GENP],1,ctr)
129 gp[3] = BEACH_DUNE_RECIPE
130 init_impl_v(base,2,20260728)
131 gv_check_eq("gen-time override enables actual Beach height cache",dg_hq_parity(base),0,ctr)
132 sys_munmap(arena,CRAFT_EXT_TOTAL); sys_munmap(capture,CRAFT_EXT_TOTAL)
133 return gv_verdict("BEACH-DUNES" as *u8,ctr,"native geometry/contact; browser GPU parity, near/mid visuals and old-save recipe migration remain separate" as *u8)
134}