A save research/discussion for Fire Emblem Echoes: Shadows of Valentia. Sole purpose to collect IDs for convenience. If you want to find hex IDs that are missing or in DLCs read @TildeHat's explanation below. Would appreciate if people contributed in the thread with the IDs that are missing ^^. I'll update as more information rolls in. My resource.
IMPORTANT IF YOU ADD BYTES TO YOUR FILE
Details:
Amiibo + Deen and Sonya + Guide on Adding Characters
Fernand + Berkut (Credits to @DeathChaos25)
FAQ:
IMPORTANT IF YOU ADD BYTES TO YOUR FILE
If you just replaced bytes, then you're fine, disregard this. If you see your file size has changed after you edited it, then this applies to you.
Step 1: Changing the pointers. Go find the text string EDNID. There you'll see 5 pairs of bytes that aren't 0's. Should be from offset 0xC8 to 0xD9.
Step 2: Now if you added bytes to your files, these pointers should be incorrect. Why does it matter if it's incorrect? Well you'll lose some stuff like inventory and units so yeah. To remedy this problem you want to to find these text strings: TOPS, TINU, NART, IFER, and ILER. The first pair of bytes is the pointer to TOPS, second pair of bytes is the pointer to TINU, third pair of bytes is the pointer to NART, fourth pair of bytes is the pointer to IFER, and the fifth pair of bytes is the pointer to ILER. as shown in the picture as a reference.
Step 3: Copy the offset of the first letter of the text string and reverse it. So let's say it's located on offset 0x6887. You would just reverse it. The new offset would be 0x8768 which we will just remember.
Step 4: Now replace the bytes from step 1, the pointers, with the new offsets that we just reversed. So now I'm replacing 0x4367 by 0x8768. And to double check if it points correctly, just reverse the value and go to that offset.
Step 5: That's about it. Just apply the same step to the other pointers.
Step 1: Changing the pointers. Go find the text string EDNID. There you'll see 5 pairs of bytes that aren't 0's. Should be from offset 0xC8 to 0xD9.
Step 2: Now if you added bytes to your files, these pointers should be incorrect. Why does it matter if it's incorrect? Well you'll lose some stuff like inventory and units so yeah. To remedy this problem you want to to find these text strings: TOPS, TINU, NART, IFER, and ILER. The first pair of bytes is the pointer to TOPS, second pair of bytes is the pointer to TINU, third pair of bytes is the pointer to NART, fourth pair of bytes is the pointer to IFER, and the fifth pair of bytes is the pointer to ILER. as shown in the picture as a reference.
Step 3: Copy the offset of the first letter of the text string and reverse it. So let's say it's located on offset 0x6887. You would just reverse it. The new offset would be 0x8768 which we will just remember.
Step 4: Now replace the bytes from step 1, the pointers, with the new offsets that we just reversed. So now I'm replacing 0x4367 by 0x8768. And to double check if it points correctly, just reverse the value and go to that offset.
Step 5: That's about it. Just apply the same step to the other pointers.
- The game's save file reuses the same file compression method as its previous ancestors, Awakening and Fates, so you could reuse @SciresM's FEAST again without any trouble.
- IDs (Character, Class, Weapons, Items) are 8 bytes long. Reasoning is it actually is a label calculated by using 2 polynomial hashes instead of a byte assigned by the game before which is explained by @TildeHat and there are pointers which you could use by simply reversing the bytes for the offset.
Copy paste from an old post:
At 0xCC is a pointer to where the characters are and 0xD0 has a pointer to items.
Character, class and items are stored in the save by throwing their labels in two polynomial hashes.
So using the Golden Dagger as an example which had the hex string 11 D2 EB 9D 4B 41 83 D5 in the save file, the first four bytes is when the label is through the hash using 0x25 as a base and the last four bytes is using 0x1F.
Golden Dagger's label in hex is 49 49 44 5F 89 A9 8B E0 82 CC 92 5A 8C 95. Starting from the end of the label the hashing goes: 0x95 * base^0 + 0x8C * base^1 + etc. Bytes are signed so watch out for that when doing the calculations. Once it's done only the last four 4 bytes are used.
- Structure of the file should be a bit similar to Fates's so if you got some prior knowledge of Fate's structure this should be easy for you quote @Soaprman
Kinda unrelated: I went ahead and bought SoV today. It might be a bit before I get around to playing it, though, and I don't really plan on doing anything with it save editor-wise. If anyone reading this decides to make a save editor for SoV, feel free to shoot me any questions you might have about how Fates does things. There are probably quite a few similarities in the overall save structure, even if the details on how particular things are stored are different.
Just some things I found that I think a lot of people are the most interested in editing.
To find your coins simply just convert the value that your game shows to hex and reverse it. EXP: 999 (0x03E7) Silver coins. Reversed Value: 0xE703. And just search with the reversed value.
To find your coins simply just convert the value that your game shows to hex and reverse it. EXP: 999 (0x03E7) Silver coins. Reversed Value: 0xE703. And just search with the reversed value.
I made a mistake, the orange F1 belongs with the green highlighting, the Skill Item in progress. The Byte after the item is the rank, 10 = 1 star, 20 = 2 start, etc.
Amiibo + Deen and Sonya + Guide on Adding Characters
For those of you who are curious about having pernament amiibos in your party, here are the amiibos (excluding Alm and Celica): https://drive.google.com/open?id=0B9HGNDRpe1v0azBITmt5TWRjelk . Follow the guide below to add them. I think I finally simplified it now!
Guide on Adding Them
Guide on Adding Them
Step 1. Add the character block before another character block. Refer to this to see what you should be looking for.
Step 2: Find the text string TINU. Two bytes after it is the byte that tells the game how many units are in your lineup. This is important because if it's wrong it will crash. It should always be before a character block.
Step 3: Count how many units you will now have or just add the number of units you added to that byte. If you don't know how to add hex, just google something like, "0x21 + 0x7". That should give your sum.
Step 4: Replace that byte by the sum.
Step 4: Follow this extensive guide very important:
Step 2: Find the text string TINU. Two bytes after it is the byte that tells the game how many units are in your lineup. This is important because if it's wrong it will crash. It should always be before a character block.
Step 3: Count how many units you will now have or just add the number of units you added to that byte. If you don't know how to add hex, just google something like, "0x21 + 0x7". That should give your sum.
Step 4: Replace that byte by the sum.
Step 4: Follow this extensive guide very important:
Step 1: Finding the pointers. Go find the text string EDNID. There you'll see 5 pairs of bytes that aren't 0's. Should be from offset 0xC8 to 0xD9. Ignore the first two pair of bytes, they won't be affected by this.
Step 2: Step 2: Now if you added bytes to your files, these pointers should be incorrect. Why does it matter if it's incorrect? Well you'll lose some stuff like inventory and units so yeah. To remedy this problem you want to to find these text strings: TOPS, TINU, NART, IFER, and ILER. The first pair of bytes is the pointer to TOPS, second pair of bytes is the pointer to TINU, third pair of bytes is the pointer to NART, fourth pair of bytes is the pointer to IFER, and the fifth pair of bytes is the pointer to ILER as shown in the picture as a reference. Ignore TOPS and TINU as they won't be affected by this.
Step 3: Copy the offset of the first letter of the text string and reverse it. So let's say it's located on offset 0x6887. You would just reverse it. The new offset would be 0x8768. (Pretend the image says another string instead of TINU)
Step 4: Step 4: Now replace the bytes from step 1, the pointers, with the new offsets that we just reversed. So now I'm replacing 0x4367 by 0x8768. And to double check if it points correctly, just reverse the value and go to that offset. (Pretend the image says another string instead of TINU)
Step 5: That's about it. Just apply the same step to the other pointers.
Step 2: Step 2: Now if you added bytes to your files, these pointers should be incorrect. Why does it matter if it's incorrect? Well you'll lose some stuff like inventory and units so yeah. To remedy this problem you want to to find these text strings: TOPS, TINU, NART, IFER, and ILER. The first pair of bytes is the pointer to TOPS, second pair of bytes is the pointer to TINU, third pair of bytes is the pointer to NART, fourth pair of bytes is the pointer to IFER, and the fifth pair of bytes is the pointer to ILER as shown in the picture as a reference. Ignore TOPS and TINU as they won't be affected by this.
Step 3: Copy the offset of the first letter of the text string and reverse it. So let's say it's located on offset 0x6887. You would just reverse it. The new offset would be 0x8768. (Pretend the image says another string instead of TINU)
Step 4: Step 4: Now replace the bytes from step 1, the pointers, with the new offsets that we just reversed. So now I'm replacing 0x4367 by 0x8768. And to double check if it points correctly, just reverse the value and go to that offset. (Pretend the image says another string instead of TINU)
Step 5: That's about it. Just apply the same step to the other pointers.
Fernand + Berkut (Credits to @DeathChaos25)
So, after finally being home, and considering the choices, I figured I'd make this as easy as possible for you guys, so this is what I'll do.
Attached here is a file with the character save blocks for both Berkut and Fernand, using the Robin save block from the OP post as a base, so just follow the instructions OP has listed for adding the amiibos, except this time you're adding Berkut and Fernand.
Do also note that they will not have any written dialogue enabled, stuff like lv up quotes, death quotes, etc, will be missing, because those are coded for a certain version of Fernand and Berkut that simply do not exist in the game, so the refferences need to be redirected for them to work, attached here is an example edit to re-enable lv up quotes and class change quotes for English versions of the game, the download also includes a luma folder, just place that in the root of your SD and enbale luma game patching, and USA versions of the game will have level up quotes and class changing quotes for both of them.
Small video of these units in action
FAQ:
Q: Is there a save editor yet/in the works?
A: No.
Q: Are the hex IDs the same in X region?
A: Yes, the hex IDs are the same for every region. They all share the same romfs (just different voice clips and text).
Q: My items disappeared. Why?
A: The pointer is probably wrong.
Q: My character/class is "unknown", I didn't edit the save. Help?
A: You probably just deleted or don't have the Extdata from the DLC.
A: No.
Q: Are the hex IDs the same in X region?
A: Yes, the hex IDs are the same for every region. They all share the same romfs (just different voice clips and text).
Q: My items disappeared. Why?
A: The pointer is probably wrong.
Q: My character/class is "unknown", I didn't edit the save. Help?
A: You probably just deleted or don't have the Extdata from the DLC.
Last edited by Koko-Kun,