Adv 2.0 D&D Phase 10 SUB3c: Cleric L10/L15

Life/War/Trickery Domain L10/L15 capstones.

L10 Divine Strike (all 3 subclasses): +4 flat per weapon hit, scaling
to +9 at L14. New CombatModifiers.DivineStrikePerHit channel, gated on
Weapon != nil since 5e specs "weapon hit". Damage type (radiant/weapon/
poison) varies by domain but isn't tracked by the engine.

Life L15 Supreme Healing: heal-spell dice resolve at max instead of
rolled. Wired through resolveHealOutOfCombat via lifeDomainSupremeHealing
helper.

War L15 Avatar of Battle: 5e physical resistance vs. non-magical
weapons → flat 0.80 DamageReduct (softer than full 50% to account for
elemental hits).

Trickery L15 Improved Duplicity: 5e duplicates grant ally-flank
advantage; no allies in 1v1, so proxied passively as +1 SporeCloud
round and +5% damage (duplicates flicker around the foe).

10 new tests; cleric-suite green. Pre-existing rng flakes
(TestOrcRageFiresOnLowHP, TestSimulateCombat_FirstAttackBonus...) are
unrelated.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
prosolis
2026-05-08 11:41:17 -07:00
parent fcd067b3c4
commit 83654eadc7
4 changed files with 233 additions and 1 deletions

View File

@@ -231,8 +231,13 @@ func (p *AdventurePlugin) resolveHealOutOfCombat(ctx MessageContext, c *DnDChara
}
totalDice := dice + extra
heal := 0
supreme := lifeDomainSupremeHealing(c)
for i := 0; i < totalDice; i++ {
heal += 1 + rand.IntN(faces)
if supreme {
heal += faces
} else {
heal += 1 + rand.IntN(faces)
}
}
heal += abilityModifier(c.WIS)
heal += lifeDomainHealBonus(c, spell, slotLevel)