Adv 2.0 D&D Phase R R2: Harvest nodes & per-room registry

Per-zone resource registry (§3, all 10 zones) and full per-room harvest
layer wired into expeditions: !forage / !mine / !scavenge / !essence /
!commune / !resources. Auto-spawns a DungeonRun per region on
!expedition start, swaps it on !region travel, retires on
abandon/extract. Long rest at camp replenishes nodes across every
room and region. Reuses existing flavor.Harvest* / RichYield /
NodeDepleted / per-zone Harvest<Zone> pools.

Also clears two pre-existing test failures introduced by the E6c
flavor expansion (briefing substring list + combat-lift trial count).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
prosolis
2026-05-08 17:34:49 -07:00
parent cb51c56f00
commit 83cdf07374
13 changed files with 1314 additions and 6 deletions

View File

@@ -611,7 +611,12 @@ func plainBMPlayer() Combatant {
// Probabilistic: a stiff +4 on the opening swing should noticeably lift
// hit-rate against an enemy AC tuned to mostly-shrug the baseline player.
func TestSimulateCombat_FirstAttackBonusImprovesEarlyHits(t *testing.T) {
const trials = 1500
// Probabilistic: a +4 on the opening swing should noticeably lift the
// player's win rate against a stiff enemy. The lift is small (a single
// hit's worth), so the trial count needs to be high enough that
// variance doesn't swamp the signal — at 1500 trials we were seeing
// ~14 wins of difference on bad seeds vs. the 25-win threshold.
const trials = 6000
hardEnemy := Combatant{
Name: "Wall",
Stats: CombatStats{
@@ -629,7 +634,7 @@ func TestSimulateCombat_FirstAttackBonusImprovesEarlyHits(t *testing.T) {
bmWins++
}
}
if bmWins-plainWins < 25 {
if bmWins-plainWins < 50 {
t.Errorf("Precision Attack lift too small: plain=%d bm=%d", plainWins, bmWins)
}
}