public void ReadHeader(string h_path) { //read and decode data byte[] h_file = File.ReadAllBytes(h_path); byte[] h_decoded = DecodeEncode.Decode(h_file); // decoded is - dexored content only (since file starts with those 4 bytes) h_Raw = Encoding.UTF8.GetString(h_decoded); try { m_Header = Json.Decode(h_Raw); //this is the header file } catch { SaveEmpty = true; } //fill episodestates list_EpStates.Clear(); foreach (var episode in m_Header.cachedEpisodes) { list_EpStates.Add(episode); } //read the date of the save for (int i = 0; i < m_Header.saveDate.Length; i++) { dateofSave[i] = m_Header.saveDate[i]; //need to test if it's possible to write to this dynamic array without an intermediate one } }
Dictionary <string, GameVariable> m_Varnames = new Dictionary <string, GameVariable>(); //string is the variable name here public void Read(string path) { byte[] file = File.ReadAllBytes(path); byte[] decoded = DecodeEncode.Decode(file); string str = Encoding.UTF8.GetString(decoded); //convert the byte array to a string dynamic json = Json.Decode(str); dynamic variables = json.variables; foreach (dynamic variable in variables) { if (variable["$type"] == "StoryVariable") { m_Variables[variable.uniqueId] = new GameVariable { name = variable.objectName, id = variable.uniqueId }; m_Varnames[variable.objectName] = new GameVariable { name = variable.objectName, id = variable.uniqueId }; } } }
public void WriteHeader(string h_path, dynamic h_json_data) { h_Raw = Newtonsoft.Json.JsonConvert.SerializeObject(h_json_data, Newtonsoft.Json.Formatting.Indented); byte[] content = Encoding.UTF8.GetBytes(h_Raw); byte[] chash = contenthash.ComputeHash(content); byte[] encoded = DecodeEncode.Decode(content); byte[] modded_hfile = new byte[20 + encoded.Length]; byte[] file_header = new byte[4] { 81, 55, 110, 170 }; int num = 0; int i; for (i = 0; i < file_header.Length + num; i++) { modded_hfile[i] = file_header[i - num]; } num = i; while (i < 16 + num) { modded_hfile[i] = chash[i - num]; i++; } num = i; while (i < encoded.Length + num) { modded_hfile[i] = encoded[i - num]; i++; } if (!File.Exists(h_path + @".bkp")) { File.Copy(h_path, h_path + @".bkp", false); } File.WriteAllBytes(h_path, modded_hfile); //write changes to Header.Save h_editsSaved = true; }
public void WriteData(string path, dynamic json_data) { Raw = Newtonsoft.Json.JsonConvert.SerializeObject(json_data, Newtonsoft.Json.Formatting.Indented); //Raw is a utf8 string. byte[] content = Encoding.UTF8.GetBytes(Raw); //dexored (for now) new content byte[] chash = contenthash.ComputeHash(content); //md5 hash of dexored new content byte[] encoded = DecodeEncode.Decode(content); //xor-ed new content. XOR functions can be applied on data to repeatedly encryptt and decrypt it. byte[] modded_file = new byte[20 + encoded.Length]; byte[] file_header = new byte[4] { 81, 55, 110, 170 }; int num = 0; int i; for (i = 0; i < file_header.Length + num; i++) { modded_file[i] = file_header[i - num]; } num = i; while (i < 16 + num) { modded_file[i] = chash[i - num]; i++; } num = i; while (i < encoded.Length + num) { modded_file[i] = encoded[i - num]; i++; } if (!File.Exists(path + @".bkp")) { File.Copy(path, path + @".bkp", false); } File.WriteAllBytes(path, modded_file); //write changes to Data.Save editsSaved = true; }
public void Read(string path) { SaveEmpty = false; Checkpoints.Clear(); EpisodePlayed.Clear(); // read and decode Data byte[] file = File.ReadAllBytes(path); byte[] decoded = DecodeEncode.Decode(file); // decoded is - dexored content only (since file starts with header) Raw = Encoding.UTF8.GetString(decoded); try { m_Data = Json.Decode(Raw); //this is the save file, NOT initialdata } catch { SaveEmpty = true; return; } // add normal checkpoints foreach (var checkpoint in m_Data.checkpoints) { List <string> flags = new List <string>(); var vars = ReadVarsForCheckpoint(checkpoint); foreach (var fl in checkpoint.flags) { flags.Add(fl); } Checkpoints.Add(new Checkpoint(checkpoint, vars, flags)); } // add currentcheckpoint (seems to be identical to latest checkpoint...) Dictionary <string, VariableState> variables; try { List <string> flags = new List <string>(); foreach (var fl in m_Data.currentCheckpoint.stateCheckPoint.flags) { flags.Add(fl); } variables = ReadVarsForCheckpoint(m_Data.currentCheckpoint.stateCheckPoint); Checkpoints.Add(new Checkpoint(m_Data.currentCheckpoint.stateCheckPoint, variables, flags)); } catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException) { SaveEmpty = true; return; } // add global variables as a last checkpoint.. // hack... variables = ReadVarsForCheckpoint(m_Data); Checkpoints.Add(new Checkpoint(new { pointIdentifier = "Global Vars", currentObjective = "" }, variables)); // fill episodeState (?) foreach (var episode in m_Data.episodes) { string name = episode.name; string stateStr = episode.episodeState; bool played = false; if (stateStr == "kFinished" || stateStr == "kInProgress") { played = true; } EpisodePlayed[name] = played; } if (File.Exists(Path.GetDirectoryName(path) + @"\Header.Save")) { ReadHeader(Path.GetDirectoryName(path) + @"\Header.Save"); } else { m_Header = null; } }