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}