Class feat injections moved to yaml

This commit is contained in:
2026-05-24 20:23:08 +02:00
parent 5fa5246e9f
commit b2a58cb011
8 changed files with 429 additions and 86 deletions
@@ -2,20 +2,18 @@
## Status Snapshot
Current state as of 2026-05-13:
Current state as of 2026-05-24:
- This document is partially stale relative to the implementation in
`internal/topdata/native.go`.
- Current code injects:
- always-on menu feats: `feat:specialattacks`, `feat:throw`,
`feat:grapple`, `feat:offensivefighting`, `feat:defensivefighting`,
`feat:horsemenu`
- conditional combat feats: `feat:powerattack`, `feat:combatexpertise`
- class-skill shorthand rows for `masterfeats:skillfocus` at level `-1` and
`masterfeats:greaterskillfocus` at level `12`
- This contract should be treated as a parity note, not as an exact
implementation transcript, until it is fully rewritten around the current
behavior.
- Current code reads class feat injection policy from
`topdata.class_feat_injections` in `nwn-tool.yaml`.
- `global_feats` injects concrete `feat:*` references into each
`classes/feats/*.json` table, unless the class already authors the same feat.
- `global_feats` supports `require_present` and `unless_present` conditions
against other feat references already present in the class feat table.
- `class_skill_masterfeats` expands configured `masterfeats:*` rows once for
each class skill.
- If a project omits `topdata.class_feat_injections`, the toolkit keeps the
former hardcoded default injections for compatibility.
## Objective
@@ -105,12 +103,12 @@ With properties:
Always inject:
- `feat:specialattacks`
- `feat:special_attacks`
- `feat:throw`
- `feat:grapple`
- `feat:offensivefighting`
- `feat:defensivefighting`
- `feat:horsemenu`
- `feat:offensive_fighting`
- `feat:defensive_fighting`
- `feat:horse_menu`
With properties:
@@ -128,8 +126,8 @@ With properties:
Inject:
- `feat:powerattack`
- `feat:combatexpertise`
- `feat:power_attack`
- `feat:combat_expertise`
With properties:
@@ -145,9 +143,11 @@ With properties:
### R6 — Override precedence
- Overrides MUST be applied after injection.
- Overrides MUST take precedence over injected defaults.
- Injection MUST NOT block or replace explicit override data.
- Explicitly authored class feat rows take precedence over injected rows.
- Injection MUST NOT replace explicit class feat data.
- Dataset overrides are applied before class feat injection in the native
dataset merge pipeline; author a class feat row directly to override or
suppress the injected equivalent for a class.
---