# Balancing Documentation

Everything about balancing Dota Factory, separated by role:

- **[rules.md](rules.md)** — the design rules and principles. Timeless;
  changes only when the design changes.
- **[targets.md](targets.md)** — the base numbers (roots/anchors) chosen
  by design. Change these first; everything else re-derives.
- **[derived.md](derived.md)** — the current tuned state of all derived
  numbers, mirroring the configs. Updated whenever configs change.
- **[process.md](process.md)** — how balancing is done: the pass order,
  tuning discipline, tools, and the checklist for the next round.
- **[history.md](history.md)** — chronological record of decisions,
  findings, bugs, and arena rounds.

Related: game content (hull grids, footprint gating, tree design and
fiction) in [../content_design.md](../content_design.md); rules with
REQ-* ids in [../requirements.md](../requirements.md).

## Status

First full balancing round complete (2026-07-06): targets → tree →
numbers → threat-calculator parity → combat stats (arena-converged) →
pacing. Next step: full-game playtests against the run-shape targets in
`targets.md`.

## Open action items

Agreed changes that require edits to `requirements.md`, the code, or the
configs. Completed items are removed (their outcomes live in
`requirements.md`, `history.md`, and the git history).

1. **Fill unfillable schematic slots with artifacts.** With duplicates
   removed, the schematic drop pool can run dry — previously unreachable.
   Decision: every slot in the choice dialog that cannot be filled with a
   schematic because the eligible pool is exhausted is filled with an
   artifact option instead (in addition to any artifact option granted by
   the regular artifact roll). A push therefore always awards a full
   dialog. Update REQ-DEF-SCHEMATIC-DROP.
2. **Confirm wave scaling in playtests.** `threat_rate_formula` is the
   only time-scaling axis; verify the tuned curve (see `derived.md`)
   produces the intended difficulty race in real runs.
3. **Gate shortcut-recipe drops on their inputs.** Extend the assembler
   recipe schematic pool eligibility in REQ-DEF-SCHEMATIC-DROP: in
   addition to the existing station-level and output-item checks, all of
   the recipe's input item types must be implicitly unlocked as well.
4. **Resource deposits.** Add a terrain deposit layer per the Resource
   deposits rules (`rules.md`): deposit patches generated in expansion
   columns (deterministic content per expansion, randomized placement
   within the new columns), deposit rendering, and a miner condition (a
   resource recipe is selectable only if the miner's footprint overlaps
   at least one matching deposit tile). Touches REQ-BLD-MINER ("every
   asteroid tile is equivalent" no longer holds),
   REQ-GW-ASTEROID-EXPAND / REQ-EXP-*, `world.toml`, and `visuals.toml`.
   Until this lands, quartz mines anywhere and the mid-game is
   knowledge-gated only.
