01How to use this
Each entry gives an id, a brief, and the constraints that make it fit. Feed a single entry to an image or model generator; do not feed the whole document at once, because the constraints are per-asset and a generator will average them.
A workable prompt is the brief, plus the art direction in §03, plus the faction livery in §04 if the asset belongs to one. The constraints are for whoever wires it in, not for the generator.
Priority
| P0 | The game is visibly incomplete without it. Ships, stations, the HUD. |
| P1 | The game reads as unfinished without it. Effects, icons, core audio. |
| P2 | Polish. Music, ambience, faction logos, decals. |
02Technical contract
| Engine | Bevy 0.19, client only — the server never loads an asset |
| Models | glTF 2.0 binary (.glb), one file per object, Y-up, metres |
| Textures | PNG, power-of-two; 2048² for hero assets, 1024² otherwise |
| Materials | PBR: base colour, metallic-roughness, normal, emissive |
| Audio | OGG Vorbis at 48 kHz — mono for positional sources, stereo for music |
| Interface | PNG with alpha, or SVG for anything that scales |
| Colour space | Base colour and emissive sRGB; normal, metallic and roughness linear |
−Z is forward, +Y is up, +X is right. This is what
shared/src/sim.rs steers with. A model authored nose-along-+Z flies
backwards. The current placeholder rotates a cone −90° about X to point it down
−Z; a properly authored asset should need no rotation at all.
Origin at the centre of mass — for a ship, roughly the centre of the hull, not the nose. The ship rotates about its origin, so an off-centre origin makes the hull swing rather than turn.
Scale
Ships are sized by hit_radius, the radius of the sphere weapons test
against. A model must fit inside its hit sphere — anything outside it can
be shot through.
| Hull | hit_radius | Target length | Target wingspan |
|---|---|---|---|
| kestrel | 11 m | 18–21 m | 12–15 m |
| bulwark | 15 m | 24–28 m | 16–20 m |
| drone_hauler | 24 m | 40–46 m | 20–26 m |
| carrack | 60 m | 105–115 m | 60–80 m |
ShipClass.visual_scale is a multiplier on the client's placeholder model
(a primitive assembly about 4 m long), sent at login since M29 so a cruiser reads as
one: carrack is 30, drone_hauler 2.2, the
fighters 1. Author to the table above and drop it. A model whose true size is a data-file
multiplier is a model nobody can inspect.
How the first models are wired in (M35). The generated set does not meet
this contract yet: each file is normalised to about 1 m and a hull's nose points along
−X. The client turns hulls −90° about Y, measures each file's furthest vertex and
scales it to the placeholder it replaces, so ships still draw at placeholder size. Files
are found by id (ships/<class>, stations/<base>,
structures/<kind>, props/…); a missing file leaves
the placeholder.
Polygon budgets
Interest management replicates up to 24 ships at once, so a busy station means two dozen hulls and their effects on screen together.
| Class | Triangles | Notes |
|---|---|---|
| Fighter hull | 8k–15k | One LOD at 30% for beyond 2 km |
| Freighter hull | 15k–25k | |
| Station | 40k–80k | Hero asset — seen from 600 m and closer |
| Planet | 2k | A sphere with a very good texture |
| Jump gate | 15k | |
| Asteroid | 300–1,500 | Six variants, instanced hundreds of times |
| Container | 500 |
Naming
<category>/<id>.<ext>, using the id from the data files
verbatim: ships/kestrel.glb,
icons/commodity/iron_ore.png, audio/weapon/pulse_1_fire.ogg. The
ids are the join between this document and the code; renaming one breaks that join
silently.
03Art direction
The reference is Freelancer (2003), not Elite Dangerous.
Hulls are readable at a glance and slightly stylised: clear silhouettes, flat panelled surfaces, visible engine glow, colour that says who built the thing. Not gritty photorealism, not cartoon. A player should be able to name a ship class from its outline at 2 km.
Space is dark and coloured. The clear colour is very nearly black with a blue cast. The key light is warm white at a low angle; ambient is cool and dim. That contrast is deliberate — it makes hulls read as lit objects in a dark place rather than as flat sprites.
Palette
Taken from the code, so the world and the interface agree.
Emissive is information. Anything that glows in this game means something: engines are thrust, tracers are damage in flight, station lights are a place you can dock. Do not add decorative glow to hull panels — it makes the things that matter harder to see.
04Faction identity
Four factions. Each needs a livery, a logo that reads at 32 px, and a structure palette.
reach_compact The Reach Compact P2
The established power: industrial, bureaucratic, prosperous. White and navy over
brushed steel; clean lines, everything stencilled with registration numbers. Logo: a
stylised five-pointed star inside a ring, #1F3A6E on white. Their
station is Halden — big, lit, obviously expensive to run.
wardens Compact Wardens P2
The Compact's enforcement arm, and a separate faction. Same hull shapes, different
paint: white with a broad #F2B705 amber stripe along the flank and
flashing amber running lights. Logo: the Compact star behind a shield. It must read
at a glance as authority — a pilot should know from the silhouette and the
stripe that shooting this is a decision.
traders_guild Traders Guild P2
Merchants, not soldiers. Worn olive and cream, heavy container hardpoints,
mismatched replacement panels — working ships repaired badly for twenty years. Logo:
a pair of scales over a cargo pod, #7A6A3F.
cinder_clans The Cinder Clans P2
Pirates, and the owners of Kessler Yard. Everything scavenged: exposed plating,
asymmetric welded-on armour, no two panels the same shade of rust and charcoal. Deep
red running lights instead of white. Logo: a broken ring, hand-painted rather than
stencilled, #8C2020. Their outpost should look like a station somebody
else built and they took.
05Ships
Three hulls, each flown by players and NPCs alike — an NPC is a
ShipInput producer, not a different kind of object.
Hardpoint offsets are exact, in metres, in hull-local space, from
assets/data/ships.ron. They are where muzzle flashes, mining beams and engine
effects attach. Model the corresponding hardware at those points or the effects will
float. The offsets are given at the placeholder's ~5 m scale: multiply by roughly
four when authoring at full size, and keep the arrangement.
kestrel Kestrel P0
- Class
- LightFighter
- Top speed
- 90 m/s
- Hold
- 30 m³
- Hit radius
- 11 m
The starter hull and the most-seen object in the game. A compact single-seat interceptor around 20 m long: forward-swept wings, a canopy set well forward, two engine bells aft. It should look cheap and fast — a hull somebody could afford as their first ship. Panel lines flat and functional, no ornament. The canopy should be transparent enough to imply a pilot without one being modelled.
| Slot | Kind | Size | Fitted | Offset (x, y, z) |
|---|---|---|---|---|
| gun_l | Gun | 1 | pulse_1 | (−1.2, −0.1, −0.6) |
| gun_r | Gun | 1 | pulse_1 | (1.2, −0.1, −0.6) |
| disruptor | EWar | 1 | disruptor_1 | (0.0, −0.5, −0.4) |
| shield | Shield | 1 | — | (0.0, 0.0, 0.0) |
| cm | Countermeasure | 1 | — | (0.0, −0.3, 0.8) |
| engine | Thruster | 1 | — | (0.0, 0.0, 1.9) |
| rig | Rig | 1 | — | (0.0, 0.2, 0.4) |
Guns just outboard and slightly below the nose, disruptor under the chin, countermeasure launcher aft-ventral. Two thruster bells at approximately (±0.45, 0, +1.9), as separately named nodes so the engine glow can attach and scale with throttle.
bulwark Bulwark P0
- Class
- HeavyFighter
- Top speed
- 78 m/s
- Hold
- 60 m³
- Hit radius
- 15 m
The gunship, and what Compact Wardens fly. Broad-shouldered and armoured, about 26 m. Where the Kestrel is swept and thin, this is blocky and layered: bolted-on plates, a heavier nose housing the centre cannon, twin engines set wide. It should look like it can take a beating — visibly thicker than the Kestrel at the same distance. It also has to wear the police amber stripe well, so keep a long uninterrupted flank surface.
| Slot | Kind | Size | Fitted | Offset (x, y, z) |
|---|---|---|---|---|
| gun_l | Gun | 2 | pulse_2 | (−1.8, −0.1, −0.5) |
| gun_r | Gun | 2 | pulse_2 | (1.8, −0.1, −0.5) |
| gun_c | Gun | 2 | cannon_1 | (0.0, 0.5, −0.9) |
| missile | Missile | 2 | missile_1 | (0.0, −0.5, −0.2) |
| miner | Mining | 1 | miner_1 | (0.0, −0.7, −1.0) |
| shield | Shield | 2 | — | (0.0, 0.0, 0.0) |
| cm | Countermeasure | 1 | — | (0.0, −0.3, 0.9) |
| engine | Thruster | 2 | — | (0.0, 0.0, 2.1) |
| rig_a | Rig | 2 | — | (−0.6, 0.3, 0.5) |
| rig_b | Rig | 1 | — | (0.6, 0.3, 0.5) |
The centre cannon sits above the nose line and the mining laser below it. That vertical separation should be visible — it is how a player tells at a glance whether the thing pointed at them is a gun or a tool.
drone_hauler Drone-class Hauler P0
- Class
- Freighter
- Top speed
- 55 m/s
- Hold
- 275 m³
- Hit radius
- 24 m
The industrial hull, and what the NPC haulers fly — so it is seen constantly on the Halden–Harrow run. A slab-sided freighter about 44 m long, built around its cargo section: an obvious spine with modular container bays clamped along it, a small crew module forward, four engines aft. The name is Drone-class: it should look semi-automated, few windows, a lot of external machinery. Two turret rings, dorsal and ventral, must be visibly rotatable hardware: since M29 they really do turn, leading the locked target within the hemisphere they face.
| Slot | Kind | Size | Fitted | Offset (x, y, z) |
|---|---|---|---|---|
| turret_t | Turret | 1 | turret_1 | (0.0, 1.4, 0.0) |
| turret_b | Turret | 1 | turret_1 | (0.0, −1.4, 0.0) |
| miner_l | Mining | 1 | miner_1 | (−1.6, −0.6, −1.2) |
| miner_r | Mining | 1 | miner_1 | (1.6, −0.6, −1.2) |
| shield | Shield | 2 | — | (0.0, 0.0, 0.0) |
| rig_a | Rig | 2 | — | (0.0, −0.8, −1.0) |
| rig_b | Rig | 2 | — | (0.0, 0.8, −1.0) |
| rig_c | Rig | 1 | — | (0.0, −0.8, 1.0) |
| engine | Thruster | 2 | — | (0.0, 0.0, 2.6) |
| scanner | Scanner | 1 | — | (0.0, 0.9, −1.4) |
Three rig mounts are the Hauler's character. It has grid for days and a processor that runs out long before it, so a fully rigged freighter has to choose. Model them as visible external hardpoints along the spine, big enough that a fitted module could plausibly be bolted there.
carrack Carrack-class Cruiser P0
- Class
- Capital
- Top speed
- 42 m/s
- Hold
- 160 m³
- Hit radius
- 60 m
The capital: 32 000 hull, 9 000 shield, six heavy turrets that aim themselves. Player-flyable (Capital Ships skill, 6 000 000 cr at Halden), and flown by the Wardens in a Drift they hold and the Clans in a Gap they hold. Docks only at stations. About 110 m long, a warship rather than a freighter: a long armoured keel, a raised command tower aft of centre, a broad engine block of six bells. Its silhouette is its six turret barbettes (dorsal fore and aft, ventral fore and aft, one on each flank), each a heavy twin-barrelled mount on a ring that must read as rotating. Compact livery is navy and white with gold trim; the Clan one is the same hull stripped, rust-red and patched.
| Slot | Kind | Size | Fitted | Offset (x, y, z) ×30 |
|---|---|---|---|---|
| turret_df | Turret | 2 | turret_2 | (0.0, 9.0, −18.0) |
| turret_da | Turret | 2 | turret_2 | (0.0, 9.0, 14.0) |
| turret_vf | Turret | 2 | turret_2 | (0.0, −9.0, −18.0) |
| turret_va | Turret | 2 | turret_2 | (0.0, −9.0, 14.0) |
| turret_p | Turret | 2 | turret_2 | (−14.0, 0.0, 0.0) |
| turret_s | Turret | 2 | turret_2 | (14.0, 0.0, 0.0) |
| shield | Shield | 2 | — | (0.0, 0.0, 0.0) |
| rig_a | Rig | 2 | — | (0.0, 4.0, 4.0) |
| rig_b | Rig | 2 | — | (0.0, −4.0, 4.0) |
| engine | Thruster | 2 | — | (0.0, 0.0, 30.0) |
Per hull, also needed P1
- LOD1 at ~30% triangles, used past 2 km.
- A damaged state, or at minimum a material variant with scorching and a blown panel or two. Hull integrity is replicated and shown on the HUD; seeing it would be better.
- Four liveries as texture variants sharing one mesh.
06The world
halden Halden Station P0
- System
- Harrow Reach
- Position
- (0, 0, −3000)
- Radius
- 220 m
- Dock within
- 600 m
The Compact's industrial station: bar, trader, ship dealer, equipment dealer, repair, refinery, manufacturing, market orders. The busiest place in the game and the first thing a new player flies to — it sits 1.8 km straight ahead of the spawn point and the whole approach is spent looking at it.
A central spindle with a habitation ring, flanked by refinery stacks and a manufacturing block with visible gantries and cargo handling. Lit windows in irregular clusters. The docking approach clearly marked with a lit bay mouth and approach strobes on the nearest face. Compact livery: white and navy, clean, expensive, with an enormous stencilled registration. It should read as a place where several hundred people work.
It must have a distinct front. The player always approaches from roughly −Z-ward, and a station that looks the same from every angle gives them nothing to aim at.
drift_relay Drift Relay P1
- System
- Vell Drift
- Position
- (1500, 300, 1500)
- Radius
- 180 m
- Dock within
- 520 m
The Traders Guild waystation in null security: bar, trader, repair, refinery. A compact ring with ice-processing tanks on one side and heavy shield plating facing Cinder Hold. Lit like it expects visitors and has had bad ones; Guild amber, used sparingly.
cinder_hold Cinder Hold P1
- System
- Vell Drift
- Position
- (−2600, −400, −3800)
- Radius
- 200 m
- Dock within
- 560 m
The Cinder Clans' home: bar, trader, repair, market orders; refuses anyone who has been hunting them. Kessler Yard's bigger, older sibling: a hollowed rock fortified over generations, trophies welded to the outside (hull sections of ships they took, still in their owners' liveries), ember-red light leaking from cracks.
Player structures P1
Two kinds, deployed by players in null security. Currently a 60 m grey mast with an amber ring at its head; stationary, hit radius 28 m, and they must read at several kilometres as built by somebody. warden_relay: a Compact signal mast, clean and regimented, blue-white beacons, the Compact star. clan_beacon: a salvaged reactor with a war-banner welded on, burning, trophies hung from the frame. Each kit (relay_kit, beacon_kit) wants an icon in the commodity set.
kessler_yard Kessler Yard P0
- System
- Kessler Gap
- Position
- (600, −200, −2200)
- Radius
- 160 m
- Dock within
- 520 m
The Cinder Clan outpost: bar, trader, repair, refinery, market orders. Low security, no police, and it pays well for what it cannot make. Smaller and meaner than Halden — an asteroid with structures welded onto it, or a captured hull section repurposed as a base. Asymmetric, patched, no two modules matching, deep red running lights. Where Halden looks maintained, this looks held together. One obvious docking slot, badly lit.
harrow Harrow P0
- Kind
- Planet
- Position
- (6000, −800, −9000)
- Radius
- 2800 m
- Land within
- 3600 m
Traders Guild. It grows and digs, and imports everything made in orbit. A green-and-ochre
habitable world seen from orbit: continents of cultivated land, visible mining scars, a
thin atmospheric haze on the limb, a handful of settlement lights on the night side. Needs
an 8192×4096 equirectangular albedo, a matching normal, and a cloud layer as a separate
slightly larger sphere. Currently a flat #268C59 sphere, which is the single
biggest visual gap in the game.
Jump gates P0
Two, one per system, each 500 m radius — a ring you fly into, not a door. Harrow Reach's is at (−5200, 300, −1400); Kessler Gap's at (0, 0, 2600).
A massive open ring with four or six anchor pylons, inactive by default, the interior holding a faint distortion that flares when a ship jumps. It should be visible from several kilometres — this is a navigation landmark, and a gate a player cannot find is a system they cannot leave. Include a slowly rotating outer collar so it reads as machinery rather than architecture.
Trade lane rings P1
Three lanes: Halden to the Kessler Gap gate and Halden to Harrow in Harrow Reach,
the gate to Kessler Yard in Kessler Gap. Each has an end ring at both
ends (enter within 300 m; currently a 120 m torus) and a
smaller line ring every kilometre between, all facing along the lane.
Currently amber #F2B34D emissive tori.
An end ring is a docking-ring-sized hoop on a short pylon, with a beacon that reads at several kilometres: it is where a pilot lines up. Line rings are lighter versions of the same shape and, in a row, should read as a route at a glance. Rings flashing in sequence as a ship rides past are optional, but that is what tells a pilot the lane is carrying them.
Asteroid fields P1
| id | System | Centre | Radius | Kind |
|---|---|---|---|---|
| halden_belt | Harrow Reach | (2400, 200, −4200) | 900 m | Asteroid |
| gap_deeps | Kessler Gap | (−1800, −300, −3400) | 1400 m | Asteroid |
| vell_shoals | Vell Drift | (2800, −600, −2600) | 1500 m | Asteroid |
Six to eight asteroid meshes, 300–1,500 triangles each, instanced with random scale and rotation. Irregular, cratered, dusty grey-brown with darker crevices. Two variants should carry visible ore veins — a warmer, faintly metallic streak — because a miner should be able to tell a rock with iron in it from one without, even though the simulation does not yet distinguish them. Add a mined variant with a fresh bright scar, and a dust-and-debris particle layer filling the field volume so flying into a belt feels like entering something rather than crossing a line.
System backdrops P2
Today every system shares one generic starfield (900 unlit dots 40 km out), so arriving somewhere new looks like arriving nowhere. Each system gets its own sky. The look to aim for is deep-space astrophotography: Hubble and Webb nebulae, the Milky Way as long-exposure photographs show it. Not painted sci-fi space with planets and lens flares.
The three must be told apart at a glance from the arrival point. That glance is how a pilot knows a jump worked: warm gold for Harrow Reach, dark brown dust for Kessler Gap, cold blue-violet for Vell Drift.
Technical contract
| Deliverable | One equirectangular panorama per system: skybox/<system id>.png |
| Size | 8192 × 4096 (2:1). 4096 × 2048 is the floor; it softens visibly |
| Format | PNG, sRGB, 8 or 16 bit. Dithered: dark gradients band badly in 8 bit |
| Wrap | The left and right edges must meet with no seam |
| Poles | Top and bottom 15% (the zenith and nadir) are pinched by the projection: keep them to plain star field |
| Conversion | The wiring step converts the panorama to the cubemap Bevy draws (2048 px a face). Do not deliver cube faces |
Orientation. The image is the sky seen from inside. The centre of the image is −Z, the direction a pilot faces at the spawn point; a quarter to the right is +X, the left and right edges are +Z (behind), the top row is +Y.
Leave the sun out. The engine draws the system's star so it lines up with the light that shades the ships, at about (u 0.81, v 0.32) of the image: right of centre, a third of the way down. Keep that patch free of bright features, or the sky shows two suns.
Brightness. The HUD is green text drawn straight over the sky, and contacts are small grey hulls. Most of the image should be near-black (sRGB below about 40/255). Nebulae peak around 60–70%. Nothing white bigger than a star. If a screenshot of the HUD over the brightest part is hard to read, it is too bright.
How hard this is
Making a beautiful nebula image is easy for any current image model. The hard part is a seamless, full-sphere image at 8k. Single-image models (GPT Image, Midjourney, Flux, Imagen) do not wrap left to right, distort at the poles, and top out around 2k. There are three ways to get there, best first:
- Real star field plus a generated feature (recommended). Start from
NASA's Deep Star Maps 2020 (Scientific Visualization Studio): a real all-sky star
map from Gaia and Hipparcos, already equirectangular, up to 64k (as HDR
.exr), free to use with the credit line “NASA/Goddard Space Flight Center Scientific Visualization Studio; Gaia DR2: ESA/Gaia/DPAC”. Turn it differently for each system so the skies differ, dim it, then composite one generated nebula or dust feature per system into the horizon band, painted on black (prompts below). The stars are real, the projection is already right, and only the feature has to be generated. - A dedicated 360 generator (Blockade Labs Skybox AI, or a panorama-capable model). It handles the projection and the wrap, but check the poles and upscale to 8k.
- A single-image model with fix-up. Generate at 2:1, upscale (Real-ESRGAN or similar), then fix the wrap: shift the image half a width, inpaint the seam now in the middle, and shift it back. Paint the poles over with star field.
Real Hubble and Webb images are the right style reference. Using one directly is possible, with care. NASA images are generally public domain. ESA/Hubble and ESA/Webb images are CC BY 4.0 and need a credit line. Check each image's credit. They are flat frames, not skies, so they can only be composited in as a feature. Famous objects (the Pillars of Creation, the Carina Nebula) are recognisable and break the fiction. A generated feature in the same palette is usually better.
The systems
| id | Name | Security | Sky |
|---|---|---|---|
| harrow_reach | Harrow Reach | High | Warm and rich: a bright Milky Way band crossing at a tilt, golden dust lanes, a soft rose-and-gold emission nebula low on the left. Busy with stars. Safe. |
| kessler_gap | Kessler Gap | Low | Dark and dusty: a broad brown-grey dark nebula blotting out a third of the sky, thin starlight around its edges, one small distant red dwarf with a faint glow. Sparse. Exposed. |
| vell_drift | Vell Drift | Null | Cold and deep: the filaments of an old supernova remnant across the sky, teal and violet with thin red edges, very few stars. One ember-red smudge low on the horizon where Cinder Hold's reactors light the dust. Nobody's. |
Prompts
Each prompt is the system's sky plus the shared style. Use the panorama form with a 360 generator; use the feature form for route 1 or 3, where the feature is composited onto a star field.
Shared style (append to every prompt)
Panorama form, prefix
Feature form, prefix
harrow_reach
kessler_gap
vell_drift
Acceptance
- Load it in a panorama viewer and turn a full circle: no seam, no pinch.
- Put the game's HUD screenshot over the brightest part: the text reads.
- Put the three side by side as small thumbnails: each is recognisable.
loot Cargo container P1
Spawns where a ship died, holding what it carried, and disperses after a timeout. Currently a 6 m yellow cube. Should be a 4 m armoured pod with a strobing locator beacon, scorched on one face. It must be findable: the beacon is the whole point, because these appear mid-fight and expire.
Distance markers P2
Eight small spheres every 500 m straight ahead of the spawn point, so a new player can read their speed off the world instead of trusting the HUD. Replace with something intentional: a line of small unlit navigation buoys, one blinking light each, receding into the dark.
07Weapons and projectiles
Every weapon here is a projectile. There is no hitscan, and leading a target is a skill.
The projectile is a real object the player watches travel, so how it looks matters more than usual. Each weapon needs a muzzle model at its hardpoint, a projectile look, and audio (§11).
| id | Name | Damage | Speed | Brief · P0 |
|---|---|---|---|---|
| pulse_1 | Pulse Laser Mk I | Energy | 620 m/s | Short cyan-white bolt, ~4 m long, soft glow, quick fade |
| pulse_2 | Pulse Laser Mk II | Energy | 680 m/s | As Mk I but longer and hotter — visibly the better gun |
| cannon_1 | Tungsten Cannon | Kinetic | 420 m/s | A slug: small, bright, hard-edged, smoke trail. Slow enough to lead badly |
| turret_1 | Defence Turret | Kinetic | 500 m/s | Short amber bursts, unmistakably defensive |
| turret_2 | Heavy Turret | Kinetic | 450 m/s | A heavy twin slug, orange-white, with a visible muzzle flash on the barbette |
| disruptor_1 | Cruise Disruptor | EMP | 380 m/s | A slow violet pulse that crackles. Non-lethal-looking, because it is not about damage — it stops a freighter running |
| miner_1 | Mining Laser Mk I | Energy | 900 m/s | A continuous orange beam with heat shimmer, not a bolt. The only weapon that reads as a tool |
| missile_1 | Hammer Missile | Explosive | 260 m/s | A visible physical object with a motor: exhaust plume, smoke trail, slow enough to watch arrive. It flies straight — there is no guidance in this game — so its threat is what it does on impact, not on the way |
Impact effects P1
- Energy — a bright flash and a brief circular scorch.
- Kinetic — sparks and a puff of debris; visible ablation.
- Explosive — a small fireball with a shockwave ring.
- EMP — a blue-white electrical crawl across the target hull.
Shield impact must be distinct from a hull hit: shields absorb before hull, and a player needs to know which is being eaten. A hexagonal ripple spreading from the impact point across a spherical shield surface, brightest at the centre, fading in about 0.4 s.
07aEquipment
Seventeen modules, three of them switched on in flight, bolted into mounts by kind and size. Most are internal — a shield capacitor is a box in a bay — so the need here is icons first, hull attachments second.
Every module's effect is a percentage of the hull's own numbers, and the trade-offs are authored in pairs: a capacitor holds more and refills slower, an emitter array does the reverse. An icon set that reads those pairs as opposites is worth more than seventeen unrelated pictures.
Icons P1
64 px SVG plus PNG, in the same flat single-weight language as the commodity set.
| id | Name | Changes | Brief |
|---|---|---|---|
| shield_cap_1 | Deflector Capacitor | shields +, regen − | A charged cell behind a shield arc |
| shield_regen_1 | Emitter Array | regen +, shields − | Radiating emitter fins |
| shield_cap_2 | Heavy Deflector Capacitor | shields ++, regen − | The same cell, doubled and braced |
| plating_1 | Ablative Plating | hull +, thrust − | A bolted armour slab, one corner scarred |
| plating_2 | Composite Plating | hull ++, thrust − | Layered composite in section |
| thruster_1 | Overtuned Injectors | thrust + | An injector assembly with heat bloom |
| gyro_1 | Gyro Stabiliser | handling + | A gimballed rotor |
| burner_tank_1 | Auxiliary Burner Tank | burner ++, thrust − | A strapped-on fuel cylinder |
| cap_booster_1 | Capacitor Booster | capacitor + | A stack of charge cells |
| cap_recharge_1 | Recharge Coupling | recharge + | A coil coupling with flow arrows |
| hold_expander_1 | Hold Expander | cargo +, hull − | A bay with its bulkhead removed |
| hold_expander_2 | Structural Hold Expander | cargo ++, hull −, handling − | The same, with the frame cut away |
| ore_processor_1 | Inline Ore Processor | mining +, capacitor − | A crusher inline with a feed pipe |
| trade_computer_1 | Market Uplink | trade + | A dish over a ledger grid |
| shield_booster_1 | Shield Booster (active) | shield +8%/s while on | The shield arc with a pump arrow feeding it |
| hull_repairer_1 | Hull Repair Unit (active) | hull +2.5%/s while on | A patch over a crack, with a nanite dot pattern |
| overcharger_1 | Weapon Overcharger (active) | damage +30%, recharge −20% while on | A bolt with a lightning flare at the muzzle |
| cloak_1 | Cloaking Device (active) | hides the ship from others while on | An eye half-closed behind a refraction ripple |
The three active modules also want four states on the HUD (off, on, hot, burnt out). One icon plus a tinted frame is enough.
Hull attachments P2
Five of the fourteen are plausibly visible from outside, and a ship that looks fitted is most of what makes fitting satisfying: the two plating modules as bolted plates sitting proud of the flanks in the hull's livery, the burner tank as an external cylinder near the engines, and the hold expanders as visibly larger cargo bays or an extra clamped container. Each is a small separate mesh attaching at the rig or thruster offsets in §05. The rest stay internal and need no geometry.
Mount markers P2
Empty mounts should be visible at close range: a capped socket, a blanking plate, an unarmed pylon. It is what tells a pilot looking at their own ship that there is somewhere left to put something.
08Visual effects
| Effect | Pri | Brief |
|---|---|---|
| Engine glow | P0 | Emissive cone at each thruster, #66B2FF, scaling with throttle from a dim idle to a hard bloom. Attaches to the named thruster nodes |
| Afterburner | P0 | Plume doubles and shifts white-hot, adding a heat-shimmer trail. It runs on a fuel budget, so it is intermittent — it has to look right flickering on and off |
| Engine kill | P1 | All plumes cut to nothing while the ship keeps its velocity. This is the Freelancer move, and the visual is the absence of thrust at speed |
| Cruise charge | P0 | A five-second spool-up: rings of light converging on the hull, building to a flash. Must be readable by other players — a ship about to escape is a ship to shoot now |
| Cruise trail | P0 | At 320 m/s: a long bright streak with compressed-light distortion at the nose |
| Cruise disrupted | P1 | The spool-up shatters — rings break apart, a violet EMP crawl, plumes drop back. This is the moment piracy works and it must be unmistakable |
| Ship explosion | P0 | Two stages: an internal flash through the hull seams, then a full break-up with tumbling debris. About 1.5 s |
| Mining beam | P1 | A continuous beam from each mining hardpoint to a point on an asteroid, with ore chips and dust spalling off and drifting toward the ship |
| Jump flash | P1 | The gate ring floods with light, the ship stretches toward it and is gone. The jump is instantaneous in the simulation, so the effect is all there is |
| Docking approach | P2 | Bay-mouth strobes, and a guide-light sequence once a pilot is inside docking range |
| Loot beacon | P1 | A slow strobe on the container, visible at 2 km |
| Damage smoke | P2 | Trailing smoke and intermittent sparks below 40% hull |
| Field dust | P2 | Drifting particulate inside asteroid fields, parallaxing against the dark |
09Interface
The HUD is currently monospaced text in five panels. It works and it is readable; what it lacks is anything drawn.
Reticle and markers P0
| id | Brief |
|---|---|
| reticle | The aiming crosshair the ship turns toward. A light open circle with four ticks; must not obscure what is behind it. #8CF2B2 |
| lead_marker | Where to aim so a bolt and the target arrive together. A diamond in #FF735A, deliberately unlike the reticle — confusing the two is confusing "where I am pointing" with "where I should point" |
| target_bracket | Corner brackets around a locked target, scaling with its screen size |
| contact_pip | Off-screen contact indicator: a chevron at the screen edge pointing toward it |
Panels, bars and the navmap P1
Five panels — net diagnostics top left, flight bottom left, station centre while docked,
contacts right, chat bottom. They need a frame that reads as a cockpit display without
eating space: a thin bevelled border, a slightly darkened translucent backing, a corner
notch. Two variants, HUD green #9EDBB8 and station amber
#EBD69E.
Shield, hull, weapon energy, afterburner fuel, throttle, cruise charge and training
progress are all fraction bars, currently drawn as [==== ].
One segmented bar graphic with a filled and an empty state, tintable per use.
The navmap is ASCII today. It needs a system node (a circle with a name label, plus a "you are here" variant), a jump link line, a route highlight, and a system detail card listing bases. Two systems now; designed for dozens.
10Icons
All flat, single-weight, legible at 24 px. Supply SVG plus 64 px PNG.
Commodities P1
The category should be readable from the shape language: Raw rough and irregular, Refined geometric, Manufactured mechanical, Consumable rounded.
| id | Name | Category | Brief |
|---|---|---|---|
| water | Water | Raw | A sealed drum with a droplet |
| oxygen | Oxygen | Consumable | A pressure cylinder with a valve |
| food | Foodstuffs | Consumable | A stacked ration crate |
| iron_ore | Iron Ore | Raw | Rough ore chunks with visible veining |
| alloys | Structural Alloys | Refined | Stacked ingots, or a girder section |
| consumer_goods | Consumer Goods | Manufactured | A sealed retail crate with a barcode |
| machinery | Heavy Machinery | Manufactured | A gear and piston assembly |
| luxury_goods | Luxury Goods | Manufactured | An ornate sealed case |
Contacts P0
Four, and these carry real information in a fight: Player a neutral chevron, Pirate a red angular hostile mark, Police a blue shield, Trader an amber cargo chevron. They must be distinguishable by shape, not only by colour.
Services, skills and damage types P1 P2
Eight station services (P1): bar, trader, ship dealer, equipment dealer, repair, refinery, manufacturing, market orders — a glass, a scale, a hull silhouette, a wrench-and-module, a welding spark, a distillation stack, a press, a candlestick chart.
Twelve skill effects (P2) for the training screen's effect column: cargo, shields, hull, damage, thrust, handling, mining, refining, production, trade, research (a flask), invention (a lit bulb over a blueprint).
Four damage types (P2): Energy a bolt, Kinetic an impact star, Explosive a burst, EMP a waveform.
11Audio
Positional sources mono, music and ambience stereo. Loop cleanly where marked.
Ship P0
| id | Loop | Brief |
|---|---|---|
| engine_light | yes | Kestrel drive: a high clean hum, pitch and volume following throttle |
| engine_heavy | yes | Bulwark: lower, with a mechanical undertone |
| engine_freight | yes | Hauler: a deep industrial rumble, slow to spool |
| afterburner | yes | A hard roar over the engine, with an ignition transient |
| engine_kill | no | The sound of everything stopping: a descending whine into near-silence, leaving hull creak |
| cruise_charge | no | Five seconds of rising harmonic tension resolving into a bass thump |
| cruise_loop | yes | A sustained high-speed drone |
| cruise_break | no | The disruptor hit: the drone collapses with an electrical crack |
Weapons, impacts and interface P0 P1
One fire sound each for the six projectile weapons plus a looping mining beam. Lasers short and electric; the cannon a heavy percussive thump; the disruptor a wet electrical warble that sounds obviously unlike a gun.
Impacts: hit_shield a resonant absorbed thud, hit_hull metal-on-metal penetration, plus per-damage-type variants, explosion_small, explosion_large and debris.
World and interface (P1): dock_granted, dock_clamp, undock_launch, jump_engage, jump_arrive, loot_scoop, mining_impact, trade_confirm, trade_refused, skill_complete — a small satisfying chime, because this fires when something trained while you were away — and the four UI clicks.
Ambience and music P2
Five ambiences: high-security space (calm, distant traffic chatter, a low tonal bed), low-security (sparser, colder, irregular unexplained noises), asteroid field (pebble impacts on the hull, dust hiss), station interior (ventilation, machinery, muffled voices), and the bar (conversation, glasses, a bad jukebox).
Music is orchestral-electronic in Freelancer's register: melodic, unhurried, never busy. Loop cleanly and leave silence — this is a game people play for hours.
| id | Length | Brief |
|---|---|---|
| mus_exploration | 3–4 min | The default flight theme. Spacious, wistful, mostly quiet |
| mus_combat | 2 min | Percussive and driving, layered so it can enter mid-phrase |
| mus_station | 3 min | Warm, safe, slightly bureaucratic |
| mus_bar | 2 min | Diegetic: source music, worse speakers, a different genre |
| mus_lowsec | 3 min | Kessler Gap. Sparse and unresolved — it should not feel safe |
| mus_title | 2 min | The theme, and the one that has to be good |
12Typography
The HUD is monospaced by design: the columns line up and the panels are tables. Bevy's bundled font has no em dash and no box-drawing characters — every on-screen string in this codebase is plain ASCII, and there are tests asserting it.
Needed: one monospaced family with a technical, slightly condensed feel,
in Regular and Bold, covering Latin-1 plus arrows and block-drawing
(─ │ ┌ ┐ └ ┘ █ ▓ ▒ ░ ← → ↑ ↓). Supplying those would let the panel frames be
drawn in text and the ASCII-only tests be relaxed. A second, proportional family for
headings and station signage would help, but is P2.
13Manifest
A first pass, in build order. Ticks are kept in this browser.
P0 The game is incomplete without these
P1 It reads as unfinished without these
P2 Polish
14Deliberately not here
Nothing should be generated for a system that cannot show it yet.
- Mine-layer hardware.
HardpointKind::Mineexists in the model and no hull declares one — the content loader now refuses a mount nothing can fill, so this stays empty until there is a module. - Capital ships, gunboats, cruisers, transports.
HullClasslists them; no content defines one. - Player structures. Deferred to sovereignty.
- Jump holes. Hidden gates exist in the model and are filtered out of what the client is told; nothing discovers them yet.
- Character portraits. Three named characters: Ilse Varga (Traders Guild dispatcher, Halden), Captain Imre Hask (Compact Wardens) and Sabe Ronn (keeper of the Cinder Clans' stores, Cinder Hold). There is nowhere to show a portrait yet; the bar is text.