A sharp-eyed inspection of the print files found stowaways: the Hornet and Falcon STLs were shipping with their landing gear still down. Fixed:
The bug. The exporter hides the gear, hook and afterburner groups before triangulating — but the triangle walk only checked each mesh’s own visibility flag, and children of a hidden group kept their own flags set. The renderers hid the subtree; the file didn’t.
The fix. The walk now checks visibility all the way up the ancestor chain. The F/A-18 STL dropped from 58 KB to 29 KB and the F-16 from 50 KB to 21 KB — half the file was wheels.
Every file regenerated. All 22 models re-exported, every zip repacked (PRINTING.txt unchanged — scales and sizes never moved), and the free fishing-boat sample refreshed too. Only the two fighters were affected, but the whole fleet got a fresh, verified build.
Verified on the plate. Side-view wireframes of the new files show the fuselage belly sitting flush at z=0 with nothing hanging below — ready to print wheels-up, as the box always promised.
A batch of details that were bugging the flight line — features first:
Gallery gear toggle. Aircraft in the showroom now pose wheels-up by default, and G drops the gear (and raises it again) on anything that has wheels to show.
Spectate everything.J no longer stops at aircraft — it rides every contact in the bay, nearest first: airliners, MiGs, yachts, freighters, the supertankers, the escorts, and the Big E herself. While spectating, SHIFT+ARROWS or RIGHT-DRAG pans and tilts around the subject, WHEEL or [ ] zooms, and 0 reframes.
Pause means silence. Holding the sim with P now suspends the entire audio graph — engine, lock tones, gatling, weather, all of it — and releasing the pause brings it straight back.
And the fixes:
AI aircraft finally retract their gear. Any gear-equipped AI jet used to fly the whole sortie with its wheels hanging out — gear now comes down only on the ground and on final, and goes up the moment they’re airborne.
SFO’s south end is clear. Three terminal and hangar blocks overlapped the southern stretches of the 01L/01R strips; they’ve been shifted off the pavement. No more clipping a building on short final.
Menu titles cleaned up. The F1–F7 and ESC badges are gone from the MISSIONS rows — the keys work exactly as before, the titles just stopped shouting them.
Analytics were homepage-only. The GA tag only ever loaded on the front page, so every blog entry, tag page, the store and the assets shelf were invisible to it. The tag now ships on every page, through a loader that’s ready for Google Tag Gateway — it tries the first-party path first and falls back to Google’s CDN until the gateway is switched on.
The mission desk wants numbers, so numbers it gets — a proper analytics dashboard, plus the plumbing that feeds it:
New dashboard at /analytics, styled to the squadron: SORTIE RECORD (missions flown, flight hours, ejections), COMBAT RECORD (MiG kills, AIM-9 and AIM-120 fired, hits by type, cannon rounds, gun hits) and PILOT CHOICES — Hornet versus Falcon picks, and how often each free-flight start point gets the nod, bars and all.
Every metric is counted as you play. Missions, flight time, MiG kills, plane and start-point selections, ejections, missiles by type, cannon rounds, missile hits by type and gun hits are all tracked live and kept between sessions. One honest caveat: the dashboard reads the counters in your browser — clear your storage and your record starts over.
Every metric also fires as a Google Analytics event — mission_flown, flight_time, mig_kill, plane_select, start_point_select, ejection, missile_fired, cannon_rounds_fired, missile_hit and gun_hits — so the fleet-wide picture across all players builds in the GA4 property. High-frequency streams (flight seconds, cannon rounds, gun hits) batch up and report once a minute and at the end of every sortie; the rest report the moment they happen.
ANALYTICS DASHBOARD is a main-menu item (key A, opens in a new tab) — and DEMO has left the menu; the attract loop still runs behind the menu as always, it just no longer takes up a row.
Two menu-router bugs surfaced while wiring all this up, and both are fixed:
One keypress was being spent twice. Hitting 2 for FREE FLIGHT used to open the start-point map and — in the very same instant — let that same 2 fall through to the map and pick Oakland for you. The menu now swallows any key it consumes.
F1–F7 work in MISSIONS again. The rows always said F1, F2, F3… but the keyboard router wasn’t listening for F-keys — mouse or nothing. Now the keys do what the badges promise.
A sharp-eared pilot report: "Both ENTER and SPACE fire the weapons. Also, what happened to the audio when weapons selected?" One regression, two symptoms. At some point ENTER had been wired up as a second fire key and weapon selection was shuffled off to TAB — which meant that anyone reaching for ENTER, the Amiga original's weapon key, got a missile in the face instead of a menu. And the selection voice callout ("GUNS" / "SIDEWINDER" / "AMRAAM")? Never broken — the samples are all there and the path works — but the select code only runs when you select, and ENTER users were busy accidentally firing instead. Restored to spec: ENTER cycles weapons (with the voice callout confirming what's live), SPACE fires, TAB kept as an alias and 1/2/3 still jump straight to a weapon. Menu hint line and flight manual updated to match, verified on the harness — ENTER cycles aim120 → aim9 → gun with zero missiles leaving the rails — and the full touch gate re-run at 51/51.
Second field report from the iPhone: "I selected free flight, rotated my device as instructed, and nothing changed — the animation continued to animate." Two bugs in one sentence. Bug one: the pilot was able to select FREE FLIGHT while the blocking overlay was up — it turned out the overlay lived inside #touch-ui (z-index 12), which stacked it below the menu (z-index 20), so in menu state the "blocking" overlay ghosted underneath and taps fell straight through to the buttons. It's now a direct child of the body where its z-60 genuinely tops every gameplay layer, in every state — and the suite gained a regression check that pokes a menu button through the overlay to prove it. Bug two is sneakier: with iOS Portrait Orientation Lock on, rotating the phone never changes the browser viewport at all — the page stays portrait, the overlay keeps spinning, and the pilot is stuck with no idea why. The page can't see the lock switch, so the overlay now says it out loud: sit on the overlay for six seconds and a hint fades in — "STUCK ON THIS SCREEN? YOUR ROTATION LOCK IS PROBABLY ON — Control Center → tap the lock icon" — plus a TAP HERE affordance that requests motion-sensor permission; once the gyro is readable, physically rotating to landscape while the viewport stays portrait lights the hint up in pulsing amber. No sensors, no problem: the static hint still points at Control Center. Full gate: 43/43.
A field report from an iPhone: load the site, rotate as instructed, game crashed. We can't reproduce WebKit in the lab, but the failure shape is a known iOS classic — rotating the device kills or starves the WebGL context, and every iOS generation has its own flavor of it (the canvas-resize memory leak of iOS 14, the context-loss waves of 16.7/17/18). Our code made it worse in two ways: it resized the GL canvas on every resize event — and iOS fires a storm of them mid-rotation with stale geometry — and it had no handler for the context actually dying, so the canvas just went black and stayed dead. From the pilot's seat: crashed.
Two fixes, both verified on the virtual device by forcibly killing the context with the WEBGL_lose_context extension. One: resizing is now debounced and rotation-safe — the geometry storm settles for 180ms (450ms after an orientation change, iOS lands its final dimensions late) before a single canvas re-allocation, degenerate zero-size frames are skipped, and the camera aspect is clamped so a NaN can never poison the projection matrix. Two: a proper context-loss handler — the browser is asked to restore, a GRAPHICS RESET — RECOVERING banner (above) keeps the pilot informed, and if the GPU doesn't come back within four seconds the page reloads itself cleanly instead of sitting dead. Full touch gate re-run after the surgery: 41/41. If you were the pilot who hit this — thanks for the report, and wheels up.
Verdict on the first touch build: needs work — so it got a proper shakedown on an emulated phone (CDP touch emulation + real touch events, not just screenshots). The hunt found three real bugs and one ergonomic crime. THR+/− never worked: the stick's grab zone painted over the throttle buttons and ate every touch — and even fixed, hold-buttons were the wrong idea anyway, so the throttle is now a proper drag-to-set lever: drag it to full, it stays, both thumbs free for the takeoff roll. The DEMO attract ate your next tap: the exit tap's leaked compatibility click landed on whatever menu button sat beneath it; the menu now re-shows a beat later so the stray click dies on the canvas. And the action cluster is tucked tight into the corner so it covers less of the radar display. The full loop — menu, attract, map, plane select, skip, quick-start, throttle, brakes, stick, weapons, gun burst, gear, views, pause, portrait nag, quit — now passes 35/35 scripted touch checks before every deploy.
Three carrier truths restored. The painted angle deck ran to starboard — the deck texture was mirrored, so the strip drifted toward the island instead of away from it; it now angles to port, agreeing with the sponson, the wires and the meatball. The island itself is rebuilt as CVN-65's signature flat-roofed box with billboard radar panels and just a small mast, and it's moved aft of midships where the Enterprise carries it — from the catapult shuttle the bridge now sits 80 metres behind you, out of sight, instead of looming ahead-right. And the journal has a real home: hornetbay.com/blog, with every entry living at its own permalink (this one is /blog/enterprise-island-blog). Old changelog.html links redirect; RSS and the search engines get a sitemap.xml and robots.txt for the asking.
Three fixes in one pass. The gun simply ignored SPACE — only the mouse trigger worked, because the fire code never looked at the keyboard for the Vulcan. Now SPACE and ENTER both fire the selected weapon (hold either for a burst), so weapon select moves to TAB, with 1 / 2 / 3 jumping straight to AMRAAM, Sidewinder or gun. And the tracers themselves are rebuilt: the old bolts were pencil-thin and effectively invisible from the cockpit, so each round now flies as a fat glowing bolt that reads day or night.