Repository navigation
Castlevania: Symphony of the Night, running natively on Android. Not an emulator — the
PlayStation code is statically recompiled into C# and built into a real app.
A fix release on top of Beta 0.10, all of it about save states and controllers.
Tested on a Retroid Pocket 6.
Fixed
Loading a save state now restores the music. This is the big one, and it had two
separate causes stacked on top of each other.
Three quarters of this disc is streamed audio — 172,972 of its 229,020 sectors — so on SOTN
the soundtrack is not sequenced, it is read off the disc as you play. Which track you hear
depends on where the drive is sitting and which channel it is filtering. None of that was
part of a save state. So loading one restored the game's memory while leaving the drive
exactly where the current session had left it, and the game had no reason to re-issue a read
it believed it had already made.
The result was oddly specific: load a state from the main menu and the menu's theme carried
on playing over the restored room. Walk into the next room and it corrected itself, because
that made the game ask the drive for music again. From a freshly launched app the drive could
still be near the start of the disc, where the first streamed audio is the game's opening
narration — so a boss room could greet you with Richter's opening line, which is at least
funny.
The drive's position, channel filter and mode are now saved and restored with the state.
Sound effects and voices no longer come back wrong. The same absence, one layer down. The
PlayStation's sound chip has its own half-megabyte of sample memory, and the game fills it
once when you enter an area; after that it only says "play the sample at this address". A
save state restored the game's bookkeeping about which sample was where, but not the samples
themselves — so those addresses still resolved, just to whatever the previous session had
loaded. The sample memory, all 24 voices and the mixer registers now travel with the state.
Two earlier attempts at this fought it from the wrong side, by resetting or silencing the
sound chip on load. One left the game permanently mute; the other kept the volume but stopped
the music. Neither could have worked, because the state simply was not there to restore. It is
now.
A controller connected after the game is already running is picked up. Reported with a
wired USB-C pad, but it was never about that pad — nothing attached after startup was ever
noticed. The only scan happened once during launch, before Android had finished enumerating
its input devices, so a pad was found by luck. Built-in controls usually got lucky; a USB-C
pad, which you plug into a phone that is already running, never did. Connecting and
disconnecting are both noticed within a frame now.
A controller no longer takes the game down with it. Opening certain pads makes the input
layer leave a harmless complaint behind — the pad opens and works fine — but that message is
sticky, and the layer above treats any pending message as a failure. The frame after a
controller was opened could die and stop the game.
Added
⚙ MENU → System → Controllers. A pad that does nothing has more than one cause: the
system never saw it, or it was seen but has no button mapping and cannot be driven. From the
outside those look identical. This screen lists every controller the system reports, marks
each Usable or No button mapping, shows which player slots are filled, and can scan again
without restarting. If a pad still misbehaves, photograph this screen for the bug report.
Save and load results are also written to the device log now. Previously a failure appeared
only as a toast, which is gone by the time anyone thinks to describe what happened.
Worth knowing
Your existing save states still work. States from 0.10 have no drive section and load
exactly as they did before; states from before 0.10 have neither. Only states written by this
version get the full treatment, so re-save anything you care about if you want the music fix
to apply to it.
Save states are a little larger again — the sound chip's sample memory adds about half a
megabyte on top of the roughly 8 MB each slot already used.
Memory cards are unaffected.
Install
The APK holds no game data. You supply your own disc the first time you open it, and the app
never asks again. Android 5.0 (API 21) or newer, arm64 or x64.
This is not affiliated with or endorsed by BlackLabelHQ. Please don't take questions about
this port to their repo or their Discord — bugs here are mine. See the README for the longer
version of that.