Repository navigation
Releases: sergiomanzur/cvlod_recomp
Release list
v0.2.31 - Android S24 fixes + Windows build
Android
- Touch controls appear by default on a fresh install. The always-visible HIDE/SHOW button lets you toggle them during gameplay; existing control preferences are respected.
- Fixed the crash after choosing a ROM and tapping Start game on the Galaxy S24 Ultra by handling framebuffer compute pipelines rejected by its Vulkan driver. The game reached the title screen on the reported S24 Ultra.
- Fixed in-game audio crackling on the S24 Ultra. Audio driver selection now happens before SDL initializes audio; the device opened OpenSL ES at 48 kHz, and the tester confirmed the music sounds good.
- The ROM picker uses Android's document picker and copies the selected ROM into app-private storage. No broad storage permission or Android/data folder is needed.
The Android APK includes arm64-v8a and x86_64. It updates the previous release in place and preserves app data. No ROM is included; select your own legally dumped Castlevania: Legacy of Darkness (USA) ROM. On devices that reject the framebuffer compute pipelines, some framebuffer-based effects may render differently.
Windows x64
The Windows package is rebuilt from this release. Extract the ZIP and keep its DLLs and assets beside LodRecomp.exe. No ROM is included.
SHA-256 files are attached beside each download.
SHA-256
- Android APK:
231eddb4da8616e6fde1b9948fe774ac128c80eafd04099c70c79bd32bb91eeb - Windows ZIP:
24ae3fe6f9768b33a9eb1f41e7f3be0b6aa92ed491d3a0287fd0359db6ac82fe
v0.2.30 - Android ROM picker fix + Windows build
Android ROM picker fix
- Select ROM in the launcher now opens Android's document picker. The chosen ROM is copied into app-private storage and validated before Start game becomes available.
- Cancelling the picker and failures while copying the ROM now show distinct launcher messages.
- The Controls screen clarifies that on-screen controls appear during gameplay, after the menu closes. The overlay is off by default and can be enabled under Settings → Controls.
No ROM is included. Pick your own legally dumped Castlevania: Legacy of Darkness (USA) ROM from Downloads or another document provider. There is no Android/data folder to fill and no broad storage permission to grant.
The Android APK contains arm64-v8a and x86_64. It has version code 230 and the same signing certificate as the published v0.2.28 APK, so it can update that release in place. The release build succeeded and the touch hit-testing suite passed 47 checks. Android 16 / One UI 8.5 still needs an on-device check.
Windows x64
Extract the Windows ZIP, keep its DLLs and assets beside LodRecomp.exe, and launch the app. The package contains no ROM. The Windows build completed and the packaged executable passed a five-second launch smoke test on Windows.
SHA-256
- Android APK:
650de55b3e935cdcfed0500372628506676999dd61a02d5e63a44ca4ae6d33ba - Windows ZIP:
38836ab2b48672a774fc1858030e84b7e19f0ccb5bfd083f609b64607d391da6
v0.2.28 - Android & Windows Issue Fixes
Castlevania: Legacy of Darkness Recomp — Release v0.2.28
This release includes stability, gameplay, and graphics fixes addressing issues reported on upstream for both Windows and Android.
Fixes & Enhancements
- Controller & Keyboard Menu Toggle (fliperama86#28): Added customizable binding support for opening and closing the config menu (
recomp::GameInput::TOGGLE_MENU). Scanning for a new toggle button no longer erroneously cancels the prompt. - Carrie Stage 4 Vampire Boss Battle Crash (fliperama86#29): Resolved access violation
0xC0000005at0x80960008by expanding KSEG0 RDRAM mirror from 8MB to 256MB and adding a physical RDRAM guard range. - Henry Scenario Transitions, Missing Objects & Input (fliperama86#27, fliperama86#31, fliperama86#33, fliperama86#35, fliperama86#36):
- Fixed transition lock
0x20000000in0x801CABC8with overlay Pair 129 tracking and a gameplay watchdog restoring object dispatch (crystals, NPCs like Edward, rock crusher floor) and pause menu controls. - Eliminated stuck full-screen black overlay in RT64 during gameplay transitions.
- Fixed transition lock
- Build Improvements:
- Full native MSVC compilation support for Windows x64.
- Optimized release APK with touch controls and audio for Android (arm64-v8a & x86_64).
Checksums
LodRecomp-v0.2.28-windows-x64.zip:bf3391ef43c276e631c65a9ffad9facede2a8a696782a0a6a32260e070617f29LodRecomp-v0.2.28-android-arm64-x86_64.apk:8aedf37ae6627a83aae93f024e5c3a386ad9cf76ba67a04f03a52b803848cdd9
v0.2.27 - Android port
First release with an Android port. Desktop behaviour is unchanged.
Android port (new)
Validated on a Retroid Pocket 6 (Snapdragon 8 Gen 2, Adreno 740, Android 13).
LodRecomp-v0.2.27-android-arm64-x86_64.apk contains arm64-v8a and x86_64.
Vulkan 1.1 is required. No ROM is bundled — the launcher asks you to pick your
own legally dumped Castlevania: Legacy of Darkness (USA) ROM on first run.
Fixes that made it playable
- Launcher crash after picking a ROM. The shared
assets/tree was never packaged
into the APK (desktop gets it from theLodRecompAssetsCMake target, which cannot
apply to an APK), solod_launcher.rmlfailed to load and the resulting null
ElementDocumentwas dereferenced. Assets are now staged into the APK and unpacked
tofilesDiron launch. - Crash on "Start game" (Adreno). RT64 sized the Vulkan descriptor pool to the
requested variable descriptor count, while Adreno accounts it against the count
declared in the set layout, sovkAllocateDescriptorSetsreturned
VK_ERROR_OUT_OF_POOL_MEMORYand the failed allocation left a null handle that was
dereferenced later. Shipped aspatches/plume.patch. - Broken, crackling in-game audio. Three separate defects:
- An off-by-2 in the resampler discard pointer - the length dropped 4 frames while
the pointer advanced only 2, so every buffer replayed 2 frames and lost 2. SDL_AudioCVTis stateless, restarting the resampler phase at every buffer.
Replaced withSDL_AudioStream; measured boundary discontinuities dropping from
130x the background rate to 4x.- The real cause:
osAiGetLength()reported the whole SDL queue depth, while real
AI hardware holds about two buffers. The game concluded its audio was covered,
stopped generating, and re-submitted its current buffer - 54% of all submissions
were byte-identical repeats. Capped to what hardware could hold: 0% duplicates,
100.2% of realtime throughput.
- An off-by-2 in the resampler discard pointer - the length dropped 4 frames while
- Null
ElementDocumentincreate_context()now reports the offending path instead of
crashing somewhere unrelated later.
Features
- On-screen touch controls (Settings -> Controls, off by default). Full N64 layout
plus a MENU button, which is the only way to reach the emulator menu on a device
with no keyboard or controller. Input is additive, so it works alongside a physical
pad. Hit areas are aspect-corrected so they are circular rather than squashed. - Cheats tab with six toggles: invincibility, money, red jewels, all consumables,
max power-ups and Henry's ammunition. Applied every VI, persisted incheats.json,
with a launcher warning while any are active. - Splash screens (landscape and portrait), launcher icon, and looping menu music that
follows the in-app master volume and mute.
Build notes
- Requires JDK 17: AGP 8.5.1 will not run on Java 8, and this Gradle does not
support newer JDKs. python tools/apply_submodule_patches.pyapplies the vendoredpatches/to the
submodules; the Gradle build runs it automatically.patches/plume.patchis
required or the game crashes on "Start game" on Adreno.patches/rt64.patchalso
suppliesfile_to_c.py, which rt64's CMakeLists invokes but which is untracked
upstream.- Do not build with
-Pandroid.injected.build.abi=...: it marks the APK
android:testOnly=true, which cannot be sideloaded normally. - A debug build is not playable - the recompiled functions compile at
-O0, roughly a
third of full speed. Always useassembleRelease.
Known limitations
- Signed with the Android debug key. Moving to a real key later forces users to
uninstall, which deletes the ROM, saves and settings from app private storage. - Only Invincibility is confirmed working in play; the other five cheats use
verified-looking addresses but are unconfirmed. Writes are bounds-checked, so a wrong
address is a no-op rather than a crash. - Tested on one device and one GPU vendor (Adreno). Mali and PowerVR are untested; a
failed Vulkan descriptor allocation now aborts with the driver limits printed rather
than crashing obscurely. - A release build cannot emit diagnostics:
adb run-asis refused when the package is
not debuggable andfprintf(stderr, ...)does not reach logcat. - The portrait splash rarely appears, as
MainActivityis locked to landscape.