code wiki / _hdl_build / nx_craft_save_recovery_gate_t21.nx
nx_craft_save_recovery_gate_t21.nx source
↩ module page · 89 lines · 5000 B
1// Actual engine functions over isolated allocated arena; no filesystem or estate writes.
2import "nx_wasm_craft_journal_index_t21.nx"
3import "nx_gate_verdict.nx"
4func sr_copy(dst: *u8,src: *u8,n: i64) -> i64 {
5 var i: i64=0;while i<n { dst[i]=src[i];i=i+1 };return n
6}
7func sr_equal(a: *u8,b: *u8,n: i64) -> i64 {
8 var i: i64=0;while i<n { if a[i]!=b[i] { return 0 };i=i+1 };return 1
9}
10func sr_save(base: i64,copy: *u8) -> i64 {
11 let n: i64=wc_save_build(base)
12 sr_copy(copy,(base+O_SAVE) as *u8,n);return n
13}
14func sr_load(base: i64,copy: *u8,n: i64) -> i64 {
15 sr_copy((base+O_SAVE) as *u8,copy,n);return wc_save_apply(base)
16}
17func sr_field(base: i64) -> i64 {
18 let s: *i64=wst(base);return wc_surface_source(base,s[S_CX],s[S_CZ])
19}
20func main() -> i64 {
21 let arena: *u8=sys_mmap(CRAFT_EXT_TOTAL)
22 let save: *u8=sys_mmap(SAVE_LEN)
23 let expected: *u8=sys_mmap(CRAFT_EXT_TOTAL)
24 if (arena as i64)<=0||(save as i64)<=0||(expected as i64)<=0 { return 3 }
25 let base: i64=arena as i64;let s: *i64=wst(base);let hd: *i64=(base+O_SAVE) as *i64
26 let ctr: *i64=gv_ctr();gv_head("CRAFT SAVE RECOVERY / actual engine state" as *u8)
27 init_impl_v(base,2,123)
28 let floor: i64=sr_field(base)
29 s[S_CY]=floor+EYE-1
30 let n: i64=sr_save(base,save)
31 init_impl_v(base,2,123)
32 gv_check("authentic save loads and recovers one-Q8 penetration" as *u8,sr_load(base,save,n)==0&&s[S_CY]==floor+EYE,ctr)
33 gv_check("real vertical tick remains on surface" as *u8,wc_player_vertical_apply(base,0)==floor+EYE,ctr)
34 var shiftcase: i64=0
35 while shiftcase<2 {
36 init_impl_v(base,2,123)
37 var dz: i64=0;if shiftcase==1 { dz=0-16 }
38 wc_shift(base,16,dz)
39 sr_copy(expected,(base+O_HQ) as *u8,WX*WZ*8)
40 let before: i64=sr_field(base);sr_save(base,save)
41 init_impl_v(base,2,123)
42 gv_check("shifted X or XZ restore reconstructs exact height cache" as *u8,sr_load(base,save,n)==0&&sr_equal(expected,(base+O_HQ) as *u8,WX*WZ*8)==1&&sr_field(base)==before,ctr)
43 shiftcase=shiftcase+1
44 }
45 init_impl_v(base,2,321)
46 sr_copy(expected,(base+O_HQ) as *u8,WX*WZ*8);sr_save(base,save)
47 init_impl_v(base,2,123)
48 gv_check("different restored seed reconstructs exact height cache" as *u8,sr_load(base,save,n)==0&&sr_equal(expected,(base+O_HQ) as *u8,WX*WZ*8)==1,ctr)
49 var airborne: i64=0
50 while airborne<2 {
51 init_impl_v(base,2,123)
52 let wanted: i64=sr_field(base)+EYE+airborne*5*256
53 s[S_CY]=wanted;sr_save(base,save)
54 init_impl_v(base,2,123)
55 gv_check("clear standing or airborne saved camera remains unchanged" as *u8,sr_load(base,save,n)==0&&s[S_CY]==wanted&&hd[1]==SAVE_VER,ctr)
56 airborne=airborne+1
57 }
58 init_impl_v(base,2,123)
59 let x: i64=s[S_CX] >> 8;let z: i64=s[S_CZ] >> 8;let obstacle: i64=(sr_field(base) >> 8)+1
60 vset(base,x,obstacle,z,6);sr_copy(expected,wvx(base),WX*WY*WZ);sr_save(base,save)
61 init_impl_v(base,2,123)
62 gv_check("occupied-volume restore selects clear support without losing voxel" as *u8,sr_load(base,save,n)==0&&wc_player_position_clear(base,s[S_CX],s[S_CY],s[S_CZ])==1&&s[S_CY]-EYE>=(obstacle+1)*256&&sr_equal(expected,wvx(base),WX*WY*WZ)==1,ctr)
63 init_impl_v(base,2,123);wc_shift(base,16,0);wc_edit(base,32,24,32,6)
64 sr_copy(expected,wvx(base),WX*WY*WZ)
65 sr_copy(((expected as i64)+WX*WY*WZ) as *u8,(base+O_EJRN) as *u8,EJRN_BYTES)
66 sr_save(base,save);init_impl_v(base,2,123)
67 gv_check("actual player edit and nonempty journal survive restore byte for byte" as *u8,sr_load(base,save,n)==0&&sr_equal(expected,wvx(base),WX*WY*WZ)==1&&sr_equal(((expected as i64)+WX*WY*WZ) as *u8,(base+O_EJRN) as *u8,EJRN_BYTES)==1&&ej_get(base,48,24,32)==6,ctr)
68 init_impl_v(base,2,123);let wanted: i64=s[S_CY];wc_save_build(base)
69 hd[1]=SAVE_VER5;hd[11]=wc_save_ck_v5(base)
70 gv_check("legacy version-five checksum geometry and camera preserved" as *u8,wc_save_apply(base)==0&&s[S_CY]==wanted&&hd[1]==SAVE_VER5,ctr)
71 var refusal: i64=0
72 while refusal<3 {
73 init_impl_v(base,2,123);wc_save_build(base)
74 if refusal==0 { hd[0]=hd[0]+1 }
75 if refusal==1 { hd[1]=hd[1]+100 }
76 if refusal==2 { hd[11]=hd[11]+1 }
77 sr_copy(expected,arena,CRAFT_EXT_TOTAL)
78 gv_check("invalid magic/version/checksum retains entire arena unchanged" as *u8,wc_save_apply(base)==(0-refusal-1)&&sr_equal(expected,arena,CRAFT_EXT_TOTAL)==1,ctr)
79 refusal=refusal+1
80 }
81 init_impl_v(base,2,123)
82 let closedx: i64=s[S_CX] >> 8;let closedz: i64=s[S_CZ] >> 8;let held: i64=s[S_CY]
83 var y: i64=0;while y<WY { vset(base,closedx,y,closedz,6);y=y+1 }
84 sr_save(base,save);init_impl_v(base,2,123)
85 gv_check("fully occupied column is explicitly unresolved" as *u8,sr_load(base,save,n)==0&&wc_player_recover(base)==(0-1)&&wc_player_position_clear(base,s[S_CX],s[S_CY],s[S_CZ])==0,ctr)
86 gv_check("unresolved state cannot fall further" as *u8,wc_player_vertical_apply(base,0)==held,ctr)
87 sys_munmap(arena,CRAFT_EXT_TOTAL);sys_munmap(save,SAVE_LEN);sys_munmap(expected,CRAFT_EXT_TOTAL)
88 return gv_verdict("CRAFT-SAVE-RECOVERY" as *u8,ctr,"actual engine and saved edits; rendered Y parity, visible unresolved diagnostic and per-frame cost remain separate acceptance" as *u8)
89}