What's new since July 20
Colors finally behave (July 21–27)
The Saturn has very little dedicated color memory, and for weeks characters and objects had been stealing each other's palettes: Mudokons flashing wrong colors, levers turning odd shades, elevator barrels going dark.
- Every recurring character in the first level fits into a tiny shared color budget with zero quality loss, so Abe, the Mudokons and the Sligs now get permanently reserved color slots, their colors are correct and stable instead of fighting for space (the idea suggested by @carlos24_).
- Objects like levers and props no longer inherit the colors of whatever was on screen before them.
- Background animations (the elevator chain and platform) no longer flash black and white.
- The elevator barrels got their real colors back: the game was guessing how many colors each image needed and guessing wrong, so the barrels shared a palette with the pull-rope and lost. Now the game measures what each image actually uses.
Cleaner screen transitions (July 29)
When walking from one screen to the next, leftover foreground scenery from the previous screen used to hang on the screen until the new one finished loading. It's now wiped instantly the moment the transition starts.
Real shadows (July 29–31)
Characters' shadows had been drawn as solid dark blobs, all the same size.
- First pass: a checkerboard-dither trick made them roughly 50% see-through, but it looked ugly.
- Final version: the shadows now use a native Saturn hardware feature (VDP2 shadow function) that genuinely darkens the background beneath them: smooth, truly translucent, and costing essentially nothing in performance. They also scale properly: a Slig's shadow matches a Slig, shadows shrink as you jump, and they clip correctly at ledge edges, just like on the PlayStation.
The sideways-Mudokon glitch (July 29)
Mudokons facing back would visibly jitter a few pixels sideways off their shadow. Cause: when the Saturn mirrors a sprite, some invisible padding pixels got mirrored to the wrong side, pushing the character over. Flipped sprites are now anchored from the other edge, so characters sit exactly on their shadows in both directions.
️ Crash-proofing (July 31)
Wesker's real console
crashed after ~51 minutes of play. The cause was tracked down from a photo of the crash screen: the engine occasionally asks an animation for a frame that no longer exists in memory, and one unguarded path let that kill the whole machine. Two fixes:
- Any bad animation frame now safely disappears for a single frame instead of crashing the console.
- A memory bookkeeping bug (a "freed but not forgotten" buffer that could silently corrupt other data) was closed.
More characters on screen, no more tearing (Aug 1–2)
The biggest fix of the period. Two long-standing complaints:
Abe's sprite visibly tearing when animations change, and
sprites vanishing on busy screens (like the lower elevator room)
, fell together after a deep audit of the Saturn's sprite library:
- It turned out the system had been silently deleting any sprite past the 40th, and deleting the closest ones first, which is exactly Abe and the enemies. The limit is now 60, with the underlying memory laid out the way the hardware manual actually requires (the old layout was quietly corrupting itself past 43 sprites, the real cause of an older mystery crash).
- The tearing happened because the game sometimes redraws a character's image twice in the same tick, and the second redraw landed on the exact image the hardware was still busy displaying. Fixed: confirmed gone by eye and by counters (178 tear events per session → 2).
- Along the way, ~4 KB of scarce memory was reclaimed by measuring (rather than assuming) how much a legacy reserve actually needed: the answer was zero.
Still to fix: the elevator chain is not optimized and continues to glitch.
SOUND IS ON (Aug 3)
The port is no longer silent:
sound effects and music now actually play (confirmed in the emulator). This was the biggest missing piece of the whole project.
- The Saturn's dedicated sound chip is now driven directly, with all 32 of its voices mapped to the game's audio engine, including the same voice-recycling logic the original game used, so busy scenes steal the least important sound, not a random one.
- All the game's audio samples are converted offline into the Saturn's native format. The sound bank for the first level squeezes into the chip's tiny memory (99.7% full!) with a trick: every voice line is kept 100% untouched, while less critical effects are gently downsampled with a proper filter so they still sound clean.
- The music clock now ticks, which means the game's adaptive soundtrack works. The music can react to what's happening on screen, like on PlayStation.
- The pitch math was rewritten for the Saturn's CPU (which has no floating-point unit): note pitches are now computed with fast integer math accurate to less than 1/100th of a semitone.
- Three independent reviews of the code caught and fixed a batch of subtle bugs before they could ever be heard: sounds getting cut short after pitch changes, a slow memory leak in the sound chip's RAM, a screeching tail when a voice was stolen, and a rare race condition at startup.
Again, thanks
@slygamer,
@Wesker for the hardware tests and
@carlos24_ for ideas and emulator tests.
My attempts to create native proper lightings failed so far (green and orange lights on platforms and doors, for example), and still plenty of bugs to go, but I'm happy with the progress.