code wiki / _hdl_build / nx_game_taming.nx
nx_game_taming.nx
buildroot/runtime/_hdl_build/nx_game_taming.nx
about
nx_game_taming.nx -- THE MULTIPLE PATHS to winning a companion (ws=game-interact rung 4, operator:
"i like multiple ways of taming -- from dominating in fighting, to items like the pal balls, and also
taming from capture ... train them or release them").
FIVE paths, each a genuinely different skill, each able to FAIL:
1 DOMINANCE -- beat her decisively in combat (nx_game_breed brd_duel: margin >= species submit_bar)
2 ITEM -- a bind-charm; odds are the real HP-dependent catch curve (composed from
nx_creature_world's cw_catch_a -- the ODDS ORACLE, not a second copy)
3 SEDUCTION -- a non-combat contest of approaches vs her ARCHETYPE; reading her wrong costs you
4 TRAINING -- the slow path: move trust/willpower over many interactions until she stays willingly
5 RELEASE -- let her go; it costs you her, moves your reputation, and she REMEMBERS
★THE ARCHITECTURAL LAW (the A2 reconciliation): every path makes its own DECISION, then funnels
through the ONE canonical transfer verb `brd_capture`, which preserves genome + bond state exactly.
There is exactly one way a creature changes hands, so the paths can never drift apart.
★BOND IS NOT OWNERSHIP: capturing her by force gives you a companion with LOW TRUST and HIGH WILL --
she is yours and she will not obey. Trust is earned afterward (path 4) whatever path took her. That is
the depth: the fast paths cost you loyalty, the slow path costs you time.
All thresholds are DATA rows. All integer, deterministic, caller-seeded. LIB, no main.
license_tier: ORIGINAL
dependencies 4 imports · 2 importers
imports: nx_syscalls.nxnx_game_breed.nxnx_creature_world.nxnx_game_genetics.nx
imported by: nx_breeder_lab.nxnx_game_taming_gate.nx
structs
| none |
consts
| 33 | const TM_DOMINANCE: i64 = 0 |
| 34 | const TM_ITEM: i64 = 1 |
| 35 | const TM_SEDUCE: i64 = 2 |
| 36 | const TM_TRAIN: i64 = 3 |
| 37 | const TM_RELEASE: i64 = 4 |
| 38 | const TM_NPATH: i64 = 5 |
| 44 | const TM_ARCH_STRIDE: i64 = 6 |
| 45 | const TM_NARCH: i64 = 4 |
| 46 | const TM_ARCH_PROUD: i64 = 0 |
| 47 | const TM_ARCH_SHY: i64 = 1 |
| 48 | const TM_ARCH_WILD: i64 = 2 |
| 49 | const TM_ARCH_CLEVER: i64 = 3 |
| 52 | const TM_AP_GIFT: i64 = 0 |
| 53 | const TM_AP_FLATTER: i64 = 1 |
| 54 | const TM_AP_IMPRESS: i64 = 2 |
| 55 | const TM_AP_CHALLENGE: i64 = 3 |
| 56 | const TM_NAP: i64 = 4 |
| 99 | const TM_OK: i64 = 1 // she is yours |
| 100 | const TM_FAIL: i64 = 0 // attempt failed, she is still wild |
| 101 | const TM_RESIST: i64 = 2 // failed AND she hardened (will/guard up) |
| 102 | const TM_REFUSED: i64 = 3 // the attempt was not legal (bad handle, roster full, no item) |
| 163 | const TM_ACT_FEED: i64 = 0 |
| 164 | const TM_ACT_SPAR: i64 = 1 |
| 165 | const TM_ACT_WORK: i64 = 2 |
| 166 | const TM_ACT_PRAISE: i64 = 3 |
| 167 | const TM_ACT_REST: i64 = 4 |
| 168 | const TM_NACT: i64 = 5 |
| 205 | const TM_WILLING_BAR: i64 = 600 |
| 225 | const TM_REL_STRIDE: i64 = 4 |
functions
| 58 | func tm_arch_default(tbl: *i64) -> i64 called by 1: main |
| 69 | func tm_best(tbl: *i64, a: i64) -> i64 { return tbl[a*TM_ARCH_STRIDE + 0] } |
| 70 | func tm_worst(tbl: *i64, a: i64) -> i64 { return tbl[a*TM_ARCH_STRIDE + 1] } |
| 71 | func tm_seduce_bar(tbl: *i64, a: i64) -> i64{ return tbl[a*TM_ARCH_STRIDE + 2] } called by 1: tm_seduce_step |
| 72 | func tm_item_rate(tbl: *i64, a: i64) -> i64 { return tbl[a*TM_ARCH_STRIDE + 3] } |
| 73 | func tm_train_rate(tbl: *i64, a: i64) -> i64{ return tbl[a*TM_ARCH_STRIDE + 4] } called by 1: tm_train |
| 74 | func tm_pride(tbl: *i64, a: i64) -> i64 { return tbl[a*TM_ARCH_STRIDE + 5] } called by 1: tm_seduce_step |
| 77 | func tm_archetype(ros: *i64, h: i64) -> i64 |
| 85 | func tm_rng(s: *i64) -> i64 |
| 92 | func tm_clamp(v: i64, lo: i64, hi: i64) -> i64 |
| 110 | func tm_item_try(ros: *i64, h: i64, tbl: *i64, c: *i64, ball: i64, s: *i64) -> i64 |
| 123 | func tm_item_odds_permil(ros: *i64, h: i64, tbl: *i64, c: *i64, ball: i64) -> i64 |
| 139 | func tm_seduce_step(ros: *i64, h: i64, tbl: *i64, approach: i64, charisma: i64, s: *i64) -> i64 |
| 170 | func tm_act_default(at: *i64) -> i64 called by 1: main |
| 178 | func tm_train(ros: *i64, h: i64, tbl: *i64, at: *i64, activity: i64, s: *i64) -> i64 |
| 195 | func tm_obeys(ros: *i64, h: i64, s: *i64) -> i64 |
| 206 | func tm_willing(ros: *i64, h: i64) -> i64 |
| 212 | func tm_escape_check(ros: *i64, h: i64, s: *i64) -> i64 |
| 226 | func tm_rel_count(reg: *i64) -> i64 { return reg[0] } called by 1: main |
| 227 | func tm_release(ros: *i64, h: i64, reg: *i64, regcap: i64, repbox: *i64) -> i64 |
| 245 | func tm_maybe_return(reg: *i64, s: *i64) -> i64 |
| 263 | func tm_readmit(ros: *i64, reg: *i64, idx: i64) -> i64 |
| 288 | func tm_acquire(dst: *i64, src: *i64, h: i64, path: i64) -> i64 |
| 297 | func tm_path_name(p: i64) -> *u8 |
| 304 | func tm_arch_name(a: i64) -> *u8 |