code wiki / _hdl_build / nx_craft_move_gate_t72.nx
nx_craft_move_gate_t72.nx source
↩ module page · 236 lines · 14201 B
1// Private actual controller gate. Fixture mutations are confined to allocated arenas.
2import "nx_wasm_craft_move_t72.nx"
3import "nx_gate_verdict.nx"
4func mg_copy(a: *u8,b: *u8,n: i64) -> i64 { var i: i64=0;while i<n { a[i]=b[i];i=i+1 };return n }
5func mg_equal(a: *u8,b: *u8,n: i64) -> i64 { var i: i64=0;while i<n { if a[i]!=b[i] { return 0 };i=i+1 };return 1 }
6func mg_flat(base: i64) -> i64 {
7 let s: *i64=wst(base); let sp: *i64=wsp(base)
8 let vx: *u8=wvx(base)
9 var i: i64=0;while i<WX*WY*WZ { vx[i]=0 as u8;i=i+1 }
10 sp[P_SURF]=1;sp[P_WATER]=0
11 var z: i64=0;while z<WZ { var x: i64=0;while x<WX { hq_set(base,x,z,2304);vset(base,x,9,z,5);x=x+1 };z=z+1 }
12 s[S_CX]=64*256;s[S_CZ]=64*256;s[S_CY]=2560+EYE;s[S_GROUNDED]=1;s[S_VY]=0
13 s[S_SPX]=s[S_CX];s[S_SPY]=s[S_CY];s[S_SPZ]=s[S_CZ]
14 wc_move_reset(base)
15 return 0
16}
17func mg_profile(base: i64,repeat: i64) -> i64 { return wc_move_set(base,1,9810,4095,9375,28125,384,repeat) }
18func main() -> i64 {
19 let arena: *u8=sys_mmap(CRAFT_EXT_TOTAL)
20 let copy: *u8=sys_mmap(CRAFT_EXT_TOTAL)
21 if (arena as i64)<=0 || (copy as i64)<=0 { return 3 }
22 let base: i64=arena as i64;let s: *i64=wst(base);let ctr: *i64=gv_ctr()
23 gv_head("PLAYER physical-gravity / actual native contact" as *u8)
24 gv_check_eq("Beach boot accepts physical-gravity recipe",init_impl_v(base,2,20260728),0,ctr)
25 gv_check_eq("Beach mode enabled",s[S_MOVE_MODE],1,ctr)
26 gv_check_eq("state tail fits64word ABI",S_MOVE_REV,63,ctr)
27 gv_check_eq("millimetre fixed tick denominator",WC_MOVE_DEN,3600000,ctr)
28 mg_flat(base)
29 gv_check_eq("fixture body initially clear",wc_player_position_clear(base,s[S_CX],s[S_CY],s[S_CZ]),1,ctr)
30 mg_copy(copy,arena,CRAFT_EXT_TOTAL)
31 gv_check_eq("same profile replay returns success",mg_profile(base,1),0,ctr)
32 gv_check_eq("same profile replay preserves whole arena and revision",mg_equal(copy,arena,CRAFT_EXT_TOTAL),1,ctr)
33 // Full-state comparison for each rejected public parameter profile.
34 var k: i64=0
35 while k<15 {
36 var g: i64=9810;var j: i64=4095;var w: i64=9375;var t: i64=28125;var step: i64=384;var rep: i64=1
37 if k==0 { g=0 };if k==1 { g=WC_MOVE_GRAV_MAX_MM+1 }
38 if k==2 { j=0-1 };if k==3 { j=WC_MOVE_SPEED_MAX_MM+1 }
39 if k==4 { w=0-1 };if k==5 { w=9223372036854775807 }
40 if k==6 { t=0 };if k==7 { t=WC_MOVE_SPEED_MAX_MM+1 }
41 if k==8 { step=WY*256 };if k==9 { rep=2 }
42 if k==10 { g=0-1 };if k==11 { j=0 };if k==12 { step=0-1 };if k==13 { rep=0-1 };if k==14 { t=0-1 }
43 mg_copy(copy,arena,CRAFT_EXT_TOTAL)
44 gv_check_eq("invalid profile refused before mutation",wc_move_set(base,1,g,j,w,t,step,rep),WC_MOVE_RC_PROFILE,ctr)
45 gv_check_eq("invalid profile preserves whole actual arena",mg_equal(copy,arena,CRAFT_EXT_TOTAL),1,ctr)
46 k=k+1
47 }
48 gv_check_eq("zero walk and step are supported policies",wc_move_set(base,1,9810,4095,0,28125,0,0),0,ctr)
49 gv_check_eq("zero walk actually emits zero displacement",wc_move_horizontal(base,0,4096),0,ctr)
50 mg_profile(base,1)
51 s[S_GROUNDED]=0
52 mg_copy(copy,arena,CRAFT_EXT_TOTAL)
53 gv_check_eq("airborne profile switch refused",mg_profile(base,0),WC_MOVE_RC_ACTIVE,ctr)
54 gv_check_eq("airborne refusal leaves whole arena",mg_equal(copy,arena,CRAFT_EXT_TOTAL),1,ctr)
55 s[S_GROUNDED]=1;s[S_MOVE_RY]=1
56 mg_copy(copy,arena,CRAFT_EXT_TOTAL)
57 gv_check_eq("precise residual prevents stationary claim",mg_profile(base,0),WC_MOVE_RC_ACTIVE,ctr)
58 gv_check_eq("residual refusal leaves whole arena",mg_equal(copy,arena,CRAFT_EXT_TOTAL),1,ctr)
59 wc_move_reset(base)
60 ia_key(winp(base),87,1)
61 mg_copy(copy,arena,CRAFT_EXT_TOTAL)
62 gv_check_eq("held movement prevents profile switch",mg_profile(base,0),WC_MOVE_RC_ACTIVE,ctr)
63 gv_check_eq("held movement refusal leaves whole arena",mg_equal(copy,arena,CRAFT_EXT_TOTAL),1,ctr)
64 ia_key(winp(base),87,0)
65 // Maximum admitted dimensions execute the real arithmetic path without signed overflow.
66 gv_check_eq("max profile values accepted",wc_move_set(base,1,WC_MOVE_GRAV_MAX_MM,WC_MOVE_SPEED_MAX_MM,WC_MOVE_SPEED_MAX_MM,WC_MOVE_SPEED_MAX_MM,WY*256-1,1),0,ctr)
67 gv_check_eq("maximum horizontal numerator remains exact",wc_move_horizontal(base,0,8192),2*WY*256,ctr)
68 wc_move_reset(base)
69 gv_check_eq("maximum acceleration and launch cancel exactly",wc_move_vertical_request(base,1),0,ctr)
70 mg_flat(base);mg_profile(base,1)
71 mg_flat(base)
72 gv_check_eq("small positive takeoff admitted",wc_move_set(base,1,9810,300,9375,28125,384,1),0,ctr)
73 wc_player_motion(base,0,0,1)
74 gv_check_eq("subQ8 rising request has zero whole displacement",s[S_CY],2560+EYE,ctr)
75 gv_check("positive precise takeoff not arrested by floor" as *u8,s[S_MOVE_VNUM]>0,ctr)
76 gv_check_eq("positive subQ8 takeoff clears grounded",s[S_GROUNDED],0,ctr)
77 wc_player_motion(base,0,0,0)
78 gv_check_eq("unresolved tiny rise settles once descending",s[S_GROUNDED],1,ctr)
79 mg_flat(base)
80 gv_check_eq("minimum positive launch accepted",wc_move_set(base,1,9810,1,9375,28125,384,1),0,ctr)
81 wc_player_motion(base,0,0,1)
82 gv_check_eq("launch below one gravity step cannot rise",s[S_CY],2560+EYE,ctr)
83 mg_flat(base);mg_profile(base,1)
84 // Fractional acceleration must survive before one Q8 of displacement is available.
85 s[S_CY]=s[S_CY]+256;s[S_GROUNDED]=0
86 let fall_y: i64=s[S_CY]
87 wc_player_motion(base,0,0,0)
88 gv_check_eq("first fractional fall retains exact numerator",s[S_MOVE_VNUM],0-2511360,ctr)
89 gv_check_eq("first subQ8 displacement remains zero",s[S_CY],fall_y,ctr)
90 wc_player_motion(base,0,0,0)
91 gv_check_eq("second fractional fall accumulates to2Q8",s[S_CY],fall_y-2,ctr)
92 // Actual full jump compared with independently retained closed arithmetic recurrence.
93 mg_flat(base);mg_profile(base,1)
94 var n: i64=0;var ymax: i64=0;var apex_tick: i64=0;var landing: i64=0;var mismatch: i64=0
95 var ref_y: i64=0;var ref_r: i64=0
96 while n<60 {
97 var jump: i64=0;if n==0 { jump=1 }
98 wc_player_motion(base,0,0,jump)
99 n=n+1
100 if landing==0 {
101 let vn: i64=4095*256*60-n*9810*256
102 let total: i64=ref_r+vn
103 let delta: i64=total/3600000
104 ref_r=total-delta*3600000
105 ref_y=ref_y+delta
106 if ref_y<=0 { ref_y=0 }
107 if s[S_CY]-(2560+EYE)!=ref_y { mismatch=mismatch+1 }
108 }
109 let rise: i64=s[S_CY]-(2560+EYE)
110 if rise>ymax { ymax=rise;apex_tick=n }
111 if s[S_GROUNDED]==1 && landing==0 { landing=n }
112 if wc_player_position_clear(base,s[S_CX],s[S_CY],s[S_CZ])!=1 { mismatch=mismatch+1 }
113 }
114 gv_check_eq("actual jump matches independent recurrence",mismatch,0,ctr)
115 gv_check_eq("actual physical-gravity apex preserves210Q8",ymax,210,ctr)
116 gv_check_eq("actual physical-gravity landing tick",landing,50,ctr)
117 gv_check_eq("landed feet match actual surface",s[S_CY]-EYE,wc_surface_source(base,s[S_CX],s[S_CZ]),ctr)
118 gv_check_eq("landing clears velocity numerator",s[S_MOVE_VNUM],0,ctr)
119 gv_check_eq("landing clears vertical remainder",s[S_MOVE_RY],0,ctr)
120 gv_kv("physical_apex_tick",apex_tick);gv_kv("physical_flight_ticks",landing);gv_kv("physical_apex_q8",ymax)
121 // Policy is independent: holding input does not retrigger in edge mode.
122 mg_flat(base);mg_profile(base,0)
123 n=0;var rises: i64=0;var last_ground: i64=1
124 while n<110 { wc_player_motion(base,0,0,1);if last_ground==1 && s[S_GROUNDED]==0 { rises=rises+1 };last_ground=s[S_GROUNDED];n=n+1 }
125 gv_check_eq("edge policy held input launches once",rises,1,ctr)
126 wc_player_motion(base,0,0,0);wc_player_motion(base,0,0,1)
127 gv_check_eq("edge policy launches after release and press",s[S_GROUNDED],0,ctr)
128 mg_flat(base);mg_profile(base,1)
129 n=0;rises=0;last_ground=1
130 while n<110 { wc_player_motion(base,0,0,1);if last_ground==1 && s[S_GROUNDED]==0 { rises=rises+1 };last_ground=s[S_GROUNDED];n=n+1 }
131 gv_check_eq("held-repeat policy launches three times in110ticks",rises,3,ctr)
132 // Existing serialized format is untouched and accepted restores reset transient physics.
133 mg_flat(base);mg_profile(base,1)
134 wc_edit(base,32,24,32,6)
135 let saved: i64=wc_save_build(base)
136 wc_player_motion(base,0,0,1)
137 gv_check("preload precise velocity is nonzero" as *u8,s[S_MOVE_VNUM]>0,ctr)
138 mg_copy(copy,arena,CRAFT_EXT_TOTAL)
139 gv_check_eq("bad save extent refuses",wc_save_apply_bytes(base,saved-1),SAVE_RC_LENGTH,ctr)
140 gv_check_eq("refused save preserves all physics and arena",mg_equal(copy,arena,CRAFT_EXT_TOTAL),1,ctr)
141 gv_check_eq("valid save accepted",wc_save_apply_bytes(base,saved),0,ctr)
142 gv_check_eq("valid save clears precise velocity",s[S_MOVE_VNUM],0,ctr)
143 gv_check_eq("valid save clears precise vertical remainder",s[S_MOVE_RY],0,ctr)
144 gv_check_eq("valid save retains actual edit",ej_get(base,32,24,32),6,ctr)
145 gv_check_eq("save extent unchanged",saved,SAVE_LEN,ctr)
146 // Actual ceiling geometry: limit is derived from the occupied cell bottom and body head.
147 mg_flat(base);mg_profile(base,1)
148 var cz: i64=63;while cz<=65 { var cx: i64=63;while cx<=65 { vset(base,cx,13,cz,6);cx=cx+1 };cz=cz+1 }
149 gv_check_eq("ceiling fixture starts clear",wc_player_position_clear(base,s[S_CX],s[S_CY],s[S_CZ]),1,ctr)
150 n=0;ymax=0;mismatch=0;var ceiling_clip: i64=0
151 while n<70 {
152 var jump: i64=0;if n==0 { jump=1 }
153 wc_player_motion(base,0,0,jump)
154 let rise: i64=s[S_CY]-(2560+EYE)
155 if rise>ymax { ymax=rise }
156 if wc_player_position_clear(base,s[S_CX],s[S_CY],s[S_CZ])!=1 { mismatch=mismatch+1 }
157 if contact_clipped_axes_impl(base)!=0 { ceiling_clip=1 }
158 n=n+1
159 }
160 gv_check_eq("ceiling sweep respects exact available head clearance",ymax,13*256-(2560+EYE+128),ctr)
161 gv_check_eq("ceiling trajectory stays body clear",mismatch,0,ctr)
162 gv_check_eq("ceiling stop lands on original field",s[S_CY],2560+EYE,ctr)
163 gv_check_eq("ceiling landing clears fractional velocity",s[S_MOVE_VNUM],0,ctr)
164 gv_kv("ceiling_max_rise_q8",ymax);gv_kv("ceiling_audit_observed",ceiling_clip)
165 // The same one-cell structural step, with the existing allowance enabled and disabled.
166 mg_flat(base);mg_profile(base,1)
167 cz=63;while cz<=65 { vset(base,65,10,cz,6);cz=cz+1 }
168 let step_x: i64=s[S_CX]
169 wc_player_motion(base,384,0,0)
170 gv_check_eq("configured legacy allowance traverses one-block step",s[S_CX],step_x+384,ctr)
171 gv_check_eq("step uses actual structure top",s[S_CY],2816+EYE,ctr)
172 gv_check_eq("stepped body remains clear",wc_player_position_clear(base,s[S_CX],s[S_CY],s[S_CZ]),1,ctr)
173 mg_flat(base)
174 gv_check_eq("zero step policy accepted for obstacle fixture",wc_move_set(base,1,9810,4095,9375,28125,0,1),0,ctr)
175 cz=63;while cz<=65 { vset(base,65,10,cz,6);cz=cz+1 }
176 wc_player_motion(base,384,0,0)
177 gv_check("disabled step clips actual horizontal motion" as *u8,s[S_CX]<step_x+384,ctr)
178 gv_check_eq("disabled step does not lift camera",s[S_CY],2560+EYE,ctr)
179 gv_check_eq("disabled step leaves body clear",wc_player_position_clear(base,s[S_CX],s[S_CY],s[S_CZ]),1,ctr)
180 mg_flat(base);mg_profile(base,1)
181 cz=63;while cz<=65 { vset(base,65,10,cz,6);vset(base,65,11,cz,6);cz=cz+1 }
182 wc_player_motion(base,384,0,0)
183 gv_check("two-block rise exceeds retained allowance" as *u8,s[S_CX]<step_x+384,ctr)
184 gv_check_eq("refused high step leaves body clear",wc_player_position_clear(base,s[S_CX],s[S_CY],s[S_CZ]),1,ctr)
185 // A deterministic native field slope, forward and reverse. Measure any downward following gap.
186 mg_flat(base);mg_profile(base,1)
187 var sz: i64=0;while sz<WZ { var sx: i64=0;while sx<WX { hq_set(base,sx,sz,2304+(sx-64)*4);sx=sx+1 };sz=sz+1 }
188 n=0;mismatch=0;var slope_gap_max: i64=0;var slope_grounded: i64=0
189 while n<120 {
190 var dx: i64=40;if n>=60 { dx=0-40 }
191 wc_player_motion(base,dx,0,0)
192 let field: i64=wc_surface_source(base,s[S_CX],s[S_CZ])
193 let gap: i64=s[S_CY]-EYE-field
194 if gap<0 { mismatch=mismatch+1 }
195 if gap>slope_gap_max { slope_gap_max=gap }
196 if s[S_GROUNDED]==1 { slope_grounded=slope_grounded+1 }
197 if wc_player_position_clear(base,s[S_CX],s[S_CY],s[S_CZ])!=1 { mismatch=mismatch+1 }
198 n=n+1
199 }
200 gv_check_eq("actual up/down slope has no sampled penetration",mismatch,0,ctr)
201 gv_check_eq("slope route returns to same horizontal position",s[S_CX],64*256,ctr)
202 n=0;while n<60 { wc_player_motion(base,0,0,0);n=n+1 }
203 gv_check_eq("rest after slope reaches exact native support",s[S_CY]-EYE,wc_surface_source(base,s[S_CX],s[S_CZ]),ctr)
204 gv_kv("slope_gap_max_q8",slope_gap_max);gv_kv("slope_grounded_samples_of120",slope_grounded)
205 // Keep the existing water float offset. This is contact compatibility, not fluid simulation.
206 mg_flat(base);mg_profile(base,1);let water_spec: *i64=wsp(base);water_spec[P_WATER]=10
207 cz=63;while cz<=65 { var wx: i64=63;while wx<=65 { vset(base,wx,10,cz,4);wx=wx+1 };cz=cz+1 }
208 wc_player_motion(base,0,0,0)
209 gv_check_eq("existing water contact offset preserved",s[S_CY],11*256+EYE-96,ctr)
210 gv_check_eq("water rest is grounded under existing rule",s[S_GROUNDED],1,ctr)
211 // An enclosed body must be explicitly unresolved and cannot advance farther downward.
212 mg_flat(base);mg_profile(base,1)
213 var by: i64=10;while by<WY { cz=63;while cz<=65 { var bx: i64=63;while bx<=65 { vset(base,bx,by,cz,6);bx=bx+1 };cz=cz+1 };by=by+1 }
214 let blocked_y: i64=s[S_CY]
215 gv_check_eq("occupied full column reports unresolved recovery",wc_player_recover(base),0-1,ctr)
216 wc_player_motion(base,0,0,0)
217 gv_check_eq("unresolved body never falls farther",s[S_CY],blocked_y,ctr)
218 gv_check_eq("unresolved body clears precise velocity",s[S_MOVE_VNUM],0,ctr)
219 gv_check_eq("unresolved body is not falsely called clear",wc_player_position_clear(base,s[S_CX],s[S_CY],s[S_CZ]),0,ctr)
220 // Other-world bootstrap keeps the legacy profile and exact incumbent parabola.
221 gv_check_eq("nonBeach initializes legacy",init_impl_v(base,0,20260728),0,ctr)
222 gv_check_eq("nonBeach profile remains zero",s[S_MOVE_MODE],0,ctr)
223 mg_flat(base);n=0;var ly: i64=0;var lv: i64=66;mismatch=0;ymax=0;landing=0
224 while n<20 {
225 var jump: i64=0;if n==0 { jump=1 }
226 wc_player_motion(base,0,0,jump);n=n+1
227 lv=lv-9;ly=ly+lv;if ly<=0 { ly=0;lv=0 }
228 if s[S_CY]-(2560+EYE)!=ly || s[S_VY]!=lv { mismatch=mismatch+1 }
229 if ly>ymax { ymax=ly };if landing==0 && s[S_GROUNDED]==1 { landing=n }
230 }
231 gv_check_eq("legacy actual20tick parabola unchanged",mismatch,0,ctr)
232 gv_check_eq("legacy apex210Q8 unchanged",ymax,210,ctr)
233 gv_check_eq("legacy landing14ticks unchanged",landing,14,ctr)
234 sys_munmap(arena,CRAFT_EXT_TOTAL);sys_munmap(copy,CRAFT_EXT_TOTAL)
235 return gv_verdict("PLAYER-PHYSICAL-GRAVITY" as *u8,ctr,"private native only; shared/WASM, served feel, NPC gravity and configuration adapter qualification remain open" as *u8)
236}