Homeworld: Unbound 0.4 — one APK, and a crash worth writing down
The headline is that there is one APK now instead of two, and it plays either campaign. But the bug fixed on the way is the more interesting story.
Hyperspacing out of a mission crashed the game
Every mission transition, not just the second. It simply had not been reached before, because far more hours had gone into the first mission than into getting out of it.
The backtrace landed fifteen frames deep, in the texture registry, nowhere near the VR code responsible:
singlePlayerLoadNewLevel -> trRegistryRefresh -> HorseRaceNext
-> horseRaceRender -> rndFlush -> vrFrame -> vrRenderEyes
-> rndMainViewRenderFunction -> ... -> trNoPalMakeCurrent <- SIGSEGV
Read it bottom-up and the cause is plain. The VR frame rides rndFlush, which
is deliberate. But the loading bar also calls rndFlush every time it
advances. So each tick of the progress bar ran a full stereo frame, rendering
the world while the texture registry was midway through freeing and reloading
every texture. The renderer asked for one that had just been torn down.
The fix is to not draw the world while a level is loading. Nothing is lost: there is no coherent world to draw, and the loading bar is on a separate layer.
One APK
The demo/full split was compiled in — it selects the .big file opened, the
music and speech filenames, and the mission list itself, that last one as a
literal array. No single binary can present both.
So the APK carries both builds and chooses at launch by whether your game data is present. The demo assets ride inside it and unpack on first run, so it plays the moment it installs. Drop your own copy’s files in and the next launch is the full campaign, with the demo files that would otherwise shadow it cleared automatically.
Commanding
B is the attack button — hold and release to attack what you point at, or pull the trigger during the hold and sweep to collect several targets for one order. Drawn routes are now flown as curves rather than as a chain of waypoints: a single destination slides along the route ahead of the fleet, and the existing move order is steered rather than reissued, so nothing pivots or restarts its engines at every point. Your objectives moved to the wrist, because the game hides them behind the Hyperspace button on any mission where you can hyperspace.