Files
dota_factory/docs/balancing/targets.md
Malte Langkabel b4fa3e6dff Restructure balancing docs into docs/balancing/
Split the cluttered progression_design.md and content_design.md into
separated documents by role:

- docs/balancing/rules.md    - design rules and principles (moved from
                               progression_design.md, which is removed)
- docs/balancing/targets.md  - the chosen base numbers: run shape,
                               factory curve, threat ladder (achieved
                               values adopted), combat anchors, pacing
                               anchors
- docs/balancing/derived.md  - current tuned state of all derived
                               numbers, mirroring the configs
- docs/balancing/process.md  - pass order, tuning discipline learned in
                               arena rounds 1-5, tools, next-round
                               checklist
- docs/balancing/history.md  - chronological record: decisions, numbers
                               pass, calculator bugs, arena rounds,
                               pacing pass
- docs/balancing/README.md   - index, status, open action items (moved
                               from progression_design.md)

content_design.md slims back down to actual content: footprint gating,
hull grids, gating matrix (module names updated to railguns), and the
production tree structure with its fiction - numbers, anchors, arena
logs, and pacing all moved to docs/balancing/. Stale references in the
config comments updated to the new locations.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DyCu8vwChKMbLJQ3xosYEN
2026-07-06 17:15:08 +02:00

5.8 KiB
Raw Permalink Blame History

Balancing Targets (base numbers)

The root numbers of the balancing. Everything in derived.md is tuned to hit these; when rebalancing, change these first and re-derive — never patch derived values directly. The rules these numbers follow live in rules.md.

All time targets are in game time. The player can pause and accelerate, so real session length differs; playtests measure both. The time unit is the boss cycle (world.toml boss_countdown_seconds, 300 s). Destroying a station set advances the boss countdown by boss_advance_seconds (60 s), so cycles run shorter than nominal when pushing actively — targets deliberately ignore that.

Run shape

  1. Run length — a winning run takes up to 2 hours of game time: win around boss cycle 2024. Losing runs end earlier.
  2. Phase boundaries — early = cycles 15 (iron/copper, small hulls), mid = cycles 614 (quartz, medium hulls), late = cycles 15+ (voidsteel, capitals). Push cadence: first station set around cycle 23, roughly one per cycle from mid onward — so the destroyed set's level is reached around cycle +2.
  3. Factory size curve — producing buildings over time; when saturated, output threat/s equals this count, so this curve IS the player power curve: ~25 when the starting asteroid is full (end of cycle 2), ~60 at the start of mid (cycle 6), ~120 at the start of late (cycle 15), ~150 near the win. threat_rate_formula must remain a fraction of this curve; buildings plus belts must physically fit the asteroid plus affordable expansions.
  4. Threat-cost ladder — total production-seconds per fitted hull (including the typical/default module loadout): drone 10.5, frigate 47, destroyer 99, cruiser 233.5, battlecruiser 354.5, battleship 722.5, dreadnought 1491.5, carrier 1436.5. Every production chain must sum to its ladder value. (The original strawman was 10/40/80/200/350/700/1500; the small end runs ~1020% hot because fixed chain overhead dominates small hulls — accepted, and the achieved values adopted as the ladder. The ~×2-per-class curve shape is the invariant.)
  5. Fleet size — swarm-leaning: ~25 player combat ships as the standing mid-game fleet. Standing fleet = build cadence (4) × average ship lifetime, so this target drives time-to-kill and therefore all combat stat magnitudes.
  6. Block economy roots — bootstrap complete (starting asteroid full) by the end of cycle 2; a factory spending ~30% of its capacity on blocks doubles in ~4 minutes early game; one expansion affordable per cycle at ~1/3 of block income mid-game, decelerating to one per 23 cycles late as escalating costs outrun income.

Combat anchors

All combat stats derive from these; per-hull HP additionally carries empirical trims from arena rounds (values in derived.md).

  • Weapon DPS per threat pays a concentration tax that grows with gun size: small ≈ 0.62, medium ≈ 0.48, large ≈ 0.41 DPS per threat of weapon contribution, compensated by the range ladder 50/70/100 m. Rationale: concentration itself (focus fire, no DPS loss to attrition, range) is worth paying for — with a flat curve, concentrated fleets win equal-threat fights outright (arena round 1).
  • Hull HP = 15 per threat of hull contribution as the prior; per-hull HP is the empirical trim knob (guns are shared across hulls, hull HP moves exactly one matchup). The arena consistently prices capitals as tanks with taxed guns — capital hulls sit well above the prior.
  • Armor HP ≈ 37 per threat — a strong premium over hull HP because armor is pure HP with no capability, and fights snowball: killing removes enemy DPS, surviving merely delays — HP must be cheaper than DPS.
  • Repair ≈ 0.7 HP/s per threat — in-combat sustain effectively removes enemy DPS and must be priced like DPS, not like HP.
  • TTK / fight duration: parity fights in the 3060 s band at mid-game scale; capital mirrors ~90 s deliberately; the extreme tank-vs-chip-damage matchup (dreadnought vs destroyer swarm, ~3.5 min) is an accepted outlier.
  • Mobility is monotone in size — the smallest hulls are the fastest and nimblest. Sensor ranges (150→350 m) always exceed weapon ranges.
  • Weapon modifiers are capital economy: a ×1.2 damage modifier at ~22.5 threat beats adding a gun once a ship carries more than ~68 threat of weapons — modifiers pay off on gun-heavy big hulls, waste on small ones. Range modifiers are the strongest and are priced/kept small (×1.3): range is the dominant stat under the orbit AI (free approach fire).
  • Stations: a fresh player station holds one early parity wave unaided; the enemy station at level 0 matches the player station exactly and scales per push level. Station range is the dominance lever, not HP (at 4× a small gun's range, two stations annihilated a 3× threat swarm through approach fire alone).
  • Accepted imbalances: the carrier loses its equal-threat fights until the drone-launching capability exists (the hangar is dead threat) — fix by implementing drones, not stats. A pure smallest-ship fleet modestly loses (~1525%) to a range-fitted capital — desirable doctrine texture; the fair anti-capital answer is the mixed fleet.

Pacing anchors

  • Starting set is the rule-minimum: drone, frigate, small gun, salvager (plus the explicitly unlocked building-block recipe).
  • Threat rate shape: below the player's achievable military output (≈ half the factory curve) early, crossing at the late boundary (~cycle 15), overwhelming by ~cycle 24.
  • Winning = five real decisions: artifact_win_count is set so that across a winning run's ~1518 pushes (~7 cumulative artifact offers at the current chance formula), the player must choose the artifact over a schematic about five times.