From 8d0dd6f4542cd2e0b5a39e6058aba39460f37b3d Mon Sep 17 00:00:00 2001 From: Malte Langkabel Date: Wed, 12 Aug 2026 09:16:19 +0200 Subject: [PATCH] name recipes after their process, not their product Recipe display names come from the id, so a recipe that shared its id with its output item showed the item's name back to the player. Every recipe id now names the process that runs it: iron_mining, quartz_reduction, steel_rolling, chip_etching, the *_framing hulls, the *_kit module prefabs, and the drop-only shortcuts as direct_rolling/-etching/-hardening. The three shortcut unlock groups are renamed with their recipes, since a group's name is derived from its id the same way. Blueprints and replays store recipe ids, so files recorded before this rename lose their miner and assembler recipe selections. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Ne3mejABZoLWKLh8fgpM3x --- bin/app/data/config/recipes.toml | 93 +++++++++++++++++--------------- bin/app/data/config/unlocks.toml | 12 ++--- docs/balancing/derived.md | 12 ++--- 3 files changed, 61 insertions(+), 56 deletions(-) diff --git a/bin/app/data/config/recipes.toml b/bin/app/data/config/recipes.toml index 546882b..7263e8c 100644 --- a/bin/app/data/config/recipes.toml +++ b/bin/app/data/config/recipes.toml @@ -6,6 +6,10 @@ # realized: tier 1 ratios are 1:1, tier 2 ratios are 2:3, tier 3+ ratios # are deliberately strange. # +# A recipe id names the process, not the product — the display name shown in +# the UI is derived from it — so an item and the recipe that makes it never +# carry the same name. +# # Input chain per game phase — each phase transition adds exactly one new # base input: # @@ -27,21 +31,21 @@ # ----------------------------------------------------------------------------- [[recipe]] -id = "mine_iron_ore" +id = "iron_mining" building = "miner" inputs = [] outputs = [{item = "iron_ore", amount = 1}] duration_seconds = 1.0 [[recipe]] -id = "mine_copper_ore" +id = "copper_mining" building = "miner" inputs = [] outputs = [{item = "copper_ore", amount = 1}] duration_seconds = 1.0 [[recipe]] -id = "mine_quartz" +id = "quartz_mining" building = "miner" inputs = [] outputs = [{item = "quartz", amount = 1}] @@ -52,21 +56,21 @@ duration_seconds = 2.0 # ----------------------------------------------------------------------------- [[recipe]] -id = "iron_ingot" +id = "iron_smelting" building = "smelter" inputs = [{item = "iron_ore", amount = 1}] outputs = [{item = "iron_ingot", amount = 1}] duration_seconds = 1.0 [[recipe]] -id = "copper_ingot" +id = "copper_smelting" building = "smelter" inputs = [{item = "copper_ore", amount = 1}] outputs = [{item = "copper_ingot", amount = 1}] duration_seconds = 1.0 [[recipe]] -id = "silicon" +id = "quartz_reduction" building = "smelter" inputs = [{item = "quartz", amount = 1}] outputs = [{item = "silicon", amount = 1}] @@ -90,7 +94,7 @@ duration_seconds = 1.0 # ----------------------------------------------------------------------------- [[recipe]] -id = "reprocessing_cycle" +id = "scrap_reprocessing" building = "reprocessing_plant" inputs = [{item = "scrap", amount = 4}] duration_seconds = 4.0 @@ -120,21 +124,21 @@ duration_seconds = 4.0 # ----------------------------------------------------------------------------- [[recipe]] -id = "steel_plate" +id = "steel_rolling" building = "assembler" inputs = [{item = "iron_ingot", amount = 2}] outputs = [{item = "steel_plate", amount = 1}] duration_seconds = 3.0 [[recipe]] -id = "copper_wire" +id = "wire_drawing" building = "assembler" inputs = [{item = "copper_ingot", amount = 1}] outputs = [{item = "copper_wire", amount = 2}] duration_seconds = 1.0 [[recipe]] -id = "copper_coil" +id = "coil_winding" building = "assembler" inputs = [{item = "copper_wire", amount = 2}] outputs = [{item = "copper_coil", amount = 1}] @@ -145,7 +149,7 @@ duration_seconds = 1.5 # unlocked_at_start: building blocks appear in no schematic's materials, so the # implicit item graph can never reach this recipe (REQ-LOCK-IMPLICIT). [[recipe]] -id = "building_block" +id = "block_pressing" building = "assembler" unlocked_at_start = true inputs = [{item = "steel_plate", amount = 2}] @@ -157,14 +161,14 @@ duration_seconds = 2.0 # ----------------------------------------------------------------------------- [[recipe]] -id = "control_chip" +id = "chip_etching" building = "assembler" inputs = [{item = "silicon", amount = 1}, {item = "copper_wire", amount = 2}] outputs = [{item = "control_chip", amount = 1}] duration_seconds = 5.0 [[recipe]] -id = "capacitor_bank" +id = "capacitor_assembly" building = "assembler" inputs = [{item = "copper_coil", amount = 2}, {item = "silicon", amount = 1}] outputs = [{item = "capacitor_bank", amount = 1}] @@ -173,21 +177,21 @@ duration_seconds = 5.0 # The quality gate for m+ hulls: a deliberately long-running recipe # (time-heavy archetype). [[recipe]] -id = "hardened_steel" +id = "steel_hardening" building = "assembler" inputs = [{item = "steel_plate", amount = 3}] outputs = [{item = "hardened_steel", amount = 1}] duration_seconds = 12.0 [[recipe]] -id = "ceramic_plate" +id = "ceramic_firing" building = "assembler" inputs = [{item = "quartz", amount = 2}] outputs = [{item = "ceramic_plate", amount = 1}] duration_seconds = 4.0 [[recipe]] -id = "drive_unit" +id = "drive_assembly" building = "assembler" inputs = [ {item = "steel_plate", amount = 2}, @@ -202,14 +206,14 @@ duration_seconds = 8.0 # ----------------------------------------------------------------------------- [[recipe]] -id = "voidsteel_plate" +id = "voidsteel_forging" building = "assembler" inputs = [{item = "voidsteel", amount = 1}, {item = "hardened_steel", amount = 1}] outputs = [{item = "voidsteel_plate", amount = 1}] duration_seconds = 8.0 [[recipe]] -id = "capital_core" +id = "core_assembly" building = "assembler" inputs = [ {item = "voidsteel", amount = 2}, @@ -223,25 +227,26 @@ duration_seconds = 10.0 # Shortcut recipes — drop-only assembler recipes, gated by unlock groups in # unlocks.toml (REQ-LOCK-EXPLICIT). Pure rewards: item threat stays defined by # the base (expensive) path via the max rule, so shortcuts give real factory -# efficiency without shifting any balance. +# efficiency without shifting any balance. Named "direct_*" after the base +# process they skip a step of, so the reward reads as what it is. # ----------------------------------------------------------------------------- [[recipe]] -id = "shortcut_steel_plate" +id = "direct_rolling" building = "assembler" inputs = [{item = "iron_ore", amount = 3}] outputs = [{item = "steel_plate", amount = 1}] duration_seconds = 2.0 [[recipe]] -id = "shortcut_control_chip" +id = "direct_etching" building = "assembler" inputs = [{item = "quartz", amount = 2}] outputs = [{item = "control_chip", amount = 1}] duration_seconds = 4.0 [[recipe]] -id = "shortcut_hardened_steel" +id = "direct_hardening" building = "assembler" inputs = [{item = "iron_ingot", amount = 4}] outputs = [{item = "hardened_steel", amount = 1}] @@ -252,35 +257,35 @@ duration_seconds = 8.0 # ----------------------------------------------------------------------------- [[recipe]] -id = "drone_hull" +id = "drone_framing" building = "assembler" inputs = [{item = "iron_ingot", amount = 1}] outputs = [{item = "drone_hull", amount = 1}] duration_seconds = 1.0 [[recipe]] -id = "frigate_hull" +id = "frigate_framing" building = "assembler" inputs = [{item = "steel_plate", amount = 2}, {item = "copper_wire", amount = 1}] outputs = [{item = "frigate_hull", amount = 1}] duration_seconds = 2.0 [[recipe]] -id = "destroyer_hull" +id = "destroyer_framing" building = "assembler" inputs = [{item = "steel_plate", amount = 3}, {item = "copper_coil", amount = 2}] outputs = [{item = "destroyer_hull", amount = 1}] duration_seconds = 4.0 [[recipe]] -id = "cruiser_hull" +id = "cruiser_framing" building = "assembler" inputs = [{item = "hardened_steel", amount = 2}, {item = "control_chip", amount = 2}] outputs = [{item = "cruiser_hull", amount = 1}] duration_seconds = 6.0 [[recipe]] -id = "battlecruiser_hull" +id = "battlecruiser_framing" building = "assembler" inputs = [ {item = "hardened_steel", amount = 3}, @@ -291,7 +296,7 @@ outputs = [{item = "battlecruiser_hull", amount = 1}] duration_seconds = 8.0 [[recipe]] -id = "battleship_hull" +id = "battleship_framing" building = "assembler" inputs = [ {item = "voidsteel_plate", amount = 3}, @@ -302,7 +307,7 @@ outputs = [{item = "battleship_hull", amount = 1}] duration_seconds = 10.0 [[recipe]] -id = "dreadnought_hull" +id = "dreadnought_framing" building = "assembler" inputs = [ {item = "voidsteel_plate", amount = 5}, @@ -313,7 +318,7 @@ outputs = [{item = "dreadnought_hull", amount = 1}] duration_seconds = 12.0 [[recipe]] -id = "carrier_hull" +id = "carrier_framing" building = "assembler" inputs = [ {item = "voidsteel_plate", amount = 5}, @@ -328,21 +333,21 @@ duration_seconds = 12.0 # ----------------------------------------------------------------------------- [[recipe]] -id = "railgun_s_module" +id = "railgun_s_kit" building = "assembler" inputs = [{item = "copper_coil", amount = 1}] outputs = [{item = "railgun_s_module", amount = 1}] duration_seconds = 1.0 [[recipe]] -id = "salvager_module" +id = "salvager_kit" building = "assembler" inputs = [{item = "steel_plate", amount = 1}, {item = "copper_wire", amount = 2}] outputs = [{item = "salvager_module", amount = 1}] duration_seconds = 2.0 [[recipe]] -id = "repair_tool_module" +id = "repair_tool_kit" building = "assembler" inputs = [{item = "steel_plate", amount = 1}, {item = "copper_wire", amount = 2}] outputs = [{item = "repair_tool_module", amount = 1}] @@ -350,56 +355,56 @@ duration_seconds = 2.0 # Material-heavy, fast: the armor archetype. [[recipe]] -id = "armor_plates_module" +id = "armor_plates_kit" building = "assembler" inputs = [{item = "steel_plate", amount = 4}] outputs = [{item = "armor_plates_module", amount = 1}] duration_seconds = 3.0 [[recipe]] -id = "maneuvering_thrusters_module" +id = "maneuvering_thrusters_kit" building = "assembler" inputs = [{item = "steel_plate", amount = 1}, {item = "copper_coil", amount = 1}] outputs = [{item = "maneuvering_thrusters_module", amount = 1}] duration_seconds = 2.0 [[recipe]] -id = "sensor_booster_module" +id = "sensor_booster_kit" building = "assembler" inputs = [{item = "copper_wire", amount = 2}, {item = "copper_coil", amount = 1}] outputs = [{item = "sensor_booster_module", amount = 1}] duration_seconds = 2.0 [[recipe]] -id = "afterburner_module" +id = "afterburner_kit" building = "assembler" inputs = [{item = "copper_coil", amount = 2}, {item = "steel_plate", amount = 1}] outputs = [{item = "afterburner_module", amount = 1}] duration_seconds = 3.0 [[recipe]] -id = "weapon_stabilizer_module" +id = "weapon_stabilizer_kit" building = "assembler" inputs = [{item = "steel_plate", amount = 1}, {item = "copper_coil", amount = 1}] outputs = [{item = "weapon_stabilizer_module", amount = 1}] duration_seconds = 2.0 [[recipe]] -id = "weapon_primer_module" +id = "weapon_primer_kit" building = "assembler" inputs = [{item = "capacitor_bank", amount = 1}, {item = "copper_coil", amount = 1}] outputs = [{item = "weapon_primer_module", amount = 1}] duration_seconds = 4.0 [[recipe]] -id = "weapon_upgrade_module" +id = "weapon_upgrade_kit" building = "assembler" inputs = [{item = "control_chip", amount = 1}, {item = "copper_coil", amount = 1}] outputs = [{item = "weapon_upgrade_module", amount = 1}] duration_seconds = 4.0 [[recipe]] -id = "railgun_m_module" +id = "railgun_m_kit" building = "assembler" inputs = [ {item = "capacitor_bank", amount = 1}, @@ -410,7 +415,7 @@ outputs = [{item = "railgun_m_module", amount = 1}] duration_seconds = 4.0 [[recipe]] -id = "drone_bay_module" +id = "drone_bay_kit" building = "assembler" inputs = [ {item = "control_chip", amount = 1}, @@ -421,7 +426,7 @@ outputs = [{item = "drone_bay_module", amount = 1}] duration_seconds = 4.0 [[recipe]] -id = "railgun_l_module" +id = "railgun_l_kit" building = "assembler" inputs = [ {item = "capacitor_bank", amount = 1}, @@ -432,7 +437,7 @@ outputs = [{item = "railgun_l_module", amount = 1}] duration_seconds = 6.0 [[recipe]] -id = "drone_hangar_module" +id = "drone_hangar_kit" building = "assembler" inputs = [ {item = "voidsteel_plate", amount = 1}, diff --git a/bin/app/data/config/unlocks.toml b/bin/app/data/config/unlocks.toml index bf38d05..5d87ed5 100644 --- a/bin/app/data/config/unlocks.toml +++ b/bin/app/data/config/unlocks.toml @@ -125,16 +125,16 @@ modules = ["drone_hangar"] # --- Assembler recipes ----------------------------------------------------- [[unlock]] -id = "shortcut_steel_plate" +id = "direct_rolling" station_level = 1 -recipes = ["shortcut_steel_plate"] +recipes = ["direct_rolling"] [[unlock]] -id = "shortcut_control_chip" +id = "direct_etching" station_level = 2 -recipes = ["shortcut_control_chip"] +recipes = ["direct_etching"] [[unlock]] -id = "shortcut_hardened_steel" +id = "direct_hardening" station_level = 2 -recipes = ["shortcut_hardened_steel"] +recipes = ["direct_hardening"] diff --git a/docs/balancing/derived.md b/docs/balancing/derived.md index 81e9048..20039f3 100644 --- a/docs/balancing/derived.md +++ b/docs/balancing/derived.md @@ -44,9 +44,9 @@ move. Combat stats were tuned empirically against the arena suite in | capital_core | 2 voidsteel + 1 capacitor_bank + 1 control_chip | 10 | 1 | 240 | Shortcut recipes (drop-only; item threat stays defined by the base path -via the max rule): `shortcut_steel_plate` 3 iron_ore → 1 plate (2 s, -level 1), `shortcut_control_chip` 2 quartz → 1 chip (4 s, level 2), -`shortcut_hardened_steel` 4 iron_ingot → 1 hardened (8 s, level 2). +via the max rule): `direct_rolling` 3 iron_ore → 1 plate (2 s, +level 1), `direct_etching` 2 quartz → 1 chip (4 s, level 2), +`direct_hardening` 4 iron_ingot → 1 hardened (8 s, level 2). Ratio curve realized: t1 all 1:1 (miner:smelter); t2 clean 2:3 (ingot→plate, wire→coil); t3 strange — 2:5 (silicon→chip), 3:5 @@ -122,13 +122,13 @@ range 120, scrap 40. Enemy station: 3000+1500x HP, 25+12x dmg, ## Pacing **Unlock ladder** (level → unlocks; ← marks `unlock_requires`; starting -set at −1: drone, frigate, railgun_s, salvager, building_block recipe): +set at −1: drone, frigate, railgun_s, salvager, block_pressing recipe): | level | ships | modules | recipes | |---|---|---|---| | 0 | destroyer | repair_tool, armor_plates | | -| 1 | | maneuvering_thrusters, sensor_booster | shortcut_steel_plate | -| 2 | cruiser | railgun_m, afterburner | shortcut_control_chip, shortcut_hardened_steel | +| 1 | | maneuvering_thrusters, sensor_booster | direct_rolling | +| 2 | cruiser | railgun_m, afterburner | direct_etching, direct_hardening | | 3 | | weapon_stabilizer | | | 4 | battlecruiser ← cruiser | weapon_primer, weapon_upgrade | | | 5 | | drone_bay | |