About This Page
The full gameplay balance dossier — every combat number in the
game in one place, mirroring BALANCE.md — so a
design question like "is Blaster stronger than Laser" has one
authoritative, up-to-date answer instead of scattered code comments.
For TWIN STRIKE's development history, see the
Changelog.
All balance damage-per-second figures below assume sustained fire with every shot connecting — no dodging, no downtime between volleys — a design tool for comparing weapons and enemies, not a guarantee of real in-run numbers.
Balance & Stats Reference
Every combat number in the game, in one place: the player ship and
its four weapon types, pickups and the smart bomb, the four
energy-weapon charge tiers, all nine regular enemy tiers, the Boss
and Big Boss escalation curves, and the run-length pacing model that
ties it all together. Generated straight from the project's own
source (scripts/) and BALANCE.md — every
figure below should match what actually ships.
Player Ship
Source: scripts/player.gd
A single interceptor with two independent emitters (left/right half), both always firing the same equipped weapon simultaneously. During every boss fight the ship splits into two independently-steered halves; outside boss fights it flies as one body.
| Property | Value | Notes |
|---|---|---|
| Max health | 1000.0 | Full pool; a HEALTH pickup restores 50% of it (see Pickups below). |
| Ram/push-out radius | 0.40 | player_collision_radius — used for the continuous push-out against bosses, deliberately smaller than the hull's actual visual width. |
| Pickup collection radius | 1.20 | PICKUP_HIT_RADIUS — either half-disc counts while split. |
Player Weapons
Source: scripts/player.gd, scripts/weapon_base.gd, scenes/weapons/*.tscn
- Both emitters always fire the same weapon at once — total ship DPS is 2x a single emitter's DPS.
- Blaster, Laser and Spread share one global damage level (from
DAMAGE_UPpickups):DAMAGE_LEVEL_BONUS_PERCENT = 0.15per level. Torpedoes (0.20/level) and the four energy-weapon tiers (0.10/level) each scale at their own, different rate. - Level 1 = base weapon, no pickups; Level 10 = 9
DAMAGE_UPpickups collected. - Torpedoes are manually triggered — 2 tubes, independent 20s cooldowns each, so max sustained rate is one launch per 10s if fired the instant each tube is ready. Each fired torpedo also homes for up to 20s before despawning if it never connects (up from 8s) — the same max life as the two homing-missile types below.
- Rapid Fire doubles fire rate (not tied to weapon level) for Blaster/Laser/Spread only — torpedoes are cooldown-gated and unaffected.
Base stats (per emitter, level 1)
| Weapon | Dmg/shot | Fire rate | Projectiles |
|---|---|---|---|
| Blaster | 20.0 | 4.0/sec | 1 |
| Laser | 5.0 | 12.0/sec | 1 |
| Spread | 10.0 | 2.5/sec | 3 |
| Torpedo | 420.0 | 1 per 20s | 1 |
Ship DPS by level (both emitters, normal fire vs. Rapid Fire)
| Level | Blaster DPS | +RF | Laser DPS | +RF | Spread DPS | +RF |
|---|---|---|---|---|---|---|
| 1 | 160.0 | 320.0 | 120.0 | 240.0 | 150.0 | 300.0 |
| 2 | 184.0 | 368.0 | 138.0 | 276.0 | 172.5 | 345.0 |
| 3 | 208.0 | 416.0 | 156.0 | 312.0 | 195.0 | 390.0 |
| 4 | 232.0 | 464.0 | 174.0 | 348.0 | 217.5 | 435.0 |
| 5 | 256.0 | 512.0 | 192.0 | 384.0 | 240.0 | 480.0 |
| 6 | 280.0 | 560.0 | 210.0 | 420.0 | 262.5 | 525.0 |
| 7 | 304.0 | 608.0 | 228.0 | 456.0 | 285.0 | 570.0 |
| 8 | 328.0 | 656.0 | 246.0 | 492.0 | 307.5 | 615.0 |
| 9 | 352.0 | 704.0 | 264.0 | 528.0 | 330.0 | 660.0 |
| 10 | 376.0 | 752.0 | 282.0 | 564.0 | 352.5 | 705.0 |
Torpedoes (own 0.20/level scaling, max 1 launch/10s)
| Level | Damage | DPS |
|---|---|---|
| 1 | 420.00 | 42.0 |
| 2 | 504.00 | 50.4 |
| 3 | 588.00 | 58.8 |
| 4 | 672.00 | 67.2 |
| 5 | 756.00 | 75.6 |
| 6 | 840.00 | 84.0 |
| 7 | 924.00 | 92.4 |
| 8 | 1008.00 | 100.8 |
| 9 | 1092.00 | 109.2 |
| 10 | 1176.00 | 117.6 |
Weapon Pickups
Source: scripts/weapon_pickup.gd, scripts/main_game.gd, scripts/player.gd
Enemies drop one pickup on death, its type chosen uniformly at random from 4 kinds. The player collects it by flying within 1.2 units (either half-disc while split).
| Type | Letter | Color | Effect |
|---|---|---|---|
| HEALTH | H | green | Heals 50% of max health, instant, one-off. |
| SHIELD | S | blue | Full damage immunity for 15s — stacks by extending remaining time, not resetting it. Blocks bullet damage and boss body-slam collisions entirely. |
| RAPID_FIRE | R | yellow | 2x fire rate on Blaster/Laser/Spread for 15s (stacks). Torpedoes and the smart bomb are unaffected. |
| DAMAGE_UP | W | magenta | +15% damage, permanent, all weapons — feeds the global damage-level tables above. |
Mutating a pickup into the smart bomb
Shooting an uncollected pickup doesn't destroy it — every 3 hits it
cycles to the next type (H → S → R → W → H…). After 12
such 3-hit cycles (36 total bullet hits), instead of mutating again
the pickup turns into the smart bomb.
Smart Bomb
Source: scripts/weapon_pickup.gd, scripts/smart_bomb_shockwave.gd
Once triggered, the pickup flashes white/red, flies to screen center at the player's height, and detonates after a 0.5s fuse. On detonation:
- Screen clear — every enemy projectile on screen is destroyed instantly.
- Fire suppression — any Boss/Big Boss on screen has its fire suppressed for 2.0s.
- Missile burst — 12 homing missiles fire radially (30° apart), each dealing 200.0 base damage scaled by the player's current damage level at 10%/level (same rate as Energy Weapons below) — 200/missile at level 1, up to 380/missile at level 10. Speed 13.75, turn rate 4.0, 20s lifetime; each missile despawns on its first hit.
- Shockwave ring — purely cosmetic, no damage of its own.
Energy Weapons (Charge Tiers)
Source: scripts/player.gd, scripts/yonshakudama.gd
Holding suppress-fire builds a charge meter at 10%/sec (0→100% in 10s). Releasing fires whichever of 4 tier thresholds the charge had reached — highest tier wins, not cumulative — and always starts a fixed decay back to 0 over 30s, during which the meter can't rebuild. All four tiers scale with the player's damage level at their own 10%/level rate (distinct from the 15%/20% rates above).
| Tier | Charge | Weapon | Payload (base, level 1) |
|---|---|---|---|
| 1 | 25% | Bullet Fan | 25 bullets total, split across both crosshairs, 30° total spread (±15° per side), 32 dmg/bullet, speed 16 → 800 dmg if every bullet connects. |
| 2 | 50% | Plasma Beams | 2 instant hitscan beams (one per crosshair), 666 dmg each, 25-unit range, 0.7 wide — resolved instantly, not a travelling projectile → 1,332 dmg. |
| 3 | 75% | Homing Missiles | 2 missiles, 0.5s apart, 100 dmg each, speed 13.75, 20s lifetime, up to 10 re-targets each (survives past its first kill, unlike the smart bomb's) → 200 dmg. |
| 4 | 100% | Yonshakudama | Fireball flies 2.5s to ~25% down from the top, bursts into 250 bullets in a golden-angle spiral, 10 dmg each, speed 20 → 2,500 dmg. |
Enemies — Regular
Source: scripts/enemy.gd, scripts/main_game.gd (_ENEMY_TIERS, _roll_squad_tier(), _LEVEL_TIER_WEIGHTS)
Nine regular-enemy tiers, unlocked progressively across the 12-wave
campaign (see docs/enemy-tier-level-distribution.md for
the full per-level unlock schedule). The type is rolled once per
squad, not per enemy.
Base stats (wave 1, health_multiplier = 1.0)
| Enemy | Score | Diff | Move | Shoot | HP | Interval(s) | Avg DPS | Coll. r. | Visual ht. | Destructible |
|---|---|---|---|---|---|---|---|---|---|---|
| Enemy 01* | 50 | 2 | ARC | AIMED | 4 | 0.50–0.75 | 16.0 | 0.63 | 1.22 | yes (1.5x) |
| Enemy 02 | 100 | 3 | SINE | SINGLE | 6 | 0.50–0.75 | 16.0 | 0.75 | 1.05 | no |
| Enemy 03 | 150 | 3 | WEAVE | ALTERNATING | 7 | 0.75–1.25 | 10.0 | 0.73 | 0.95 | no |
| Enemy 04 | 300 | 6 | STRAIGHT | SPREAD | 40 | 1.25–1.75 | 16.0 | 0.82 | 1.84 | no |
| Enemy 05 | 200 | 3 | KAMIKAZE | NONE | 12 | n/a | 0.0 | 0.60 | 1.22 | no |
| Enemy 06 | 250 | 4 | SINE | ALTERNATING | 10 | 0.70–1.00 | 11.76 | 0.69 | 1.05 | no |
| Enemy 07 | 350 | 6 | STRAIGHT | SPREAD | 14 | 1.00–1.40 | 20.0 | 0.69 | 0.95 | no |
| Enemy 08* | 400 | 6 | STRAIGHT | AIMED | 34 | 1.30–1.75 | 6.56 | 0.76 | 1.38 | yes (2.0x) |
| Enemy 09 | 450 | 7 | SPIRAL | SWEEP | 24 | 0.60–0.90 | 12.0 | 0.81 | 1.50 | no |
* fires destructible bullets — see
below; its listed DPS is a nominal ceiling only reached if none of
its shots are intercepted. "Coll. r." is the hitbox radius used for
all player-bullet/ram checks; "Visual ht." is the rendered hull's own
world-space AABB height. The two are tuned independently — several
tiers deliberately carry a hitbox smaller than their hull (grazing
forgiveness). "Difficulty" is a qualitative 1–10 rating (HP, Avg DPS,
speed, move/shoot-pattern predictability, discounted for destructible
tiers) that Score is derived from: tiers are ranked by difficulty
(ties broken by the prior score order) and Score = 50 × rank.
See BALANCE.md's "Difficulty rating & score
derivation" for the full derivation and the rule for re-deriving
Score if a difficulty rating ever changes.
Kamikaze tier (Enemy 05)
Enemy 05 (2026-09-10, experimental, still being playtested/tuned) is
the only tier with no ranged attack at all — shoot_min/
shoot_max are both 0.0, so it never fires a
shot of any pattern. Its threat is pure movement instead:
MovePattern.KAMIKAZE homes on the player's live position
(both axes, not a fixed lane) until it reaches mid-screen, then locks
its lane and dives straight down, surging to double its speed, so a player who
moves clear of that lane escapes it (a dodged kamikaze costs nothing).
Its speed climbs every frame, uncapped. Current tuning: speed
1.0–1.2 at spawn, accelerating at 1.8/s² — treat
these as first-pass numbers likely to move again. Its only damage source is the same ram/collision mechanic
every regular enemy already has — it just becomes the tier's
entire threat instead of a secondary one layered under gunfire.
Destructible bullets (Enemy 01, 08)
Enemy fire is normally un-interceptable — strafing, not shooting, is the counter to it. Two tiers are the exception: their shot can be shot out of the air, and the interception pierces through (clearing every destructible bullet it overlaps, still landing on the shooter behind it, at no cost to the player's shot). Enemy 05 used to be the third destructible tier here but fires nothing at all as of 2026-09-10 — see Kamikaze tier above.
| Property | Non-destructible tiers | Enemy 01 / 08 |
|---|---|---|
| Shootable | no | yes — and the shot pierces |
| Bullet radius | 0.1125 | 0.16875 (01) / 0.225 (08) |
| Size scale | 1.0x | 1.5x (01) / 2.0x (08) |
| Color cycle | fixed, matches body | 01 yellow→red, 08 icy blue→orange, 0.5s |
| Score per kill | n/a | 5 per bullet shot down |
Per-shot damage and volley size are not wave-scaled for any tier — only HP and move speed grow with wave, so later waves are harder purely because enemies soak more hits and close distance faster, not because their guns get stronger (Enemy 05 is the exception — it has no guns at all; its danger instead grows with its own acceleration over the course of its approach, independent of wave).
HP by wave — health_multiplier(wave) = 1 + (wave − 1) × 0.16
| Enemy | W1 | W2 | W3 | W4 | W5 | W6 | W7 | W8 | W9 | W10 | W11 | W12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 01 | 4.0 | 4.6 | 5.3 | 5.9 | 6.6 | 7.2 | 7.8 | 8.5 | 9.1 | 9.8 | 10.4 | 11.0 |
| 02 | 6.0 | 7.0 | 7.9 | 8.9 | 9.8 | 10.8 | 11.8 | 12.7 | 13.7 | 14.6 | 15.6 | 16.6 |
| 03 | 7.0 | 8.1 | 9.2 | 10.4 | 11.5 | 12.6 | 13.7 | 14.8 | 16.0 | 17.1 | 18.2 | 19.3 |
| 04 | 40.0 | 46.4 | 52.8 | 59.2 | 65.6 | 72.0 | 78.4 | 84.8 | 91.2 | 97.6 | 104.0 | 110.4 |
| 05 | 12.0 | 13.9 | 15.8 | 17.8 | 19.7 | 21.6 | 23.5 | 25.4 | 27.4 | 29.3 | 31.2 | 33.1 |
| 06 | 10.0 | 11.6 | 13.2 | 14.8 | 16.4 | 18.0 | 19.6 | 21.2 | 22.8 | 24.4 | 26.0 | 27.6 |
| 07 | 14.0 | 16.2 | 18.5 | 20.7 | 23.0 | 25.2 | 27.4 | 29.7 | 31.9 | 34.2 | 36.4 | 38.6 |
| 08 | 34.0 | 39.4 | 44.9 | 50.3 | 55.8 | 61.2 | 66.6 | 72.1 | 77.5 | 83.0 | 88.4 | 93.8 |
| 09 | 24.0 | 27.8 | 31.7 | 35.5 | 39.4 | 43.2 | 47.0 | 50.9 | 54.7 | 58.6 | 62.4 | 66.2 |
Average DPS across all 9 tiers, unaffected by wave, ≈ 13.5. Move speed scales separately: speed_multiplier(wave) = 1 + (wave − 1) × 0.12 — 1.0x at wave 1 up to 2.32x at wave 12.
Boss
Source: scripts/boss.gd
Spawns at the end of every wave that isn't a Big Boss wave (1, 2, 4, 5, 7, 8, 10). Attacks escalate through 3 phases keyed off remaining HP (phase 2 at ≤50%, phase 3 at ≤25%). A separate player-tracking burst attack runs independently from phase 1.
| Phase | HP left | Main fire (dmg/volley) | Interval | Burst (indep.) | Total DPS* |
|---|---|---|---|---|---|
| 1 | >50% | Spread(6×8=48) + Ring(12×8=96) = 144 | 1.50s | 3×11=33/2.20s | 111.0 |
| 2 | 25–50% | + alt. Aimed(4×10=40)/Cross(8×9=72) | 1.125s | 3×11=33/1.65s | 197.8 |
| 3 | ≤25% | (same volleys, faster) | 0.825s | 3×11=33/1.21s | 269.7 |
* Theoretical max, every bullet connecting; phase 2/3 uses the Aimed/Cross average since they alternate each shot.
HP by wave — wave_health(w) = 1800 + 1400 × w
| Wave | 1 | 2 | 4 | 5 | 7 | 8 | 10 |
|---|---|---|---|---|---|---|---|
| HP | 3,200 | 4,600 | 7,400 | 8,800 | 11,600 | 13,000 | 15,800 |
Big Boss
Source: scripts/big_boss.gd
Spawns instead of the regular Boss on waves 3, 6, 9, 11 and 12. Waves 3/6/9/11 are Boss 03B/06B/09B/11B; wave 12 is Boss 12F (Final Boss) — same 3-phase shape as Boss but larger volleys, an extra phase-3 Spiral pattern, and (Final only) one extra burst shot.
| Phase | HP left | Main fire (dmg/volley) | Interval | Burst (non-final) | Total (non-fnl) | Total (Final) |
|---|---|---|---|---|---|---|
| 1 | >50% | Spread(10×12=120)+Ring(16×10=160)=280 | 2.00s | 4×14=56/2.50s | 162.4 | 168.0 |
| 2 | 25–50% | + alt. Aimed(2×15=30)/Cross(8×11=88) | 1.30s | 4×14=56/1.625s | 295.3 | 303.9 |
| 3 | ≤25% | + Spiral(12×9=108), always | 0.90s | 4×14=56/1.125s | 546.5 | 558.9 |
Final Boss fires 5 burst shots instead of 4 (5×14=70), same intervals — main fire is otherwise identical.
HP — wave_health(index, is_final) = is_final ? 96,000 : 9,600 + 3,200 × index
| Wave | Index | HP | Encounter |
|---|---|---|---|
| 3 | 1 | 12,800 | Boss 03B |
| 6 | 2 | 16,000 | Boss 06B |
| 9 | 3 | 19,200 | Boss 09B |
| 11 | 4 | 22,400 | Boss 11B |
| 12 | — | 96,000 | Boss 12F (Final) |
Boss & Big Boss Size Reference
Source: scripts/boss_roster.gd — one hand-tuned entry per wave
Every wave's boss fight uses its own hand-tuned hitbox, independent of the shared Boss/BigBoss attack patterns above.
| Wave | Name | Kind | Coll. radius (x) | Coll. radius (y) | Ram radius (x) | Ram radius (y) |
|---|---|---|---|---|---|---|
| 1 | Boss 01 | Boss | 2.00 | — | 2.91 | 3.67 |
| 2 | Boss 02 | Boss | 1.90 | — | 2.96 | 3.69 |
| 3 | Boss 03B | Big Boss | 2.83 | 2.82 | 4.18 | 4.19 |
| 4 | Boss 04 | Boss | 2.05 | — | 2.96 | 3.67 |
| 5 | Boss 05 | Boss | 2.04 | — | 2.98 | 3.68 |
| 6 | Boss 06B | Big Boss | 2.76 | 2.76 | 4.18 | 4.17 |
| 7 | Boss 07 | Boss | 1.90 | — | 2.96 | 3.68 |
| 8 | Boss 08 | Boss | 1.99 | — | 2.96 | 3.68 |
| 9 | Boss 09B | Big Boss | 2.75 | 2.75 | 4.18 | 4.18 |
| 10 | Boss 10 | Boss | 2.09 | — | 2.96 | 3.68 |
| 11 | Boss 11B | Big Boss | 2.75 | 2.75 | 4.18 | 4.18 |
| 12 | Boss 12F | Final | 1.92 | 2.50 | 3.18 | 3.97 |
"Coll. radius (y)" only applies to Big Boss/Final entries (an
elliptical hitbox — Boss entries are circular, x-radius only). "Ram
radius" is the player-facing push-out/ram-collision boundary, tuned
independently per axis (imported from ShipGallery's collision panel
— see docs/import/all_ships.json); waves 9 and 11 give
no explicit y value, so their ram boundary stays circular at the x
radius shown. Every entry's ram radius is now bigger than that same
boss's own hull collision radius, on both axes — the push-out
boundary sits visibly outside the rendered silhouette rather than
hugging it, acting as a force field around the boss. As of
2026-09-11 that field is no longer an invisible boundary in actual
gameplay: a faint pulsing aura now renders at its edge, flaring
brighter right where the player's ship makes contact. Touching it
knocks the ship (or split half) away over a 0.5s window and costs
10% of max health (down from 25%) — see the Downstream TODO's "Boss
Ram Radius as a Visible Force Field" entry below for what's still
open (bullet-vs-field feedback, health-gated deactivation).
Player DPS vs. Enemy Scaling
A rough at-a-glance comparison: player Ship DPS (using Laser's numbers as the conservative floor — Blaster and Spread both run higher, see the Weapons table above) against that wave's Boss/Big Boss HP, assuming weapon level tracks the wave number. TTK ignores dodging, downtime, and any Rapid Fire/energy-weapon/smart-bomb burst layered on top.
| Wave | Level | Ship DPS | Kind | Boss HP | TTK (sec) |
|---|---|---|---|---|---|
| 1 | 1 | 120.0 | Boss | 3,200 | 26.7 |
| 2 | 2 | 138.0 | Boss | 4,600 | 33.3 |
| 3 | 3 | 156.0 | BIG | 12,800 | 82.1 |
| 4 | 4 | 174.0 | Boss | 7,400 | 42.5 |
| 5 | 5 | 192.0 | Boss | 8,800 | 45.8 |
| 6 | 6 | 210.0 | BIG | 16,000 | 76.2 |
| 7 | 7 | 228.0 | Boss | 11,600 | 50.9 |
| 8 | 8 | 246.0 | Boss | 13,000 | 52.8 |
| 9 | 9 | 264.0 | BIG | 19,200 | 72.7 |
| 10 | 10 | 282.0 | Boss | 15,800 | 56.0 |
| 11 | 11 | 300.0 | BIG | 22,400 | 74.7 |
| 12 | 12 | 318.0 | FINAL | 96,000 | 301.9 |
Run Length Budget
The wave curves above are tuned against a target of 20-25 minutes per full run.
| Segment | Model time |
|---|---|
| Spawn phases (12 waves) | 487 s |
| Boss announce overhead (12×6) | 72 s |
| Regular Bosses (7) | 308 s |
| Big Bosses (4) | 306 s |
| Final Boss | 302 s |
| Total | 1,475 s (24.6 min) |
Calibration: the old 10-wave run modelled at 1,374s and played in about 20 real minutes (≈0.87x the model), so the 12-wave run above projects to ~21.5 real minutes. Treat the model as a design tool, not a measurement — a timed playtest is the real gate.
Difficulty — Pro/Noob
Source: scripts/difficulty_settings.gd, scripts/boss.gd, scripts/player.gd, scripts/main_game.gd
Persisted player choice, selectable from a DIFFICULTY row in Settings and shown live in the HUD ("MODE: PRO"/"MODE: NOOB"). Pro is today's balance — every number elsewhere on this page. Noob applies a single flat multiplier (0.75x) across the board:
| Scaled on Noob (0.75x) | Unaffected |
|---|---|
| Enemy/Boss/Big Boss health | Player weapon damage/fire rate |
| Enemy-caused player damage (hits, ram) | Kill-streak multiplier (stacks on top) |
| Score per kill (before kill-streak) | Wave/spawn timing, run length |
Noob runs skip the online toplist submission offer entirely — only Normal/Pro runs are meaningful to compare on the shared leaderboard. The choice is stamped into GameRun.difficulty and recorded on every replay.
Downstream TODO
What's actually queued up next, and what's blocking it — mirrors TODO.md, not exhaustive.
Blocked on the visual theme & art direction decision
Every current sprite is a throwaway 2D placeholder; a 3D artist is now available to build real geometry, and the candidate directions live in the art-direction dossier. Until a direction is picked, these wait:
scripts/boss_roster.gd.
BossRoster.ENTRIES currently carries neutral placeholders ("Boss 01", "Boss 03B", …), and nothing renders them anyway: the announce banner still just says BOSS / THE BIG BOSS / FINAL BOSS APPROACHING. Real names get picked once the theme lands, then wiring them into that banner is a small, self-contained follow-up.
Not blocked — ready to scope now
- Player ship VFX follow-ups — done (2026-09-10), since revised: the per-disc engine exhaust particle stream shipped in 0.3.7 but is disabled as of 2026-09-11 in favor of a retro CRT-style motion-blur trail (faded "ghost" afterimages of each hull half, driven by that half's own speed) tried in its place. Detonations (Yonshakudama, smart bomb) and, as of 2026-09-11, non-final boss deaths all trigger camera screen shake, deliberately not routine hits. A separate, still-open idea: a smaller shake specifically on hits.
- Weapon & pickup progression — letting the player choose which slot's aim a rotate affects, if independent per-slot loadouts are ever wanted. (Per-weapon-type damage upgrades were considered and discarded as unnecessary complexity — the single global
DAMAGE_UPlevel is simpler to balance.) - Scoring & fairness/QoL — combo/streak scoring done (2026-09-12): kill streak scales score up to 2x (+10% every 5 kills), resets on any unshielded hit with no decay timer, and pops a HUD banner at each milestone. Pause overlay resume/quit hints and a Pro/Noob difficulty select are both done (2026-09-17) — see the Changelog. Still open: no post-hit invincibility frames (considered and shelved 2026-09-17 — no concrete playtesting case for it yet).
- Enemy-type variety across waves — done (2026-09-10): per-wave tier variety was already in via
_roll_squad_tier()'s per-level weight table across all 9 tiers (seedocs/enemy-tier-level-distribution.md), and the remaining gap — no tier sought or charged the player — is closed too: Enemy 05 now usesMovePattern.KAMIKAZE, homing on the player and accelerating from a slow start until it hits or is destroyed, firing no bullets at all. Still experimental/being playtested — seeBALANCE.md's "Kamikaze tier (Enemy 05)". gdlintrcbaseline — kept at exactly one accepted error (audio_manager.gd:30); re-rungdlint scripts/ tests/before committing so it doesn't drift again.
Bigger, further out
Discord Rich Presence, console platform-holder applications (Xbox/PS5/Switch), anti-cheat/score-tampering protection, and the full game-balance pass — the last of these is explicitly deferred until enemy variety, boss attack sets, and weapon progression above have landed, so there's a stable full run to tune against.