Write the v2 production tree into the config files

recipes.toml: full v2 rewrite - iron/copper/quartz mining, smelting
incl. the value-losing scrap sink, reprocessing (4 scrap / 4 s,
voidsteel at 20% of the full pool), tiered intermediates, hulls,
module prefabs, and the three drop-only shortcut recipes.

modules.toml: lasers renamed to railguns (implementation unchanged),
prefab materials and numbers-pass production times; combat stats stay
placeholders for the arena pass.

ships.toml: hull-item materials, numbers-pass base production times,
and geometry-validated default_modules loadouts for every ship (waves
now spawn armed).

visuals.toml: item entries for the new palette (quartz, silicon,
copper_coil, control_chip, capacitor_bank, hardened_steel,
ceramic_plate, voidsteel, voidsteel_plate, railgun modules); retired
titanium/alloy/laser items removed.

world.toml: scrap_per_threat = 0.25 per the numbers pass.

threat_report.py: commit an item's threat only once every eligible
recipe is computable - the previous first-resolved-wins behavior let
shortcut recipes underprice items (same flaw exists in
ThreatCostCalculator, recorded as action item 9). Verified: all
default_modules placements valid, verify_recipes and verify_layouts
pass, and the report reproduces the numbers-pass tables exactly
(fitted: 10.5/47/99/233.5/354.5/722.5/1491.5/1436.5). Doc tables
updated for the three geometry-corrected loadouts.

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 17:05:19 +02:00
parent b9e70ba83a
commit d889b79658
8 changed files with 487 additions and 400 deletions

View File

@@ -1,26 +1,29 @@
# modules.toml
#
# First real-content iteration: module ids and surface masks are the designed
# content; stats, materials, and threat costs are placeholders until the
# recipe and balancing passes.
# Production tree v2: all weapons are railguns for now — the implementation
# (instant damage, no projectile, no ammunition) stays as-is and the beam
# visual reads as a tracer round. Lasers are reserved for a future distinct
# weapon type (see docs/content_design.md, "Production tree v2 — Weapons").
# Combat stats are placeholders until the arena balancing pass;
# production_time_seconds values come from the numbers pass.
#
# Unlock progression is mostly disabled (unlock_at_station_level = -1) pending
# the balancing pass. The laser cannons are the exception: laser_cannon_m is
# gated to station level 1, and laser_cannon_l requires laser_cannon_m to be
# unlocked first (unlock_requires) — a demonstration of the prerequisite chain.
# the pacing pass. The railguns are the exception: railgun_m is gated to
# station level 1, and railgun_l requires railgun_m to be unlocked first
# (unlock_requires) — a demonstration of the prerequisite chain.
#
# Surface mask footprint ladder — footprints gate which hulls can mount a
# module, purely through geometry (see ships.toml for the matching hull
# grids):
#
# 1x1 laser_cannon_s, salvager, repair_tool fits every hull, incl. drones
# 1x1 railgun_s, salvager, repair_tool fits every hull, incl. drones
# 1x2 maneuvering_thrusters, sensor_booster,
# armor_plates frigate and up
# 1x3 afterburner frigate and up (eats most of a frigate)
# L-shape weapon_stabilizer, weapon_primer,
# weapon_upgrade frigate and up
# 2x2 laser_cannon_m, drone_bay cruiser and up (no 2x2 area on s hulls)
# 3x3 laser_cannon_l battleship and up (no 3x3 area on m hulls)
# 2x2 railgun_m, drone_bay cruiser and up (no 2x2 area on s hulls)
# 3x3 railgun_l battleship and up (no 3x3 area on m hulls)
# 2x6 drone_hangar carrier only
# -----------------------------------------------------------------------------
@@ -28,13 +31,13 @@
# -----------------------------------------------------------------------------
[[module]]
id = "laser_cannon_s"
id = "railgun_s"
unlock_at_station_level = -1
surface_mask = ["O"]
materials = [{item = "laser_cannon_s_module", amount = 1}]
production_time_seconds = 0.5
materials = [{item = "railgun_s_module", amount = 1}]
production_time_seconds = 1
fill_color = "#FF8040"
glyph = "Ls"
glyph = "Rs"
[module.weapon]
damage = 2
@@ -43,15 +46,15 @@ attack_rate_hz = 2.0
[[module]]
id = "laser_cannon_m"
id = "railgun_m"
unlock_at_station_level = 1
surface_mask = [
"OO",
"OO"]
materials = [{item = "laser_cannon_m_module", amount = 1}]
production_time_seconds = 2
materials = [{item = "railgun_m_module", amount = 1}]
production_time_seconds = 3
fill_color = "#FF8040"
glyph = "Lm"
glyph = "Rm"
[module.weapon]
damage = 10
@@ -60,17 +63,17 @@ attack_rate_hz = 1.5
[[module]]
id = "laser_cannon_l"
id = "railgun_l"
unlock_at_station_level = 1
unlock_requires = ["laser_cannon_m"]
unlock_requires = ["railgun_m"]
surface_mask = [
"OOO",
"OOO",
"OOO"]
materials = [{item = "laser_cannon_l_module", amount = 1}]
production_time_seconds = 8
materials = [{item = "railgun_l_module", amount = 1}]
production_time_seconds = 4
fill_color = "#FF8040"
glyph = "Ll"
glyph = "Rl"
[module.weapon]
damage = 40
@@ -86,7 +89,7 @@ id = "salvager"
unlock_at_station_level = -1
surface_mask = ["O"]
materials = [{item = "salvager_module", amount = 1}]
production_time_seconds = 2
production_time_seconds = 1
fill_color = "#AACC44"
glyph = "Sv"
@@ -101,7 +104,7 @@ id = "repair_tool"
unlock_at_station_level = -1
surface_mask = ["O"]
materials = [{item = "repair_tool_module", amount = 1}]
production_time_seconds = 2
production_time_seconds = 1
fill_color = "#66CCFF"
glyph = "Rp"
@@ -119,7 +122,7 @@ id = "afterburner"
unlock_at_station_level = -1
surface_mask = ["OOO"]
materials = [{item = "afterburner_module", amount = 1}]
production_time_seconds = 2
production_time_seconds = 1
fill_color = "#40A0FF"
glyph = "Ab"
@@ -133,7 +136,7 @@ id = "maneuvering_thrusters"
unlock_at_station_level = -1
surface_mask = ["OO"]
materials = [{item = "maneuvering_thrusters_module", amount = 1}]
production_time_seconds = 2
production_time_seconds = 1
fill_color = "#40A0FF"
glyph = "Mt"
@@ -150,7 +153,7 @@ id = "armor_plates"
unlock_at_station_level = -1
surface_mask = ["OO"]
materials = [{item = "armor_plates_module", amount = 1}]
production_time_seconds = 3
production_time_seconds = 1
fill_color = "#808080"
glyph = "A"
@@ -163,7 +166,7 @@ id = "sensor_booster"
unlock_at_station_level = -1
surface_mask = ["OO"]
materials = [{item = "sensor_booster_module", amount = 1}]
production_time_seconds = 2
production_time_seconds = 1
fill_color = "#40A0FF"
glyph = "S"
@@ -182,7 +185,7 @@ surface_mask = [
"OX",
]
materials = [{item = "weapon_upgrade_module", amount = 1}]
production_time_seconds = 4
production_time_seconds = 2
fill_color = "#FF4040"
glyph = "Wu"
@@ -198,7 +201,7 @@ surface_mask = [
"OX",
]
materials = [{item = "weapon_primer_module", amount = 1}]
production_time_seconds = 4
production_time_seconds = 2
fill_color = "#FF4040"
glyph = "Wp"
@@ -214,7 +217,7 @@ surface_mask = [
"OX",
]
materials = [{item = "weapon_stabilizer_module", amount = 1}]
production_time_seconds = 4
production_time_seconds = 1
fill_color = "#FF4040"
glyph = "Ws"
@@ -236,7 +239,7 @@ surface_mask = [
"OO",
"OO"]
materials = [{item = "drone_bay_module", amount = 1}]
production_time_seconds = 5
production_time_seconds = 3
fill_color = "#CC66FF"
glyph = "Db"
@@ -248,6 +251,6 @@ surface_mask = [
"OOOOOO",
"OOOOOO"]
materials = [{item = "drone_hangar_module", amount = 1}]
production_time_seconds = 20
production_time_seconds = 6
fill_color = "#9933CC"
glyph = "Dh"