Drag curve shapes
What this is
dragCurve is a per-hull enum on every ship def that tunes how velocity decays when the player releases thrust. The physics tick computes a base decay factor dragArg = 1 - ship.drag * DRAG_BASE, then warps it as a function of the current speed normalised against maxSpeed (speedNorm in 0..1). The four named shapes pick different warps, producing recognisable driving feels: space-drag, boat-coast, arcade brake, and heavy-cargo plant. dragCurve is independent from accelCurve so any acceleration feel can mix with any deceleration feel. The default for any hull without an override is exponential.
A fifth value, overshoot, is also accepted by the type and handled in the physics tick (drag weakens below ~25% of max speed for a hovercraft-glide feel), but no current hull in the roster uses it.
The four curve shapes
How each shape warps baseDragArg and what it feels like under the stick:
| Curve | Warp applied | Brake behaviour over speed range | Driving feel |
|---|---|---|---|
exponential | dragArg = baseDragArg (unwarped — the default) | Same fractional decay each frame; absolute deceleration is largest at high speed and tapers smoothly as the ship slows | Space drag — coasts a long tail, never sharply plants |
linear | dragArg = (speed - brakeRate) / speed with brakeRate = drag * DRAG_BASE * 60 * dt | Constant absolute brake rate per frame regardless of speed | Boat-like — a steady slow-down all the way to zero |
front_loaded | dragArg = baseDragArg ^ (0.6 + 1.0 * speedNorm) | Strong brake at high speed (exponent up to 1.6), eases at low speed (exponent down to 0.6) | Arcade car — taps the brake hard when you let go, then drifts the last bit |
back_loaded | dragArg = baseDragArg ^ (0.6 + 1.0 * (1 - speedNorm)) | Weak brake at high speed, strong brake at low speed | Heavy cargo — keeps moving on momentum, then plants firmly near zero |
Constants and formulas above are from engine/physics/movement.ts (drag-and-speed-cap block). DRAG_BASE is the global scalar applied to every ship’s drag field; dt is the per-frame delta time.
Roster distribution
Counts across the 37 hull classes that define a dragCurve override in SHIP_STATS_S1 (no S2-S5 override touches dragCurve, so a hull’s curve does not change with star level):
| Curve | Hull count | Hulls |
|---|---|---|
back_loaded | 19 | Industria_Bigbot, Industria_Caravan, Industria_Digbot, Industria_Drillbot, Industria_Eel, Industria_Loader, Industria_Milita, Industria_Towncar, Junkrats_Orca, Junkrats_Tank, Solaris_Armada, Solaris_Cargo, Solaris_Cruiser, Solaris_Flyer, Solaris_Hauler, Solaris_Oracle, Solaris_Princess, Solaris_Torque, Solaris_Valet |
exponential | 12 | Ancients_Glyph, Ancients_Rune, Backwater_Batwing, Backwater_Caiman, Backwater_Killer Croc, Backwater_Lizard, Junkrats_Bomber, Junkrats_Drifter, Junkrats_Marco, Junkrats_Pierre, Junkrats_Skewer, Junkrats_Stinger |
front_loaded | 6 | Prism_Citrine, Prism_Crystal, Prism_Jade, Prism_Pearl, Prism_Ruby, Prism_Shard |
linear | 0 | — (defined in the type but not used by any current hull) |
overshoot | 0 | — (defined in the type but not used by any current hull) |
Total: 37 hulls.
Per-faction patterns
The six hull-name prefixes in the roster (Ancients, Backwater, Industria, Junkrats, Prism, Solaris) each pick a dominant curve:
| Hull-prefix group | Dominant curve | Hulls in group | Pattern |
|---|---|---|---|
| Ancients | exponential (2 / 2) | Glyph, Rune | Non-rotating hovercraft sweep-platforms; long coasting tail matches their omnidirectional drift feel |
| Backwater | exponential (4 / 4) | Batwing, Caiman, Killer Croc, Lizard | Mid-weight rotating ships; smooth coast suits their aggressive heat-curve fire-and-move kit |
| Industria | back_loaded (8 / 8) | Bigbot, Caravan, Digbot, Drillbot, Eel, Loader, Milita, Towncar | All industrial cargo and bot hulls; coast on momentum then plant — heavy-truck feel |
| Junkrats | exponential (6) and back_loaded (2 — Orca, Tank) | Bomber, Drifter, Marco, Orca, Pierre, Skewer, Stinger, Tank | Mostly fast scrap-ships with space-drag feel; the heaviest two (Orca, Tank) adopt the cargo-style back-loaded brake |
| Prism | front_loaded (6 / 6) | Citrine, Crystal, Jade, Pearl, Ruby, Shard | High-acceleration crystal hulls; the arcade-car front brake checks their high top speeds the moment thrust is released |
| Solaris | back_loaded (9 / 9) | Armada, Cargo, Cruiser, Flyer, Hauler, Oracle, Princess, Torque, Valet | The armoured Solaris fleet; momentum-preserving brake supports their high-armor / mid-speed sustained-pressure role |
Two factions are unanimous on a single curve choice (Industria → back_loaded, Prism → front_loaded, Solaris → back_loaded, plus the smaller Ancients and Backwater on exponential). Junkrats is the only group with a mixed assignment, splitting its eight hulls 6 / 2 between exponential and back_loaded along weight lines.