code wiki / _hdl_build / nx_story_quest_gate.nx

nx_story_quest_gate.nx source

↩ module page · 69 lines · 4094 B

1// nx_story_quest_gate.nx -- S-R2: proves DIALOGUE TREES + a multi-step QUEST run on the same sovereign 2// story VM (nx_story_vm) using multi-flag masks. Quest: collect ITEM_A(bit0) + ITEM_B(bit1) from two 3// NPCs, then TURN IN at the hub (requires mask 3 = both). Dialogue tree = the NPC nodes have branching 4// accept/decline choices with different effects. GREEN only if: full quest completes, early/partial 5// turn-in is BLOCKED (neg-controls), and a dialogue branch changes state. license_tier: ORIGINAL expect_exit: 0 6import "nx_syscalls.nx" 7import "nx_story_vm.nx" 8 9func qw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 10func qn(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)} let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1} sys_write(1,bb,k); return 0 } 11 12func main() -> i64 { 13 let ch_target: *i64 = sys_mmap(8 * 16) as *i64 14 let ch_req: *i64 = sys_mmap(8 * 16) as *i64 15 let ch_set: *i64 = sys_mmap(8 * 16) as *i64 16 let node_is_end: *i64 = sys_mmap(8 * 8) as *i64 17 var i: i64 = 0 18 while i < 16 { ch_target[i]=-1; ch_req[i]=-1; ch_set[i]=-1; i=i+1 } 19 node_is_end[0]=0; node_is_end[1]=0; node_is_end[2]=0; node_is_end[3]=1 20 21 // N0 hub: c0->N1 (A-giver), c1->N2 (B-giver), c2->N3 TURN IN (REQ mask 3 = ITEM_A|ITEM_B) 22 ch_target[0]=1; ch_req[0]=-1; ch_set[0]=-1 23 ch_target[1]=2; ch_req[1]=-1; ch_set[1]=-1 24 ch_target[2]=3; ch_req[2]=3; ch_set[2]=-1 25 // N1 A-giver (dialogue tree): c0 accept -> N0 set ITEM_A(mask1); c1 decline -> N0 (no effect) 26 ch_target[4]=0; ch_req[4]=-1; ch_set[4]=1 27 ch_target[5]=0; ch_req[5]=-1; ch_set[5]=-1 28 // N2 B-giver: c0 accept -> N0 set ITEM_B(mask2); c1 decline -> N0 29 ch_target[8]=0; ch_req[8]=-1; ch_set[8]=2 30 ch_target[9]=0; ch_req[9]=-1; ch_set[9]=-1 31 32 var pass: i64 = 0 33 var total: i64 = 0 34 35 // ---- FULL QUEST: get A, get B, turn in -> COMPLETE ---- 36 let f: *i64 = sys_mmap(8) as *i64 37 f[0]=0 38 var cur: i64 = 0 39 cur = sv_choose(ch_target, ch_req, ch_set, cur, 0, f) // to A-giver 40 cur = sv_choose(ch_target, ch_req, ch_set, cur, 0, f) // accept A (back to hub, ITEM_A set) 41 total=total+1; if sv_has_flag(f,0)==1 { pass=pass+1 } else { qw("Q1 FAIL no ITEM_A\n") } 42 // NEG-CONTROL: partial turn-in with only A must be BLOCKED 43 let early: i64 = sv_choose(ch_target, ch_req, ch_set, cur, 2, f) 44 total=total+1; if early == -1 { pass=pass+1 } else { qw("Q2 FAIL partial turn-in not blocked\n") } 45 cur = sv_choose(ch_target, ch_req, ch_set, cur, 1, f) // to B-giver 46 cur = sv_choose(ch_target, ch_req, ch_set, cur, 0, f) // accept B (ITEM_B set) 47 total=total+1; if sv_has_flag(f,1)==1 { pass=pass+1 } else { qw("Q3 FAIL no ITEM_B\n") } 48 cur = sv_choose(ch_target, ch_req, ch_set, cur, 2, f) // turn in (have both) 49 total=total+1; if cur==3 { pass=pass+1 } else { qw("Q4 FAIL turn-in cur="); qn(cur); qw("\n") } 50 total=total+1; if sv_is_end(node_is_end, cur)==1 { pass=pass+1 } else { qw("Q5 FAIL not complete\n") } 51 52 // ---- NEG-CONTROL: turn in immediately (no items) blocked ---- 53 let f2: *i64 = sys_mmap(8) as *i64 54 f2[0]=0 55 let none: i64 = sv_choose(ch_target, ch_req, ch_set, 0, 2, f2) 56 total=total+1; if none == -1 { pass=pass+1 } else { qw("Q6 FAIL empty turn-in not blocked\n") } 57 58 // ---- DIALOGUE BRANCH: accept vs decline at the A-giver yields different state ---- 59 let fa: *i64 = sys_mmap(8) as *i64 60 fa[0]=0 61 var ca: i64 = sv_choose(ch_target, ch_req, ch_set, 0, 0, fa) // to A-giver 62 ca = sv_choose(ch_target, ch_req, ch_set, ca, 1, fa) // DECLINE 63 total=total+1; if sv_has_flag(fa,0)==0 { pass=pass+1 } else { qw("Q7 FAIL decline still set item\n") } 64 65 qw("STORY-QUEST "); qn(pass); qw("/"); qn(total); qw("\n") 66 if pass == total { qw("STORY-QUEST ALL-PASS (dialogue tree + multi-flag quest + blocked partial/empty + branch)\n"); sys_exit(0) } 67 sys_exit(1) 68 return 1 69}