Combat stats pass: anchor-derived stats and canonical arena suite

Derive all combat stats from documented anchors (content_design.md,
'Combat stat anchors'): weapon DPS ~0.6 per threat with a mild size
discount traded for range (railgun m/l damage 17/70), hull HP at 15
per hull threat (drone 60 up to capitals 15500), armor at a 20/threat
premium (armor_plates 640 HP), repair at ~2 HP/s per threat (25 HP per
cycle), salvager range fixed to 60 m with cargo 20, and a monotone
mobility ladder (the placeholder drone was the least agile ship).
Stations anchored to 'a fresh station holds one early parity wave';
enemy level 0 matches the player station and scales per push. HQ 5000
HP. scrap_despawn_seconds 30 -> 120 so capital-sized scrap drops are
collectable.

Rewrite balancing.toml as the canonical 12-arena suite: class mirrors,
equal-threat cross-tier matchups with counts from the verified threat
values, a two-to-one decisiveness check, armored-vs-glass and
repair-escort doctrine matchups, and station assault. The carrier
arena is expected to lose until drone launching exists (hangar is dead
threat) - documented, not stat-compensated.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DyCu8vwChKMbLJQ3xosYEN
This commit is contained in:
2026-07-03 20:19:24 +02:00
parent 38fd2e4e89
commit 5aa0544cf2
6 changed files with 457 additions and 78 deletions

View File

@@ -440,6 +440,48 @@ typical loadouts double as the `default_modules` for enemy waves):
scrap-free recipe produces that item, mirroring the reprocessing-path
rule (see progression_design.md action items).
### Combat stat anchors — first pass
All combat stats derive from a few anchors so that power-per-threat holds
by construction; the arena suite in `bin/balancing/data/balancing.toml`
verifies it empirically. Change the anchors first, re-derive stats second.
- **Weapon DPS ≈ 0.6 per threat of weapon contribution**, mildly
diminishing with gun size, compensated by the range ladder:
railgun_s 2 dmg × 2.0 Hz = 4.0 DPS at 6.5 threat (0.62), range 50;
railgun_m 17 × 1.5 = 25.5 at 43.5 (0.59), range 70;
railgun_l 70 × 0.8 = 56 at 102 (0.55), range 100.
- **Hull HP = 15 per threat of hull contribution** (incl. ship base
time): drone 60, frigate 300, destroyer 550, cruiser 1500,
battlecruiser 2700, battleship 7500, dreadnought/carrier 15500.
- **Armor HP = 20 per threat** — a premium over hull HP because armor is
pure HP with no capability: armor_plates adds 640 HP at 32 threat.
- **TTK check:** a mirror cruiser duel (51 DPS vs 2140 EHP) lasts ~42 s —
inside the 3060 s parity-fight band implied by the 25-ship fleet
target. Capital mirrors run longer (~90 s), deliberately.
- **Repair ≈ 2 HP/s per threat:** repair_tool heals 25 HP × 1 Hz at 13
threat. Salvager: collection range 60 (was a nonsensical 500, beyond
any sensor), cargo 20, 0.5 collections/s. `scrap_despawn_seconds`
raised 30 → 120: a capital kill drops hundreds of scrap collected one
per cycle, so 30 s despawned nearly everything.
- **Mobility ladder is monotone in size** — small = fast and nimble
(drone 45 m/s, 60 accel) down to capitals (10 m/s, 8 accel); the old
placeholder had the drone as the least agile ship. Sensor ranges keep
the existing 150→350 ladder; all weapon ranges stay below sensor
ranges.
- **Weapon modifiers are capital economy:** ×1.2 damage at 22.5 threat
beats adding a gun once a ship carries more than ~68 threat of weapons
— so modifiers pay off on gun-heavy big hulls and are a waste on small
ones. Kept at ×1.2/×1.2/(×1.5 range, ×0.8 rate) deliberately.
- **Stations:** a fresh player station (3000 HP, 25 dmg × 1 Hz,
range 200) holds one early parity wave unaided; the enemy station at
level 0 matches it exactly and scales per push level
(+1500 HP, +12 dmg, +0.1 Hz per level). HQ 5000 HP.
- **Known imbalance, accepted:** the carrier loses its equal-threat
arena until the drone-launching capability exists — the hangar is 224
threat of dead weight. Do not compensate with stats; fix by
implementing drones.
## Balancing targets (first pass, July 2026)
The six root numbers for the balancing pass. Every derived value (threat