HMX Forge (RB4/DCS/Amp16/FME) save game decryptor/encryptor
at master 4.4 kB view raw
1using davesave.Saves; 2using davesave.Saves.Amp2016; 3using LibForge.Util; 4using System; 5using System.Collections.Generic; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9 10namespace davesave 11{ 12 internal class AmpConversion 13 { 14 public static void ConvertAmpSavePS3toPS4(Stream inStream, Stream outStream, bool encrypt = true) 15 { 16 Console.WriteLine("Converting PS3 Amplitude save to PS4..."); 17 // start the stream we're reading from 18 Stream realIn = inStream; 19 EncryptedReadRevisionStream? ers = null; 20 if (encrypt) 21 { 22 Console.WriteLine("(encryption enabled)"); 23 ers = new EncryptedReadRevisionStream(inStream, true); 24 realIn = ers; 25 } 26 // load the profile in from the stream 27 AmpProfile profile = AmpProfile.ReadFromStream(realIn, true); 28 if (ers != null) ers.FinishReading(); // we've finished reading, do this as a sanity check 29 // change some values to properly convert 30 profile.mVersion = 0x19; 31 // start an output stream 32 Stream realOut = outStream; 33 EncryptedWriteRevisionStream? ews = null; 34 if (encrypt) 35 { 36 ews = new EncryptedWriteRevisionStream(outStream, 0x69696969, false); 37 realOut = ews; 38 } 39 // write our profile to it 40 profile.WriteToStream(realOut, false); 41 if (ews != null) ews.FinishWriting(); 42 // conversion successful? 43 Console.WriteLine("Conversion completed!"); 44 } 45 46 public static void ConvertAmpSavePS4toPS3(Stream inStream, Stream outStream, bool encrypt = true) 47 { 48 Console.WriteLine("Converting PS4 Amplitude save to PS3..."); 49 // start the stream we're reading from 50 Stream realIn = inStream; 51 EncryptedReadRevisionStream? ers = null; 52 if (encrypt) 53 { 54 Console.WriteLine("(encryption enabled)"); 55 ers = new EncryptedReadRevisionStream(inStream, false); 56 realIn = ers; 57 } 58 // load the profile in from the stream 59 AmpProfile profile = AmpProfile.ReadFromStream(realIn, false); 60 if (ers != null) ers.FinishReading(); // we've finished reading, do this as a sanity check 61 // change some values to properly convert 62 profile.mVersion = 0x1A; 63 profile.mCampaignData.mUnknownPS3Byte = 0x1; 64 // start an output stream 65 Stream realOut = outStream; 66 EncryptedWriteRevisionStream? ews = null; 67 if (encrypt) 68 { 69 ews = new EncryptedWriteRevisionStream(outStream, 0x69696969, true); 70 realOut = ews; 71 } 72 // write our profile to it 73 profile.WriteToStream(realOut, true); 74 if (ews != null) ews.FinishWriting(); 75 // conversion successful? 76 Console.WriteLine("Conversion completed!"); 77 } 78 79 public static async Task ConvertAmpSave(string input, string output) 80 { 81 FileStream inStream = File.OpenRead(input); 82 SaveDetection.SaveType type = await SaveDetection.DetectSaveTypeAsync(inStream); 83 84 bool encrypted = false; 85 bool ps3tops4 = false; 86 87 if (type == SaveDetection.SaveType.AmpPS4 || type == SaveDetection.SaveType.AmpPS4_Decrypted) 88 { 89 ps3tops4 = false; 90 encrypted = (type == SaveDetection.SaveType.AmpPS4); 91 } else if (type == SaveDetection.SaveType.AmpPS3 || type == SaveDetection.SaveType.AmpPS3_Decrypted) 92 { 93 ps3tops4 = true; 94 encrypted = (type == SaveDetection.SaveType.AmpPS3); 95 } else 96 { 97 Console.WriteLine("Unsupported input file."); 98 return; 99 } 100 101 FileStream outStream = File.OpenWrite(output); 102 outStream.SetLength(0); 103 if (ps3tops4) 104 ConvertAmpSavePS3toPS4(inStream, outStream, encrypted); 105 else 106 ConvertAmpSavePS4toPS3(inStream, outStream, encrypted); 107 inStream.Close(); 108 outStream.Close(); 109 } 110 } 111}