/// <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();
        }
Example #2
0
        /// <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());
                }
        }
Example #4
0
        /// <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()));
        }