monkeylashes
← Homeworld: Unbound

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.