Skip to content

v0.9.0

Choose a tag to compare

@github-actions github-actions released this 09 May 19:18

What's Changed

The list below is hand-curated from merged PRs and tells the story of the
fork's evolution.

Highlights since the fork

The biggest architectural shift is portability. The playable game now builds as pure C/C++ against SDL3 and libsmacker, with no ASM toolchain on the build path. The original 16/32-bit x86 assembly is still in the tree as the source of truth and powers the ASM↔C++ equivalence tests, but it no longer runs in the playable binary. Native builds for Linux x86_64, macOS arm64/x86_64, and Windows (MSYS2 UCRT64). Community members are already running it on handheld devices in the wild.

Stability & 64-bit hardening

  • Magic-school grand-wizard crash on 64-bit hosts — fixed (#78, #84). U32+pointer-wraparound trap in CopyMask, pinned by a host-only regression test.
  • Renderer-side U32+pointer-wrap class named, documented, and swept across ~80 files in SVGA, pol_work, 3D, 3DEXT, GRILLE, INTEXT — one bug fixed (above), six "safe by convention" latent traps recorded (#85, #86, #87, #88, #89, #90) - Endgame credits segfault on 64-bit hosts — fixed (#65, #66)
  • Legacy 32-bit .lba saves load safely on 64-bit builds, with a corpus harness to prevent regressions (#62, #63)
  • 32-bit on-disk ABI rule and credits HQR layout codified in docs (#67)
  • Linux exterior draw-order bug — SinTab/CosTab arrays merged into a single contiguous block to match the original ASM layout (#55)
  • Compiler warnings cleaned up across GCC, Clang, and MinGW (#52)
  • Bezier C++ memory corruption — fixed (#8)

New features (opt-in)

All new features default-off or default-to-original-behavior.

  • Quake-style debug console: built-in, always available, configurable toggle key, host-tested (#23, #24, #60) — see docs/CONSOLE.md
  • SDL3 gamepad support (#38, #58)
  • Optional exterior auto-camera centering (FollowCamera) (#37, #50) — see docs/CAMERA.md
  • Menu mouse QoL: hover, selection, marquee for long text, keyboard takes priority over mouse hover (#41, #53, #56)
  • Original Adeline debug tools re-enabled behind DEBUG_TOOLS=ON (#17, #22) — see docs/DEBUG.md

Game data, config, and UX

  • Auto-discovery of retail game data (./data, ../LBA2, LBA2_GAME_DIR, --game-dir); embedded default config; clearer startup errors
    (#54) — see docs/GAME_DATA.md
  • Menus reorganized to match LBA2 Original from GOG (#42)
  • Menu language selection (#42)
  • Menu music and jingle handling — fixed (#43)
  • Case-sensitive music paths on Linux — fixed (#12)

Audio/video backends

  • SDL audio backend with Miles parity gap tracking (#27, #28, #9)
  • SDL renderer presentation path with LTO and inline rotates (#11, #51)
  • Early SDL bring-up for renderer/audio in the fork's first cross-platform phase, plus follow-up SDL3 AIL-linking fixes (#6, #9, #11, e9ba7d8)
  • Smacker FMV via libsmacker; video audio routed through the AIL backend (#10, #29, #35)

Ported (ASM → C++)

  • Object display, rendering helpers, and supporting math via the ASM-validation framework, with byte-for-byte equivalence tests (#31, #32)
  • Early renderer/SVGA/object-display ASM→CPP ports (polygon fillers, blitters/sprites, and object rendering), which established the base for later validation-driven porting work (#6)
  • See docs/ASM_TO_CPP_REFERENCE.md for the full port-status table.

Cross-platform & build

  • First Linux release artifact: AppImage built in CI from an any-linux base, packaged as a single portable binary (#74)
  • First Windows release artifact: a portable ZIP (lba2cc-<version>-windows-x64.zip) built in CI under MSYS2 UCRT64 with SDL3 and the GCC C++ runtime static-linked. Drop the single lba2cc.exe into your existing LBA2 install folder — no DLLs, no installer, no registry entries. Follows the same release-workflow conventions as the AppImage flow (matrix build → idempotent gh-release attach), see docs/RELEASING.md.
  • Product metadata (executable name, display name, description, desktop ID) centralized into CMake cache variables so the runtime window title, .desktop entry, and AppImage script all consume one source (#83). Window title now shows the version (e.g. LBA2 Classic Community 0.9.0-dev) — previously just LBA2.
  • Default binary renamed lba2lba2cc to avoid colliding with the retail executables (lba2.exe, tlba2.exe, tlba2c.exe). Path is now build/SOURCES/lba2cc[.exe]. Override-able via -DLBA2_EXECUTABLE_NAME=... for anyone shipping a custom branded build. - Windows .exe now ships with an embedded application icon and populated File Properties → Details (Product Name, File Description, Product Version, Original Filename). Strings flow from the sameLBA2_* cache vars that feed the runtime window title, .desktop entry, and AppImage labels. Pre-release versions (anything carrying -dev/-dirty/-rc suffix) are flagged with VS_FF_PRERELEASE in VERSIONINFO.
  • macOS CI build (arm64); macOS x86_64 preset (#52)
  • Portable Windows build via MSYS2 UCRT64 (#14) — see docs/WINDOWS.md
  • CMake presets for Linux, macOS arm64/x86_64, Windows UCRT64, and cross-compile Linux→Windows (#21)
  • SDL3 throughout (audio, video, renderer)
  • Default Windows preset switched to Release
  • clang-format with checked-in config; ASM and LIB386/libsmacker/ excluded (#36)
  • Host-only discovery tests run on Linux/macOS/Windows in CI without Docker or retail files (#54)

Tests

  • ASM↔CPP equivalence test framework with byte-for-byte assertions and randomized stress rounds (#31) — see docs/TESTING.md
  • Polyrec replay with --bisect for finding the first divergent draw call between ASM and CPP renderers
  • Tightened assertions across POLYFLAT, POLYGOUR, POLYDISC, POLYTEXT, POLYGTEX, AFF_OBJ, FPU precision, and the resampler (#44)

Documentation

Pre-PR foundations

Most of what made this fork buildable and cross-platform predates the PR workflow. The themes from that direct-commit era — CMake build system and MinGW cross-compile to Windows (@leokolln), macOS M1 build, the bulk of the LIB386 ASM→C++ port, and the ASM↔CPP equivalence test infrastructure (@sergiou87), early renderer/SVGA/object-display ASM→CPP ports (@xesf), all building on @yaz0r's original buildable
prototype — are credited under Contributors below.

The earliest PR-tracked entries that sit alongside that work:

  • File encoding preservation (#1)
  • Preservation docs and build configuration clarity (#13)

Contributors

Thanks to everyone who's worked on this fork to date:
@gwen-gg,
@innerbytes,
@leokolln,
@Link4Electronics,
@noctonca,
@sergiou87,
@xesf,
@yaz0r.

Special thanks to the contributors whose foundational work this fork stands on:

  • @sergiou87 — macOS M1 build, the bulk of the LIB386 ASM→C++ port, and the ASM↔CPP equivalence test infrastructure that makes the cross-platform port verifiable.
  • @leokolln — the cross-platform build foundation: CMake build system and presets, MinGW cross-compile to Windows, UASM ASM modernisation, 64-bit Linux preset, AIL sound backend structure, and Linux CI.
  • @xesf — implementation work across SVGA, 3D object rendering, brick handling, and AffString, plus the CopyMask Tavern crash fix and widescreen Steam Deck work.
  • @yaz0r — the original buildable prototype that the cross-platform fork was built on.

A big thank you to Gwen Gourevich (@gwen-gg) and 2.21 for open-sourcing the original code, and to the original Adeline
Software team whose code this builds on.

Full Changelog: https://github.com/LBALab/lba2-classic-community/commits/v0.9.0