Files
claudetools/projects/factorio-quality-mod/DESIGN.md
Mike Swanson 30841fbfb1 sync: auto-sync from GURU-5070 at 2026-06-23 20:23:47
Author: Mike Swanson
Machine: GURU-5070
Timestamp: 2026-06-23 20:23:47
2026-06-23 20:25:46 -07:00

75 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Factorio Mod — Deterministic Quality System (design notes)
> Personal project (Mike). Status: **DESIGN / pre-build.** Not started building.
> Companion: `factorio-mod-anatomy.md` (how a 2.0 mod is structured).
> Resume by reading both files. Next concrete step = the feasibility check (bottom).
## Concept (the pitch)
Replace Factorio 2.0's **RNG quality** with a **deterministic, cost-based** one. Vanilla
raises quality by chance (quality modules roll a %-chance for a better output; recycler
upcycling loops the same gamble). Mike doesn't like the dice. Instead: raise quality by
**spending more resources** through a dedicated machine — guaranteed, no chance.
## Locked decisions (2026-06-23)
- **Full replacement.** Remove the chance element entirely; the new machine is the ONLY way up.
- **Keep vanilla quality tiers + their perks UNTOUCHED.** Normal → Uncommon → Rare → Epic →
Legendary, with vanilla's stat bonuses (Legendary machine faster, Legendary module stronger,
etc.). Those bonuses live in vanilla's `quality` prototypes + the engine, so the design is to
**leave the quality prototypes alone** and only change *how a tier is obtained*. Perks inherited free.
- **The Refinery machine** runs deterministic per-tier-step recipes:
`N × (item @ tier K) → 1 × (item @ tier K+1) [+ byproduct]`. (Mike's example: copper plates →
a better copper plate via a "modified recycler/refiner.")
- **Cost = escalating + compounding resource expense** (no RNG). Mike's curve: "tier 2 is 3×,
tier 3 is 4× that, and so on" → per-step ratios **3 / 4 / 5 / 6**:
| Step | Per-step ratio | Total Normal-equivalents |
|---|---|---|
| Normal → Uncommon | 3× | 3 |
| Uncommon → Rare | 4× | 12 |
| Rare → Epic | 5× | 60 |
| Epic → Legendary | 6× | 360 |
Exact numbers TBD; ratios to be **startup settings** for tuning.
## Open decisions (to settle next)
- **Quality modules:** remove entirely (cleanest) vs leave inert (exist, do nothing — less likely
to break other mods). Either way their RNG bonus is neutralized (which also kills recycler
upcycling, same mechanic). — UNDECIDED.
- **Byproduct (slag):** keep a light byproduct you must reprocess/void (adds factory friction;
Mike liked this earlier) vs pure-cost (input ratio is the whole balance). Lean: **keep light,
settings-dialable to zero.** — UNDECIDED.
- **Exact cost numbers** — TBD (curve shape agreed, magnitudes not).
- **Item scope** — auto-generate refine recipes for all quality-eligible items (intermediates +
machines + modules + equipment), gate categories via settings. Start curated (plates/gears/
circuits) then expand? — lean auto-gen, gated.
- **Refinery details** — one generic machine vs tiered/category machines; does the Refinery's OWN
quality speed it up (nice recursive incentive)? — UNDECIDED.
- **Extra cost dimensions** — energy/time scaling per tier, or a catalyst/reagent (a "flux" item or
fluid) for a second supply chain. Deferred (adds depth + complexity).
## Implementation approach (sketch)
- **Data-stage recipe generation:** loop over `data.raw` quality-eligible items and emit
`refine_<item>_<K>_to_<K+1>` recipes automatically → scales to modded items, no hand-writing.
- **New prototypes:** a `Refinery` entity (could reuse the recycler model/graphics); if byproduct
kept, a `slag` item + a disposal/reprocess recipe (slag → small base material at energy cost).
- **Neutralize RNG:** zero out (or remove) quality-module quality bonus; audit + neutralize any
other vanilla/Space-Age quality sources (asteroid crushing / mining quality) so nothing rolls a
random tier.
- **Dependencies:** requires `quality`; `space-age` optional (handle its extra quality sources).
## FOUNDATION TO VERIFY FIRST (load-bearing — do before building)
1. **Can a 2.0 recipe deterministically output a HIGHER quality than its ingredients?** i.e. a
recipe with explicit `quality` on ingredients (Normal) and on results (Uncommon), with NO RNG.
Believed yes (recipe prototype supports per-ingredient/per-result `quality`) — must confirm
against lua-api.factorio.com prototype docs.
2. **Cleanest way to neutralize quality-module RNG** (and thus recycler upcycling), and the full
list of vanilla/Space-Age quality sources to disable.
Run via Grok (`ask-grok.sh`); Gemini CLI auth is currently broken on GURU-5070 (see errorlog —
needs interactive `gemini` re-login).
## Tooling / references
- API docs: `lua-api.factorio.com`**prototype docs (data stage) are separate from runtime docs.**
- VS Code + **FMTK** (Factorio Modding Tool Kit) extension for prototype + runtime autocomplete.
- Wiki tutorial: `wiki.factorio.com/Tutorial:Modding`. Portal: `mods.factorio.com`.