HMX Forge (RB4/DCS/Amp16/FME) save game decryptor/encryptor
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}