# Rules that hold in every system: repairs, experience, the shipyard and the # Ministry's captains, and the [[rule]] rows that make things happen (when # this happens, if that holds, do this; the end of this file documents them). # What belongs to one system (its star, planet, belts, pirates and frontier) # lives in systems/.toml. # Opportunity's pad technicians. Shields recharge for free; armor and # structure are billed per point put back, structure first. A hull's # repair_subsidy (hulls.toml) is the share the Ministry covers: the Basic is # fully covered, bought hulls pay their own way. Short on credits, you get # what you can afford. [repair] armor_per_hp = 1.2 structure_per_hp = 2.0 # Pilots learn from fighting (each band's xp, bands.toml) and, slowly, # from mining with their own ship. [experience] per_ore = 0.35 # What a pilot's level is worth: every level after the first adds this much # damage and mining yield to every ship you own, up to a total of bonus_max # (3% a level reaches +60% at level 21 and stays there). [pilot] bonus_per_level = 0.03 bonus_max = 0.6 # How much a pilot can command. Each of your fleets holds hulls worth up to # `command` points at level 1 (classes.toml: a frigate takes 1, a destroyer # 2...), one more at levels 3, 5, 7 and so on (every `command_every` levels). # You run `count` fleets at once, your own and every captain's, and one more # at levels 5, 10, 15... (every multiple of `count_every`). A fleet already # over a limit keeps flying; it just can't take more. [fleets] command = 4 command_every = 2 count = 4 count_every = 5 # What a dock of yours costs to run, a minute: a starbase you took or a # structure you built or took (Opportunity, a planet you claimed and a gate # run themselves). A base, plus a step for every facility level it has, both # grown by the industry ladder (industry.toml price_growth) to the tier of # the ring it stands in. The payroll pays it with escort wages and the keep # of big hulls (classes.toml upkeep; docs/upkeep.md). [upkeep] dock = 40.0 facility_level = 8.0 # Hull blueprints, sold at Opportunity for this many times the hull's price. # A starbase shipyard you own builds hulls from them (hulls.toml `build`). [shipyard] blueprint_factor = 10 # A starbase's slip holds `queue` hulls and research projects at Shipyard # level 1, the one being worked included, and one more each level after. One # is worked at a time; the rest wait their turn. queue = 2 # The Ministry's yard holds `stock` of each hull it sells. Each one bought # leaves a gap it fills again at one hull per `restock_minutes` of play, up to # `stock` again. Starbase yards building from # blueprints have no such limit. stock = 20 restock_minutes = 60 # Scrapping a parked ship gives back `scrap_share` of the materials its hull # takes to build, rounded down, and no credits, so a hull bought from the # Ministry is never worth more broken up. Its modules go into the hangar as # they are. scrap_share = 0.25 # What every other hull blueprint costs (shipyard.rs; Rheisen, 2026-10-17): # `minutes` of the income you'd have at the hull's tier, by its class, times # `mark_three` for a mark III, to two significant figures. A starbase slip's # research project pays it whole (hulls.toml `project`, unless the project # names its own credits). A hull worked out from its wrecks is yours to # build once you unlock it, for `wrecks` of the price, wherever you are; one # found in a vault for `vault` of it, since vault ships are the stronger # ones. The Ministry's own blueprints keep `[shipyard] blueprint_factor`; # objective and stronghold rewards are free. # # `income` is credits a minute at tiers 1 to 20: a quarter of what every # system up to that tier gives back with each field worked flat out (your # crews keep working the ones behind you), between the systems' middle tiers # on a geometric curve. tests/blueprints.rs recomputes it from the belts and # fails when it drifts more than 10% from these. [blueprints] minutes = { frigate = 20, destroyer = 30, battleship = 60, titan = 90 } mark_three = 1.5 wrecks = 0.5 vault = 1.25 income = [ 760, 2_100, 5_600, 15_000, 30_000, 42_000, 60_000, 86_000, 120_000, 180_000, 260_000, 360_000, 500_000, 690_000, 950_000, 1_300_000, 1_800_000, 2_300_000, 3_100_000, 4_100_000, ] # How a starbase looks on the map, from a frontier outpost to a fortress: the # level each grade starts at. A starbase shows the grade of the tier of the # ring it stands in; one of yours, of its highest facility level once that's # higher (taking a starbase never shrinks it). # Only a look: the map has one picture per grade (app/public/art/starbases). [starbase] grades = [1, 3, 6, 10, 15] # Structures under attack (docs/defenses.md). Every Ministry starbase you own # stands on `starbase_frame` (a frontier station's `frame` overrides it). # A structure's shields come back as a ship's do; its armor and structure # mend once no enemy has been within reach for `quiet` seconds, from nothing # to full in `mend` seconds. A starbase knocked out stays silent until you # pay to repair its guns: `repair_per_point` credits for each point of its # frame's armor and structure, plus `repair_fitted` of what its fitted # modules are worth, and `repair_seconds` of work. [defenses] starbase_frame = "starbase_frame" quiet = 30.0 mend = 300.0 repair_seconds = 600.0 repair_per_point = 1.5 repair_fitted = 0.1 # Raids on your structures, in every system but the one you start in: the # first `raid_first` seconds after your first structure stands there, then # every `raid_every`, give or take `raid_jitter` of that. You're warned # `raid_warning` seconds ahead. Raiders come from the system's own hideouts # (none, no raid), a band of the ring the target stands in, and give up # after `raid_stays` seconds. raid_first = 3600.0 raid_every = 3600.0 raid_jitter = 0.25 raid_warning = 120.0 raid_stays = 900.0 # Raids come in force: a band that rolls fewer ships than this is topped up # to it, so even a small band's raid beats a structure nobody has armed. raid_min_ships = 5 # The Ministry's job placement office hires out captains to fly your spare # ships on standing orders. They are UBI entrepreneurs too, with smaller dreams. [crew] hire_fee = 150 # Captains keep this share of every load they bring home. share = 0.4 # ...and this share of a load brought home to a dock of your own (a starbase # you took, a planet you claimed): your own docks don't pay Ministry rates. own_dock_share = 0.2 # Escorts in your own fleet need pilots: hire_fee to hire, then this many # credits a minute each, docked or not. escort_wage = 30.0 # A base's garrison (docs/logistics.md) is paid an escort's wage for each # ship: this share of it while docked at its base, all of it while out # fighting. garrison_docked_wage = 0.5 retreat_radius = 1000.0 retreat_wait = 45.0 unload_seconds = 2.5 captains = [ "Doris", "Gus", "Marguerite", "Tobias", "Ines", "Rolf", "Priya", "Bartholomew", "Yuki", "Odile", "Lev", "Consuelo", "Fitz", "Amara", "Horst", "Wendell", ] # Captains' fleets that fight: any crew set to engage, and military jobs # (hunting bounties, patrolling a belt, guarding a dock). [crew.fight] # Pirates this close to the fleet get fought (guarding: this close to the dock). fight_radius = 1200.0 guard_radius = 2500.0 # Share of armor and structure left: under break_off a fleet in a fight # breaks away and heads home; under repair_at, after a fight, it goes home to # be patched up. break_off = 0.3 repair_at = 0.6 # How ships fight (docs/industry.md, "Weapons: range and aiming"). A gun hits # at its accuracy inside its optimal range, less and less past it, and not at # all past optimal + falloff. Tracking is how fast (radians a second, seen # from the gun) a target can cross its sights and still be hit every time; # faster than that, proportionally less. A module can set its own optimal, # falloff and tracking; these are the defaults for its size. [combat] # Ships in a fight close to this share of their main guns' optimal range # (main guns: the biggest size they carry). hold = 0.85 # ...unless their main guns' optimal range clears the target's reach: then # they hold just outside it, this many times the target's reach away, hitting # fully where they can't be hit (a laser frigate against pea shooters). kite = 1.03 # Industry ships with escorts stay out of the fight: this many times the # reach of the nearest enemy guns away, while the escorts engage. stand_off = 1.1 # Ships in a fight keep this many times the sum of their sizes apart, so a # battle spreads out instead of stacking up. spacing = 3.5 # The ships of one side on the same target spread round it to evenly spaced # places, pulled toward them at this share of their speed. spread = 0.5 # Picking a target, each ship already firing on one counts as this many # times its distance again, so a side spreads its fire across the ships in # range. A focus order puts every gun on one ship regardless. share_fire = 0.6 # Classes with `maneuver = "runs"` (classes.toml) make passes: by the target # `pass` times their holding range to one side, out to `out` times it, and # round for the next. Crossing that fast costs both sides accuracy. runs = { pass = 0.55, out = 1.3 } sizes = { s = { optimal = 380.0, falloff = 120.0, tracking = 1.2 }, m = { optimal = 620.0, falloff = 200.0, tracking = 0.6 }, l = { optimal = 1000.0, falloff = 300.0, tracking = 0.25 }, xl = { optimal = 1500.0, falloff = 400.0, tracking = 0.12 } } # What a module's size does to its numbers (docs/industry.md, "Sizes and # hardpoints"). Each step up from S multiplies by these: with main = 3, an M # module does 3x an S one of the same tier and level, L 9x, XL 27x, in step # with hull points per class. Some numbers grow slower, so a size trades one # thing for another. Guns' range and tracking come with their size (above). # Engines add a share of the hull's own speed and don't grow. Mining lasers # bigger than S fit industry hulls only. # Drills against harder rock (fields.rs field_mining). A drill keeps this # share of its yield on ore one tier above its own, and this share again for # every tier past that: 0.5 halves it one tier up and quarters it two up, so # a belt of higher-tier ore wants drills of its tier. Ore at or below a # drill's tier comes at full yield. [mining] hardness = 0.5 # Drill yield grows its own way, gentler than damage or armor: this much a # tier above the drill's first tier and this much a size step, in place of # industry.toml stat_growth and [module_sizes] main. A titan's drills stay a # few times a frigate's instead of thousands of times. tier_growth = 1.06 size_growth = 1.4 # Higher belts want bigger drills: ore from each of these tiers on wants the # next size (s from tier 1, m from 9, l from 12, xl from 17), and a drill # keeps size_hardness of its yield for every size it falls short. Each want # comes two tiers after its drill family starts (m 7, l 10, xl 15), so a new # size has room to be built before the belts insist on it. size_hardness = 0.5 sizes = [1, 9, 12, 17] # Holds grow the same gentle way as drills: this much a tier above the # module's first tier and this much a size step, in place of industry.toml # stat_growth and [module_sizes] main. [holds] tier_growth = 1.06 size_growth = 1.4 [module_sizes] # Damage, mining yield, shield capacity, armor and cargo. main = 3.0 # Big shields hold far more than they refill. shield_regen = 2.0 # Big scanners resolve more and see further, and recharge slower. scanner_strength = 1.5 scanner_range = 1.5 scanner_cooldown = 1.5 # Warp gates (gates.rs, docs/systems.md, Gates). A fleet sent through flies # this close to the gate, holds there while its drive charges, then comes out # beside the linked gate in the other system. A starbase is towed to 0.8 of # it. The map draws this zone round every open gate; keep it well outside the # gate's drawn ring (radius 150) so a fleet or starbase waits beside the gate, # not on top of it. [gates] jump_radius = 400.0 warp_seconds = 4.0 # What happens when (rules.rs, docs/rules.md): `[[rule]]` rows, each a # trigger (`when`), conditions (`if`) and effects (`do`), every word one the # sim implements. Core writes none here yet; a pack adds its own rows, which # take its prefix (union:strike_bonus), with every reference written in full. # The words, the events and their filters are listed on the plugins page. # # [[rule]] # id = "strike_bonus" # when = { patronage = { faction = "union:union", reached = 5000 } } # if = [{ flag = { not = "union:struck" } }] # do = [{ hull = "ox" }, { letter = { title = "A token of thanks", body = "..." } }, { flag = "union:struck" }]