/// <summary> /// Deserializes the data elements from the internal buffer. /// </summary> /// <remarks></remarks> private void ReadData() { // Read version string version = _buffer.ReadString(4); if (version != "1.21") { throw new InvalidDataException($"Invalid primary file version: '{version}'"); } // Read remaining file header _buffer.ReadUInteger(); // Header length _buffer.ReadInteger(); // Unknown constant = 2 LastSaveTimestamp = _buffer.ReadUInteger(); int instructionsLength = _buffer.ReadInteger(); ScenarioInstructions = _buffer.ReadString(instructionsLength); _buffer.ReadUInteger(); // Unknown constant = 0 PlayerCount = _buffer.ReadUInteger(); // Create memory stream for decompression using (MemoryStream output = new MemoryStream()) using (MemoryStream input = _buffer.ToMemoryStream()) { // Go to begin of uncompressed data input.Seek(_buffer.Position, SeekOrigin.Begin); // Create decompressor stream using (DeflateStream decompressor = new DeflateStream(input, CompressionMode.Decompress)) { // Decompress decompressor.CopyTo(output); decompressor.Close(); } // Save decompressed data into buffer _buffer = new RAMBuffer(output.ToArray()); } // Read parts Header = new DataElements.Header().ReadData(_buffer); MessagesCinematics = new DataElements.MessagesCinematics().ReadData(_buffer); PlayerAiResources = new DataElements.PlayerAiResources().ReadData(_buffer); GlobalVictory = new DataElements.GlobalVictory().ReadData(_buffer); Diplomacy = new DataElements.Diplomacy().ReadData(_buffer); Disables = new DataElements.Disables().ReadData(_buffer); Map = new DataElements.Map().ReadData(_buffer); Units = new DataElements.Units().ReadData(_buffer); PlayerDiplomacyVarious = new DataElements.PlayerDiplomacyVarious().ReadData(_buffer); Triggers = new DataElements.Triggers().ReadData(_buffer); IncludedFiles = new DataElements.IncludedFiles().ReadData(_buffer); // Clear buffer to save memory _buffer.Clear(); }
/// <summary> /// Schreibt die enthaltenen Daten in den übergebenen Stream. /// </summary> /// <param name="destFile">Der Stream, in den die Daten geschrieben werden sollen.</param> /// <remarks></remarks> public void WriteData(Stream stream) { // Daten in Puffer schreiben WriteData(); // Puffer in Stream schreiben _buffer.ToMemoryStream().CopyTo(stream); }
/// <summary> /// Serializes the data elements into the internal buffer. /// </summary> /// <remarks></remarks> private void WriteData() { // Initialize buffer if (_buffer == null) { _buffer = new RAMBuffer(); } else if (_buffer.Length != 0) { _buffer.Clear(); } // Write header _buffer.WriteString("1.21", 4); _buffer.WriteUInteger(4 + 4 + 4 + (uint)ScenarioInstructions.Length + 4 + 4); _buffer.WriteInteger(2); _buffer.WriteUInteger(LastSaveTimestamp); _buffer.WriteInteger(ScenarioInstructions.Length); _buffer.WriteString(ScenarioInstructions); _buffer.WriteUInteger(0); _buffer.WriteUInteger(PlayerCount); // Create buffer for compressed data elements RAMBuffer comprBuffer = new RAMBuffer(); Header.WriteData(comprBuffer); MessagesCinematics.WriteData(comprBuffer); PlayerAiResources.WriteData(comprBuffer); GlobalVictory.WriteData(comprBuffer); Diplomacy.WriteData(comprBuffer); Disables.WriteData(comprBuffer); Map.WriteData(comprBuffer); Units.WriteData(comprBuffer); PlayerDiplomacyVarious.WriteData(comprBuffer); Triggers.WriteData(comprBuffer); IncludedFiles.WriteData(comprBuffer); // Compress data and copy to main buffer using (MemoryStream output = new MemoryStream()) using (MemoryStream input = comprBuffer.ToMemoryStream()) { // Create compressor stream using (DeflateStream compressor = new DeflateStream(output, CompressionMode.Compress)) { // Compress input.CopyTo(compressor); input.Close(); } // Save compressed data into main buffer _buffer.Write(output.ToArray()); } }
/// <summary> /// Dekomprimiert die gegebenen DAT-Daten (zlib-Kompression). /// </summary> /// <param name="dat">Die zu dekomprimierenden Daten.</param> /// <returns></returns> public static RAMBuffer DecompressData(RAMBuffer dat) { // Ausgabe-Stream erstellen MemoryStream output = new MemoryStream(); // Daten in Memory-Stream schreiben using (MemoryStream input = dat.ToMemoryStream()) { // Kompressions-Stream erstellen using (DeflateStream decompressor = new DeflateStream(input, CompressionMode.Decompress)) { // (De-)Komprimieren decompressor.CopyTo(output); decompressor.Close(); } } // Ergebnis in Puffer schreiben return(new RAMBuffer(output.ToArray())); }