nx_craft_placement_wasm_gate_t316.nx source
↩ module page · 84 lines · 4553 B
1// nx_craft_placement_wasm_gate_t316.nx -- Tests placement VM functionality against specified terrain and actor seat conditions.
2import "nx_craft_imported_placement_candidate_t316.nx"
3import "nx_gate_verdict.nx"
4import "nx_wasm_vm.nx"
5func placement_vm_case(m:*WasmMod,c:*i64)->i64 {
6 let base:i64=m.mem as i64
7 let spec:*i64=wsp(base);spec[P_SURF]=1;spec[P_WATER]=0
8 hq_set(base,10,10,1152);hq_set(base,11,10,1408);hq_set(base,10,11,1152);hq_set(base,11,11,1408)
9 let x:i64=10*256+128;let z:i64=10*256+128
10 gv_check_eq("fractional terrain placement",placement_vm_floor(m,x,z),1536,c)
11 gv_check_eq("actor seat repairs below-field position",placement_vm_seat(m,x,z,1000),1536,c)
12 gv_check_eq("negative x refused",placement_vm_floor(m,-1,z),-1,c)
13 gv_check_eq("negative z refused",placement_vm_floor(m,x,-1),-1,c)
14 gv_check_eq("last x corner lacks interpolation neighbor",placement_vm_floor(m,(WX-1)*256,z),-1,c)
15 gv_check_eq("last z corner lacks interpolation neighbor",placement_vm_floor(m,x,(WZ-1)*256),-1,c)
16 vset(base,10,8,10,6)
17 gv_check_eq("overhead canopy does not become arrival floor",placement_vm_floor(m,x,z),1536,c)
18 gv_check_eq("legacy sky scan distinguishes canopy",wc_contact_floor_q(base,x,z,WY-1),2304,c)
19 vset(base,10,7,10,6)
20 gv_check_eq("body course obstruction rises through contiguous structure",placement_vm_floor(m,x,z),2304,c)
21 vset(base,10,7,10,0);vset(base,10,8,10,0);vset(base,10,6,10,5)
22 gv_check_eq("terrain voxel ignored in continuous mode",placement_vm_floor(m,x,z),1536,c)
23 spec[P_SURF]=0
24 gv_check_eq("voxel mode retains top solid",placement_vm_floor(m,x,z),1792,c)
25 gv_check_eq("voxel actor seat respects supplied altitude",placement_vm_seat(m,x,z,1000),-1,c)
26 spec[P_SURF]=1
27 var valid:i64=1;var offset:i64=0
28 while offset<256{if placement_vm_floor(m,10*256+offset,z)!=1408+offset{valid=0};offset=offset+1}
29 gv_check("all256 fractional x samples follow actual linear field",valid,c)
30 gv_check_eq("body registry remains available",wm_run(m,"body_init",2,m.mem_bytes,0,0,0,2),0,c)
31 gv_check_eq("body ABI stage unchanged",O_IMPORTED_STAGE,27534176,c)
32 gv_check_eq("runtime pages unchanged",WASM_PAGES_REQ,421,c)
33 gv_check_eq("actual bytecode below-field support",wm_run(m,"wc_contact_floor_below_q",0,x,z,WY-1,1535,5),1536,c)
34 gv_check_eq("old rule negative control",placement_old_support(base,x,z,WY-1,1535),-1,c)
35 let state:*i64=wst(base);state[S_CY]=1535+EYE
36 gv_check_eq("actual player current-column target",wm_run(m,"wstand_here",0,x,z,0,0,3),1536+EYE,c)
37 return 0
38}
39
40func placement_vm_floor(m:*WasmMod,x:i64,z:i64)->i64{return wm_run(m,"wc_place_floor_q",0,x,z,0,0,3)}
41func placement_vm_seat(m:*WasmMod,x:i64,z:i64,y:i64)->i64{return wm_run(m,"wc_actor_seat_q",0,x,z,y,0,4)}
42func main(argc:i64,argv:*i64)->i64 {
43 if argc!=3{return 3};let c:*i64=gv_ctr();gv_head("PLACEMENT-ACTUAL-PLAIN-SHARED")
44 var a:i64=1;while a<3{
45 let box:*i64=sys_mmap(8) as *i64;let bytes:*u8=sys_read_file(argv[a] as *u8,box)
46 if (bytes as i64)<=0{return 3};let m:*WasmMod=wm_new(bytes,box[0]);let rc:i64=wm_parse(m)
47 gv_check("candidate bytecode parses",rc==0,c);if rc!=0{return 3}
48 gv_check("placement export exists",wm_find_export(m,"wc_place_floor_q")>=0,c)
49 gv_check("actor seat export exists",wm_find_export(m,"wc_actor_seat_q")>=0,c)
50 let pages:i64=wm_run(m,"wasm_pages_req",0,0,0,0,0,0)
51 gv_check_eq("actual runtime required pages preserved",pages,421,c)
52 if pages!=421{return 3}
53 if m.mem_bytes<pages*65536{let expanded:*u8=sys_mmap(pages*65536);var k:i64=0;while k<m.mem_bytes{expanded[k]=m.mem[k];k=k+1};m.mem=expanded;m.mem_bytes=pages*65536}
54 gv_check_eq("actual body staging offset preserved",wm_run(m,"body_stage_off",0,0,0,0,0,0),27534176,c)
55 placement_vm_case(m,c);a=a+1
56 }
57 return gv_verdict("PLACEMENT-ACTUAL-PLAIN-SHARED",c,"Both actual compiled runtimes interpreted; threaded host execution and page placement remain separate.")
58}
59
60func placement_old_support(base: i64, xq: i64, zq: i64, top: i64, ceiling: i64) -> i64 {
61 let sp: *i64 = wsp(base)
62 var y: i64 = top
63 if y >= WY { y = WY - 1 }
64 var floor: i64 = 0 - 1
65 if sp[P_SURF] == 1 {
66 floor = wc_surface_source(base,xq,zq)
67 if floor < 0 { return 0 - 1 }
68 if floor > ceiling { floor = 0 - 1 }
69 }
70 while y >= 0 {
71 let b: i64 = vget(base,xq >> 8,y,zq >> 8)
72 var eligible: i64 = vsolid(base,xq >> 8,y,zq >> 8)
73 if sp[P_SURF] == 1 { if wterrain(b) == 1 { eligible = 0 } }
74 if eligible == 1 {
75 let celltop: i64 = (y+1)*256
76 if celltop <= ceiling {
77 if celltop > floor { floor = celltop }
78 return floor
79 }
80 }
81 y = y - 1
82 }
83 return floor
84}