Ship Star-Tier XP Curve
Each ship hull progresses through five star tiers by accumulating duplicate pulls. One duplicate pull of the same hull grants 1 XP. The curve is defined by STAR_XP_THRESHOLDS and is intentionally back-loaded — early stars come fast, S5 is the long tail.
Curve
STAR_XP_THRESHOLDS = [0, 0, 1, 3, 7, 17] (index 0 unused; indices 1-5 = stars 1-5).
| Star | Cumulative XP | Dupes from previous | Total pulls to reach |
|---|---|---|---|
| S1 | 0 | — | 1 (the first pull) |
| S2 | 1 | 1 | 2 |
| S3 | 3 | 2 | 4 |
| S4 | 7 | 4 | 8 |
| S5 | 17 | 10 | 18 |
Reaching S5 requires 17 duplicates after the first pull, i.e. 18 total pulls of the same hull.
Per the prompt framing: 1 dupe to S1, 1 to S2, 3 to S3, 7 to S4, 17 to S5 (cumulative dupes). Total: 18 pulls to S5.
What stars unlock
Stars unlock mod-backpack grid space, NOT stat scaling. Base ship stats do not change with star level — only the grid that holds installed mods grows. This keeps power gains gated by mod acquisition and fit, not raw star count.
Grid dimensions per star (from GRID_DIMS_BY_STAR):
| Star | Grid (cols × rows) | Cells |
|---|---|---|
| S1 | 3 × 3 | 9 |
| S2 | 4 × 3 | 12 |
| S3 | 4 × 4 | 16 |
| S4 | 5 × 4 | 20 |
| S5 | 5 × 5 | 25 |
Helper functions
starFromXp(xp)— returns current star (1-5) from cumulative XP. Throws on negative XP.xpToNextStar(xp)— XP remaining to advance one star. Returns 0 at S5 (capped).gridForStar(star)—[cols, rows]for a given star level. Throws out of range.