Both result screens set IsDestroyed before ClearBattle, which derived the
result from that flag, so BattleEndedEvent.Result was always "defeat".
The screens now pass the outcome in.
A status effect added without an explicit duration started with no remaining
turns and the countdown skipped it, so it never expired. OnTurnEnd counted
down a second time, expired unlimited effects after one turn and removed
expired stacks by id; it is now a pure hook. The victory screen rolls loot
through LootEntry.Roll, so a loot table with MinCount > MaxCount no longer
throws half-way through the battle end, and its success-path diagnostics are
no longer logged as errors. Mod unit tests for the status effect lifetime.
Battle cores, winground listeners and status effect behaviours reach their
registries through ModTypeConsumer subclasses instead of per-mod assembly
lookups and AppDomain rescans, and leave again when their mod unloads, so a
game switch or hot reload never keeps a released mod's types alive.
BattleCoreRegistry.GetActive: without an explicit battle.set_core the
active game collection's settings["battle.core"] chooses the core (e.g.
card_battle for cthangover and card_novel), then the first registered one.