Skip to content

Releases: sergiomanzur/cvlod_recomp

v0.2.31 - Android S24 fixes + Windows build

Choose a tag to compare

@sergiomanzur sergiomanzur released this 29 Sep 21:36

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

Choose a tag to compare

@sergiomanzur sergiomanzur released this 29 Sep 13:16

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

Choose a tag to compare

@sergiomanzur sergiomanzur released this 17 Sep 06:03

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 0xC0000005 at 0x80960008 by 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 0x20000000 in 0x801CABC8 with 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.
  • 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: bf3391ef43c276e631c65a9ffad9facede2a8a696782a0a6a32260e070617f29
  • LodRecomp-v0.2.28-android-arm64-x86_64.apk: 8aedf37ae6627a83aae93f024e5c3a386ad9cf76ba67a04f03a52b803848cdd9

v0.2.27 - Android port

Choose a tag to compare

@sergiomanzur sergiomanzur released this 22 Aug 03:58

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 the LodRecompAssets CMake target, which cannot
    apply to an APK), so lod_launcher.rml failed to load and the resulting null
    ElementDocument was dereferenced. Assets are now staged into the APK and unpacked
    to filesDir on 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, so vkAllocateDescriptorSets returned
    VK_ERROR_OUT_OF_POOL_MEMORY and the failed allocation left a null handle that was
    dereferenced later. Shipped as patches/plume.patch.
  • Broken, crackling in-game audio. Three separate defects:
    1. 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.
    2. SDL_AudioCVT is stateless, restarting the resampler phase at every buffer.
      Replaced with SDL_AudioStream; measured boundary discontinuities dropping from
      130x the background rate to 4x.
    3. 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.
  • Null ElementDocument in create_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 in cheats.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.py applies the vendored patches/ to the
    submodules; the Gradle build runs it automatically. patches/plume.patch is
    required or the game crashes on "Start game" on Adreno. patches/rt64.patch also
    supplies file_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 use assembleRelease.

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-as is refused when the package is
    not debuggable and fprintf(stderr, ...) does not reach logcat.
  • The portrait splash rarely appears, as MainActivity is locked to landscape.