


Unreleased: Lifecycle hardening pass — config setting-change handlers now unsubscribe on teardown to avoid duplicate callbacks after reload cycles; added expected-teardown lifecycle logging and extra debug diagnostics for runtime time/season/HP fallback reads.
Version 2.2.0 — Unique racial bonuses, active abilities, drawbacks, and conditional synergies for all 12 playable races in Sun Haven. Celestial Bloodlines: Font of Light (Angel) and Soul Harvest (Demon). Correctly resets when switching saves. Optional [BonusTransfers] (off by default): copy passive table bonuses between races via TargetRace|SourceRace|BonusType rules in the main Birthright config.
2.0.1: Config file now uses BepInEx/config/HavensBirthright.cfg (auto-migrates values from the legacy GUID-named config on first load).
HavensBirthright.dll in BepInEx/plugins/HavensBirthright/Edit BepInEx/config/HavensBirthright.cfg to customize bonuses.
F9 (or ToggleKey under Active Abilities): Infernal Forge, Tidal Blessing, Font of Light, and Soul Harvest start OFF each session or after switching character. Press the key any time to turn them ON or OFF — as often as you like (not limited to a single press).
Section [BonusTransfers]:
EnableBonusTransfers — default false. When true, Rules apply.Rules — semicolon-separated entries: TargetRace|SourceRace|BonusType. Each rule adds the same passive percentage the source race gets for that bonus type (from the usual Birthright tables in config). Does not copy active abilities, drawbacks, or conditional synergies.Example (HavensBirthright.cfg):
[BonusTransfers]
EnableBonusTransfers = true
Rules = Human|WaterElemental|Defense; Elf|Human|ExperienceGain
That gives Humans Water Elemental’s Defense passive (same % as [Water Elemental] → Defense in your cfg) and gives Elves the ExperienceGain bonus Humans get from [Human]. Add more grants by chaining with ; (no line breaks inside the value).
Changing saves or characters—and Fire/Water Elemental behavior after loads and F9—is more reliable. The code was reorganized for upkeep, and the mod keeps its hidden runner alive with shared SceneRootSurvivor instead of a third-party Keep Alive mod.