adventure: T6 Amendment (Custodian) + in-combat round-end boss seam (P8)

First in-combat Layer-2 mechanic. applyBossInCombatRoundEnd is a new
round-boundary seam called from the turn engine's stepRoundEnd, the
counterpart to the pre-combat applyBossRunModifiers. The Custodian snapshots
its HP at end of round 3 and rewinds to it once on the phase-2 crossing
(refunding front-loaded burst); a soft midnight timer past round 20 climbs
its Attack via the existing enemyAtkBuff. New state (EnemyRewindHP/Used)
round-trips through CombatStatuses so a suspend/resume can't replay the
rewind. Sim A/B (n=120 L20 party): last_meridian fighter 65->37.5% clear,
a clean -27.5pp swing attributable to the mechanic; shipped as-is per the
opt-in-endgame difficulty call.

Claude-Session: https://claude.ai/code/session_0156WqjgsbmSY2U8eQ3Kkb1s
This commit is contained in:
prosolis
2026-07-16 09:20:29 -07:00
parent db13ed75b9
commit 189a44e1eb
6 changed files with 323 additions and 12 deletions

View File

@@ -232,6 +232,17 @@ type CombatStatuses struct {
EnemyRevealNext bool `json:"enemy_reveal_next,omitempty"`
EnemyFearImmune bool `json:"enemy_fear_immune,omitempty"`
EnemyAtkBuff int `json:"enemy_atk_buff,omitempty"`
// Amendment (Tier-6 postgame, The Custodian of the Last Hour). An in-combat
// Layer-2 hook resolved at round end (applyBossInCombatRoundEnd), not proc-
// armed: EnemyRewindHP snapshots the boss's HP at the end of round 3 (0 until
// captured); when the boss then crosses into phase 2 the hook restores it to
// that snapshot exactly once and sets EnemyRewindUsed. Both round-trip through
// combatState so the once-only rewind survives a suspend/resume. Zero/false
// for every other enemy. The soft midnight timer past round 20 rides the
// existing EnemyAtkBuff, so it needs no field of its own.
EnemyRewindHP int `json:"enemy_rewind_hp,omitempty"`
EnemyRewindUsed bool `json:"enemy_rewind_used,omitempty"`
}
// applyBuffDelta folds one resolved buff (the result of a !cast / !consume