code wiki / _hdl_build / nx_char_ai.nx
nx_char_ai.nx source
↩ module page · 55 lines · 2111 B
1// nx_char_ai.nx -- G-R2: sovereign CHARACTER-AI primitives (P5 generative pillar). Two classic, data-
2// driven game-AI engines, pure integer logic:
3// BEHAVIOR TREE: nodes = SEQ / SEL / COND / ACT over a blackboard bitmask; bt_tick returns OK/FAIL and
4// writes the chosen action. SEQ = all-children-must-succeed; SEL = first-success-wins (priority).
5// FSM: a transition table; fsm_step(state,event) -> next state (stays if no transition).
6// These drive NPC decisions deterministically -> reproducible, testable AI. 100% sovereign. license_tier: ORIGINAL
7import "nx_syscalls.nx"
8
9const BT_FAIL: i64 = 0
10const BT_OK: i64 = 1
11const NT_SEQ: i64 = 0
12const NT_SEL: i64 = 1
13const NT_COND: i64 = 2
14const NT_ACT: i64 = 3
15const BT_K: i64 = 4 // max children per composite node
16
17// recursive tick. ty/a0/nk/kids define the tree; bb = blackboard condition bitmask; action_out[0] gets
18// the chosen action id (set by the ACT leaf that runs). Returns BT_OK / BT_FAIL.
19func bt_tick(ty: *i64, a0: *i64, nk: *i64, kids: *i64, node: i64, bb: i64, action_out: *i64) -> i64 {
20 let t: i64 = ty[node]
21 if t == NT_COND {
22 if (bb & (1 << a0[node])) != 0 { return BT_OK }
23 return BT_FAIL
24 }
25 if t == NT_ACT {
26 action_out[0] = a0[node]
27 return BT_OK
28 }
29 if t == NT_SEQ {
30 var c: i64 = 0
31 while c < nk[node] {
32 let r: i64 = bt_tick(ty, a0, nk, kids, kids[node*BT_K + c], bb, action_out)
33 if r == BT_FAIL { return BT_FAIL }
34 c = c + 1
35 }
36 return BT_OK
37 }
38 if t == NT_SEL {
39 var c2: i64 = 0
40 while c2 < nk[node] {
41 let r2: i64 = bt_tick(ty, a0, nk, kids, kids[node*BT_K + c2], bb, action_out)
42 if r2 == BT_OK { return BT_OK }
43 c2 = c2 + 1
44 }
45 return BT_FAIL
46 }
47 return BT_FAIL
48}
49
50// FSM transition. trans[state*nev + event] = next state, or -1 to STAY in the current state.
51func fsm_step(trans: *i64, nev: i64, state: i64, event: i64) -> i64 {
52 let nxt: i64 = trans[state*nev + event]
53 if nxt < 0 { return state }
54 return nxt
55}