Sync parsers and game mechanics with vault changes (2026-08-18 to 08-23)

- talent-parser.ts, discipline-parser.ts, race-parser.ts: rebuilt to read
  from the vault's post-bab5a62 per-topic-file layout (rulebook monoliths
  were split into per-chapter subfolders; discipline/race writeups moved to
  their canonical disciplines/ and races/ folders). All three parsers were
  previously producing zero or broken output for their packs.
- constants.ts, actor-character.ts, actor-npc.ts, rest.ts: mana is now a
  daily pool (Poziom Mocy x3) restored via rest tiers, not a per-round
  budget; Zywotnosc is 2x(Cialo+Umysl+Dusza), not 3x; rest recovery amounts
  updated to match Odetchniecie/Krotki Odpoczynek/Dlugi Odpoczynek.
- combat.ts: removed the now-obsolete per-round mana reset hook.
- actor-npc.ts: Initiative now includes Refleks/Spostrzegawczosc skill
  bonuses (was missing entirely); Magia attribute constrained to valid
  1k10 character-creation values.
- fields.ts: added `choices` support to makeIntField for the above.
- spell-cast.ts: overcast test now uses the correct T-threshold tiers and
  triangular S = E*(E+1)/2 required-successes formula (Zasada
  Nadczarowywania Zaklec).

Not implemented (flagged as new features, out of scope for a sync fix):
mana-exhaustion/overcast-failure penalty tables, overcast bonus taper past
step 2, shield-breaking damage mechanic, elixir-weapon-coating system.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-23 01:15:38 +02:00
co-authored by Claude Sonnet 5
parent 0fe9dd02d6
commit 1fba0892b9
10 changed files with 345 additions and 396 deletions
+6 -2
View File
@@ -46,7 +46,8 @@ export class NpcData extends foundry.abstract.TypeDataModel {
mind: new f.SchemaField({ value: makeIntField(1, { min: 1, max: 12 }) }),
soul: new f.SchemaField({ value: makeIntField(1, { min: 1, max: 12 }) }),
magic: new f.SchemaField({
value: makeIntField(0, { min: 0, max: 10 }),
// Valid 1k10 character-creation values only (Atrybuty.md).
value: makeIntField(0, { choices: [0, 1, 2, 3, 4, 6] }),
actual: makeIntField(0, { min: 0, max: 10 }), // derived
}),
mana: new f.SchemaField({
@@ -112,6 +113,7 @@ export class NpcData extends foundry.abstract.TypeDataModel {
magicalShield: { value: number; max: number };
initiative: { value: number; bonus: number };
};
skills: Record<string, { value: number }>;
};
const a = sys.attributes;
@@ -134,7 +136,7 @@ export class NpcData extends foundry.abstract.TypeDataModel {
// Derive NPC mana from MAGIC_POWER_TABLE
const mp = getMagicPowerEntry(a.magic.actual);
a.mana.max = mp.manaPerRound;
a.mana.max = mp.manaPerDay;
a.mana.maxPerSpell = mp.maxPerSpell;
if (a.mana.value > a.mana.max) a.mana.value = a.mana.max;
@@ -154,6 +156,8 @@ export class NpcData extends foundry.abstract.TypeDataModel {
a.initiative.value =
a.mind.value +
(sys.skills.reflex?.value ?? 0) +
(sys.skills.perception?.value ?? 0) +
initiativeBonus +
(a.initiative.bonus ?? 0);