148 lines
5.5 KiB
Markdown
148 lines
5.5 KiB
Markdown
# Content Design — Ships & Modules
|
||
|
||
First real-content iteration (June 2026). This pass defines ship hull grids
|
||
and module surface masks only. Stats, materials, recipes, and threat costs in
|
||
the config files are placeholders; the recipe pass and the balancing pass
|
||
come later.
|
||
|
||
## Design principle: footprint gating
|
||
|
||
Which module fits on which hull is controlled purely by geometry — no
|
||
explicit allow-lists. Each hull grid is shaped so that it physically cannot
|
||
contain the footprint of modules from a larger size class. This keeps the
|
||
rules transparent to the player ("it doesn't fit because there is no room")
|
||
and makes them trivially moddable through the config files alone.
|
||
|
||
### Module footprint ladder
|
||
|
||
| Footprint | Modules | Smallest hull that fits it |
|
||
|-----------|---------|----------------------------|
|
||
| 1x1 | laser_cannon_s, salvager, repair_tool | drone |
|
||
| 1x2 | maneuvering_thrusters, sensor_booster, armor_plates | frigate |
|
||
| 1x3 | afterburner | frigate (eats most of it) |
|
||
| L-shape (3 cells) | weapon_stabilizer, weapon_primer, weapon_upgrade | frigate |
|
||
| 2x2 | laser_cannon_m, drone_bay | cruiser |
|
||
| 3x3 | laser_cannon_l | battleship |
|
||
| 2x6 | drone_hangar | dreadnought / carrier |
|
||
|
||
### Hull grids
|
||
|
||
`O` = buildable cell, `X` = hull structure (not buildable).
|
||
|
||
**drone (xs, 1 cell)** — exactly one 1x1 module: a small gun, a salvager, or
|
||
a repair tool. This is what makes drone roles swappable.
|
||
|
||
O
|
||
|
||
**frigate (s, 5 cells)** — plus shape. Every 1x2 placement crosses the center
|
||
cell, so at most ONE 1x2 support fits; alternatively one L-shaped weapon
|
||
modifier or one afterburner through the center line. Gun-boat with one or two
|
||
support modules, as intended.
|
||
|
||
XOX
|
||
OOO
|
||
XOX
|
||
|
||
**destroyer (s, 8 cells)** — gun deck with three turret bumps. More cells
|
||
than the frigate (more small guns), but still no 2x2 area anywhere, so medium
|
||
hardware can never be mounted.
|
||
|
||
OXOXO
|
||
OOOOO
|
||
|
||
**cruiser (m, 12 cells)** — notched corners. Fits at most two 2x2 m guns
|
||
(stacked through the middle), leaving the side cells for supports. No 3x3
|
||
area.
|
||
|
||
XOOX
|
||
OOOO
|
||
OOOO
|
||
XOOX
|
||
|
||
**battlecruiser (m, 16 cells)** — split bow with two gun cheeks, tapered
|
||
stern. Fits three 2x2 m guns — one more than the cruiser — with small support
|
||
slots left over. The bow split and stern taper prevent any 3x3 area (no l
|
||
gun) and any 2x6 area (no drone hangar).
|
||
|
||
OOXXOO
|
||
OOOOOO
|
||
XOOOOX
|
||
XXOOXX
|
||
|
||
**battleship (l, 20 cells)** — 5 wide, so at most ONE 3x3 l gun fits, and
|
||
mounting it consumes nearly half the grid, leaving only narrow strips for
|
||
supports. Without an l gun it flexibly fits several m guns. Too narrow for a
|
||
drone hangar.
|
||
|
||
XOOOX
|
||
OOOOO
|
||
OOOOO
|
||
OOOOO
|
||
XOXOX
|
||
|
||
**dreadnought (xl, 42 cells)** — 11-wide, 3-deep main battery deck: three 3x3
|
||
l guns fit side by side with spacer columns to spare, plus bow/stern strips
|
||
for supports. Wide enough for a drone hangar too, if the player wants to
|
||
trade a gun battery for one.
|
||
|
||
XXXOOOOOXXX
|
||
OOOOOOOOOOO
|
||
OOOOOOOOOOO
|
||
OOOOOOOOOOO
|
||
XXOOXXXOOXX
|
||
|
||
**carrier (xl, 37 cells)** — the top flight deck (rows 0–1) is the only
|
||
region wide enough for the 2x6 drone hangar, and exactly one fits. The middle
|
||
deck row is broken up by elevator shafts (X cells placed so every 3-column
|
||
window hits one), which is what prevents any 3x3 l gun from ever fitting.
|
||
Lower decks hold supports and 2x2 point-defense m guns.
|
||
|
||
XOOOOOOOOX
|
||
OOOOOOOOOO
|
||
OOXOOXOOXO
|
||
XOOOOOOOOX
|
||
XXXOOOOXXX
|
||
|
||
### Verified gating matrix
|
||
|
||
Checked programmatically against the configs (all four mask rotations,
|
||
all placements):
|
||
|
||
| Footprint | drone | frigate | destroyer | cruiser | battlecruiser | battleship | dreadnought | carrier |
|
||
|-----------|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|
||
| 1x1 | x | x | x | x | x | x | x | x |
|
||
| 1x2 | | x | x | x | x | x | x | x |
|
||
| 1x3 | | x | x | x | x | x | x | x |
|
||
| L-shape | | x | x | x | x | x | x | x |
|
||
| 2x2 | | | | x | x | x | x | x |
|
||
| 3x3 | | | | | | x | x | x* |
|
||
| 2x6 | | | | | | | x | x |
|
||
|
||
\* dreadnought only; the carrier's elevator shafts block all 3x3 placements.
|
||
Max disjoint l guns: battleship 1, dreadnought 3. Max disjoint m guns:
|
||
cruiser 2, battlecruiser 3.
|
||
|
||
## Deliberate placeholders / open questions for later passes
|
||
|
||
- All new hulls have `threat.cost_formula = "0"` so enemy waves do not spawn
|
||
them yet (WaveSystem treats any ship with positive threat cost as wave-
|
||
eligible, regardless of unlock level). The balancing pass should set real
|
||
threat costs together with `default_modules` loadouts so waves spawn them
|
||
armed.
|
||
- All new hulls are `unlock_at_station_level = -1` (available from the start)
|
||
to make layout testing easy; the progression pass should stagger these.
|
||
- Ship hull material items (`frigate_hull` … `carrier_hull`) and the new
|
||
module items (`laser_cannon_m_module`, `laser_cannon_l_module`,
|
||
`drone_bay_module`, `drone_hangar_module`, …) have no recipes yet — that is
|
||
the recipe pass. The old `laser_cannon_xs_module` recipe is orphaned (the
|
||
module was renamed to `laser_cannon_s`, consuming `laser_cannon_s_module`,
|
||
which already has a recipe).
|
||
- `drone_bay` and `drone_hangar` are footprint-only placeholders: the drone
|
||
launching capability does not exist in the simulation yet, so they define
|
||
no capability section.
|
||
- Renames in this pass: `laser_cannon_xs` → `laser_cannon_s` (the old 2x2
|
||
`laser_cannon_s` became `laser_cannon_m`), `armor_plate` → `armor_plates`,
|
||
`manuvering_thrusters` → `maneuvering_thrusters` (typo fix). Test data
|
||
under `bin/test/data/config` intentionally still uses the old ids — it is
|
||
an independent fixture set.
|