design config
This commit is contained in:
147
docs/content_design.md
Normal file
147
docs/content_design.md
Normal file
@@ -0,0 +1,147 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user