private void SezializeSaveFile(Stream stream, SaveFile save) { var saveDataStream = new MemoryStream(); var nameTableStream = new MemoryStream(); var newSave = new SaveFile { Header = { UnkInt1 = save.Header.UnkInt1 }, SaveDataHeader = { HeaderSize = save.SaveDataHeader.HeaderSize, UnkInt2 = save.SaveDataHeader.UnkInt2 } }; newSave.SaveData = FillSaveData(); saveDataStream.SerializeObject(newSave.SaveData, newSave.NameTable.Names); nameTableStream.WriteInt32(newSave.NameTable.Names.Count); for (var i = 0; i < newSave.NameTable.Names.Count; i++) { nameTableStream.WriteString(newSave.NameTable.Names[i]); } newSave.SaveDataHeader.SaveDataSize = (int) saveDataStream.Length + 12; // 12 = SaveDataHeader size newSave.Header.FileSize = (int) saveDataStream.Length + 12 + (int) nameTableStream.Length; stream.Seek(0, SeekOrigin.Begin); // File header stream.WriteInt32(newSave.Header.UnkInt1); stream.WriteInt32(newSave.Header.FileSize); // Save data header stream.WriteInt32(newSave.SaveDataHeader.HeaderSize); stream.WriteInt32(newSave.SaveDataHeader.SaveDataSize); stream.WriteInt32(newSave.SaveDataHeader.UnkInt2); // Save data saveDataStream.WriteTo(stream); //stream.WriteInt32(255); // Name table nameTableStream.WriteTo(stream); }
private SaveFile DeserializeSaveFile(Stream stream) { var save = new SaveFile(); // File header stream.Seek(0, SeekOrigin.Begin); save.Header = new FileHeader { UnkInt1 = stream.ReadInt32(), FileSize = stream.ReadInt32() }; // Save data header save.SaveDataHeader = new SaveDataHeader { HeaderSize = stream.ReadInt32(), SaveDataSize = stream.ReadInt32(), UnkInt2 = stream.ReadInt32() }; // Name table stream.Seek(save.SaveDataHeader.SaveDataSize + 8, SeekOrigin.Begin); var count = stream.ReadInt32(); save.NameTable = new NameTable(); for (var i = 0; i < count; i++) { save.NameTable.Names.Add(stream.ReadString()); } // Save data stream.Seek(20, SeekOrigin.Begin); save.SaveData = new WhatIfSaveData(); var saveDataStream = new byte[save.SaveDataHeader.SaveDataSize - 12]; stream.Read(saveDataStream, 0, save.SaveDataHeader.SaveDataSize - 12); var ms = new MemoryStream(saveDataStream); ms.Seek(0, SeekOrigin.Begin); ms.DeserializeObject(save.SaveData, save.NameTable.Names); return save; }