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}