fix: Egzorcyzmy count as Magia Sakralna for spell discipline gate (1.5.2) #8
@@ -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
|
||||
|
||||
@@ -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).
|
||||
|
||||
+1
-1
@@ -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)"
|
||||
|
||||
+1
-1
@@ -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)"
|
||||
|
||||
+1
-1
@@ -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",
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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": {
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user