This repository contains a small browser game written entirely in a single HTML file. The goal of the challenge is to keep all the game's HTML, CSS and JavaScript code self-contained so that it can be played by simply opening index.html.
Open index.html in any modern browser. The game will load immediately with no additional assets required. Use the on-screen instructions or the hotkeys listed on the start screen to play.
For detailed controls and tips see HOW_TO_PLAY.md.
The start screen also includes a background music selector. Use the arrows to cycle through the available tracks or choose Off to disable it entirely. The slider beside the selector adjusts the music volume and defaults to 25%.
- Theme — cycles through different visual styles.
- Mute — turns game sounds on or off.
- SFX — toggles beep sound effects.
- Time controls — unlock higher and lower battle speeds through the new time-control upgrades, then adjust speed from the compact control cluster.
Run the local smoke check before publishing changes:
node scripts/smoke_check.mjsFor local multi-agent workflow and publishing notes, see AGENTS.md. For Codex-specific orchestration and usage-accounting workflow, see CODEX.md.
index.html now embeds the original styles.css and themes.js directly inside <style> and <script> tags. There are no external dependencies beyond the Firebase scripts loaded from a CDN.
The previous css/ and js/ folders have been removed as part of the single-file challenge.
The repository also includes a favicon.ico so browsers display an icon in the
tab when the game is loaded. A database.rules.json file is provided as an
example Firebase security rules configuration.
A Firebase Realtime Database is required to store and serve the global leaderboard. The global leaderboard is now fully operational. Create a database in your Firebase project and configure the rules similar to the example below:
{
"rules": {
"scores": {
".read": true,
".write": "newData.exists() && newData.hasChildren(['initials', 'wave', 'time', 'date', 'ranking']) && newData.child('initials').isString() && newData.child('initials').val().length >= 2 && newData.child('initials').val().length <= 3 && newData.child('initials').val().matches(/^[A-Z0-9]+$/) && newData.child('wave').isNumber() && newData.child('wave').val() >= 1 && newData.child('wave').val() <= 1000 && newData.child('time').isNumber() && newData.child('time').val() >= 0 && newData.child('ranking').isNumber() && newData.child('ranking').val() == newData.child('wave').val() * 100000 - newData.child('time').val()",
".indexOn": "ranking"
}
}
}Scores are ranked using the formula ranking = wave * 100000 - time where
wave is the lowest wave that was still active when the player was defeated.
This ensures sending multiple waves early will not inflate scores. Higher waves
and faster completion times result in a better leaderboard position.
The database must allow writes at /scores so the game can submit new
entries. A permission_denied error in the browser console typically means the
rules are misconfigured or a submitted score does not match the required
initials, wave, time, and ranking validation.
database.rules.json contains the same example configuration shown above and can be used as a template for your security rules. This file is only a reference and is not read by the game directly.
The game is under active development. Below is a brief summary of recent updates. See CHANGELOG.md for the full history.
- Added +1,000,000,000 (1 billion) and +100,000,000,000 (100 billion) credits to the Debug credit-grant buttons, alongside the existing 100K / 1M / 100M. Use still flags the run as [Q] (cheated) on the leaderboard.
- The Missile Systems category header now shows a live recharge progress fill, mirroring the Laser header — fills left-to-right as the missile cooldown elapses and turns green when missiles are ready (active once Missiles is purchased).
- Missiles now have an upgradable Recharge, mirroring the laser. Base missile recharge raised 2s → 5s. The new Missile Recharge upgrade sits at the top of the Missile Systems tree (requires the Missiles upgrade) and shaves a flat 0.6s off the cooldown per level, floored at 0.1s, over 9 levels. The button displays recharge time in seconds. Existing saves are preserved (the upgrade is appended at array end and reordered to render at top).
- Base laser recharge raised 0.5s → 5s. The Laser Recharge upgrade now subtracts a flat 0.6s per level (floored at 0.1s) instead of a percentage fire-rate multiplier; max level lowered to 9 so the final level lands at 0.1s. The button now shows recharge time in seconds (e.g. "5.0s > 4.4s").
- The 360° coverage celebration now soft-pauses the game and paints the entire sensor range solid green. A beat later the gold "360° Real-Time Coverage Achieved" banner pops up with a click-to-continue prompt; clicking dismisses it, resumes play, and fades the green out over ~1s. Replaces the earlier transient flash version.
- Purchasing the final Radar Sweep Width upgrade (reaching full 360° coverage) now triggers a celebration: a whole-range green flash, a centered gold congratulations banner, and a toast.
- The XP enemy is now targeted by the cannon like a real enemy before it is identified (cannon fires, bullets strike with a hit spark but deal no damage). Once Enemy Identification is purchased, the cannon no longer targets it, leaving it for the manual laser.
- Radar Sweep Width is now a child of Radar Sweep Speed: it cannot be purchased until Sweep Speed is maxed (100%). Cost raised 300 → 2500 per level. At 100% width the sweep retires into full 360° coverage (no sweep drawn).
- Wave-reward popup is now deferred until after the boss's death explosion plays out. The wave timer freezes during that delay so the post-wave time bonus is not consumed by the explosion/reward wait.
- Cannons and lasers can no longer target a radar contact once it has faded to invisible. Targeting is gated on the contact being visibly painted; once invisible it drops off the targeting list until the next sweep repaints it.
- Radar fade is now a fire-light flicker: a contact's color fades starting ~25% past the sweep, transitions color → grey, then flickers grey → invisible by 50% of the sweep cycle.
- Halved the initial cannon range. The first Sensor Range (Electronic FOV) upgrade is now granted free at start so the sensor ring shows. Sensor base range is decoupled from cannon range (own floor) so halving the cannon no longer collapses the sensor envelope.
- Wave-1 pacing is now slow and deliberate for teaching: an early-wave spawn factor ramps from 20% on wave 1 back to full by wave 5. Scan radius leads cannon range by 10px at base. Fixed a close-spawn bug and made the radar fade clearly visible across the sweep cycle.
- Early-wave spawn distance now scales with the slow-speed factor so enemies still arrive at the normal pace on slow waves. Radar contacts respect the Enemy Visuals (identification) upgrade — before identification every painted contact renders as a uniform small grey circle.
- Replaced the estimated-position ghost with a smooth fade model: a painted enemy renders at its real position and fades color → grey → near-invisible, timed to the sweep. The fresh-paint blip flare still pops on each pass.
- Reworded the one-time radar nudge toast to point more clearly at the Sensors → Radar Sweep upgrades.
- Replaced the abrupt half-pace cutoff with a gentler learn-the-radar ramp: enemies start at 1/10 normal speed on wave 1 and climb ~1.6x per wave to full speed by wave 6.
- Grey estimated tracks now carry an "EST POS" label. A one-time toast nudges players toward Radar Sweep upgrades the first time a contact fades to grey. Weapons respect the radar: turrets, missiles, and the laser only engage contacts the sweep has painted at least once.
- Radar Sweep is now a tactical mechanic: an 80s green phosphor sweep paints contacts (blip flash + sonar ping); between paints enemies show as grey estimated tracks that get more accurate with each pass. New Sensors upgrades - Radar Sweep Width and Speed - go from 10% to 100%; at 100% width the sweep retires into permanent 360° coverage. CRT Curvature and Boot Animation effects removed.
- Fixed the FX cog button not opening its settings panel (initialisation ran before the panel existed in the DOM).
- Retro FX toggles now live in a cog button next to the theme button, opening a transparent in-game panel with live checkboxes. Phosphor Glow is removed; the boss warning now flags bosses approaching through the fog with a pulsing edge marker until they become visible.
- Added the Retro FX pack: 13 toggleable visual effects (phosphor glow, CRT curvature and flicker, boot animation, impact glitch, muzzle flash, death flash, combo meter, boss warning banner, boss slow-mo, low-HP pulse, wave banner, shooting stars, radar sweep). Toggle each from the hidden Debug upgrade menu (Q); settings persist in localStorage and default to On.
- Removed the HUD Font experiment button; the theme default font won and the v3.114 HUD readability fixes remain.
- The top HUD (credits, wave, health) now renders under the CRT scanline overlay, and the washed-out black text outline is replaced with a soft drop shadow so the HUD font styles show properly.
- Added a HUD Font button to the bottom controls that cycles the top HUD text (credits, wave, health) through four font styles; the choice persists and the rest of the UI is unaffected.
- Expanded the Enemy Identified popup into a larger tactical dossier with an in-game-size enemy visual, role, behavior, stat explanations, weapon estimates, and upgrade advice.
- Enemy dossiers now calculate current cannon shots to kill and show current or locked laser, missile, and specialist weapon guidance per enemy type.
- Moved the Info / hover-help card to the bottom of the left menu stack, after XP Boost and any other action cards, so its variable height no longer shifts the upgrade category buttons.
- Bottom controls and the Support me widget now sit below the global CRT overlay so scanlines pass over them like the rest of the game.
- Enemy Stats now matches the Hotkeys panel width before Enemy Identification is purchased, wrapping the locked-message text instead of widening the panel.
- Removed the remaining bottom decorative lines from the Support me widget and bottom control buttons.
- Support me widget internals are now forced borderless and shadowless.
- Bottom-row controls and the Support me widget now use a lighter borderless HUD line/glow treatment instead of boxed frames.
- Support me text now uses the same yellow accent as the Fog of War title.
- Bottom-row controls now use the same Retro HUD styling as the side panels: translucent dark panels, cyan borders, scanlines, and compact square buttons.
- The Support me widget now visually matches the theme, enemy info, music, and sound controls.
- Left-side Info / hover-help card is now the same 170px width as the other upgrade menu buttons, with text reduced to 12px for a comfortable fit.
- Fog of War callout text reduced to 12px (10px on small screens).
- Right-side Hotkeys and Enemy Stats panels adopt the Fog of War callout look: clean cyan border, dark translucent background, yellow headers, white 16px body text under the CRT scanlines.
- Fog of War callout text is now 16px, and the left-side Info / hover-help card matches the same Fog-of-War styling.
- Enemy Stats width sizing reduced from
#999000to#99000.
- Enemy Stats now sizes itself from a hidden
#999000worst-case row and locks enemy order by first identified health, preventing distracting row reshuffles. - The Send Next Wave button now matches the cyan fog-callout styling.
- Enemy Stats is narrower again and keeps enemy rows stable: Kamikaze stays first and other enemy types keep discovery order instead of jumping around.
- The Info card now says
Click Here for Instructions., and the full guide overlay includes controls, stat labels, XP Boost notes, and enemy type icons.
- Enemy Stats is wider and keeps enemy rows on one line, while right-side panels use a darker retro HUD treatment with gold borders.
- The Info / How To Play card now shows only hover help text, and the full guide overlay explains enemy colors, stats, movement, upgrades, and XP Boost.
- The Info / How To Play menu card is now a larger fixed help panel for hover text, so upgrade help no longer covers nearby buttons.
- Battle Status bottom text now reads
Total: E = Enemies: N.
- Battle Status now uses
Efor per-wave enemy counts and shows the compact bottom legend asTotal: E = Enemies: N. - Upgrade hover callouts now more aggressively avoid covering visible menu buttons, trying above, below, and right-side placements before falling back.
- Battle Status wave details now expand above a bottom Total Enemies row, with compact per-wave enemy counts and a bottom legend.
- Upgrade hover help now uses a fog-callout-style canvas panel with a connector line to the hovered card and placement that avoids covering nearby buttons.
- Left-side upgrade menu hover tips now show compact live system stats or upgrade explanations beside the hovered card.
- Battle Status now collapses under Total Enemies, keeping Enemy Stats compact until the wave details are expanded.
- XP Boost progress now lives on the left-side XP Boost card with the cyan XP marker, live banked-charge count, and a Manual Targeting hover tip for saving, spending, and stacking charges.
- The separate right-side XP Status panel has been removed.
- Battle Status now lives inside the Enemy Stats box (Send Next Wave, compact
per-wave lines, Total Enemies), and each enemy row's
#shows how many of that type are still expected across active waves.
- Enemy Stats panel now shows a colored behavior icon per enemy type with compact
live metrics (
#count on field,»speed,♥health), and the right-hand panels are restyled to match the upgrade-button look.
- Battle Status now shows a color-coded composition preview for each incoming wave (counts per enemy type), so you can prepare the right upgrades before pressing Send Next Wave.
- The red homing lock ring now shows around the targeted enemy for the first purchased missiles too (it previously needed the Homing upgrade, whose radius was 0 before purchase).
- Missile trails no longer shrink when you slow time; they keep full-speed length and shape, just progressing slower.
- Beam Splitter's cap is now gated by Laser Damage: its total damage can't exceed the main laser's damage, so you must upgrade Laser Damage to raise the splitter cap. It keeps its own independent damage line (doubling per level, split across Kamikazes).
- Beam Splitter is now a fully independent damage line: upgrading Laser Damage no longer auto-strengthens it. It has its own damage (doubling per level, split across the Kamikazes in range) with a 10-level cap for a long, separate upgrade path.
- New Laser Recharge upgrade (between Damage and Range) speeds up laser fire rate by 15% per level. Beam Splitter reworked to fire up to four Kamikaze split beams.
- Beam Splitter sub-lethal hits now chip away at Kamikaze health instead of being silently discarded, so splitter volleys visibly reduce health bars.
- Laser System now shows weapon recharge progress on its left-side category button, and Beam Splitter replaces Wide Beam with up to four Kamikaze split bolts whose power cap advances with Laser Damage.
- Laser kills now cleave enemies into two fading halves, and overkill creates a transparent carry-through beam based on remaining laser power.
- Supersonic missiles now fire only at bosses, once per boss, while Super Salvo adds guided boss-seeking MIRV payloads in +2 steps; every 10th wave now brings two bosses.
- Wave rewards now unlock only after the wave boss is destroyed; blocked rewards show as greyed-out previews explaining that the boss must be defeated first.
- Supersonic now branches directly from Supersonic Research, and Super Warhead has an expensive wave-capped damage ladder that can scale toward half-boss hits at matching wave grades.
- Upgrade tree side-branch connector lines now more clearly show prerequisite relationships, including Auto XP Targeting directly under Manual Targeting.
- Laser System now has a high-cost Auto XP Targeting upgrade under Manual Targeting, allowing XP enemies in laser range to be shot automatically for XP Boost charges.
- Enemies now spawn outside the current fog-of-war reveal boundary, so expanded sensor or weapon ranges reveal enemies as they cross inward instead of after they are already inside the largest range ring.
- Missile trails now use one fixed medium-detail smoke/flame renderer at every missile count, so late-wave swarms no longer switch to a different look.
- Credit totals, upgrade prices, research costs, reward unlocks, and credit gain text now show comma-separated thousands and millions again.
- The Q debug performance overlay now uses a fixed width and sits above the Fog of War callout instead of the bottom support button area.
- Q debug mode now shows an FPS/performance overlay, and high missile-count fights spend less frame time on trails, homing-radius rings, target scans, and particle bursts.
- Weapon reward labels are back beside their category buttons, with expanded upgrade panels now drawing over them when panels overlap.
- Weapon reward labels now sit inside their left-side category buttons, avoiding overlap with expanded upgrade cards.
- Reward bonuses now highlight the affected numbers on upgrade cards in yellow rather than adding separate reward text rows.
- Reward targeting can now be unlocked for Missiles and Laser, letting Damage and Rapid Loader rewards apply to specific weapon categories with yellow category bonus labels.
- Buying Laser System now immediately gives the laser a real firing range, and wave reward choices now include a Skip Reward button.
- Left-side category buttons stay compact again while expanded branch cards still avoid overlaps and keep connector lines attached to their parents.
- Missile count now scales to 100, parked Macross mines cap at 500, and side-branch upgrade cards auto-space to avoid overlapping each other.
- The debug menu now includes +1,000,000 and +100,000,000 credit grant buttons in addition to the existing +100,000 option.
- The Fog of War text box and highlighted hatch circle now move together as a single callout and hide when the whole callout cannot fit in fog.
- Laser and missile range calculations now enforce the 110% cannon-radius minimum directly, including when loading older saved radius values.
- Newly activated non-cannon systems now start at least 10% beyond the current cannon radius so their rings do not overlap the cannon targeting ring.
- The Fog of War callout is more compact, keeps range-info popups from covering it, and only points at fog that is outside the current reveal radius.
- The Fog of War callout now uses brighter hatch lines inside the highlighted sample circle so the pattern is easier to identify.
- Ring info now includes a Fog of War callout that highlights the diagonal fog pattern and explains that better sensor or weapon range reveals enemies sooner.
- Wide Beam power is no longer capped by Laser Damage level; it can be upgraded to level 10 so its per-target damage matches the focused beam.
- Wide Beam upgrade card now shows actual per-target damage values, matching the Laser Damage card format.
- Wide Beam is now a single upgrade: activates at level 1, then each extra level adds 10% power, capped at the current Laser Damage level.
- Wide beam spread now matches the focused beam colour and scales its opacity to its relative power, making weak spreads nearly transparent.
- Fixed a regression where enemy visibility and the Special Weapon stun radius ring disappeared; restored the missing stun radius increment constant.
- Wide Beam Power upgrade added: increases wide beam destruction by 10% per level (max 10 levels).
- Wide Beam draws a cone spread at Kamikazes (1/10 focused damage each) instead of three thick beams.
- Focused Fast/Boss laser beam restored to a thin single beam.
- Enemy reveal radius now follows the laser's effective firing range so purchased Laser Range upgrades keep targets visible.
- Fixed enemy visibility regression from the laser split; laser acquisition now provides its own reveal radius.
- Laser System is now split into independent Damage and Range upgrades.
- Laser radius anchors at acquisition range and grows via its own upgrade.
- New Wide Beam upgrade sweeps Kamikazes with a wider beam that spreads total laser strength proportionally across its width.
- Missile radius no longer changes when cannon radius is upgraded.
- Sensor range now follows the furthest active radius while keeping its Electronic FOV buffer distance beyond that ring.
- Locked missile trails to Thin Needle and removed the temporary Trail button.
- Tactical Zoom now unlocks unlimited post-cap Missile Radius, Electronic FOV, and Stun Radius upgrades.
- Special Weapons now separates Stun Field strength from Stun Radius.
- Kept Ghost Thin as the default missile trail and replaced the alternate Trail selector entries with nine thinner/smoother variants.
- Made Ghost Thin the default missile trail style and reset the Trail selector storage so the live build opens on it.
- Made Ghost Smoke the default missile trail and added ten Ghost-style variants with white smoke starting behind the missile and orange flame layered over it.
- Added a temporary Trail button with the current missile trail as Default plus ten longer flame-to-smoke trail variants for testing.
- Locked Hatch Lock opacity to the selected former 5/10 tuning and removed the temporary Hatch opacity button.
- Retuned Hatch opacity so 1/10 is the strongest option and the remaining levels get progressively fainter.
- Added a bottom Hatch opacity control with ten saved transparency levels for testing the locked Hatch Lock target disc.
- Missile homing visuals are locked to Hatch Lock, with the temporary style selector removed.
- Hatch Lock shows a dashed ring while searching and a stronger hatched red disc under locked enemies.
- Missile trails are locked to Needle Core and the temporary trail style selector has been removed.
- Follow-up noted: the anime missile massacre trail art needs a stronger dedicated visual pass.
- Defense Systems now uses a green outline instead of the cannon purple category colour.
- Weapon colours are now consistent: Cannon purple, Laser yellow, and Missile red for upgrade borders, range rings, and the fired laser beam.
- Retargeting missiles now arc more naturally toward reacquired targets instead of making a sharp snap turn.
- Missiles now have white anime-style bodies with red tips and smoky trails that fade from white to grey to transparent.
- Missile trail art: revisit the Macross/Itano-style missile massacre look. Needle Core is the current best option, but the trails still need a stronger custom visual treatment than the tested selector variants.
- Defense Health is now an unlimited +10% max-health upgrade that shows the current value and next value, including boss and perk health gains.
- Clicking the playfield outside upgrade buttons now collapses open upgrade panels.
- Bullets and missiles now continue across the full visible Tactical Zoom view instead of disappearing at the old unzoomed canvas edge.
- Tactical Zoom now keeps the fog-of-war hash overlay filling the full screen while revealing the correctly zoomed sensor area.
- Missile lifespan now counts actual distance traveled, so retargeted or weaving missiles cannot exceed their travel budget by staying near base.
- Missile tails now shrink from 75% to 90% of travel life, then missiles tumble unguided for the final 10%.
- Missile tails shrink and vanish near end-of-life; the final 5% is unguided tumbling drift that can still hit enemies before expiry.
- Tactical Zoom now fills the full revealed sensor area with stars out to the largest active range, with fog remaining outside.
- Range ring labels now shift apart in screen space to avoid overlapping during Tactical Zoom.
- Range ring label text now stays readable at normal screen size while using Tactical Zoom.
- Tactical Zoom now appears in the main Sensor list directly below Calculate Enemies' Health.
- Added Tactical Zoom under Sensors, unlocked from Calculate Enemies' Health, for pinch or mouse-wheel zooming of the playfield without scaling the UI.
- Macross reload now combines the activation-wave base timer with the within-wave +5s penalty for each previous use.
- Macross Missile Massacre reload starts at 15 seconds on the wave where Macros is first activated, then rises by 1 second each later wave.
- Missiles now fade their smoke and body, wobble, and drift after 75% of their lifespan distance while still dealing collision damage until they expire.
- Added Ordnance Sync and Fire Control AI Sensor upgrades to reduce wasted overlap between cannon, missile, and laser targeting.
- Macross Missile Massacre's +5s recharge penalty resets on each new wave, while repeated uses within the same wave still get progressively slower.
- Every Macross Missile Massacre launch adds 5 seconds to the next recharge, making repeated use progressively slower to come back.
- New Lifespan missile upgrade: travel allowance starts at base-to-radius +10% and each of 8 grades adds another 10% (maxed matches the old limit).
- New Retarget upgrade (offshoot of the Radius card): the base reassigns a surviving missile to the closest enemy inside its missile targeting ring.
- The homing radius circle draws around the missile's locked target, and only around the missile itself while it hunts for a new one.
- The Smart AI card now branches off the Macros card in the upgrade menu.
- The Macross button moved from the bottom bar to a card under XP Boost with a recharge progress bar that turns green when ready.
- The homing radius toggle moved onto the Homing upgrade card; Homing now upgrades to 80% (8 grades); the radius circle is fainter.
- The Macross volley is capped at 200 missiles.
- Braided is the only missile flight style; the style-cycling button was removed.
- New Smart AI upgrade for the Macross volley: health-based missile allocation across enemies closest-first (70%–100% accuracy over 4 grades), with spare missiles fanning out in all directions.
- New homing radius visibility toggle showing each missile's acquisition circle.
- XP Boost now stacks as up to seven timed layers: each charge doubles fire rate and appends a shorter duration to the active boost tail.
- Missile styles are now Itano, Helix, and Braided; Braided combines the burst and corkscrew feel into twisting convergent strikes.
- Enemies are now visible inside any active targeting or sensor radius, fixing invisible missile targets outside sensor range.
- XP Status no longer duplicates Boost charge details, and its Manual Laser hint hides after Manual Targeting is purchased.
- XP Boost moved into the upgrade menu as a clickable progress-card with the active multiplier and countdown shown directly on the button.
- Wave reward choosers now offer 3 deterministic options based on wave number, removing random reward luck from high-score runs.
- XP kills bank charges on a new XP Boost button; each press doubles fire rate, stacking with halved durations (20s, 10s, 5s...).
- Splitter children dodge sideways out of the bullet stream when they spawn.
- Repair Crew overheals past max health; active perks show in a HUD readout; Bounty Contract bonuses appear in the floating kill text.
- Enemy archetypes, wave rewards, and Juice FX are now always on; debug toggles removed.
- Macross-style missile choreography with four switchable flight styles (bottom "Missiles" button); cheaper first missile purchase and up to 12 missiles.
- Parallax starfield inside the visible sensor circle and a soft glow on the base; the fog outside stays greyed out to mark sensor coverage.
- Juice FX pass behind the debug toggle: floating credit/damage text, hit-stop on kills, screen shake, and kill-combo callouts.
- Pick-1-of-3 wave reward perks after each cleared wave, behind the debug "Wave Rewards" toggle.
- Four experimental enemy archetypes (Splitter, Shielded, Healer, Kamikaze swarm) behind the debug "Enemy Archetypes" toggle.
- The hidden debug menu (Q) now has persistent ON/OFF toggles for upcoming experimental features: Enemy Archetypes, Wave Rewards, and Juice FX.
- Internal cleanup: split the monolithic draw routine into focused layers, removed dead and duplicated drawing code, and trimmed a redundant per-frame pass over the enemy pool. No intended gameplay or visual change.
- Q on the leaderboard screen now cleanly toggles cheat scores on and off for everyone, without affecting the in-game debug menu.
- Leaderboard scores from runs that used the debug credit cheat are flagged and
hidden from normal players; cheat users (or anyone with the debug menu open
via Q) see them marked with
[Q].
- Refactored the single-file internals so upgrade definitions and initial game
state are easier to maintain while keeping
index.htmldirectly playable. - Added workflow guidance that every testable local change should bump the visible version and changelog before handoff.
- Saved active battle objects so hard-refreshing the page can restore enemies, projectiles, particles, and wave state instead of resuming with an empty field.
- Preserved stacked-wave progress on load and added smoke-check coverage for the runtime save format.
- Greyed out fully maxed upgrade categories and maxed upgrade rows while keeping them clickable for review.
- Improved ring info label placement so large range labels stay out of the right-side status panels and remain anchored to the visible ring edge.
- Centralized the displayed game version so the browser title and start screen use the same source value.
- Tightened leaderboard validation documentation to match the Firebase rules.
- Improved small-screen HUD and control wrapping so the game controls fit more reliably on mobile viewports.
- Added save metadata and migration validation so old local saves remain loadable while future save changes have an explicit compatibility check.
- Fixed stored preference parsing so setting music volume to zero remains muted after reload.
- Added a local smoke-check script for version consistency, Firebase rule validation, single-file assumptions, and inline JavaScript syntax.
- Removed stale implementation comments and unused missile placeholder state from the single-file game.
- Improved the opening sensor warning layout so the text is centered and constrained.
- Enemy Info now defaults to Inline mode when starting a new game.
- Inline enemy cards use shorter wrapped locked-health messaging.
- Loaded save games now resume immediately instead of starting paused.
- Time-speed controls now dock under the Time Control upgrade category.
- Fog of war now uses a grey hidden-area overlay with repeated dark hash marks and recurring FOG labels.
- Bumped the game version after 17 merged updates on May 27, 2026.
- Added purchasable time-control upgrades that unlock wider speed limits.
- Moved compact time-speed controls beside the sensor controls.
- Added an SFX toggle for beep sound effects.
- Restyled ring info and inline enemy HUD cards with theme-aware translucent panels and clearer text.
- Improved enemy stat panels with health-based sorting, corrected wave speed scaling, cleaner alignment, and less duplicate HP text.
- Moved the Send Next Wave button into the Battle Status panel.
- Improved theme readability, including the renamed Neon theme and Pixel Black and White HUD contrast.
- Fixed ring, targeting-range, and canvas layering so HUD and range information render above shadow and overlay effects.
- Clarified labels for unidentified non-enemy objects.
- Start screen now warns the game is still in development.
- Title increased in size and simplified to "Orbital Defense".
- Show the lowest undefeated wave on the Game Over screen.
- Leaderboard scoring now uses the earliest unfinished wave.
- Remaining enemy count is displayed during each wave.
- Leaderboard uses the earliest active wave when calculating scores.
- Info upgrade uses a standalone layout without connecting lines.
- XP enemy despawns instantly when a boss is destroyed.
- Leaderboard ranking now uses
wave * 100000 - timeand stores only the top 10 scores. - The global leaderboard is fully operational.
- Minor bug fixes.
- Added Electronic FOV sensor upgrade with visible radius ring.
- Enemies outside the sensor radius remain hidden until entering it.
- Added Sensors upgrade category with enemy outlines, health bars and targeting AI.
- Targeted enemies now keep solid red brackets for a short time.
- Polished upgrade lines and swapped triangle notches for rectangles.
- Redesigned upgrade menu with flowchart layout and visible costs.
- Categories highlight when affordable upgrades are available.
- Missile homing fixed with range limit and wave timer resumes correctly.
- Upgrade categories can now be expanded or collapsed.
- Reduced upgrade button font size so long labels fit.
- Minor optimizations.
- Added a clickable Focus Radius selector that saves your preference.
- Updated version references and refined notch visuals.
- Removed redundant code for a leaner single-file build.
- Major UI overhaul with a more compact HUD and screens.
- Introduced a Debug panel for quickly awarding credits.
- Added the Focus Radius upgrade and visual ring indicator.
- Implemented missile homing improvements and toggle controls.
This project is licensed under the MIT License.