mirror of
https://github.com/prosolis/gogobee.git
synced 2026-07-18 01:42:42 +00:00
adventure: T6 postgame Layer-2 seam + Aurvandryx's Greed Tax (P8)
Add the pre-combat boss-hook seam for Tier-6 postgame bosses and the first bespoke mechanic on it. Seam: applyBossRunModifiers(bossID, enemy, run) in postgame_boss_hooks.go — a pure, idempotent, bestiary-ID-dispatched hook that folds run-state-derived adjustments into the freshly-built boss Combatant. No-op for every non-hooked enemy or nil run. The turn engine (which resolves both prod bosses and the sim) rebuilds the enemy every round via partyCombatantsForSession, so the hook must be a pure function of run state — fine at a terminal boss room, where the route is frozen. Wired at both enemy-finalization points: the per-round rebuild and buildFightSeats' initial HP persist (threaded a run param; the caller already had it). Greed Tax (boss_aurvandryx / first_hoard): her Attack rises with the richness of the route walked to reach her — the summed excess LootBias (>1.0) over the run's visited nodes. Note run.LootCollected is the wrong signal (BossOnly signature manifest, empty at the boss); the gilded veins on the graph are. Attack += min(2.0*richness, 12). Same-binary A/B sweep (n=150, L20 party + Pete + pets): taxless 66.7% -> taxed 48.0%, landing first_hoard mid-band. Claude-Session: https://claude.ai/code/session_0156WqjgsbmSY2U8eQ3Kkb1s
This commit is contained in:
@@ -51,7 +51,7 @@ func fightRoster(sender id.UserID) []id.UserID {
|
||||
// The enemy is built once. Every seat's build derives the identical stat block
|
||||
// from (monster, tier, dmMood); only the player half varies.
|
||||
func (p *AdventurePlugin) buildFightSeats(
|
||||
sender id.UserID, roster []id.UserID, monster DnDMonsterTemplate, tier, dmMood int,
|
||||
sender id.UserID, roster []id.UserID, monster DnDMonsterTemplate, tier, dmMood int, run *DungeonRun,
|
||||
) (seats []CombatSeatSetup, enemy *Combatant, senderSkip, refusal string) {
|
||||
skip := func(uid id.UserID, why string) {
|
||||
if uid == sender {
|
||||
@@ -157,6 +157,13 @@ func (p *AdventurePlugin) buildFightSeats(
|
||||
// actually seated — a member who was skipped (downed, busy elsewhere) never
|
||||
// joined the fight and must not be charged to the enemy.
|
||||
applySeatWeights(seatCombatants(seats), levels, companions)
|
||||
|
||||
// Fold in any Layer-2 pre-combat boss mechanic before this enemy is used to
|
||||
// persist the initial HP pool. partyCombatantsForSession re-applies the same
|
||||
// modifier on every round's rebuild; doing it here keeps the persisted stat
|
||||
// block consistent with the fight the engine will actually run. No-op for
|
||||
// every non-hooked enemy.
|
||||
applyBossRunModifiers(monster.ID, enemy, run)
|
||||
return seats, enemy, senderSkip, ""
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user