nx_beach_controller_contact_gate.nx source
↩ module page · 92 lines · 4750 B
1import "nx_wasm_craft.nx"
2import "nx_gate_verdict.nx"
3func ccg_pose(base: i64, x: i64, y: i64, z: i64, vy: i64, grounded: i64) -> i64 {
4 let s: *i64=wst(base)
5 s[S_CX]=x; s[S_CY]=y; s[S_CZ]=z; s[S_VY]=vy; s[S_GROUNDED]=grounded
6 return 0
7}
8func main() -> i64 {
9 let c: *i64=gv_ctr()
10 let base: i64=sys_mmap(CRAFT_EXT_TOTAL) as i64
11 let s: *i64=wst(base)
12 let sp: *i64=wsp(base)
13 sp[P_SURF]=1; sp[P_WATER]=0
14 var z: i64=8
15 while z <= 13 {
16 var x: i64=8
17 while x <= 13 { hq_set(base,x,z,1024); vset(base,x,4,z,5); x=x+1 }
18 z=z+1
19 }
20 gv_check_eq("scratch box layout matches reserved words",__size_of(BeachContactBox),CONTACT_BOX_WORDS*8,c)
21 gv_check_eq("scratch result layout matches reserved words",__size_of(BeachContactResult),CONTACT_RESULT_WORDS*8,c)
22 var fits: i64=0
23 if CRAFT_TOTAL <= WASM_MEM_BYTES { fits=1 }
24 gv_check_eq("initial arena including contact scratch fits initial Wasm memory",fits,1,c)
25 gv_kv("initial_arena_bytes",CRAFT_TOTAL)
26 gv_kv("extended_cast_arena_bytes",CRAFT_EXT_TOTAL)
27 gv_kv("initial_wasm_bytes",WASM_MEM_BYTES)
28 gv_kv("exported_required_pages",WASM_PAGES_REQ)
29 gv_check_eq("persistent save version unchanged",SAVE_VER,6,c)
30 gv_check_eq("persistent save byte contract unchanged",SAVE_LEN,853728,c)
31 vset(base,10,12,10,6)
32 ccg_pose(base,2432,3251,2688,0,0)
33 wc_player_motion(base,256,0,0)
34 gv_check_eq("actual airborne controller clips before wood",s[S_CX],2560,c)
35 gv_check_eq("wall tangency still allows gravity",s[S_CY],3242,c)
36 gv_check_eq("wall side contact does not ground player",s[S_GROUNDED],0,c)
37 gv_check_eq("admitted motion has no initial overlap",contact_initial_overlap_impl(base),0,c)
38 ccg_pose(base,2688,1715,2688,0,1)
39 wc_player_motion(base,40,0,0)
40 gv_check_eq("controller walks beneath high overhang",s[S_CX],2728,c)
41 gv_check_eq("continuous ground remains support beneath overhang",s[S_CY],1715,c)
42 ccg_pose(base,2688,2600,2688,600,0)
43 wc_player_motion(base,0,0,0)
44 gv_check_eq("controller upward sweep stops at ceiling underside",s[S_CY],2944,c)
45 gv_check_eq("ceiling stops vertical velocity",s[S_VY],0,c)
46 ccg_pose(base,2688,3830,2688,-120,0)
47 wc_player_motion(base,0,0,0)
48 gv_check_eq("controller falling lands on crossed platform",s[S_CY],3763,c)
49 gv_check_eq("platform landing marks grounded",s[S_GROUNDED],1,c)
50 // The point footprint can slide along an exposed wall face, but a shared solid
51 // face is interior to the roof union. A four-cell corner follows the same rule.
52 vset(base,9,12,10,6)
53 ccg_pose(base,2560,2600,2688,600,0)
54 wc_player_motion(base,0,0,0)
55 gv_check_eq("continuous roof seam cannot be tunneled",s[S_CY],2944,c)
56 vset(base,10,12,9,6); vset(base,9,12,9,6)
57 ccg_pose(base,2560,2600,2560,600,0)
58 wc_player_motion(base,0,0,0)
59 gv_check_eq("continuous four-cell roof corner cannot be tunneled",s[S_CY],2944,c)
60 ccg_pose(base,2560,3251,2560,0,0)
61 wc_player_motion(base,0,0,0)
62 gv_check_eq("union seam initial penetration is explicit",contact_initial_overlap_impl(base),1,c)
63 gv_check_eq("initial overlap is not an arbitrary relocation",s[S_CY],3251,c)
64 vset(base,10,12,10,0); vset(base,9,12,10,0)
65 vset(base,10,12,9,0); vset(base,9,12,9,0)
66 vset(base,10,5,10,6)
67 ccg_pose(base,2432,1715,2688,0,1)
68 wc_player_motion(base,256,0,0)
69 gv_check_eq("grounded controller retains legitimate step movement",s[S_CX],2688,c)
70 gv_check_eq("grounded step resolves up across down trajectory",s[S_CY],1971,c)
71 gv_check_eq("stepped body remains supported",s[S_GROUNDED],1,c)
72 vset(base,10,5,10,0)
73 // A post-motion personal-space push must use actual-pose admission too.
74 vset(base,10,12,10,7)
75 ccg_pose(base,2432,3251,2688,0,0)
76 wc_player_axis_apply(base,0,256,0)
77 gv_check_eq("shared push admission cannot place body inside leaf",s[S_CX],2560,c)
78 // Native seeded initialization and actual apply2 include world streaming and NPC pushes.
79 let seeded: i64=sys_mmap(CRAFT_EXT_TOTAL) as i64
80 init_impl_v(seeded,BEACH_RELEASE_WORLD,CRAFT_DEFAULT_SEED)
81 let ss: *i64=wst(seeded)
82 let field: i64=wc_surface_source(seeded,ss[S_CX],ss[S_CZ])
83 var spawn_ok: i64=0
84 if ss[S_CY] >= 0 { if field >= 0 { if ss[S_CY]-EYE >= field { spawn_ok=1 } } }
85 gv_check_eq("real seeded spawn is above continuous terrain",spawn_ok,1,c)
86 apply2_impl(seeded,0,0,0,0,0,0,0,0,0)
87 gv_check_eq("seeded controller frame starts without body penetration",contact_initial_overlap_impl(seeded),0,c)
88 let expected_spec: i64=sys_mmap(CRAFT_EXT_TOTAL) as i64
89 wc_spec(expected_spec,BEACH_RELEASE_WORLD)
90 gv_check_eq("release bush does not overwrite world foliage palette",wsp(seeded)[P_PAL+7],wsp(expected_spec)[P_PAL+7],c)
91 return gv_verdict("BEACH-CONTROLLER-CONTACT",c,"Actual controller phase, solid-union point contacts, stairs, support, spawn and palette ownership; browser replay and anatomical width remain unverified.")
92}