v0.3.14

Balance & Stats Reference

Twin Strike

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.

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.

01

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.

PropertyValueNotes
Max health1000.0Full pool; a HEALTH pickup restores 50% of it (see Pickups below).
Ram/push-out radius0.40player_collision_radius — used for the continuous push-out against bosses, deliberately smaller than the hull's actual visual width.
Pickup collection radius1.20PICKUP_HIT_RADIUS — either half-disc counts while split.
02

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_UP pickups): DAMAGE_LEVEL_BONUS_PERCENT = 0.15 per 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_UP pickups 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)

WeaponDmg/shotFire rateProjectiles
Blaster20.04.0/sec1
Laser5.012.0/sec1
Spread10.02.5/sec3
Torpedo420.01 per 20s1
The three sustained weapons are not damage-tied to each other: Blaster leads at 160 ship-DPS (level 1), Spread follows at 150, Laser is the floor at 120 — and percentage scaling keeps that same spread all the way to level 10 (376 / 352.5 / 282). Laser's higher fire rate trades total damage for smaller, more frequent hits — better for grazing small targets and shooting down Enemy 01/05/08's destructible bullets.

Ship DPS by level (both emitters, normal fire vs. Rapid Fire)

LevelBlaster DPS+RFLaser DPS+RFSpread DPS+RF
1160.0320.0120.0240.0150.0300.0
2184.0368.0138.0276.0172.5345.0
3208.0416.0156.0312.0195.0390.0
4232.0464.0174.0348.0217.5435.0
5256.0512.0192.0384.0240.0480.0
6280.0560.0210.0420.0262.5525.0
7304.0608.0228.0456.0285.0570.0
8328.0656.0246.0492.0307.5615.0
9352.0704.0264.0528.0330.0660.0
10376.0752.0282.0564.0352.5705.0

Torpedoes (own 0.20/level scaling, max 1 launch/10s)

LevelDamageDPS
1420.0042.0
2504.0050.4
3588.0058.8
4672.0067.2
5756.0075.6
6840.0084.0
7924.0092.4
81008.00100.8
91092.00109.2
101176.00117.6
03

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).

TypeLetterColorEffect
HEALTHHgreenHeals 50% of max health, instant, one-off.
SHIELDSblueFull damage immunity for 15s — stacks by extending remaining time, not resetting it. Blocks bullet damage and boss body-slam collisions entirely.
RAPID_FIRERyellow2x fire rate on Blaster/Laser/Spread for 15s (stacks). Torpedoes and the smart bomb are unaffected.
DAMAGE_UPWmagenta+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.

04

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.
Net burst if every missile connects: 2,400 damage at level 1, scaling up to 4,560 at level 10. An emergency panic button earned entirely through accurate shooting of pickups — no charge meter, no manual trigger key.
05

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).

TierChargeWeaponPayload (base, level 1)
125%Bullet Fan25 bullets total, split across both crosshairs, 30° total spread (±15° per side), 32 dmg/bullet, speed 16 → 800 dmg if every bullet connects.
250%Plasma Beams2 instant hitscan beams (one per crosshair), 666 dmg each, 25-unit range, 0.7 wide — resolved instantly, not a travelling projectile → 1,332 dmg.
375%Homing Missiles2 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.
4100%YonshakudamaFireball 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.
At level 10 (1.90x multiplier) those ceilings become 1,520 / 2,530.8 / 380 / 4,750. Tiers 1–3 fire from each mount along its own crosshair aim; Tier 4 is a single fireball from the ship's position, independent of aim. The raw ceiling isn't a strict "best tier" ordering — Plasma Beams land instantly and guaranteed, while the others trade some guaranteed burst for area coverage and homing utility.
06

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)

EnemyScoreDiffMoveShootHPInterval(s)Avg DPSColl. r.Visual ht.Destructible
Enemy 01*502ARCAIMED40.50–0.7516.00.631.22yes (1.5x)
Enemy 021003SINESINGLE60.50–0.7516.00.751.05no
Enemy 031503WEAVEALTERNATING70.75–1.2510.00.730.95no
Enemy 043006STRAIGHTSPREAD401.25–1.7516.00.821.84no
Enemy 052003KAMIKAZENONE12n/a0.00.601.22no
Enemy 062504SINEALTERNATING100.70–1.0011.760.691.05no
Enemy 073506STRAIGHTSPREAD141.00–1.4020.00.690.95no
Enemy 08*4006STRAIGHTAIMED341.30–1.756.560.761.38yes (2.0x)
Enemy 094507SPIRALSWEEP240.60–0.9012.00.811.50no

* 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.

Enemy 02, 03, 06 and 07 had the shortest hulls in the roster (visual_height under 1.0) and read as visibly smaller than the rest of the fleet. All four were scaled up 15% on 2026-09-04 — hull model transform, collision_radius, and (Enemy 03's) hit_offset together — with no change to HP, speed, damage, or score. Before: collision radius 0.50 / 0.50 / 0.60 / 0.60 and visual height 0.91 / 0.83 / 0.91 / 0.83 for 02/03/06/07 respectively.

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.

PropertyNon-destructible tiersEnemy 01 / 08
Shootablenoyes — and the shot pierces
Bullet radius0.11250.16875 (01) / 0.225 (08)
Size scale1.0x1.5x (01) / 2.0x (08)
Color cyclefixed, matches body01 yellow→red, 08 icy blue→orange, 0.5s
Score per killn/a5 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

EnemyW1W2W3W4W5W6W7W8W9W10W11W12
014.04.65.35.96.67.27.88.59.19.810.411.0
026.07.07.98.99.810.811.812.713.714.615.616.6
037.08.19.210.411.512.613.714.816.017.118.219.3
0440.046.452.859.265.672.078.484.891.297.6104.0110.4
0512.013.915.817.819.721.623.525.427.429.331.233.1
0610.011.613.214.816.418.019.621.222.824.426.027.6
0714.016.218.520.723.025.227.429.731.934.236.438.6
0834.039.444.950.355.861.266.672.177.583.088.493.8
0924.027.831.735.539.443.247.050.954.758.662.466.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.

07

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.

PhaseHP leftMain fire (dmg/volley)IntervalBurst (indep.)Total DPS*
1>50%Spread(6×8=48) + Ring(12×8=96) = 1441.50s3×11=33/2.20s111.0
225–50%+ alt. Aimed(4×10=40)/Cross(8×9=72)1.125s3×11=33/1.65s197.8
3≤25%(same volleys, faster)0.825s3×11=33/1.21s269.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

Wave12457810
HP3,2004,6007,4008,80011,60013,00015,800
08

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.

PhaseHP leftMain fire (dmg/volley)IntervalBurst (non-final)Total (non-fnl)Total (Final)
1>50%Spread(10×12=120)+Ring(16×10=160)=2802.00s4×14=56/2.50s162.4168.0
225–50%+ alt. Aimed(2×15=30)/Cross(8×11=88)1.30s4×14=56/1.625s295.3303.9
3≤25%+ Spiral(12×9=108), always0.90s4×14=56/1.125s546.5558.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

WaveIndexHPEncounter
3112,800Boss 03B
6216,000Boss 06B
9319,200Boss 09B
11422,400Boss 11B
1296,000Boss 12F (Final)
The Final Boss's 96,000 HP is a huge outlier — 4.3x the toughest non-final Big Boss and 6x the toughest regular Boss — clearly designed to be worn down with Rapid Fire pickups and repeated Energy Weapon/smart bomb bursts stacked on top of sustained fire.
09

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.

WaveNameKindColl. radius (x)Coll. radius (y)Ram radius (x)Ram radius (y)
1Boss 01Boss2.002.913.67
2Boss 02Boss1.902.963.69
3Boss 03BBig Boss2.832.824.184.19
4Boss 04Boss2.052.963.67
5Boss 05Boss2.042.983.68
6Boss 06BBig Boss2.762.764.184.17
7Boss 07Boss1.902.963.68
8Boss 08Boss1.992.963.68
9Boss 09BBig Boss2.752.754.184.18
10Boss 10Boss2.092.963.68
11Boss 11BBig Boss2.752.754.184.18
12Boss 12FFinal1.922.503.183.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).

10

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.

WaveLevelShip DPSKindBoss HPTTK (sec)
11120.0Boss3,20026.7
22138.0Boss4,60033.3
33156.0BIG12,80082.1
44174.0Boss7,40042.5
55192.0Boss8,80045.8
66210.0BIG16,00076.2
77228.0Boss11,60050.9
88246.0Boss13,00052.8
99264.0BIG19,20072.7
1010282.0Boss15,80056.0
1111300.0BIG22,40074.7
1212318.0FINAL96,000301.9
11

Run Length Budget

The wave curves above are tuned against a target of 20-25 minutes per full run.

SegmentModel 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 Boss302 s
Total1,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.

12

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 healthPlayer 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.

13

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:

Boss Fight Depth — every Boss/BigBoss still shares one identical 3-phase kit (spread → +aimed → +8-bullet ring, same sine-sweep movement at every tier). Distinct per-boss attack sets, movement, and telegraphs are meant to be designed around what each boss actually looks like, so this waits until a direction is picked and final boss models exist — not bolted onto the current three-sprite-set placeholders in scripts/boss_roster.gd.
Boss NamingBossRoster.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.
Boss Ram Radius as a Visible Force Field — partially done (2026-09-11): the always-on pulsing aura and the brighter flash at the point of player contact both shipped, along with a 0.5s timed knockback and dropping the collision damage from 25% to 10% of max health. Still blocked, two dependencies deep behind Boss Fight Depth above: transient feedback when a player bullet crosses the field, and dropping the field once a boss's HP crosses a phase threshold.
Final Music & SFX — every current sound cue and music track is placeholder. The final pass needs the theme's mood to aim at, so the audio fits the direction chosen rather than being picked independently of it.

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_UP level 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 (see docs/enemy-tier-level-distribution.md), and the remaining gap — no tier sought or charged the player — is closed too: Enemy 05 now uses MovePattern.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 — see BALANCE.md's "Kamikaze tier (Enemy 05)".
  • gdlintrc baseline — kept at exactly one accepted error (audio_manager.gd:30); re-run gdlint 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.