Author Topic: [Tutorial] Hatsune Miku Project Diva f 2nd savadata and DLC region conversion  (Read 6457 times)

Offline cuevavirus

  • Hot Pockets
  • Useful Idiot
  • *****
  • Posts: 140
    • View Profile
Savedata region conversion

This is useful if you started on the US version but want to use piapro or if you just became a bigger weeb since the time you started playing. This process won't transfer your network profile nor the edit data. Trophies are shared so there are no problems there. If you started on the EU or AS versions they probably can be converted in a similar process, but the offset might be different.

1. Take your savedata at for example ux0:user/00/savedata/PCSE00434/MAIN00/SECURE.BIN
2. Decrypt with vitashell or psvpfsparser
3. Remove 0x370 bytes starting at offset 0x2EDF0
4. Launch the JP version and create a save in the slot you want to put the converted savadata to
5. Put in the converted savedata with open decrypted in vitashell at for example ux0:user/00/savedata/PCSG00205/MAIN00/SECURE.BIN

Don't know what's suppose to go in those 0x370 bytes but I looked at a few different saves and it's all zeros with a large range of zeros that precedes it. Included below is a python script to do the trimming automatically.

DLC region conversion

Now you may want to do this because NPS does not have all the DLCs for the JP version. Simply decrypt the US version DLCs with psvpfsparser and install with repatch. Make sure you remove sce_sys. PVs won't work but the only missing PVs are the AR PVs.

Code: [Select]
#!/usr/bin/env python3

import argparse
import pathlib
import sys

def main():
parser = argparse.ArgumentParser(description='Convert savedata for PS Vita Hatsune Miku Project Diva f 2nd from US to JP')
parser.add_argument('SAVEDATA')
args = parser.parse_args()

path = pathlib.Path(args.SAVEDATA)
if not path.exists():
print(f'{path} does not exist')
sys.exit(1)
if not path.is_file():
print(f'{path} is not a file')
sys.exit(1)
if path.stat().st_size != 0x343C0:
print(f'{path} has the wrong size')
sys.exit(1)

dest_path = path.parent / f'{path.name}_jp'
if dest_path.exists():
print(f'{dest_path} already exists')
sys.exit(1)

savedata = path.read_bytes()
for i in range(0x2EDF0, 0x2F160):
if savedata[i] != 0:
print('Found non-zero in extraneous range')
sys.exit(1)

dest_path.write_bytes(savedata[:0x2EDF0] + savedata[0x2F160:])
print(f'Converted to {dest_path}')

if __name__ == '__main__':
main()