v0.9.0
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
.lbasaves 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/CosTabarrays 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 singlelba2cc.exeinto 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), seedocs/RELEASING.md. - Product metadata (executable name, display name, description, desktop ID) centralized into CMake cache variables so the runtime window title,
.desktopentry, and AppImage script all consume one source (#83). Window title now shows the version (e.g.LBA2 Classic Community 0.9.0-dev) — previously justLBA2. - Default binary renamed
lba2→lba2ccto avoid colliding with the retail executables (lba2.exe,tlba2.exe,tlba2c.exe). Path is nowbuild/SOURCES/lba2cc[.exe]. Override-able via-DLBA2_EXECUTABLE_NAME=...for anyone shipping a custom branded build. - Windows.exenow 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,.desktopentry, and AppImage labels. Pre-release versions (anything carrying-dev/-dirty/-rcsuffix) are flagged withVS_FF_PRERELEASEinVERSIONINFO. - 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-formatwith checked-in config; ASM andLIB386/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
--bisectfor 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
- AGENTS.md — principles, "never" list, "when modifying X do Y" table for AI assistants and human contributors
(#40) - docs/GLOSSARY.md, docs/LIFECYCLES.md, docs/SCENES.md — engine reference (#25, #26)
- docs/MENU.md, docs/CONFIG.md, docs/SAVEGAME.md — subsystem references (#30)
- docs/CONSOLE.md, docs/DEBUG.md, docs/CAMERA.md, docs/FEATURE_WORKFLOW.md
- docs/PLATFORM.md — host-assumptions map (pointer width, endianness, FPU semantics, OS boundaries), docs/PLATFORM_AUDITS.md — per-file audit logs hung off it (#85, #88)
- docs/ABI.md — disk-layout patterns for fat structs on 64-bit (#67)
- docs/CRASH_INVESTIGATION.md — AddressSanitizer + gdb runbook (#85)
- docs/COMPILER_NOTES.md, docs/TESTING.md
- docs/FRENCH_COMMENTS.md and docs/ASCII_ART.md — preservation catalogs
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:
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