v0.3.14

Development Changelog

Twin Strike

TWIN STRIKE's development history end to end, oldest decisions to newest — every dated build below is a real exported release, entries grouped Added / Changed / Fixed / Removed per Keep a Changelog convention.

About This Page

TWIN STRIKE's development history end to end, oldest decisions to newest, generated straight from the project's CHANGELOG.md — every dated build below is a real exported release, entries grouped Added / Changed / Fixed / Removed per Keep a Changelog convention. For the full gameplay balance dossier, see Balance & Stats Reference.

Exported builds are named <name>-<version>-<platform>.<ext> — e.g. twin_strike-0.3.3-win64.exe, twin_strike-0.3.3-macos.zip, or twin_strike-0.3.3-linux-x86_64 — no v prefix (reserved for git tags, e.g. v0.3.3) and no alpha/beta suffix, since the 0.x major version already signals in-development/unstable.

0.3.11

Added

  • A Pro/Noob difficulty setting, selectable from a new DIFFICULTY row in Settings and shown live in the HUD ("MODE: PRO"/"MODE: NOOB"). Noob runs enemy health/damage/score at a flat 0.75x and don't submit to the online toplist, since only Normal/Pro runs are meaningful to compare online.
  • A death cutscene before Game Over: the gameplay HUD hides, the wreck glides to screen center (skipped mid-boss-fight), then detonates in a proper explosion before handing off to the existing Game Over flow.
  • The PAUSED overlay now shows the resume/quit key hints (P to resume, Esc to quit to menu) alongside the title.

Changed

  • The final boss's procedural hull goes from a violet/green color scheme to red/black/dark-gray, with its pattern shader swapped to CURL FLOW.
  • The online toplist submit-offer dialog no longer looks like a destructive warning (red title, defaulted-to-cancel) — declining it costs nothing.

Fixed

  • An old 3-letter tag typed as today's nickname could silently reuse a stale token bound to a different display name, submitting every run under that old name regardless of what was just typed.
  • The online toplist showed each nickname twice ("Nickname [Nickname]") next to every entry.

0.3.10

Added

  • Online toplist submission is now offered right after a run ends, not only when the run also makes the local top 10 — a cheap candidacy check asks the server whether the run would qualify for the online Score/Time Attack boards without paying for a full replay re-simulation.
  • Nickname entry remembers a short history of recently-used nicknames, so a returning player on a shared machine can pick their name back up with ↑/↓ instead of retyping it.

Changed

  • The local high-score screen and the online submit dialog's identity step now collect a free-text nickname (up to 20 characters) instead of a fixed 3-letter A-Z tag, typable from a keyboard or navigable with a gamepad d-pad/stick. Existing scores saved under the old 3-letter tag still load.

Fixed

  • The game-over and victory screens could leave a wave/boss banner, pickup announcement, combo-streak popup, or charge-tier label lingering on screen, visible through the panel's translucent overlay — whatever was mid-display at the moment the run ended stayed there since ending the run pauses the tree before it can clear itself normally.
  • The online submit dialog no longer asks for your nickname a second time when you've just typed it for a local high score — it reuses that nickname and goes straight to the consent step.

Removed

  • The hidden easter-egg sound triggered by entering one of five specific 3-letter nicknames on the game-over screen, along with the now-unused audio fallback plumbing it needed.

0.3.9

Added

  • Kill-streak combo scoring: consecutive kills scale score up to 2x (+10% every 10 kills), reset by any unshielded hit rather than decaying over time, with a HUD popup ("STREAK x10", etc.) at each milestone.
  • Boss/BigBoss force fields now flash a small hot-spot where a player bullet crosses the field on its way in, alongside the existing player-hull-contact flash (same effect, but narrower, dimmer/more transparent, and faster to fade) — purely cosmetic, does not block/absorb the bullet. Up to 12 bullet crossings plus the hull-contact flash can all light up their own spot at once, so a ram and several simultaneous bullets no longer stomp each other's flash.

Fixed

  • Ship Gallery logged a "GameRng drawn before reset()" error when browsing onto a regular Boss entry (waves 1/2) — its Boss instance never had shoot_phase pre-set (every real spawn path does), so it fell back to a seeded-RNG draw outside the simulation, where that RNG is never reset. Ship Gallery now pre-sets it like a real spawn does.
  • The new bullet-vs-field flash (above) slid sideways along the force field instead of staying put, most visible on SPREAD's off-axis shots — a bullet dwelling several sim steps inside the field's annulus re-flashed at its new position on every one of those steps. Now flashes once per bullet, at its entry point, via a one-shot latch (Projectile.claim_boss_field_flash()).
  • Both the bullet-crossing and player-ram-contact flashes landed off-center from the actual contact point on any elliptical force field (every roster-tuned Boss/BigBoss) — the flash angle was computed in world space, but the shader draws the hot-spot in the ring's local, pre-stretch space, so the two disagreed whenever the field's x/y radii differ. The flash now lands centered on the real contact/crossing point.

Changed

  • Internal: extracted camera shake, crosshair mesh/material construction, and enemy-tier/wave-progression data out of main_game.gd into dedicated ScreenShake, CrosshairFactory, and WaveProgression modules — no gameplay or behavior change.
  • Internal: extracted the pure collision/knockback math (force-field knockback physics, projectile-vs-enemy ellipse hit test, enemy-vs-enemy separation) out of main_game.gd into a new CollisionMath module — no gameplay or behavior change.
  • Internal: moved the per-pickup-type announcement text and sound name tables from main_game.gd onto WeaponPickup itself, alongside its existing COLORS/LETTERS tables — no gameplay or behavior change.
  • Internal: main_game.gd's boss-ramming and hit-area lookup code no longer reaches directly into Boss/BigBoss/Player's private fields — Player gained hit-area accessor methods, and Boss/BigBoss gained methods bundling their own ram-contact edge-trigger bookkeeping — no gameplay or behavior change.
  • Internal: main_game.gd's pickup-handling code no longer reaches directly into WeaponPickup's private collected/bomb-mutation flags — WeaponPickup gained is_collected()/is_bomb()/collect() methods — no gameplay or behavior change.
  • Internal: _state_hash_parts() now reads the player's damage level via Player.get_damage_level() (already used everywhere else this value is read) instead of the private field directly — no gameplay or behavior change.

0.3.8

Added

  • Bosses (regular Boss and BigBoss) now show a faint pulsing blue aura at the edge of their ram force field — the invisible radius that pushes the player ship back and deals ram damage was previously impossible to see during real play (only visible as a debug ring in Ship Gallery), so getting pushed had no visual cause.
  • That force-field aura now flares brighter right at the point where the player's ship is actually touching it, instead of just glowing evenly all the way around.
  • Boss deaths (regular per-wave Boss and non-final BigBoss) now end in an explosion instead of shrinking away (Boss) or silently vanishing (BigBoss): the same 5x white/color flicker every boss death already had is kept, then a screen shake plus a particle burst 10x the size of a regular enemy's ram-death burst play as it disappears. The final boss is unchanged — its own scripted defeat cutscene (fireball volley + fade) already shakes the camera and is a bigger spectacle on its own.
  • Touching a boss's ram force field now knocks the player ship (or, mid-split, each half) away over 0.5 seconds instead of just stopping it at the field's edge — movement input is locked out for that whole window, so the shove can't be fought or cancelled early.
  • Boss death particle bursts now travel further and take longer to fade than a regular enemy's, instead of just being denser over the same short life.
  • The player ship now leaves a retro CRT-style motion-blur trail — faded "ghost" afterimages of the hull — when moving fast, for both the fused ship and independently-steered split halves.

Changed

  • Each ship disc's continuous engine exhaust particle stream (added in 0.3.7) is disabled for now in favor of the new motion-blur trail above — the two read as competing effects under the hull.
  • Torpedoes, homing missiles (Shadow Stalker energy-weapon tier), and smart bomb missiles all now expire after 20s of searching for a target, up from 8s (torpedoes) or 12s (the other two) — long enough to actually connect against a boss instead of despawning mid-chase.
  • The "WAVE CLEAR" banner now appears 1 second after a wave finishes instead of instantly, giving the boss's death particles and the ship's glide back to its start position a beat to read before the banner takes over the screen.
  • Body-slamming a boss's ram force field now costs the player 10% of max health per hit, down from 25%.

0.3.7

Added

  • Each ship disc now trails a continuous engine exhaust particle stream (blue-white, scales with thrust) — visible whether the halves are touching at rest or flown apart during a boss fight, unlike the existing thruster glow which only shows fused.
  • Screen shake on Yonshakudama fireball and smart bomb detonations (not on regular hits).
  • Enemy 05 now uses a new KAMIKAZE move pattern: homes on the player's live position (both axes, not a fixed lane) and accelerates from a slow start until it hits or is destroyed. It fires no bullets at all — the only regular-enemy tier that's pure movement threat. Experimental, still being tuned; see BALANCE.md's "Kamikaze tier (Enemy 05)".
  • Ramming an enemy to death now explodes it into a one-shot particle burst in its own color, instead of just vanishing.

0.3.6

Changed

  • Regular-enemy score (Enemy 01-09) now derives from a 1-10 difficulty rating (HP, DPS, speed, move/shoot-pattern predictability, discounted for destructible tiers) instead of tier index — score = 50 x rank once tiers are ranked by difficulty, ties broken by prior score order. New values: Enemy 01 100->50, 02 150->100, 03 200->150, 04 250->300, 05 300->200, 06 350->250, 07 400->350, 08 450->400, 09 500->450. See BALANCE.md's "Difficulty rating & score derivation" for the full table and the re-derivation rule if difficulty changes again. No change to HP, speed, damage, or any other stat.

0.3.5

No changes recorded for this build.

0.3.4

Changed

  • Enemy 02/03/06/07 (visual_height under 1.0, the shortest hulls in the roster) scaled up 15% — hull model, collision hitbox, and Enemy 03's hit_offset together, so hitbox and silhouette stay aligned; no change to HP, speed, damage, or score

0.3.3

Changed

  • Enemy 02 no longer uses ZIGZAG's dart-and-pause (slowed three times over 0.3.1/0.3.2 and still read as too fast/jerky); it now uses SINE's continuous sway, along with a lower move speed
  • Formation lane spacing widened (2.25 -> 2.6) — Enemy 08 (added in 0.3.2) is now the widest hull at ~2.01, tighter against the old spacing than Enemy 04 ever was, so same-row squad-mates could read as touching
  • A slow, tall, multi-row squad (most often Enemy 04) could already run its own row-forming time past its whole spawn budget; nothing then held before the next squad's first row, so it could spawn on top of the finishing squad's last one. A minimum inter-squad gap now always holds, even then
  • Enemy tier HP rebalanced to track hull size/speed instead of tier index — the two tank-class hulls (Enemy 04, Enemy 08) now sit well above the rest, the small/fast hulls (Enemy 02, Enemy 03) sit at the bottom
  • Enemy 05 and Enemy 08 now fire destructible bullets like Enemy 01's, each with its own bigger size and color-cycle (teal->magenta and icy blue->orange) so the three tiers' shoot-down cues stay visually distinct
  • Squad tier selection (MainGame._roll_squad_tier()) now rolls off a per-level weight table instead of a flat roll plus an Enemy-04-only gate — levels unlock one new tier at a time through level 7, tanks (04, 08) are reserved for BigBoss levels, and no tier/tank-pair/destructible-pair can exceed its own cap on any level. See docs/enemy-tier-level-distribution.md
  • Blaster base damage 15 -> 20, Spread 8 -> 10 per pellet; Fan, Plasma Beam, Homing Missile, and Yonshakudama now scale with weapon level at their own 10%/level rate instead of the regular weapon slots' 15%/level, and the smart-bomb pickup's missile burst (350 -> 200 per missile) now scales too (it didn't before)
  • Applied ShipGallery hull re-tunes (color/accent/pattern scale/speed/glow) to Enemy tiers 01/07/08/09 and to bosses 01/02/03B/04/06B/07/08/11B/12F

0.3.2

Added

  • Four new regular-enemy tiers (Enemy 05-08), rounding the roster out from 4 to 8: teal/magenta/orange/icy-silver-blue identities with their own real ship models (pack01 obj_mtl ship10-13), reusing the existing SINGLE/ALTERNATING/SPREAD/AIMED fire patterns with their own bullet colors (Enemy 08's AIMED shots are not destructible, unlike Enemy 01's), and their own procedural hull patterns (17-20, QUASICRYSTAL/MOIRE FRINGES/NEWTON FRACTAL/APOLLONIAN GASKET) instead of reusing tier 04's
  • Ship gallery: EXPORT and EXPORT ALL buttons write the current ship's (or all ships') hull/pattern/collision values to JSON under user://ship_exports/
  • Ship gallery: hull/collision panel tweaks now persist per-ship while browsing between ships instead of resetting every time — RESET (or leaving the gallery) is the only thing that discards one
  • Enemy 05 spins continuously around its own model's Y axis, 360 degrees every 4 seconds

Changed

  • Ship gallery: hull/collision panel now spans half the screen width (was a fixed 330px strip) with room for every slider, so it no longer needs a horizontal scrollbar
  • Enemy 02's ZIGZAG dart slowed again (still read as too fast after 0.3.1's slowdown) — both the dart's own speed and its flip cadence are calmer now
  • Enemy 08 shrunk 25% (model and its matching collision hitbox together)
  • Enemy 06/08 hull colors re-tuned, and Enemy 06's pattern now travels much faster
  • All 12 bosses', and Enemy 03/04/08's, collision hitboxes re-tuned individually instead of sharing one uniform value per class
  • Collision/ram debug rings only render in the ship gallery now — they used to also show up during real play and on the How To Play screen's preview pickup whenever the DEBUG INFO setting was on
  • The pickup's debug ring is now sized to match the pickup itself, instead of its much larger real (deliberately generous) collection radius

Fixed

  • Regular-enemy tiers 5-8's ship models were rendering nose-up instead of nose-down toward the player
  • Ship gallery's EXPORT ALL was exporting every ship's untouched defaults instead of whatever the panel had actually been tweaked to

0.3.1

Added

  • Ship gallery: live hull-shader tweak panel (colors, pattern, intensity, scale, speed, glow, quality) and live collision hit/ram radius and offset sliders per ship, each with its own RESET
  • Ship gallery: every ship's collision hit/ram rings now shown automatically while the screen is open
  • Ship gallery: the shared menu backdrop's starfield now scrolls, matching the main menu

Changed

  • Enemy 02's ZIGZAG dart slowed from ~18 to ~6 units/sec, and squad-mates no longer snap left/right in perfect unison — each now staggers on its own phase

Fixed

  • audio_manager.gd's play_queued() no longer rejects optional-stream keys
  • online_client.gd's response body is no longer unbounded, and an explicit JSON error: null is no longer mishandled

0.3.0

Added

  • Dev-only ship gallery screen, reachable from the main menu, for browsing all 16 regular-enemy tiers and wave-ending bosses one at a time

Changed

  • Procedural Hulls is now the default hull style for a fresh install (previously Engraved); anyone with an existing settings save keeps whatever they'd already chosen

Fixed

  • Regular-enemy tiers 1-3's procedural hull patterns had too little color contrast and barely any visible motion; widened the contrast and sped up (or added) the spatial movement in each
  • All 12 wave-ending bosses' procedural hull patterns read too flat and near-static, and every Big Boss/Final Boss pattern in particular read as almost monochrome pale; fixed the Big Boss/Final Boss color contrast and added clearly visible movement throughout all 12

0.2.10

Added

  • Regular enemies now render as 3D ship models with a hand-drawn "engraved" hull look and a small colored spotlight matching each tier's own bullet color, replacing the old flat 2D sprites
  • Regular enemies, bosses, and the Big Boss/Final Boss now flash red briefly when hit without being destroyed

Changed

  • A wave's weapon-pickup ship now appears later in the wave — three-quarters of the way through its regular enemies instead of halfway
  • The splash screen title now matches the main menu's accent color

Fixed

  • Regular-enemy squads no longer spawn packed close enough for the ships to visibly overlap each other, especially the largest ship type
  • Regular enemies no longer get stuck looking tinted after flashing from a hit — the flash now fades back to their normal look instead of settling on the wrong color

0.2.9

Added

  • Replay Browser: the SUBMITTING screen now shows an animated progress bar under the title — a left-to-right sweep cycling between two accent colors, looping until the submission finishes. There's no way for the client to know real completion percentage (validator-server re-simulates the whole replay server-side, which has no fixed relationship to upload size or elapsed time), so this signals "still working" rather than faking a 0-100% readout.

0.2.8

No changes recorded for this build.

0.2.7

Fixed

  • How to Play: the gamepad DEV 3-wave-test-run toggle no longer flips back and forth on what looks like a single X-button press. Some gamepads report one physical press as multiple button-down events, and each one was toggling the setting again; the screen's input guard now re-arms after each accepted shortcut (dev toggle, replay browser, continue) to absorb the duplicates.

0.2.6

No changes recorded for this build.

0.2.5

Changed

  • The win/lose/game-over sound is now 6dB quieter (~50% amplitude cut) — it was noticeably louder than the rest of the SFX mix.

0.2.4

No changes recorded for this build.

0.2.3

Changed

  • Regular enemies and per-wave bosses now go by neutral IDs instead of creature names — enemy.gd/main_game.gd and BossRoster.ENTRIES refer to Enemy 01-Enemy 04 and Boss 01-Boss 12F, and their art folders are named to match (assets/images/enemy/01-04, assets/images/boss/01-12f, b/f suffix kept for Big Boss/Final waves). No gameplay change — this is a naming cleanup only.

0.2.2

No changes recorded for this build.

0.2.1

Changed

  • Each of the twelve waves now has its own boss, with its own name and its own art. Nothing looks different yet — all twelve start out as copies of the three sprite sets that used to be shared between them, so the seven identical mid-run bosses are still identical for now. What changed is that they are no longer the same boss: each can be redrawn and re-tinted on its own from here
  • Submitting a replay online now asks for your 3-letter tag with the same ▲letter▼ picker the local high-score screen uses, so a tag can be entered with a gamepad — d-pad or stick to pick letters, A to continue, B to back out — instead of needing a keyboard. Typing the letters still works
  • The one-time nickname a brand-new tag needs before its first online submission is now entered on an on-screen keyboard instead of a text field, so the whole SUBMIT flow — tag, nickname, consent, send — can be completed on a gamepad alone. Move with the d-pad or stick (hold a direction to run along a row), A to press a key, a/A for lowercase, DONE when finished — which drops you onto the consent box and SEND. The grid has Å Ä Ö Æ Ø alongside A–Z, digits and a few symbols, so Swedish, Danish and Norwegian names can be written properly. Mouse clicks and typing on a real keyboard both still work
  • The macOS download is now named twin_strike-<version>-macos.zip instead of -macos-intel.zip. Nothing about the build changed — it has been a universal binary running natively on both Intel and Apple Silicon since 0.1.6, and the old name wrongly suggested Apple Silicon Macs would need Rosetta

Fixed

  • The final-boss defeat cutscene no longer bogs down. Collision resolution was rescanning every projectile on screen once per projectile, so the nine fireballs bursting into roughly two thousand bullets turned the game's biggest moment into its slowest one
  • Submitting a replay can no longer send the same run twice. Toggling the consent box (or typing another letter) while the submission was already on its way re-enabled SEND, and pressing it again registered and uploaded the whole run a second time
  • Accuracy is no longer overstated by the charged Tier-4 shot. Its burst counts as the one shot it is, so a single release can register a single hit rather than one per bullet in the blast
  • Skipping the high-score name entry with ESC can no longer save a score anyway if you press confirm in the same instant
  • Bosses no longer split the ship a second time when they die during the moment the ship is gliding back to re-split, which left the controls stuck in the split state with nothing to fight
  • A boss's burst fire now keeps pressuring the half of the ship it picked, instead of being swung to the other half by its own main volley
  • Enemies that weave side to side no longer slide back into each other after being pushed apart
  • The big boss now shows its proper colour from the moment it appears, rather than changing colour partway through the fight and staying that way
  • The Big Boss and Final Boss no longer look washed-out dark from the moment they appear. Their orange/violet tint was crushing the art's own silver highlights and glow down to near-black; the tint is lighter now so the full detail of the artwork actually shows
  • PLAY on a replay that can no longer be read now says so instead of doing nothing at all
  • Damage numbers on the debug health bar no longer go negative
  • A hand-edited audio settings file with one bad value no longer discards the rest of your saved volumes

0.2.0

Changed

  • A full run is now 12 waves instead of 10, and the boss order changed. Big Bosses arrive on waves 3, 6, 9 and 11 before the final boss on 12 — the gaps between them shrink as the run closes, so the finale ramps up instead of bosses arriving on a steady beat
  • Wave pacing retuned for the longer run: later waves now hold roughly the same length instead of stretching out, with the pressure coming from enemies arriving thicker and faster rather than a wave simply lasting longer. The run still ends at about the same difficulty ceiling as before, spread across 12 waves rather than 10
  • Boss health rebalanced around the new order. Regular bosses die noticeably faster and read as punctuation between waves; Big Bosses are the heavy encounters, and each one now clearly outweighs the regular bosses around it. The final boss is unchanged
  • The Titan Centipede Cruiser — the heavy, slow, gold broadside enemy — now only shows up on Big Boss waves, and turns up half as often as it used to even there. A Titan formation is now a warning that a Big Boss is closing the wave rather than routine traffic; every other wave is Scarab Fighters, Mantis Interceptors and Hornet Strikers only
  • The first wave now eases the player in. Its opening half deploys out on the flanks with the middle five lanes of the screen left empty, then closes to the middle three for the second half, so wave 1 starts wide open and narrows toward the normal full-width deployment every later wave uses
  • The Drone Scarab Fighter now fires bullets you can shoot down, worth 5 points each. They're 50% bigger and pulse yellow/red so they stand out from ordinary enemy fire, which is still un-interceptable as before. It fires twice as often to pay for it: left alone it's now the most dangerous regular enemy, shot down on sight it's the least. Your shot isn't used up doing it — it punches through, clearing every one of those bullets in its path and still hitting whatever is behind them
  • Smart bomb missiles hit harder: 350 damage each instead of 200, so a full 12-missile burst is worth 4,200 rather than 2,400
  • How to Play now says what a full run actually is — 12 waves, about 20 minutes — instead of describing it as a development wave cap. Flipping the dev toggle now reads as a short test run standing in for the full 12
  • How to Play now shows a live, slowly spinning pick-up cube in the middle of the sentence instead of writing "pick-up", cycling through all four types every couple of seconds so you can see what you're looking for. The screen also reads as one page now — a single font and text size throughout — and the boss-fight tip names the gamepad sticks alongside the keys
  • Replays recorded in earlier versions no longer validate. Every wave and boss constant above feeds the deterministic simulation, so an old replay re-simulates to different results. Scores from earlier versions are also no longer directly comparable

0.1.33

Changed

  • Regular enemies now deploy in formation instead of trickling in one at a time at random positions. Each wave is a sequence of squads flying a mirror-symmetric shape — chevrons, walls, twin columns, diamonds, outside flanks — off a fixed lane grid, so what arrives on screen is something the player can read and learn rather than an unstructured drizzle. Every squad is one enemy type moving at one speed, and its members fire in unison, so a formation lands as a single readable volley instead of scattered shots. Which shapes appear is fixed per wave (the same wave always deploys the same sequence), while which enemy type flies them still varies per run
  • Enemy formations spread wider than the old spawn corridor, and the widest shapes only start appearing in later waves, so the playfield opens up as a run progresses

0.1.32

Added

  • Killing the Final Boss on the Final Wave now plays a defeat sequence: the boss flashes while nine Yonshakudama (five gold/green, four interleaved silver/blue with a slight launch delay) fire from the bottom of the screen, the boss fades out once they've all exploded, and the ship rejoins before a 2-second pause hands off to the victory screen; the charge meter and any "Ready!"/weapon-tier text also clear from the HUD at that point without releasing whatever charge the player was holding

Fixed

  • Yonshakudama now detonates higher up the screen while the Final Boss is alive, instead of popping at its usual quarter-from-top height where the boss's bulk would eat most of the blast (trying the old, unraised detonation height back for the regular Big Boss encounter)
  • The Big Boss/Final Boss bullet hit test is now 25% narrower on the y-axis than the x-axis, matching the boss sprite's proportions instead of a uniform circle that let shots register well above/below its silhouette
  • Shrunk the Big Boss/Final Boss bullet hit test by another 25% on both axes, so shots have to land closer to the boss's actual silhouette instead of its wider spawn-spacing footprint

0.1.31

Added

  • Audio: torpedoes and every homing missile (player torpedoes, the "Shadow Stalker" charge-tier missiles, and the smart bomb's 12-missile burst) now play a looping thruster sound for as long as they're alive and on screen

Fixed

  • Torpedoes and homing missiles no longer lock onto enemies that haven't fully entered the screen yet (and so couldn't be hit); when nothing currently qualifies as a target they now launch straight ahead and pick one up as it becomes valid, instead of refusing to fire

0.1.30

Added

  • Enemies: once half a wave's regular enemies have deployed, the next one spawned carries a weapon pickup — shown with a color-matched halo (its own energy color) for as long as it's alive, and drops the pickup on death

Changed

  • Smart bomb: now flies to screen center instead of near the top; detonation no longer instakills enemies or chips boss health directly — instead it clears all enemy bullets, briefly suppresses boss fire, sends out an expanding white shockwave halo, and fires 12 red homing missiles (200 dmg each, trailed, removed on impact) radiating in every direction

0.1.29

Added

  • HUD: a pulsating " Ready!" banner flashes center-screen the instant the charge meter crosses 25/50/75/100%, colored to match the charge bar; the meter itself now also shows "Charging...", "Cooling...", or "Havoc!" (while held at 100%) next to the bar, defaulting to "Ready!" when idle
  • Audio: all four suppress-fire tiers now have their own sound — the bullet fan, plasma beams, and homing missiles each play a launch sound, and the Yonshakudama fireball has a deploy sound and a louder detonation sound. Deploying the Yonshakudama fades every other sound out, holding through the detonation and fading back in 1.5s after

0.1.28

Added

  • Player: a new suppress-fire charge meter — hold the suppress-fire input to build charge from 0-100% (shown in the HUD next to the health bar, white->yellow->red); releasing fires the highest tier reached: a split bullet fan at 25%, twin plasma beams at 50%, twin retargeting homing missiles at 75%, or the Yonshakudama fireball (a screen-filling 500-bullet burst) at 100%, followed by a 30-second recharge lockout. All four effects scale their damage with the player's current weapon level
  • Enemies and bosses: idle sprites now have a slow pulsing glow, crossfaded and phase-randomized per instance so they don't pulse in lockstep
  • FX: weapon pickups now show a soft color-matched glow halo; torpedoes and homing missiles trail particles; the Yonshakudama fireball leaves a glowing trail and its explosion recolored to a punchier gold/blue/green palette

Changed

  • Player: tier-1 charge fan narrowed and now splits into two independent fans (one per crosshair); homing missiles retarget more aggressively (up to 10 kills, +25% speed) and always retarget toward whichever enemy is closest to the player, rather than to themselves
  • Main menu: the "TWIN STRIKE" title text is now white
  • HUD: HP and energy/charge bars now align to the same starting x position regardless of label width
  • validator-server: default toplist size raised to 100 entries

Fixed

  • HUD: the post-game-over "press any key" hint no longer shifts the whole panel's layout when it appears, and now fades in instead of popping in
  • Player: each plasma beam now correctly follows its own crosshair, and the beam visual no longer skews while banking
  • Homing missiles now survive landing their own killing blow instead of always disappearing on a lethal hit
  • Yonshakudama: fixed a bug where its fireball fell short of its intended target instead of flying to the top of the screen; its explosion bullets now scatter across the full circle instead of spiraling out narrowly

0.1.27

Added

  • Settings: a Red/Green status lamp next to the ONLINE title pings validator-server's GET /healthz to show reachability, cooldown-gated and guarded against spamming the server
  • How To Play: the control legend now lists gamepad equivalents alongside each keyboard binding

Changed

  • Replay submissions to validator-server are now gzip-compressed on the wire (client compresses, server transparently decodes) — a JSON replay body shrinks to roughly 1-4% of its raw size, keeping long runs well under the server's upload size limit
  • The public GET /toplist page now shows two extra columns per entry: Created (when the run was actually played) and Uploaded (when it was submitted to the server) — the two can differ since submission is manual and deferred from the Replay Browser
  • How To Play: gamepad B now backs out to the main menu (matching the back-button convention used elsewhere) instead of opening the Replay Browser; gamepad Y opens the Replay Browser instead

Fixed

  • Settings: the online status lamp no longer resets to grey and re-pings the server on a no-op URL field focus cycle (e.g. tabbing through it without editing) — only an actual URL change triggers a recheck now

0.1.26

Added

  • Main menu: a "REPLAYS" entry under TOPLIST opens a simplified, player- facing replay list (DateTime, Score, Time, and PLAY/DELETE/SUBMIT) — the dev-only Replay Browser (with the outcome column plus EXPORT/VERIFY) stays reachable from How To Play, unchanged
  • Gamepad/keyboard navigation for the replay playback control bar: ui_left/ ui_right move between the transport buttons (skip/pause/stop) or the speed buttons, ui_up/ui_down switch between the two rows

Fixed

  • Playing a replay now always returns to wherever it was started from when playback ends or is stopped, instead of always returning to the dev Replay Browser regardless of whether it was launched from there or from the new REPLAYS screen

0.1.25

Added

  • Deterministic replay system: every run is now recorded automatically and saved to disk; a dev-only Replay Browser (reachable from the How To Play screen, [R]/gamepad [B]) lists past runs
  • Playback controls for replay viewing: Play/Pause, skip back/forward (5s), and a speed multiplier (x1-x20)
  • Verify button per replay row, checking that it reproduces the original run's score, frame count, statistics, and periodic state-hash checkpoints exactly — runs independently of Play, so it's unaffected by playback speed/pause/skip
  • "ENABLE ONLINE FEATURES" toggle in Settings (opt-in, default off — a normal build makes zero network calls unless it's turned on): fetches a real seed from the server before a run starts, and adds a SUBMIT button to the Replay Browser for sending a completed run to a server-validated online leaderboard under a local nickname/tag
  • Main menu's TOPLIST now offers LOCAL (the existing on-device list) and ONLINE separately from a submenu; gamepad B acts as BACK on every submenu screen
  • Settings: a caption above the DEBUG INFO/CONTROLS checkboxes explains they control what's shown in the HUD during play

Changed

  • Player's shield/rapid-fire/torpedo cooldowns now use fixed-step counters instead of Timer nodes (no change in duration or feel — required so replay playback can drive them deterministically)
  • Player/Enemy/Boss/BigBoss/Projectile/WeaponPickup no longer self-drive their own timing during live play — MainGame now explicitly steps every entity itself every simulation frame, live play and replay playback alike, instead of only doing so during replay (no change in feel; each entity's own movement/firing/cooldown logic is untouched, only who calls it changed — see docs/replay_architecture.md's "Simulation driver")
  • Renamed "Rotate Weapon" to "Cycle Weapon" throughout the UI and input bindings (the action itself is unchanged)
  • Splash screen, main menu, and About screen now lead with "DUAL WIELD" and show "-= TWIN STRIKE =-" as a subtitle
  • How To Play: advancing to the game now requires Enter or gamepad A specifically (previously any key), freeing gamepad A from the dev-only 3-wave test toggle, which moved to gamepad X

Fixed

  • Replay verification no longer fails on real playback. Three separate causes: projectile hit detection (player fire vs. enemies/bosses, enemy fire vs. player, enemy/boss body-ram-vs-player, and shooting a weapon pickup to cycle it) used to rely on Godot's own Area3D.area_entered physics signal, which fires on the physics server's own tick — decoupled from the fixed sim-step clock everything else in the replay system is built on, so a hit could land on a different sim frame between a recording and a replay of it; every entity self-driving its own timing off real render delta (see "Changed" above) could batch 2+ simulation steps into a single real frame, landing a hash checkpoint mid-batch on one side but not the other; and MainGame advanced the replay input cursor before _update_crosshairs() (ship/crosshair movement, weapon aim) and Player's fire-suppression check had done their own reads of it for the frame, so during replay specifically those reads silently saw next frame's recorded input instead of the current frame's — invisible unless the ship was actually moving, which is why it took a real recorded strafe input, not just idle playback, to surface it. Hit detection is now resolved manually every sim step, there's only one simulation clock left, and the input cursor now advances only after every read of it that frame is done. The state hash also no longer includes an enemy mid-death-animation (its Tween runs on real time, so exactly when it's freed isn't a pure function of the sim frame)
  • Starting a new game after watching a replay no longer goes straight to the game-over screen — leaving a finished replay's game-over screen never reset GameRun.is_replaying, so the next game (from anywhere, not just the Replay Browser) misread it as still being a replay and tried to play back the already-exhausted previous replay's input instead of starting fresh
  • Deleting a replay from the Replay Browser no longer strands gamepad/ keyboard focus with nothing to navigate — the just-deleted row's own button had focus, so removing it left nothing focused; deleting now refocuses the BACK button
  • VERIFY no longer hangs/crashes the game. Its yield interval was 100000 instead of the intended 500, so a normal-length replay's verify pass never yielded at all — the whole run happened as one unbroken synchronous call, and every enemy/projectile/pickup that died or expired over the entire replay stayed fully allocated the whole time (queue_free() is deferred; nothing ever gave the engine a chance to flush it)
  • VERIFY no longer reports false failures on real recorded runs. Root causes included: the bare MainGame/Player it re-simulates through never actually initialized (health stuck at 0, no weapon ever equipped, wrong starting position/scale relative to the real scene); several places (_check_enemy_escape(), a dying boss clearing its own bullets, the smart-bomb detonation, a projectile's own lifetime expiry) called queue_free() without marking the node as already-resolved, letting it keep acting — repeat damage, re-detonating, still-live homing — for as long as it lingered as an unflushed zombie; a duplicate, independent read of live movement/aim/strafe/fire-suppression input for the recorded snapshot vs. actual use meant a saved replay could genuinely not match what live play had done with it; and _end_game() silently crashed when called from the headless verify context, so completion status was never recorded correctly. See docs/replay_architecture.md's "VERIFY correctness fixes" for the full list
  • Skipping forward to (or past) the end of a replay no longer leaves it stuck showing the run as still in progress. _process() already had a safety net to force-end a replay once playback reached the recorded frame count without the run's own end conditions (player death/final boss defeat) having done so first, but skipping used a separate code path (_burst_resimulate_to()) that had no equivalent — landing exactly on the last frame via skip left every enemy/projectile/pickup from the run still "alive" instead of cleared out like normal playback reaching the same point would leave them
  • VERIFY no longer reports a small stat discrepancy on a run that ended in defeat. A run's outcome was recorded and saved from the middle of the sim frame that ended it: the enemy landing the fatal blow deals its damage (which runs the whole game-over path synchronously) before self-destructing and crediting its own kill/score, and the player's own cannons don't fire for that frame until after the collision block. So the saved statistics described a half-simulated final frame, while a replay re-simulates the frame in full and is only compared once it's done — the two never disagreed about what happened, only about when to look, which is why VERIFY reported extra kills/score/shots with zero state-hash mismatches anywhere in the run. Stopping the simulation and recording the outcome are now separate steps, the latter running at the end of the sim frame, so a recording always describes exactly the frames a replay will re-simulate. A recorded replay's statistics also used to be a live reference to the run's counters rather than a snapshot, so an in-memory replay always agreed with itself no matter when it was built — which is why only replays loaded back off disk ever failed, and why no automated test could see this
  • VERIFY no longer floods the console with an engine error every simulated frame. The two crosshair nodes are children of the bare MainGame ReplayVerifyRunner deliberately never adds to the SceneTree, so writing their position each frame hit Godot's out-of-tree guard; cosmetic only (aim direction is computed from separate plain fields, not these nodes), now skipped when they're not actually in the tree
  • Replay Browser: VERIFY no longer leaves audio playing underneath it, including a victory run's looping game-over stinger
  • Replay Browser: row layout no longer overflows into a horizontal scrollbar with empty space on the right
  • Replay Browser: the SUBMIT dialog is now fully opaque, and its consent checkbox is visible whether checked or unchecked
  • Replay playback controls (Play/Pause/skip/speed) moved to the bottom-left corner instead of overlapping the center of the screen

0.1.24

Added

  • Dev-only "3-wave test run" toggle on the How To Play screen (click, [SPACE], or gamepad [A]) that shortens a run to one of each boss — Boss, Big Boss, Final Boss at 25000 HP — for quick testing

Changed

  • Big boss and final boss health bars no longer show a title label and now sit directly above the boss, matching the regular boss's bar position, instead of floating near the top of the screen

Fixed

  • Bosses now clear their own in-flight bullets when they die, instead of leaving them to keep hunting the player after the fight ends

0.1.23

Changed

  • Rebalanced the four regular enemy types into an explicit Lvl 1-4 tier: Drone Scarab Fighter (100p, 4hp, purple), Needle Mantis Interceptor (150p, 8hp, blue), Reaver Hornet Striker (200p, 12hp, green), Titan Centipede Cruiser (250p, 16hp, gold) — base HP now scales per tier instead of the old flat/tank-only multiplier, and each ship's hull tint matches its bullet's energy color
  • The settings menu's up/down navigation now wraps: pressing up on the first control jumps to BACK, and pressing down on BACK jumps back to the first control

0.1.22

Added

  • Settings menu checkboxes to toggle the HUD's debug info panel and control hints on/off, both off by default

Changed

  • The per-weapon damage legend and the current-wave counter in the HUD are now part of the debug info panel instead of always showing
  • Renamed "KILL COUNT" to "KILLS" in the HUD
  • Repositioned the HUD readouts: HP stays top-left, TIME is dead center, and SCORE/KILLS/WEAPON LVL are stacked top-right; the debug info panel moved up a row and the control-hints panel moved up two rows to keep clear of the bottom ship-status footer
  • TIME and SCORE no longer visibly jitter as their digits change — both are now left-aligned within a fixed-width box instead of being center/right-aligned against fluctuating text width

Removed

  • Bosses no longer periodically become immune to the player's current weapon (added in 0.1.21) — the mechanic added no meaningful counterplay
  • The clickable pause button in the HUD — pausing via keyboard/gamepad is already available and sufficient

0.1.21

Added

  • Bosses (regular and big) now periodically become immune to the player's current weapon — a blocked hit is absorbed with a milky force-field flash instead of dealing damage

Changed

  • Regular enemies are a third smaller (sprite, hitbox, and spawn spacing)
  • Regular enemy movement speed increased by 25%

Fixed

  • Torpedoes now let go of an already-dying target instead of continuing to chase (or re-targeting) a corpse for the remainder of its death animation

0.1.20

Added

  • True fullscreen toggle in settings (exclusive fullscreen, bypassing the compositor, instead of borderless-fullscreen), alongside the volume sliders
  • A bonus pickup now drops at 75% health on the final boss, on top of the usual phase-change drops
  • Weapon pickups can now be collected by either split half of the ship during a boss fight, not just the dormant dock

Changed

  • Torpedoes now scale their own damage per weapon level (420 base, +20%/level) instead of sharing the 15%/level bonus used by the other weapons
  • Bosses (regular and big) are 50% bigger
  • Wave 5's big boss has more health (9600 -> 16000), back in line with how every other big boss scales by index
  • Smart bomb damage to bosses lowered from 20% to 10% of max health

0.1.19

Added

  • New game icon and launch splash art, both centered on the twin-engine ship design

Changed

  • Menu screens now use a shared color palette and consistent title font instead of scattered hardcoded colors
  • Regular enemies are 50% bigger (sprite, hitbox, and spawn spacing)
  • The new entry on the top scores list is highlighted in orange gold

0.1.18

Added

  • Linux export preset (twin_strike-<version>-linux-x86_64), a single self-contained executable; release.sh now builds it alongside the Windows exe and macOS zip on every release

0.1.17

Added

  • Two new regular enemies: Reaver Hornet Striker (sine movement, alternating shots) and Titan Centipede Cruiser (slow, tanky, broadside spread volley)
  • Regular enemies, mini-bosses, bosses, and the final boss now have real sprite art instead of placeholder box-mesh shapes
  • Waves cleared is now tracked and shown on the toplist

Changed

  • Each regular enemy's bullets now match its own energy-glow color instead of a shared placeholder color
  • Health pickups restore half of max health (up from a quarter)
  • Torpedo damage doubled (160 -> 320)
  • Regular enemy bullets are 25% smaller
  • Smart bomb detonation now deals a flat 20% of max health to a boss/mini-boss, in addition to its existing fire-suppression window, instead of leaving them untouched

0.1.16

Added

  • Full gamepad support for gameplay and all menus
  • Player ship's twin cannons turn independently to track the crosshair instead of the whole hull rotating to aim
  • Procedural engine-glow thrusters and a subtle idle hover bob on the player ship
  • Ship rolls slightly when strafing, reading as reactive to steering input

Changed

  • Player ship's procedural placeholder geometry replaced with sprite art; the hull is now composited from a dock coupler and two half-disc sprites (previously only shown mid-boss-fight, now always visible) with a distinct indigo hull, yellow turrets, and a darker indigo dock piece, all still flashing red/white on hits
  • Removed the bullet-interception mechanic
  • Removed the HUD's docking-bay reticle graphic
  • HUD gained a bottom status footer with restyled stat rows

Fixed

  • Player bullets now spawn from the cannon muzzles instead of mid-hull
  • Ship returns to its start position before splitting apart for a boss fight, instead of splitting from wherever it happened to be
  • Split ship halves no longer visually overlap while boss-locked

0.1.15

Changed

  • DAMAGE_UP pickups now scale weapon and torpedo damage by a percentage (15% per level) instead of a flat +2.0 per level, so BLASTER, LASER, and SPREAD stay proportionally balanced as damage level rises instead of the fastest-firing weapon (LASER) pulling ahead

0.1.14

Changed

  • Torpedo damage buffed from 60 to 160

Fixed

  • Ship's hull glow no longer stays permanently dimmed to black after a shield wears off — it now fades back to its idle brightness instead of fading to zero
  • Music now pauses when the game is paused instead of continuing to play under the pause overlay

0.1.13

Added

  • Ship splits into independently-steered left ([WASD]) and right ([ARROWS]) halves for the duration of every boss fight, fusing back together once the boss is destroyed; the how-to-play screen now explains the mechanic

Changed

  • release.sh now renames the bundled macOS .app inside the exported zip to include the version (e.g. twin_strike-0.1.13.app), matching the already-versioned .exe and .zip filenames
  • Horizontal strafing ([X/C]/gamepad bumpers) is disabled for the duration of boss fights (split, fuse-back, and the return-to-start glide), since the ship is piloted as two separate halves during that window

Removed

  • Joypad debug overlay (scripts/joypad_debug.gd) and its autoload

0.1.12

Added

  • Horizontal ship strafing on X/C (keyboard) and the left/right shoulder buttons (gamepad bumpers, not triggers), available during normal play and stacking with the existing aim-stick steering during boss-lock; documented in the HUD keybind panel and the how-to-play instructions screen
  • Joypad debug overlay (scripts/joypad_debug.gd): always-on diagnostic panel logging connected devices and raw button/axis events, useful for confirming physical gamepad input

Changed

  • HUD debug text (debug panel title/stats, damage legend) recolored to match the joypad debug overlay's green

0.1.11

Added

  • All bosses (mini-boss, boss, final boss) now fire an independent player-tracking burst of single shots, 0.1s apart, active from the start of the fight rather than waiting until half health — mini-boss fires 3 shots per burst, boss 4, final boss 5
  • Retro sci-fi "Audiowide" font applied to the splash screen title, the main menu and all sub-menus (titles and buttons), and HUD headline/status text (HP, TIME, SCORE, torpedo READY/cooldown, shield and rapid-fire timers, wave banners, pickup announcements, pause and game-over titles, boss health label)

Changed

  • Base HP doubled for all three boss tiers (mini-boss, boss, final boss)
  • Splash screen title text is now "TWIN STRIKE"; the "Press any key to continue" prompt uses the plain default font at a smaller size and sits lower on screen
  • Instructions screen's wrapped tip/notice text column widened (560 -> 820 world units) so fewer lines wrap

0.1.10

Added

  • Run timer: the HUD now shows elapsed time (mm:ss.xxx) from wave 1 start until the run ends, driven by the same fixed-delta sim clock as the rest of gameplay so it stays comparable across runs. The final time freezes on the game-over/victory screen, carries through name entry, and is now shown alongside score in the toplist.
  • Smart bomb detonations now suppress Boss and MiniBoss fire for 2 seconds, giving a partial payoff against the enemies it can't outright kill
  • New instructions-screen tip: firing on pick-ups can be a tactical move, not just a way to burn through them

Changed

  • Every run now plays out identically: enemy spawns, movement, and firing no longer vary between runs, so times and scores are directly comparable for speedrunning and competitive play
  • Crosshair arms are a bit thicker again (0.045 -> 0.06 world units) for readability
  • Smart bomb fuse shortened to 0.5s (from 1s): pick-up now flashes white/red 3 times before detonating instead of pulsing white for a full second
  • Once a pick-up becomes a smart bomb, it now rushes to a fixed spot at screen top-center (25% of the height down from the top) instead of continuing to home in on the player, and only detonates once it arrives

0.1.9

Changed

  • Right crosshair is now white to match the left instead of red; each crosshair drops one inner horizontal arm (the right one loses its left arm, the left one loses its right) so they still read as distinct mirrored shapes without relying on color, and both got slightly thicker arms for readability
  • Boss/mini-boss ring bullet burst now rotates 10 degrees per burst (was 5)
  • Boss/mini-boss forward spread fan no longer always fires south: its facing now cycles South -> East -> North -> West, one 90-degree step per burst
  • Rotate weapon key moved from [R] to [E] (updated in the HUD keybind panel and the "HOW TO PLAY" screen too)

0.1.8

Added

  • Boss-fight crosshair lock is now fully automatic: once a boss finishes popping in, both crosshairs glide onto it over 0.3s and lock on, with an always-on-top outline keeping them visible over the boss's own geometry; while locked, the arrow keys pilot the ship itself while WASD keeps steering the crosshair pair (replaces the old manual [E] lock key)
  • Player-boss contact is now a body-slam: it costs the player 25% of max health, knocks them back, and flashes them white, but only bullets damage the boss itself (mini-bosses no longer die instantly on contact)
  • Debug HP numbers now overlay every health bar (player, boss HUD bar, and the mini-boss's in-world bar)
  • Pick-ups now hover in place while being hit by player bullets, resuming their drift 0.2s after the last hit instead of continuing to move while under fire

Changed

  • Boss and mini-boss health increased roughly 16x since the last release
  • Boss and mini-boss now spawn dead-center and pop in from near-zero to full size (2x/3x respectively) over 0.3s, then lock permanently in place at their resting height instead of drifting or endlessly chasing the player
  • Boss and mini-boss bullet patterns significantly expanded: more volleys per burst, extra patterns (cross/spiral) layered on as they take damage, the ring burst now fires from the very start of the fight so bosses threaten every direction immediately, and the ring's starting angle now rotates 5 degrees clockwise every burst so its gaps sweep across the arena instead of leaving a safe spot to camp in
  • Boss and mini-boss bullets are now smaller and sit on their own collision layer, so player bullets pass through them instead of being destroyed on contact
  • Regular enemies now fly all the way past the player and off-screen instead of stopping to hover above her forever, at double their previous speed
  • Pick-ups continuously retarget the player's current position every second instead of homing toward wherever she was when they dropped
  • Crosshairs can now move directly above the player instead of being clamped to stay below her
  • Player/crosshair movement bounds widened horizontally, and the player ship's tail now tapers to a point instead of a flat block
  • Smart bomb now instantly kills every regular enemy on screen instead of dealing 50% max-health damage (main bosses and mini-bosses remain immune)

0.1.7

Added

  • Right crosshair now defaults to bright red instead of white, for a clearer distinction from the left crosshair
  • Torpedo "READY" HUD text now pulsates white-to-red in sync with the torpedo tubes once a torpedo is ready to fire

Fixed

  • HUD, menus, and toplist rendered far too small on Retina macOS displays (gameplay was unaffected); the project now scales UI correctly against the window size regardless of display pixel density

0.1.6

Added

  • macOS export preset (twin_strike-<version>-macos-intel.zip), a universal binary covering both Intel and Apple Silicon Macs; release.sh now builds it alongside the Windows exe on every release

0.1.5

Added

  • Launch splash screen shown on startup before the main menu, with menu music now starting as soon as the splash appears
  • Custom game icon replacing the default Godot engine icon (editor, project, and Windows export)

Fixed

  • First save on a fresh install could silently fail because the user:// directory didn't exist yet before writing settings/scores
  • A stray duplicate input on the name-entry screen could be processed by the scene being switched away from
  • Debug file logging was inadvertently left enabled in release exports

0.1.4

Added

  • Neon glow halo behind player and enemy bullets
  • Crosshair lock status (LOCK ON/OFF) in the debug stats list

Changed

  • Torpedo/shield/rapid-fire HUD status now anchored next to the ship on each side instead of a fixed corner block
  • Weapon level readout moved under the wave counter, top-right
  • Bullet-hit white flash lengthened from 0.08s to 0.3s so it reads more clearly

Fixed

  • Crosshairs could clamp past the camera's visible top edge and vanish off-screen

0.1.3

Added

  • Main menu now plays background music, looping seamlessly and fading out the game-over stinger over 1s if it was still playing

0.1.2

Fixed

  • In-game version overlay was stale at "v0.1.0 alpha"; now shows the current version with no alpha suffix

Changed

  • Adopted the <name>-<version>-<platform>.exe build naming convention documented above

0.1.1

Added

  • Instructions screen shown before entering the game, with controls, tips, and a notice that this build is capped at 10 waves during development
  • Flashing "BOSS APPROACHING" announcement before a boss/mini-boss spawns

Changed

  • Dev build capped at wave 10 (was 50) for faster playtesting
  • Enemy bullets enlarged 50%
  • Victory screen ("THE WAR IS OVER...") now plays the same audio as the regular game-over screen instead of ending in silence
  • HUD reworked: dropped the weapon A/B readout under the HP bar, moved wave info and on-screen control hints, folded the weapon damage legend into the debug/FPS panel under a "-=Debug Information=-" heading
  • Main menu's Start button now routes through the instructions screen first

0.1.0

Added

  • Distinct sound per weapon and per enemy projectile type
  • Persistent version tag and About screen with copyright
  • Settings screen with Master/Music/SFX volume sliders
  • ESC now exits gameplay back to the main menu
  • Destroyed enemy bullets are tracked and scored
  • 3s grace period before the game-over screen accepts input

Changed

  • Enemies implode (flash + shrink) on death with a new death sound
  • Player flashes red on hit, white when the shield absorbs damage
  • Background music alternates between two tracks during gameplay
  • Boosted pickup SFX gain; fixed pause/volume bugs
  • Game-over audio now loops from death through the top-list and into the main menu

Prior to 0.1.0

There were no version tags before this point, so entries below are grouped by date instead of by release, newest first.

2026-07-06

  • Boosted pickup SFX gain; fixed pause/volume bugs
  • Added a Settings screen with Master/Music/SFX volume sliders
  • Background music now alternates between two tracks during gameplay
  • Added a 3s grace period before the game-over screen accepts input
  • Looped game_over.wav from death through the toplist into the main menu
  • Added a persistent version tag and About screen with copyright
  • Player flashes red on hit, white when the shield absorbs damage
  • Enemies implode on death (flash + shrink) with a new death sound
  • Each weapon and enemy fire type now has its own distinct sound

2026-07-05

  • Play a distinct sound per pickup type, queued for overlaps
  • Standard enemy now fires single shots instead of a spread

2026-07-04

  • Enemies no longer overlap or spawn on top of each other
  • Standard enemies now spawn 4x faster
  • Pulse the actual torpedo tubes (not the HUD labels) white/red when ready
  • Reverted "pulse torpedo labels white/red when ready"
  • Announce each pickup's effect on collection
  • Pulse torpedo labels white/red when ready
  • Moved shield timer directly above the rapid-fire timer
  • Shifted weapon level and damage legend down 3 rows
  • Show a letter identifying each power-up type
  • Colored weapon level label like the DAMAGE_UP pickup; levels now start at 1
  • Show weapon level above the damage legend
  • Doubled regular enemy count and spawn a mini-boss at wave end
  • Reduced Spread bullet type's spread angle by 50%

2026-07-03

  • Capped max FPS at 60
  • Scaled HEALTH pickup heal amount with max health
  • Added RAPID_FIRE and DAMAGE_UP pickup types
  • All weapon types equipped from the start; cycle with R
  • Weapons now level up on repeat pickups of the same type
  • Added breathing room between torpedo status and damage legend
  • Show a per-bullet-type damage legend under torpedo status
  • Boss now drops a pickup on each flash and on death
  • Replaced boss phase speed-up with a white flash on phase change
  • Doubled regular enemy spawn count per wave
  • Added a kill counter next to the score
  • Added tests covering HUD, mini_boss, shield pickup, and smart-bomb detonation
  • Applied health_multiplier to spawned enemy health
  • Added a right-side keybind reference panel to the HUD
  • Removed orphaned player_ship code and its dead input actions
  • Remapped pause/torpedo/suppress_fire keybindings
  • Added an Xvfb virtual display snippet for agent-driven runs
  • Warned against testing on the real RDP display (DISPLAY=:0)
  • Dropped dead suppress-fire code from orphaned player_ship.gd
  • Wired suppress-fire (Z) to Base, the actual player entity
  • Player can suppress weapon fire while holding Z
  • Homing torpedoes now retarget when their locked target dies
  • Rate-limited weapon-pickup mutation so it's trackable
  • Added side-mounted homing torpedoes, triggered one at a time on Q
  • Added gameplay enhancement suggestions to TODO.md

2026-07-02

  • Added crosshair lock toggle; repositioned pause/boss-HP/wave HUD elements
  • Renamed "stage" to "wave"; added a full boss every 5th wave and a Final Wave/Boss ending
  • Added audio assets, export presets, subagent defs, and workflow tweaks
  • Enemies stop before player collision; raised crosshair floor and added a classic crosshair mark
  • Restricted available models to exclude Fable
  • Reframed the base as the ship's front turret with a parallax starfield
  • Show stacking shield countdown on the HUD
  • Mini boss now drops a pickup at 50% HP; bullets pass through pickups

2026-07-01

  • Rebalanced smallest enemy, tuned pickups/shield, fixed base collision
  • Player bullets now shoot down enemy bullets on contact
  • Further tuned enemy speed, base HP, and crosshair feel
  • Added dual cannons with independent aim; halved enemy speed
  • Resolved BUG-1 through BUG-4 from code review

2026-06-30

  • Wired enemy projectile damage to the base
  • Redesigned gameplay to static base defense with a wave system
  • Added HUD weapon display with weapon-coloured label and aim arrow
  • Added weapon cycling, directional crosshair, and immortality shield
  • Added smart bomb pick-up with auto-detonate

2026-06-28

  • Marked the flicker bug as on hold after Windows testing
  • Patched GUT 9.6.0 to run on Godot 4.3 stable
  • Added GUT unit tests for game logic (65 tests, all passing)
  • Added 3-stage progression with boss fights and victory flow
  • Toplist now uses a monospace font with aligned columns and centered layout
  • Added enemy health bars, cleared field on death, fixed game-over hint blink
  • Added keyboard navigation to menus (arrow keys, space, ESC)
  • Doubled enemy fire rates, added HEALTH pickup and 5-hit cycle threshold
  • Added per-type enemy autofire patterns and player-ram collision
  • Added name entry flow on death with top-10 qualification

2026-06-27

  • Added main menu, toplist, and score persistence

2026-06-26

  • Added game over screen with score and restart
  • Added HUD with health bar and score
  • Added enemies with three behaviour types and hit detection
  • Marked all code review findings as fixed
  • Initial commit — dual-stick shmup foundation