code wiki / _hdl_build / nx_craft_dunes_boundary_gate_t70.nx
nx_craft_dunes_boundary_gate_t70.nx source
↩ module page · 167 lines · 8627 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("explicit dune predicate admits dune slot",genp_dune_gen_ok(P_DUNE),1,ctr)
42 gv_check_eq("generic engines retain original index admission",genp_gen_ok(P_DUNE),0,ctr)
43 gv_check_eq("allowlist census",genp_gen_count(),GA_ADMITTED,ctr)
44 var identity: i64 = 0; var other_bad: i64 = 0
45 while identity < 4 {
46 wc_spec(base,identity)
47 if identity != 2 { if sp[P_DUNE] != 0 { other_bad = other_bad + 1 } }
48 identity = identity + 1
49 }
50 gv_check_eq("other identities retain disabled dune data",other_bad,0,ctr)
51 wc_spec(base,2)
52 gv_check_eq("Beach explicitly enables reviewed recipe",sp[P_DUNE],BEACH_DUNE_RECIPE,ctr)
53 gv_check_eq("Beach packed recipe valid",wc_dune_valid(sp[P_DUNE]),1,ctr)
54 gv_check_eq("negative packed data refused",wc_dune_valid(0-1),0,ctr)
55 gv_check_eq("reserved bits refused",wc_dune_valid(WC_DUNE_PACK_MAX+1),0,ctr)
56 gv_check_eq("sub-grid wavelength refused",wc_dune_valid(768+(3 << WC_DUNE_WAVE_SHIFT)),0,ctr)
57 var bad: i64 = 0; var changed: i64 = 0; var varied: i64 = 0
58 var minrelief: i64 = BEACH_DUNE_AMPLITUDE_Q8; var maxrelief: i64 = 0
59 var maxstep: i64 = 0; var z: i64 = 0-32
60 while z < 128 {
61 var x: i64 = 0-32
62 while x < 128 {
63 let a: i64 = wc_dune_q(sp,x,z,123)
64 let b: i64 = wc_dune_q(sp,x,z,321)
65 if a < 0 || a > BEACH_DUNE_AMPLITUDE_Q8 { bad = bad + 1 }
66 if a < minrelief { minrelief = a }; if a > maxrelief { maxrelief = a }
67 if a != b { varied = varied + 1 }
68 var step: i64 = a-wc_dune_q(sp,x+1,z,123)
69 if step < 0 { step = 0-step }
70 if step > maxstep { maxstep = step }
71 if z >= 100 { if a != 0 { bad = bad + 1 } }
72 let enabled: i64 = wheight_q(base,x,z,123)
73 sp[P_DUNE] = 0
74 let disabled: i64 = wheight_q(base,x,z,123)
75 if disabled != dg_legacy_q(base,x,z,123) { bad = bad + 1 }
76 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)
77 if wheight_raw(base,x,z,123) != raw { bad = bad + 1 }
78 sp[P_DUNE] = BEACH_DUNE_RECIPE
79 if enabled != disabled { changed = changed + 1 }
80 if wheight_raw(base,x,z,123) != (enabled+128)/256 { bad = bad + 1 }
81 x = x + 1
82 }
83 z = z + 1
84 }
85 gv_check_eq("25600 signed-coordinate samples bounded and disabled baseline exact",bad,0,ctr)
86 gv_check("enabled geometry changes sampled terrain" as *u8,changed > 0,ctr)
87 gv_check("seed changes dune shape" as *u8,varied > 0,ctr)
88 gv_kv("changed_samples",changed); gv_kv("seed_changed_samples",varied)
89 gv_kv("relief_min_q8",minrelief); gv_kv("relief_max_q8",maxrelief); gv_kv("max_sampled_x_step_q8",maxstep)
90 let boot_start: i64 = sys_clock_now_us()
91 init_impl_v(base,2,20260728)
92 gv_kv("enabled_boot_us",sys_clock_now_us()-boot_start)
93 gv_check_eq("initial complete HQ matches absolute native terrain",dg_hq_parity(base),0,ctr)
94 let floor: i64 = wc_surface_source(base,s[S_CX],s[S_CZ])
95 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)
96 gv_check_eq("standing player body is clear",wc_player_position_clear(base,s[S_CX],s[S_CY],s[S_CZ]),1,ctr)
97 let mobs0: *i64 = mobp(base); var k: i64 = 0; var npc_bad: i64 = 0
98 while k < en_count(mobs0) {
99 let h: i64 = en_nth(mobs0,k)
100 let mx: i64 = en_get(mobs0,h,MC_X); let mz: i64 = en_get(mobs0,h,MC_Z)
101 if en_get(mobs0,h,MC_Y) != wc_contact_floor_q(base,mx,mz,WY-1) { npc_bad = npc_bad + 1 }
102 k = k + 1
103 }
104 gv_check("actual NPC contact population nonempty" as *u8,k > 0,ctr)
105 gv_check_eq("actual initial NPC roots match native contact",npc_bad,0,ctr); gv_kv("npc_count",k)
106 let shift_start: i64 = sys_clock_now_us()
107 wc_shift(base,16,0-16)
108 gv_kv("enabled_shift_us",sys_clock_now_us()-shift_start)
109 gv_check_eq("shifted complete HQ matches same absolute surface",dg_hq_parity(base),0,ctr)
110 dg_copy(capture,(base+O_HQ) as *u8,WX*WZ*8)
111 wc_hq_restore(base)
112 gv_check_eq("derived restore produces exact shifted HQ bytes",dg_equal(capture,(base+O_HQ) as *u8,WX*WZ*8),1,ctr)
113 wc_edit(base,32,24,32,6)
114 let save_bytes: i64 = wc_save_build(base)
115 dg_copy(capture,(base+O_SAVE) as *u8,save_bytes)
116 init_impl_v(base,2,999)
117 dg_copy((base+O_SAVE) as *u8,capture,save_bytes)
118 gv_check_eq("same recipe save loads through bounded native door",wc_save_apply_bytes(base,save_bytes),0,ctr)
119 gv_check_eq("saved seed and origin regenerate complete HQ",dg_hq_parity(base),0,ctr)
120 gv_check_eq("saved edit and journal survive",ej_get(base,48,24,16),6,ctr)
121 // Existing save format omits spec. Retain that boundary, do not claim cross-recipe migration.
122 gv_kv("save_recipe_identity_persisted",0)
123 let gp: *i64 = wgp(base)
124 gp[0] = GENP_MAGIC; gp[1] = 1; gp[2] = P_DUNE; gp[3] = 0
125 let baseline_start: i64 = sys_clock_now_us()
126 init_impl_v(base,2,20260728)
127 gv_kv("disabled_boot_us",sys_clock_now_us()-baseline_start)
128 gv_check_eq("gen-time override disables Beach relief before generation",sp[P_DUNE],0,ctr)
129 gv_check_eq("override application count",s[S_GENP],1,ctr)
130 gp[3] = BEACH_DUNE_RECIPE
131 init_impl_v(base,2,20260728)
132 gv_check_eq("gen-time override enables actual Beach height cache",dg_hq_parity(base),0,ctr)
133
134 // Native preflight must reject before wc_spec, GENP assignment or world mutation.
135 gv_check_eq("maximum packed recipe admitted",genp_dune_valid(GA_DUNE_PACK_MAX),1,ctr)
136 gv_check_eq("zero-amplitude nonzero recipe refused",genp_dune_valid(4 << GA_DUNE_WAVE_SHIFT),0,ctr)
137 gv_check_eq("minimum wavelength and amplitude admitted",genp_dune_valid(1+(GA_DUNE_MIN_WAVE << GA_DUNE_WAVE_SHIFT)),1,ctr)
138 var refused: i64 = 0
139 while refused < 4 {
140 gp[0] = GENP_MAGIC; gp[1] = 2; gp[2] = P_WPIPE; gp[3] = 12
141 gp[4] = P_DUNE
142 if refused == 0 { gp[5] = 0 - 1 }
143 if refused == 1 { gp[5] = WC_DUNE_PACK_MAX + 1 }
144 if refused == 2 { gp[5] = 4 << GA_DUNE_WAVE_SHIFT }
145 if refused == 3 { gp[5] = 1 + (3 << GA_DUNE_WAVE_SHIFT) }
146 dg_copy(capture,arena,CRAFT_EXT_TOTAL)
147 gv_check_eq("invalid recipe with earlier staged-pipeline pair returns named init error",init_impl_v(base,2,123),WC_INIT_DUNE_INVALID,ctr)
148 gv_check_eq("refused init preserves entire arena including old scene",dg_equal(capture,arena,CRAFT_EXT_TOTAL),1,ctr)
149 refused = refused + 1
150 }
151 gp[5] = BEACH_DUNE_RECIPE
152 gv_check_eq("valid staged-pipeline dune recipe initializes",init_impl_v(base,2,123),0,ctr)
153 gv_check_eq("staged-pipeline full HQ uses admitted dune surface",dg_hq_parity(base),0,ctr)
154 gv_check_eq("staged-pipeline column rounds same Q8 geometry",wheight_raw(base,32,32,123),(wheight_q(base,32,32,123)+128)/256,ctr)
155 gp[1] = 1; gp[2] = P_DUNE; gp[3] = 0
156 init_impl_v(base,2,20260728)
157 dg_copy(capture,(base+O_HQ) as *u8,WX*WZ*8)
158 wc_edit(base,32,24,32,6)
159 wc_save_build(base)
160 // An old recipe save is authentic but contains no terrain recipe identity.
161 sp[P_DUNE] = BEACH_DUNE_RECIPE
162 gv_check_eq("legacy-recipe payload checksum still admits today",wc_save_apply_bytes(base,SAVE_LEN),0,ctr)
163 gv_check_eq("negative control detects old-save changed terrain",dg_equal(capture,(base+O_HQ) as *u8,WX*WZ*8),0,ctr)
164 gv_check_eq("negative control retains actual old-save edit",ej_get(base,32,24,32),6,ctr)
165 sys_munmap(arena,CRAFT_EXT_TOTAL); sys_munmap(capture,CRAFT_EXT_TOTAL)
166 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)
167}