diff --git a/CHANGELOG.md b/CHANGELOG.md index 11589cc..d595c42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to the **HbM RPG v3** Foundry VTT system. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.5.2] - 2026-10-26 + +### Fixed +- A character with the discipline Magia Sakralna - Egzorcyzmy (`sacredExorcism`) is now treated as a Sacred Magic caster in the spell discipline gate. Before, it only matched its own id, so exorcists failed the requirement for Sacred spells. The match is one-way: a plain Sacred mage is not an exorcist. +- The "new round" chat message and README no longer claim that Mana is reset. Mana is a daily pool in the vault and has not been reset per round since 1.3.x; the message now says which counters really reset. + ## [1.5.1] - 2026-10-22 ### Added diff --git a/README.md b/README.md index b93b72d..886b41b 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ A companion lore module ([`foundry-lore`](https://github.com/iwo-strzebonski/hbm - **TS d6 dice pool roller** (`HbmTSRoll`) - `1` auto-fail, `6` auto-success, configurable Threshold (T) and required Successes (Y), plus T-step / Y-step modifiers driven by Active Effects. - **Derived stats** - `health.max = 3 × (body + mind + soul)`, `zeal.max = ceil(soul/2)`, initiative pool, mana table lookup (Magic Power Level 0–X), blood pool (`body + soul`), elixir tolerance cap (`body + 1`), insanity counter. - **4-layer damage model** - Magical Armor (with runic counter) → Magical Shield → Physical Armor (DR + condition) → Health. `Apply Damage` dialog with bypass flags; auto-applies `Oszołomiony` on heavy HP loss. -- **Combat hooks** - Mana resets each round; Zeal +1 each turn; turns auto-skipped for Nieprzytomny / Obezwładniony; Podpalony ticks 1 environmental damage; Umierający prompts a Death Save. +- **Combat hooks** - Mana is a daily pool (not reset per round; recovered by rests); Zeal +1 each turn; Immediate Action and Krew counters reset each round; turns auto-skipped for Nieprzytomny / Obezwładniony; Podpalony ticks 1 environmental damage; Umierający prompts a Death Save. - **Spell-cast workflow** - `validateCast()` gates on resources / race / talent / discipline / deity / group / inCombat / superspell / witch-symbol; dispatcher routes to standard / Sacred / Witch / Blood / Hekate hybrid; `rollSpellDamage()` parses formula tokens; reactive triggers (`killWithWeapon`, `targetCastsSpell`, `damageTaken`, `turnStart`). - **Cast dialog** - mana / zeal / blood inputs, group-caster picker, Hekate toggle, GM bypass checkboxes (superspell, non-combat block), inline validation feedback. - **Mechanics modules** (`game.hbm.*`) - `bloodMagic` (Self-Harm, Life Steal, talent integration), `abyssMagic` (Aspects vs Primal, Mistrz Losu penalty, `Dary Otchłani`, insanity gain), `brewing` (TS test + tolerance counter), `rest` (short / long), `trade` (founding company workflow, transactions, smuggling). diff --git a/lang/en.json b/lang/en.json index c74db31..2eaf886 100644 --- a/lang/en.json +++ b/lang/en.json @@ -423,7 +423,7 @@ } }, "combat": { - "newRound": "New round - Mana reset", + "newRound": "New round - Immediate Action and Krew counters reset", "newTurn": "New turn - Zeal +1", "turnSkipped": "Turn skipped (condition)", "deathSavePrompt": "Make a Death Saving Throw (Body, T:4, Y:1)" diff --git a/lang/pl.json b/lang/pl.json index b222e9e..8ebd57c 100644 --- a/lang/pl.json +++ b/lang/pl.json @@ -426,7 +426,7 @@ } }, "combat": { - "newRound": "Nowa runda - Mana zresetowana", + "newRound": "Nowa runda - liczniki Akcji Natychmiastowych i Krwi zresetowane", "newTurn": "Nowa tura - Zapał +1", "turnSkipped": "Tura pominięta (stan)", "deathSavePrompt": "Wykonaj Rzut Obronny przeciw Śmierci (Ciało, T:4, Y:1)" diff --git a/package.json b/package.json index c2bae20..a233b1c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hbm-rpg-v3-foundry", - "version": "1.5.1", + "version": "1.5.2", "description": "Foundry VTT system for Homebrew Magic: Role Playing Game v3", "private": true, "type": "module", diff --git a/src/logic/spell-validation.ts b/src/logic/spell-validation.ts index 168ed27..d7df853 100644 --- a/src/logic/spell-validation.ts +++ b/src/logic/spell-validation.ts @@ -41,7 +41,7 @@ function actorHasTalent(actor: CastableActor, talentId: string): boolean { return false; } -function matchDiscipline(disciplineId: string, targetId: string): boolean { +export function matchDiscipline(disciplineId: string, targetId: string): boolean { const d1 = disciplineId.toLowerCase().trim(); const d2 = targetId.toLowerCase().trim(); if (d1 === d2) return true; @@ -52,6 +52,8 @@ function matchDiscipline(disciplineId: string, targetId: string): boolean { abyssprimal: ['abyssprimal', 'magia otchłani', 'primal', 'eldritch', 'eldritch magic', 'abyss - primal', 'magia otchłani - pierwotna magia', 'pierwotna magia'], witch: ['witch', 'wiedźmia magia', 'witch magic', 'dzika wiedźmia magia', 'wildwitch'], blood: ['blood', 'magia krwi', 'blood magic'], + sacred: ['sacred', 'magia sakralna', 'sacred magic'], + sacredexorcism: ['sacredexorcism', 'magia sakralna - egzorcyzmy', 'egzorcyzmy', 'exorcism', 'exorcisms', 'sacred - exorcisms'], }; let key1: string | null = null; @@ -63,6 +65,8 @@ function matchDiscipline(disciplineId: string, targetId: string): boolean { } if (key1 && key2 && key1 === key2) return true; + // Egzorcyzmy are a sub-discipline of Magia Sakralna: an exorcist counts as Sacred, not the other way round. + if (key1 === 'sacredexorcism' && key2 === 'sacred') return true; return false; } diff --git a/system.json b/system.json index 8df3091..49fa97e 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "id": "hbm-rpg-v3", "title": "Homebrew Magic: RPG v3", "description": "System Foundry VTT dla Homebrew Magic: Role Playing Game v3 - autorska gra fabularna z mechaniką puli kości d6 (TS - Trudność:Sukcesy).", - "version": "1.5.1", + "version": "1.5.2", "manifest": "https://vtt-content.octoturge.com/packages/system/hbm-rpg-v3.json", "download": "https://vtt-content.octoturge.com/packages/system/hbm-rpg-v3-v1.5.0.zip", "compatibility": { diff --git a/tests/logic/spell-validation.test.ts b/tests/logic/spell-validation.test.ts new file mode 100644 index 0000000..3fdb6ba --- /dev/null +++ b/tests/logic/spell-validation.test.ts @@ -0,0 +1,19 @@ +import { describe, it, expect } from 'vitest'; +import { matchDiscipline } from '../../src/logic/spell-validation'; + +describe('matchDiscipline: Magia Sakralna - Egzorcyzmy', () => { + it('an exorcist counts as Sacred Magic for casting', () => { + expect(matchDiscipline('sacredExorcism', 'sacred')).toBe(true); + expect(matchDiscipline('Magia Sakralna - Egzorcyzmy', 'sacred')).toBe(true); + expect(matchDiscipline('Egzorcyzmy', 'Magia Sakralna')).toBe(true); + }); + + it('a plain Sacred mage is not an exorcist', () => { + expect(matchDiscipline('sacred', 'sacredExorcism')).toBe(false); + expect(matchDiscipline('Magia Sakralna', 'egzorcyzmy')).toBe(false); + }); + + it('does not leak into other disciplines', () => { + expect(matchDiscipline('sacredExorcism', 'witch')).toBe(false); + }); +});