Selected work

Case study / 05

Wizball Remake — Legacy C++ Revival

Legacy software recovery and modernisation

A recovery and modernisation of Graham Goring’s Retrospec Wizball remake, prompted by wanting to play it on a Linux handheld. After locating the surviving source, I directed the revival independently, choosing the architecture, guiding coding-agent implementation and testing the game through to its release on PortMaster.

Modernisation boundaryPreserve the game · replace the ageing platform layer

The recovered game engine, scripting system and creative content are retained above a modern platform and runtime boundary. That boundary provides SDL2 platform services and feeds an SDL renderer for desktop Linux or a direct OpenGL ES 2.0 renderer for handheld Linux. PhysFS packages shared game data for repeatable desktop, release and PortMaster targets.

Recovered systemGame engine + scripting coreOriginal remake logic · scripts · creative content
Modern platform / runtime boundaryWindow · input · timing · audio · image loading · rendering
SDL2SDL_imageSDL_mixerPhysFS
Desktop LinuxSDL rendererConventional desktop path
ARM handheldsDirect OpenGL ES 2.0PortMaster performance path
data.zipLinux releasesWindows CI packagePortMaster aarch64 + armhf
Modernisation is concentrated around the platform and runtime boundary; the recovered game and scripting core remain the system being carried forward.
Wizball gameplay running through the modern SDL2-based runtime
The recovered 2007 Retrospec remake running through the modern SDL2-based runtime.

01 / Recovery and purpose

Bring the remake to a handheld

Getting an Anbernic RG40XX-H prompted the project. I wanted to play Graham Goring’s Retrospec remake of Wizball on it, rather than an emulated version of the original Commodore 64 game.

The remake was developed in 2006–2007, but by 2026 its source appeared to have been lost. After I contacted Graham, he reached out to Peter Hull, who had worked on the Mac conversion. Peter still had a surviving copy, including the Mac project material.

The archive contained Visual Studio and early Xcode projects, bundled libraries and generated game data. Its runtime depended on Allegro 4, AllegroGL, desktop OpenGL and older FMOD APIs. The initial work established how the engine and data fitted together and brought up a working Linux baseline.

The original game logic, scripting system and creative content provided the foundation for the revival. Modernisation concentrated on the platform dependencies and runtime assumptions that prevented the remake from working reliably on current hardware.

AI-assisted engineering

Coding agents, including Codex and Claude via GitHub Copilot, carried out much of the implementation. My work covered task definition, architectural decisions, reviewing and redirecting changes, and acceptance through builds, diagnostics, gameplay and device testing. The project also became a practical way to develop that engineering workflow against an unfamiliar legacy codebase.

02 / Runtime and performance

Choose portability, then test it on the device

SDL2 was chosen as a cross-platform foundation with support for desktop systems and a possible Android version. Window management, input, timing and rendering moved behind a platform boundary, with SDL_image handling image loading and SDL_mixer replacing the legacy audio path.

The initial SDL rendering path worked well on the desktop but was too slow on the handheld. Reviewing the alternatives led to a direct OpenGL ES 2.0 renderer, supported by PortMaster. Draw batching, texture handling, scaling and viewport behaviour were adapted for the device, while the conventional SDL renderer remained available for desktop use.

Testing on the RG40XX-H guided that work. A functioning renderer was an intermediate result; acceptable performance had to be established through actual gameplay on the handheld.

The platform boundary also supported the later Android version, which builds the native engine through Gradle and the NDK, uses the GLES2 renderer and adds a touch-control overlay.

03 / Playing and testing

Make the game suit interrupted play

A game of Wizball can occupy a long session, while handheld play is often interrupted. Save-and-continue was added so a run could be stopped and resumed later without losing progress.

Restoring a run required corrections to entity state and bonus-stage behaviour. Saving also needed to be quick enough to use comfortably on the handheld. Removing unnecessary work from the save and load path made the feature practical for short sessions.

Gameplay testing exposed assumptions elsewhere in the recovered engine: asset-name case differences, incomplete resource loads, unchecked references and input or simulation behaviour coupled to display refresh. A portal failure was traced to its frame-zero state being indistinguishable from an uninitialised value.

Diagnostic logging, defensive loading, explicit validation and a sanitizer-enabled build configuration supported investigation. Repeated desktop and handheld play provided the evidence that changes worked in the game, alongside source review and build checks.

04 / Delivery and current status

Package the game for players

A release needed both the executable and a dependable route from source assets to packaged game data. CMake defines the native builds, while the game’s existing data-generation modes run headlessly to rebuild scripts, tile sets and tile maps.

PhysFS provides access to a shared data.zip package across desktop, PortMaster and Android builds. Writable configuration, scores and saves remain outside the packaged assets.

GitHub Actions builds the game data once, then produces Linux and Windows packages and PortMaster binaries for aarch64 and armhf. A separate assembly stage combines both handheld binaries with the launcher, metadata, controller mapping and game data.

The PortMaster submission was accepted and the game is available through its catalogue. Submission testing led to startup-script adjustments, with no changes required to the game itself. It runs well on my Anbernic RG40XX-H and has also been tested through gameplay on my Linux and Windows desktops.

The Android version is operational in emulator testing. Earlier memory and lifecycle problems have been resolved, with work continuing on the touch-control overlay before release.

Provenance and credits

The original Wizball was released by Sensible Software in 1987, designed by Jon Hare and Chris Yates, with programming by Chris Yates, graphics by Jon Hare and music by Martin Galway.

The 2006–2007 Retrospec remake was programmed by Graham Goring, with graphics by Trevor “Smila” Storey, music and arrangements by Infamous — Chris Nunn — and a Mac conversion by Peter Hull. Scott Wightman contributed the original Linux conversion effort. This case study covers Craig Chandler’s 2026 recovery and modernisation of that work.