Somebody saaaaaaaave meeeee: A Play! (PS2 emulator) Report
[DISCLAIMER: THE INFORMATION CONTAINED IN THIS REPORT IS RELATED TO PROGRESS MADE ON PLAY! (PS2 EMULATOR PROJECT), WHERE I’M JUST PRESENTING DATA ABOUT THE IMPROVEMENTS MADE. I’M NOT A DEVELOPER IN THE PROJECT AND MY WORK IS ONLY RELATED TO TESTING AND REPORTING MY FINDINGS. IF YOU WANT TO SUPPORT PLAY!, DO SO IN THIS PATREON. I WOULDN’T MIND SOMEONE PAYING ME A COFFEE, JUST BE AWARE THAT YOU SHOULD ALWAYS SUPPORT THE DEVELOPERS BEFORE ANYONE ELSE]
Being able to save your progress in most games is pretty much mandatory to have them labeled as playable in the compatibility tracker. This isn’t always the case as some more arcade’ish style titles just use your memory card for minor data storage (like highscores or settings you’ve changed), but when this comes to games like 20+ hours long RPGs… well, let’s just say you wouldn’t want (and shouldn’t) to keep your faith in save states, having the chance of them becoming incompatible with newer versions of the emulator or worse (e.g. being stuck at some point with no options to go back). This is where the correct behavior of reading, writing and overwriting data to your memory card is vital for a good experience.
All games are not created equal, neither are the way they save your progress…
Games created by different people, using different engines in different ways, so it’s a given that the way some games save your data could differ enough that some extra work is needed to be sure nothing is missing or corrupt while writing/loading the files. While some developers go that extra mile and present us specific error messages on the game interface related to each kind of possible error, others will give you a “save failed” and good luck understanding why that happened. Here is where Kernle worked his magic implementing some missing behavior in Play!:
Make CMcServ::GetInfo return -1 on first invocation [PR #1054]
Previously, Play! would always return 0 (no error). However, some games (such as Onimusha 2) use the return value -1 (new card) to populate an internal data structure, and query additional data about the memory card afterwards. If the return is always 0, the game thinks it already initialized its data structure - and things break apart from there.
Implement WriteFast for McServ [PR #1056]
Fixes Resident Evil 4 not being able to save.
Reset known memory cards on McServ init [PR #1058]
Fixes Gran Turismo 4 not being able to detect existing save games on startup
Rule of rose fixes [PR #1064]
Here’s a nice combo, not only fixing the game not being able to save/load properly (save file was listed as corrupted), but also implementing the blendmode 1021 to the OpenGL backend, meaning that you can both save and see in-game graphics properly regardless of using Vulkan or OpenGL for rendering.
After all this, I went into my regular game testing section for many hours and I’m very happy to present you a list of games fixed:
Samurai Western
Resident Evil 4
Cold Fear
Unlimited Saga
Gran Turismo 4
Metal Gear Solid 3: Snaker Eater
Metal Gear Solid 3: Subsistence
Shadow of the Colossus
Soulcalibur II
Dragon Blaze
Medal of Honor - Vanguard
BMX XXX
Mercury Meltdown Remix
Viewtiful Joe 2
The Thing
Aces of War
Sonic Mega Collection Plus
Sonic Heroes
Tourist Trophy
Killer7
Shadow the Hedgehog
Drakengard 2
Mana Khemia 2: Fall of Alchemy
Silent Hill - Shattered Memories
Medal of Honor - European Assault
Shin Megami Tensei - Persona 3 FES
Yakuza 2
Intellivision Lives
Burnout
Rule of Rose
Fatal Fury: Battle Archives Volume 1
This probably doesn’t cover all the improvements, but gives us a very good idea about how much the situation improved: the number of issues in the compatibility tracker related to memory cards went from 64 to 23.
To play your games with all the improvements mentioned here, just download the latest build available on the site (here). If you can, there’s also jpd002 Patreon where you can donate to support the project.
