Ship Systems — Upgrades, Equipment, and Loadouts¶
How a ship grows from a starter freighter into a specialised platform. The architecture has two distinct extension points — Ship.upgrades (linear stat bumps) and Ship.equipment_slots (modular plug-ins) — that work in parallel.
This doc complements ships.md, which lists ship types and base stats. Here we cover the customisation layer.
Source files:
- services/gameserver/src/models/ship.py — Ship, ShipSpecification, UpgradeType, InsuranceType, ShipStatus.
- services/gameserver/src/services/ship_service.py — creation, destruction, repair, escape pod handling.
- services/gameserver/src/services/ship_upgrade_service.py — UPGRADE_DEFINITIONS, EQUIPMENT_DEFINITIONS, purchase_upgrade, install_equipment.
1. The two-track architecture¶
1.1 Upgrades — linear stat bumps¶
Ship.upgrades is a JSONB column on the ships table (models/ship.py:97):
upgrades = Column(JSONB, nullable=False, default=[])
It stores {upgrade_type: current_level}. Levels are integer, start at 0, and cap at the ship-spec-defined max (ShipSpecification.max_upgrade_levels, also JSONB). Each upgrade level applies a fixed delta (e.g. +0.5 speed per Engine level).
Costs follow a geometric progression: each next level costs base_cost * cost_multiplier^current_level. So Engine L1 = 5,000 cr, L2 = 10,000 cr, L3 = 20,000 cr, etc.
Upgrades are permanent — once purchased they stay attached to that ship until the ship is destroyed.
1.2 Equipment slots — modular plug-ins¶
Ship.equipment_slots is also JSONB (models/ship.py:100):
equipment_slots = Column(JSONB, nullable=False, default={})
It stores {equipment_key: {effects: {...}, installed_at: ...}}. Equipment is flat (no levels), ship-type-restricted (each piece lists compatible_ships), and stacks additively across slots — ship_upgrade_service.get_equipment_effects merges all installed equipment into a single effects dict that combat / trading / movement services consult.
Equipment is removable (✅ Shipped — ship_upgrade_service.uninstall_equipment refunds int(catalog_cost × SALVAGE_FRACTION) at 25% salvage credits, same fraction as module strip; exposed via ship_upgrades.py).
Status: ✅ Shipped — both the upgrades and equipment_slots columns are populated by ship_upgrade_service, which exposes both purchase_upgrade and install_equipment paths. The two systems run in parallel, not as a replacement for one another.
1.5 SHIP-MODS — the unified slot-grid module system¶
✅ Shipped (SHIP-MODS Phase 1). The slot grid is the unified customization paradigm: each hull gets a finite, size-keyed grid of component slots (some supercharged, some class-locked) into which players bolt modules, with effects baked into the stored stat columns on install. Source:
models/ship.py(Ship.modules,ShipSpecification.module_slots),services/ship_upgrade_service.py(MODULE_DEFINITIONS, bake loop),api/routes/ship_upgrades.py, and the SpaceDock slot-grid UI.
The linear upgrades (§2) and equipment plug-ins (§3) are folded into this grid as module classes; the §1 two-track columns coexist while module classes carry their effects, with class-by-class cutover handled as separate Max-gated work orders.
1.5.1 The slot grid¶
ShipSpecification.module_slots(JSONB, nullable) is the per-hull lattice:{"v":1, "cols":int, "rows":int, "slots":[{"i":int, "x":int, "y":int, "super":bool, "class":str|null, "requires":str|null}]}. Anullmodule_slotsmeans a hull that predates the feature — "no grid yet."Ship.modules(JSONB, nullable) is the per-instance installed-module map:{"installed": {slot_index: {"class":str, "tier":int, "super_at_install":bool, "installed_at":isoZ}}}. Onlyclass+tier+super_at_installare stored per module; effect magnitudes resolve fromMODULE_DEFINITIONSat bake time, so a later magnitude re-tune does not require a migration.(x, y)coordinates are stored from day one even though same-class adjacency bonuses are a later phase — adjacency becomes a behavior toggle, never a re-migration.
1.5.2 Slot counts by hull size¶
Slot count keys off ShipSpecification.ship_size via a literal table; which slot indices are supercharged or class-locked is hand-authored per hull for distinct identity (never computed from the size formula):
ship_size |
Slot count |
|---|---|
| tiny (Escape Pod) | 0 |
| small | 3 |
| medium | 4 |
| large | 6 |
| capital | 8 (hand-set — CAPITAL has no size_unit, so the budget is hand-keyed, not derived) |
null (NPC-only Interdictor hulls) |
0 (filtered, ERR_NPC_ONLY_HULL) |
The six faction-reward hulls and every future hull inherit this descriptor with zero bespoke code — a premium hull is just a spec row with a richer module_slots layout. (The Citizen Clipper is a small baseline grid plus one extra supercharged, citizen-gated maintenance slot.)
1.5.3 Supercharged slots¶
A module installed in a supercharged slot has its numeric effects multiplied by a flat supercharge factor, snapshotted as super_at_install at install time so a later lattice re-tune cannot retroactively change a baked module. The supercharge factor is NO-CANON (pending a DECISIONS.md ruling) and co-tunes with the tier cost/effect curve so that breadth-by-count (several Mk I modules) stays a live alternative to depth-in-a-super-slot (one high-tier module supercharged) rather than a strictly-dominant "always tier-up-and-supercharge" choice. Tier is 1-based (Mk I = tier 1).
1.5.4 The bake-on-install model¶
Effects are baked into the stored stat columns (Ship.combat, Ship.cargo, Ship.maintenance, Ship.current_speed, …) on install, following the baked-delta REPLACE contract: column = current − prev_baked + new_total, storing the new total in Ship.modules['_baked']. The bake loop reads MODULE_DEFINITIONS[(class, tier)] and applies the per-module base → ×supercharge → cap across the summed contribution. The grid is capped (a best-N cap on the summed module effect per class) so a bounded grid cannot re-create the "8 shield modules = god-ship" failure.
1.5.5 The P2W income fence (class-lock)¶
Module slots may be class-locked via the requires seam: None = open, "citizen" = Galactic-Citizen membership (lapse-safe double-checked live), {faction: tier} = a reputation gate. A citizen-gated slot is barred from the combat and income axes — a paid-membership slot may carry only cosmetic / capped-utility modules whose effects are empty, never passive_income, mining_efficiency, cargo_bonus_percent, credit_bonus, income_bonus, or trade_profit_bonus. This is the monetization firewall: paid buys shape and expression, never power or income, and a CI income-fence test asserts it. Cosmetic citizen choices write to Ship.modules.cosmetics (outside installed), so a skin never consumes a finite slot.
1.5.6 The weapons guardrail¶
There is no weapon_damage module class. attack_rating is fixed at hull purchase (§2.6) — to get a stronger gun, buy a stronger hull. Modules offer tactical modifiers, never raw firepower.
2. Upgrade categories¶
Source: services/gameserver/src/services/ship_upgrade_service.py:UPGRADE_DEFINITIONS. All eight upgrade types map to UpgradeType enum values in models/ship.py:35-43.
| Upgrade | Base cost | Multiplier | Effect per level | UpgradeType enum |
|---|---|---|---|---|
| Engine | 5,000 | 2.0 | speed +0.5 | ENGINE |
| Cargo Hold | 3,000 | 1.8 | cargo +30% | CARGO_HOLD |
| Shield | 8,000 | 2.2 | max_shields +200 | SHIELD |
| Hull | 7,000 | 2.0 | hull_points +300 | HULL |
| Sensor | 6,000 | 2.5 | evasion +15% | SENSOR |
| Drone Bay | 10,000 | 2.0 | drone capacity +2 | DRONE_BAY |
| Genesis Containment | 15,000 | 3.0 | genesis capacity +2 | GENESIS_CONTAINMENT |
| Maintenance System | 6,000 | 2.0 | failure_rate_reduction +0.15 | MAINTENANCE_SYSTEM |
Status: ✅ Shipped — all eight upgrade types are purchasable. MAINTENANCE_SYSTEM's UPGRADE_DEFINITIONS entry — 6,000 cr base cost, 2.0× geometric multiplier, failure_rate_reduction +0.15 per level — and its _apply_upgrade_effects branch (accumulates the reduction into Ship.maintenance, clamped ≤ 1.0) are ratified canon, so it sells through the existing purchase / cost / info flow under the per-hull cap. The effect is fully live: the failure-roll consumer (§2.9 — base 2%/jump, also ratified canon) has landed.
2.1 Hull¶
Source: models/ship.py:ShipSpecification.hull_points, services/gameserver/src/services/combat_service.py.
Each Hull upgrade level adds 300 hull points. Combat damage that exceeds shields hits hull; when hull reaches 0 the ship is destroyed. Hull repair happens at stations via ship_service.repair_ship.
2.2 Engine¶
Source: models/ship.py:Ship.base_speed, models/ship.py:Ship.current_speed.
Each Engine upgrade adds +0.5 to Ship.current_speed. The column is consumed by Fleet.average_speed (denormalized fleet stat used by the fleet-pacing UI) and reserved for future combat-side wiring. It is not consumed by today's combat-resolver evasion or escape formulas — evasion is driven by Ship.evasion (Sensor-upgrade scaled), and escape uses ship-type / hull / sector-edge / pursuer-class factors, not speed. Speed does not reduce sector turn cost either — every ship pays the same Ship.turn_cost for a direct warp and the same WarpTunnel.turn_cost for a tunnel traversal regardless of speed. See ./movement.md for the canonical movement model and the full breakdown of what current_speed does and does not do.
Separately, Engine level shortens the Quantum Jump cooldown (Warp Jumper only — not natural-warp / sector turn cost): ✅ Shipped — ShipUpgradeService.engine_jump_cooldown_factor (≈10%/level multiplicative, floor 0.5) is applied when quantum_service sets quantum_jump_cooldown_until after a jump (JUMP_COOLDOWN_HOURS * engine_factor). The 4h scan cooldown is untouched. Per-level magnitude is NO-CANON / provisional in code — effect is live; do not treat 10%/floor as ratified balance.
2.3 Shield¶
Source: models/ship.py:ShipSpecification.max_shields, shield_recharge_rate.
Each Shield level adds 200 max shields. Shields regenerate per-tick at the spec's shield_recharge_rate. Upgrades do not change the recharge rate — that's set by the ship spec.
2.4 Cargo¶
Source: models/ship.py:ShipSpecification.max_cargo, Ship.cargo (JSONB).
Each Cargo Hold level adds +30% to base cargo capacity. Cargo holds commodities for trading (see economy/trading.md) — bigger cargo means more profit per haul.
2.5 Sensor¶
Source: models/ship.py:ShipSpecification.scanner_range, evasion.
Each Sensor level adds +15% evasion and +1 scanner-range sector (✅ Shipped — both the evasion bonus and the scan-range extension apply). Higher evasion = lower hit probability against the ship in combat; longer scanner range reveals more sectors per scan.
2.6 Weapons¶
Source: models/ship.py:ShipSpecification.attack_rating, models/ship.py:Ship.combat (JSONB).
Weapons are not in UpgradeType — they're driven by attack_rating from the ship spec, which is fixed at ship purchase. To get a stronger gun, buy a stronger ship. Combat-class equipment offers tactical modifiers (ECM, stealth), never raw firepower — ✅ Shipped (ecm_suite, stealth_module in EQUIPMENT_DEFINITIONS, 34d5cd7a). Profile-switch mounts (autocannon_mount / particle_projector / torpedo_bay) set weapon_type only — they do not raise attack_rating / weapon_damage (§2.6 intact).
Status: ✅ Shipped (tactical combat equipment + weapon-profile mounts) / intentional exclusion of weapon damage from upgrades. The upgrade-vs-equipment split deliberately excludes raw firepower; attack_rating stays a ship-class signature. 📐 Design-only — target-lock equipment (named in the planned set, not yet defined).
2.7 Drone bay¶
Source: models/ship.py:ShipSpecification.max_drones, models/drone.py, services/drone_service.py.
Each Drone Bay level adds +2 drone capacity. Drones are deployable assets — attack drones, defence drones, and mines (Player.attack_drones, Player.defense_drones, Player.mines).
2.8 Genesis bay¶
Source: models/ship.py:ShipSpecification.max_genesis_devices, models/ship.py:Ship.genesis_devices.
Each Genesis Containment level adds +2 device slots. Only ships with ShipSpecification.genesis_compatible = true can install this upgrade (typically Carrier and Warp Jumper). See galaxy/genesis-devices.md.
2.9 Maintenance¶
Source: models/ship.py:Ship.maintenance (JSONB), models/ship.py:Ship.has_automated_maintenance, models/ship.py:FailureType enum, services/gameserver/src/services/movement_service.py:MovementService._roll_mechanical_failure.
Two distinct failure mechanics share the Ship.maintenance JSONB and are easy to conflate — see ./ships.md#maintenance-system for the condition/decay system this page cross-links against:
- Condition/decay system (owned by
./ships.md) — hull condition decays daily by ship class and maps toFailureTypeevents (NONE / MINOR / MAJOR / CATASTROPHIC) via the performance-band table. That system's own per-jump failure roll is ✅ Shipped (WO-BUILD-HULL-FAILURE-TIER-DICE-ROLL):apply_hull_condition_failure_rollconsumes bandfailure/failure_tieron successful jumps viaMovementService._roll_hull_condition_failure. MAINTENANCE_SYSTEMupgrade (this page, §2) — a purchasable upgrade that banksfailure_rate_reductionintoShip.maintenance. 📐has_automated_maintenance(boolean column) is a schema stub only — zero gameplay readers; admin create hardcodesfalse. Do not conflate it with the shipped upgrade path above. Continuous-without-docking auto-maintenance remains unbuilt.
Status: ✅ Shipped — the MAINTENANCE_SYSTEM upgrade is buyable (accumulating failure_rate_reduction into Ship.maintenance, see §2), and its consumer is live: MovementService._roll_mechanical_failure rolls a base 2%-per-jump mechanical failure on every successful jump, reduced by the banked failure_rate_reduction and clamped to [0, base_rate]; on a hit, one random installed upgrade drops a level (ship_upgrade_service.degrade_random_system). This roll does not use FailureType and does not touch hull condition or the destruction handler — a hit here degrades an upgrade, not the ship's condition band. The condition/decay system's own Minor/Major/Catastrophic failure roll is a separate shipped consumer (apply_hull_condition_failure_roll / _roll_hull_condition_failure) — see ./ships.md#maintenance-system.
3. Equipment catalogue¶
Source: services/gameserver/src/services/ship_upgrade_service.py:EQUIPMENT_DEFINITIONS.
| Key | Cost | Compatible ships | Effects |
|---|---|---|---|
quantum_harvester |
50,000 | Scout, Fast Courier, Defender, Warp Jumper | passive_income: 100 (✅ Shipped — grants 100 cr daily per installed harvester; also gates nebula Shard harvesting per ../galaxy/quantum-resources.md) |
mining_laser |
35,000 | Cargo Hauler, Colony Ship, Defender | mining_efficiency: 1.5 |
planetary_lander |
20,000 | Colony Ship, Light Freighter, Cargo Hauler | landing_bonus: 1.25 |
tractor_beam |
40,000 | Cargo Hauler, Defender, Carrier, Warp Jumper | tow_capable: true, weapon_mode: tractor (tow ✅ shipped; combat face 📐 Design-only) |
ecm_suite |
45,000 [NO-CANON] | Scout, Defender, Carrier, Warp Jumper | ecm_hit_penalty: 0.15 — reduces opponent hit chance when this ship is defender (✅ Shipped 34d5cd7a) |
stealth_module |
40,000 [NO-CANON] | Scout, Fast Courier, Warp Jumper | stealth_evasion_bonus: 15 — flat evasion in defense power (✅ Shipped 34d5cd7a) |
Status: ✅ Shipped — utility equipment (quantum_harvester / mining_laser / planetary_lander) + tow-side tractor_beam + tactical combat ecm_suite / stealth_module. 📐 Design-only — tractor combat face (speed-debuff / flee-suppression beyond the single-shot MVP) and additional planned equipment (scientific scanners, fleet command link, target lock). The Warp Jumper's own tractor_beam is the exclusive Tractor that operates through Quantum Jump (medium-max towed ship, one per jump, +5 turns flat); other compatible ships' Tractors do not transit QJ.
OpenAPI honesty (tip
46bce720):EquipmentRequest.equipment_keyField description inship_upgrades.pystill hardcodes only three keys (quantum_harvester,mining_laser,planetary_lander) while liveEQUIPMENT_DEFINITIONSalso includestractor_beam/ecm_suite/stealth_module/ weapon mounts / …. Do not treat the OpenAPI string as the full live catalog. Land path: OPEN Soft-ORDER Fibril#1637/ PR #633 (tip_HAS_land=NO).
✅ Install Planetary Lander CTA on LEG-117 tip / pending merge — claim confirm + disembark unload expose PlanetaryLanderInstallCta → shipUpgradeAPI.installEquipment('planetary_lander') at catalog 20,000 cr when the active ship lacks equipment_slots.planetary_lander and hull is compatible (e8fe58f5 / PR #626 — open as of 2026-08-20, not yet on feat/new-feature-development). ModuleGrid lander family / lander ladder upgrades remain 📐 Design-only (out of scope for this CTA). ✅ Install Tractor Beam CTA on LEG-120 tip / pending merge — TowConsentPanel exposes TractorBeamInstallCta → shipUpgradeAPI.installEquipment('tractor_beam') at catalog 40,000 cr when the active ship lacks equipment_slots.tractor_beam and hull is compatible (78c21a21 / PR #628 — open as of 2026-08-20, not yet on feat/new-feature-development). ModuleGrid tractor family / combat-face tractor UI remain 📐 Design-only (out of scope for this CTA). ✅ Install ECM Suite / Install Stealth Module CTAs on LEG-126 tip / pending merge — ArmoryVenue exposes EcmSuiteInstallCta / StealthModuleInstallCta → shipUpgradeAPI.installEquipment('ecm_suite'|'stealth_module') at catalog 45,000 / 40,000 cr when the active ship lacks the matching equipment_slots entry and hull is compatible (d2284f4d / PR #630 — open as of 2026-08-20, not yet on feat/new-feature-development). ModuleGrid combat ladders for ECM/stealth remain 📐 Design-only (out of scope for these CTAs). ✅ Install Mining Laser CTA on LEG-109 tip / pending merge — MiningVenue exposes Install Mining Laser → shipUpgradeAPI.installEquipment('mining_laser') at catalog 35,000 cr when the active ship lacks equipment_slots.mining_laser and hull is compatible (229d2579 / PR #622 — open as of 2026-08-20, not yet on feat/new-feature-development). ModuleGrid mining family / laser ladder UI remain 📐 Design-only (out of scope for this CTA).
3.1 How equipment effects apply¶
ship_upgrade_service.get_equipment_effects(ship) returns a merged dict. Other services consume:
- passive_income → granted by the idle-income job, which credits 100 cr per day for each installed
quantum_harvester(✅ Shipped — daily credit-grant scheduler). - mining_efficiency → multiplier on raw resource yields when mining (✅ Shipped — consumed by
mining_service.pyat harvest; see../economy/mining.md). Player UI: when a compatible ship lacks the mining_laser slot,MiningVenuealso exposes an Install Mining Laser CTA (catalog 35,000 cr viashipUpgradeAPI.installEquipment) — ✅ on LEG-109 tip / pending merge (229d2579/ PR #622 — open as of 2026-08-20, not yet onfeat/new-feature-development). ModuleGrid mining family remains 📐 Design-only. - landing_bonus → multiplier on colonist throughput at the landing/deposit action — a
planetary_lander-equipped ship lands×1.25more colonists per cargo pod at bothclaim_planetanddisembark(✅ Shipped — ratified application point per DECISIONS landing-bonus-application-point (Max 2026-06-20): option (a), a discrete landing/deposit hook, explicitly not a continuous production-tick multiplier). Player UI: when a compatible ship lacks the lander slot, claim confirm + disembark unload also expose an Install Planetary Lander CTA (catalog 20,000 cr viashipUpgradeAPI.installEquipment) — ✅ on LEG-117 tip / pending merge (e8fe58f5/ PR #626 — open as of 2026-08-20, not yet onfeat/new-feature-development). - tow_capable → enables the ship-towing operation per
./ships.md#tractor-beam-tow-operations. Movement service consults this flag plusShip.tow_state(📐 Design-only JSONB on the hauler — see../../DATA_MODELS/ships.md#ship-tow-state) to look up the towed ship's size and apply the per-move turn surcharge. Player UI: when a compatible ship lacks the tractor_beam slot, TowConsentPanel also exposes an Install Tractor Beam CTA (catalog 40,000 cr viashipUpgradeAPI.installEquipment) — ✅ on LEG-120 tip / pending merge (78c21a21/ PR #628 — open as of 2026-08-20, not yet onfeat/new-feature-development). - weapon_mode: tractor → registers the tractor weapon profile with the combat resolver per
./combat.md#weapons(📐 Design-only — speed-debuff + flee-suppression weapon variant; single-shot escape-suppression MVP is live). - ecm_hit_penalty → defender ECM reduces attacker hit chance in ship-vs-ship combat (
combat_service._apply_defender_ecm, ✅ Shipped). Player UI: when a compatible ship lacks the ecm_suite slot, ArmoryVenue also exposes an Install ECM Suite CTA (catalog 45,000 cr viashipUpgradeAPI.installEquipment) — ✅ on LEG-126 tip / pending merge (d2284f4d/ PR #630 — open as of 2026-08-20, not yet onfeat/new-feature-development). - stealth_evasion_bonus → flat evasion points folded into
_calculate_defense_power(✅ Shipped). Player UI: when a compatible ship lacks the stealth_module slot, ArmoryVenue also exposes an Install Stealth Module CTA (catalog 40,000 cr viashipUpgradeAPI.installEquipment) — ✅ on LEG-126 tip / pending merge (d2284f4d/ PR #630 — open as of 2026-08-20, not yet onfeat/new-feature-development).
The pipe (read merged effects → apply at use site) is in place for the shipped consumers above; remaining Design-only effect consumers are called out per-row.
4. Insurance¶
Source: models/ship.py:InsuranceType (NONE / BASIC / STANDARD / PREMIUM), models/ship.py:Ship.insurance (JSONB), services/ship_service.py:_calculate_insurance_payout.
Insurance is a one-time purchase at ship commissioning time. The premium is a flat upfront fee proportional to Ship.purchase_value; coverage stays attached to the ship for its lifetime. On destruction the payout is the tier's coverage fraction of purchase_value, minus the tier's deductible. See ./ships.md#insurance for the canonical tier table and pricing.
5. Ship destruction & escape pod¶
Source: services/ship_service.py:destroy_ship, _ensure_escape_pod; combat_service._handle_ship_destruction.
When a ship is destroyed:
1. Ship.is_destroyed = true, Ship.status = ShipStatus.DESTROYED.
2. An ESCAPE_POD ship is created for the player if they don't already have one. The escape pod is a special ShipType.ESCAPE_POD — minimal cargo, no weapons, indestructible to non-PvP.
3. All cargo routes to a salvageable Cargo Wreck in the sector — none of it transfers to the escape pod. The legacy _transfer_emergency_cargo path (which proportionally moved 10% of cargo to the pod) is amended out of canon; see ./ships.md#cargo-wreck for the full wreck-creation flow and removal sequence.
4. If insurance was active, the payout credits are added to Player.credits.
Status: ✅ Shipped — destruction status, pod auto-creation, insurance payout (steps 1, 2, 4), and Cargo Wreck creation (step 3) are live. Spawn: CombatService._spawn_cargo_wreck (combat_service.py:5012, from _handle_ship_destruction; model CargoWreck / WreckCause models/cargo_wreck.py:53 / :39). Salvage: salvage_service.salvage_wreck (:93) + 1h grace (GRACE_WINDOW :47, grace_status :66); routes GET /sectors/{id}/wrecks + POST /sectors/salvage (api/routes/sectors.py:317 / :385, mounted api.py:107). See ./ships.md#cargo-wreck. 📐 Residuals: ADR-0007 per-damage-type recovery bands (tip drops full leftover hold — band roll PARKED); legacy _transfer_emergency_cargo 10% pod haircut retired on tip (ShipService has no such method; non-voluntary destroy_ship leaves hold cargo for CombatService._spawn_cargo_wreck; planned-dismantle / warp_gate_anchor / genesis use _transfer_all_cargo only) — verified origin/feat 46bce720 + services/gameserver/tests/unit/test_adr0093_item40_wreck_only_cargo.py (re-checked 2026-08-19; _transfer_emergency_cargo appears only in that test).
6. Ship types and loadouts¶
The ship types live in models/ship.py:ShipType:
ESCAPE_POD, LIGHT_FREIGHTER, CARGO_HAULER, FAST_COURIER, SCOUT,
COLONY, DEFENDER, CARRIER, WARP_JUMPER
Each has a ShipSpecification row with base stats, max_upgrade_levels (which upgrades it accepts and how high), and acquisition_methods. See ships.md for base stats; here we cover example loadouts — what a player should build toward depending on play-style.
6.1 Scout build (exploration)¶
Base ship: SCOUT — high speed, high evasion, low cargo, no genesis bay.
Recommended upgrades (in order): 1. Sensor L1–L3 (max evasion: +45%) 2. Engine L1–L2 (max speed boost) 3. Shield L1 (survival buffer) 4. Cargo Hold L1 (small)
Recommended equipment: quantum_harvester (passive income while exploring deep space).
Total investment to fully kit: ~155,000 cr.
6.2 Cargo Hauler build (trader)¶
Base ship: CARGO_HAULER — large cargo, slow, modest defence.
Recommended upgrades: 1. Cargo Hold L1–L4 (max cargo: +120%) 2. Engine L1–L2 (offset baseline slowness) 3. Shield L1–L2 (defend valuable cargo) 4. Hull L1
Recommended equipment: mining_laser (extra resource yield from sectors), planetary_lander (improved colonist trade with own planets).
Total investment to fully kit: ~450,000 cr.
6.3 Defender build (combat / escort)¶
Base ship: DEFENDER — balanced offense/defence, high attack rating.
Recommended upgrades: 1. Hull L1–L4 (max hull: +1,200) 2. Shield L1–L4 (max shields: +800) 3. Drone Bay L1–L3 (max drones: +6) 4. Sensor L1–L2 (improved combat evasion)
Recommended equipment: quantum_harvester (passive income while patrolling), or combat tactical ecm_suite / stealth_module (✅ Shipped).
Total investment to fully kit: ~700,000 cr.
6.4 Colony Ship build (colonist hauler)¶
Base ship: COLONY — high max_colonists, modest cargo.
Recommended upgrades: 1. Cargo Hold L1–L3 2. Hull L1–L2 (lots of valuable cargo) 3. Shield L1 4. Engine L1
Recommended equipment: planetary_lander (mandatory), mining_laser.
6.5 Carrier build (fleet flagship)¶
Base ship: CARRIER — many drones, genesis-compatible.
Recommended upgrades: 1. Drone Bay L1–L5 (massive drone swarm) 2. Genesis Containment L1–L3 (carry multiple genesis devices) 3. Hull / Shield L1–L4 4. Cargo Hold L1–L2
Equipment slots: large; intended for end-game tactical equipment (📐 Design-only).
6.6 Warp Jumper build (cross-region)¶
Base ship: WARP_JUMPER — quantum_jump_capable, warp_creation_capable.
Recommended upgrades:
1. Engine L1–L3 (Quantum Jump cooldown reduction — ✅ Shipped via engine_jump_cooldown_factor on QJ commit; magnitude NO-CANON/provisional; does not reduce natural-warp turn cost)
2. Shield L1–L3
3. Genesis Containment L1–L2
4. Sensor L1–L2
Equipment: quantum_harvester. End-game logistics ship — fewest in number, most strategic value.
6.7 Fast Courier build (high-value cargo)¶
Base ship: FAST_COURIER — fast, small cargo, highly evasive.
Recommended upgrades: 1. Engine L1–L4 (max speed) 2. Sensor L1–L3 (max evasion) 3. Shield L1 4. Cargo Hold L1
Use case: hauling exotic_technology and luxury_goods on long routes where speed matters more than volume.
Player-facing affordances¶
- ✅ Upgrade / module purchase UI —
ModuleGridInterface.tsxin SpaceDockShipyardVenue.tsxandServicesVenue.tsx; purchases viashipUpgradeAPIagainstship_upgrades.pyroutes (origin/feat46bce720). - 🚧 Equipment install UI — same module grid + equipment install paths;
planetary_landerinstall CTA on claim/disembark when compatible hull lacks the slot — PR #626 OPEN (not on tip; comparison only). - ✅ Wreck salvage UI —
SolarSalvagePage.tsxon the SOLAR SYSTEM deck monitor; lists sector wrecks and calls salvage API (origin/feat46bce720). - 📐 Residual design-only equipment (scientific scanners, fleet command link, target lock) — see §3 inline markers; no invent magnitudes.
7. Cross-references¶
- ships.md — base ship-type stats and
ShipSpecificationfields. - combat.md — how
attack_rating,defense_rating, hull, shields, drones interact in combat. - economy/trading.md — cargo's role in trade.
- economy/lifecycle.md — upgrades and equipment as credit sinks.
- galaxy/genesis-devices.md — genesis device deployment from ships with genesis bays.
- factions-and-teams.md — fleet operations.