Ys V Save State Hacking

If you've poked around this site you might have noticed I'm a fan of the Ys series. I've played through almost variation of each game in the series except for V and IX. For the latter I decided to wait for an official US release which isn't too far off now. V is a different story. There was never an official US release. There are a couple really obvious reasons why. In the US the series stalled out at part III. There were two different versions of IV available in Japan but neither received a US port. Ys V was also released on the Super Famicom a couple months after the PlayStation launched in the US. In the time it would take to port it would have been released in the US when the Super Nintendo was being buried in the back of stores everywhere. No one was going to take that project on.

A few years ago an excellent fan translation was developed and I tried it right away. That's when I realized there was another reason it wasn't ported... it's not very good. Or perhaps "not very good by Ys standards". I'd put it about on par with Soul Blazer. The difference being that Soul Blazer was very good for an early Super Nintendo game. Ys V would have been a good early Super Nintendo game too, but it came out at the very end. A big part of the problem is the change in mechanics. The Ys series had to evolve past the original bump combat mechanics. The series would not have survived beyond the 1990s without that change. In Ys V the new sword swinging mechanic was rough. Half of your swings completely whiff even if they look like they connected. Compared to Link to the Past it's quite bad. Soul Blazer was no Link to the Past but its controls were fine, better than Ys V for sure.

It's also a very grindy game. There are separate physical and magical experience point meters. It's sort of like Secret of Mana that way. The magic attack system is slow and frustrating to use making it a long grind. It's a huge downgrade from Ys Book I&II on the TurboGrafx-16 CD. Fully leveling-up requires a lot of free time and patience. When I tried Ys V I made it to about the third boss and then quit.

I really do want to go back and finish it though. The story was interesting enough through the first few hours and the soundtrack is outstanding (as expected). The only way I'll complete it this time is if I start totally maxed-out. So today I'm going to figure out how to do that. This will also be a decent introductory tutorial for people who want to enter the lucrative world of save state hacking.

"State" is the keyword. This will be about editing save states created by an emulator. Save battery (SRAM) editing is an option too. I usually avoid that because most games have a checksum scheme to test for corruption (intentional or otherwise) when they load from battery.

If anyone cares, I own physical copies of both Ys V versions because I'm a strange person like that. I don't quite own every physical Ys release but it's close.

For this article I'm using Retro Arch with the bsnes core. Depending on how other emulators store save states your mileage may vary. The first step is to make sure save state compression is turned off. This is a handy feature if you're playing on something with limited storage but it makes save state hacking more complicated.

Disable save state compression

Before doing anything else, let's grab a save state with the initial stats. I don't plan to edit the stats directly but they give us a string of consecutive integers to search for.

Initial statistics

The stats are very easy to find in the save state. Did I mention you will need a hex editor if you want to play along? Google something like "open source hex editor for [my operating system]". It makes no difference which you use.

Searching for values

Right next to the stats are some values that look like max HP and MP at 0x1100A and 0x1100C. They appear to be 16-bit little-endian numbers. Let's bump them up by 1 each and see what happens.

Modified values

Alright, that worked. Now let's search for gold. Initially Adol starts with 100 gold. That comes out to 64 in hex. Being a single byte it will take a while to find. Let's proceed to the part of the game where he stumbles into another 1000 giving us a value of 4C04 to find (that's 1100 converted to little-endian hex).

Finding gold

0x11015 is the address where gold is stored. After bumping that to FFFF we are in good shape.

Maximum gold

Since we have money let's buy the best equipment in the first town.

Equipping some items

Now let's save the current game state. Then change save slots and buy another sword.

Buying some more swords

After saving that state we have two save slots to compare.

Comparing save states

We can now see where items are stored. Let's brute force through all the values next.

Editing items

From this we find three locations where items are stored. 0x1102C has the weapon list, 0x11031 has the armor list, and 0x11036 has the shield list.

Here are all the item codes:

Now let's leave town and fight a couple enemies to gain a some experience points. That leads us 0x11002 for physical XP and 0x11006 for magic XP.

Finding XP

We'll bump each of those to 999998 (3E420F) since the max XP is 999999. That means that next enemy we fight will shoot Adol straight up to the maximum level.

And now for a brief plug for Hapsby.. it's a open source save game editor I wrote about 20 years ago because I wanted to learn Java. I rarely update it but adding support for Ys V just requires creating a single JSON file.

Updating Hapsby

So after all this I can finally play Ys V.

Finally ready to play Ys V

There's obviously a lot more I could look at. For example, how to change locations or mark game events complete. Since I just want to play through the game I'll stop here for today.