Пример #1
0
        private void Import(Stream inputStream)
        {
            Reset();

            MemoryStream dataStream = new MemoryStream();
            BinaryWriter dataWriter = new BinaryWriter(dataStream, System.Text.Encoding.UTF8, true);
            SR1_Reader   dataReader = new SR1_Reader(this, dataStream, System.Text.Encoding.UTF8, true);

            using (BinaryReader inputReader = new BinaryReader(inputStream, System.Text.Encoding.UTF8, true))
            {
                uint dataStart = ((inputReader.ReadUInt32() >> 9) << 11) + 0x00000800;
                _FileLength = (uint)inputStream.Length - dataStart;

                _IsLevel = inputReader.ReadUInt32() == 0;

                inputReader.BaseStream.Position = dataStart;
                dataWriter.BaseStream.Position  = 0;
                inputReader.BaseStream.CopyTo(dataWriter.BaseStream);
                dataWriter.BaseStream.Position = 0;
            }

            SR1_Structure root;

            if (_IsLevel)
            {
                bool validVersion = false;

                if (!validVersion && ((_ImportFlags & ImportFlags.DetectPCRetail) != 0))
                {
                    dataReader.BaseStream.Position = 0x9C;
                    if (dataReader.ReadUInt64() == 0xFFFFFFFFFFFFFFFF)
                    {
                        _Version     = Version.Retail_PC;
                        validVersion = true;
                    }
                }

                if (!validVersion)
                {
                    dataReader.BaseStream.Position = 0xF0;
                    UInt32 version = dataReader.ReadUInt32();
                    if (!validVersion && version == RETAIL_VERSION)
                    {
                        _Version     = Version.Jun01;
                        validVersion = true;
                    }

                    if (!validVersion && version == BETA_19990512_VERSION)
                    {
                        _Version     = Version.May12;
                        validVersion = true;
                    }

                    if (!validVersion)
                    {
                        dataReader.BaseStream.Position = 0xE4;
                        version = dataReader.ReadUInt32();
                    }

                    if (!validVersion && version == ALPHA_19990216_VERSION_3)
                    {
                        _Version     = Version.Feb16;
                        validVersion = true;
                    }

                    if (!validVersion)
                    {
                        dataReader.BaseStream.Position = 0xE0;
                        version = dataReader.ReadUInt32();
                    }

                    if (!validVersion && version == ALPHA_19990204_VERSION_2)
                    {
                        _Version     = Version.Feb04;
                        validVersion = true;
                    }
                }

                if (!validVersion)
                {
                    _Version     = Version.Jun01;
                    validVersion = true;
                }

                root = new SR1Structures.Level();
            }
            else
            {
                bool validVersion = false;

                if (!validVersion)
                {
                    dataReader.BaseStream.Position = 0x2C;
                    UInt32 oflags2 = dataReader.ReadUInt32();
                    if ((oflags2 & 0x00080000) != 0)
                    {
                        dataReader.BaseStream.Position = 0x1C;
                        UInt32 dataPos = dataReader.ReadUInt32();
                        if (dataPos != 0)
                        {
                            dataReader.BaseStream.Position = dataPos;
                            UInt32 magicNum = dataReader.ReadUInt32();
                            if (magicNum == 0xACE00065)
                            {
                                _Version     = Version.Jul14;
                                validVersion = true;
                            }
                            else if (magicNum == 0xACE00064)
                            {
                                _Version     = Version.Jun10;
                                validVersion = true;
                            }
                            else if (magicNum == 0xACE00063)
                            {
                                _Version     = Version.Jun01;
                                validVersion = true;
                            }
                            else if (magicNum == 0xACE00062)
                            {
                                _Version     = Version.May12;
                                validVersion = true;
                            }
                            else if (magicNum == 0xACE0005C)
                            {
                                _Version     = Version.Feb16;
                                validVersion = true;
                            }
                        }
                    }
                    else
                    {
                        dataWriter.BaseStream.Position = 0x24;
                        uint namePos = dataReader.ReadUInt32();
                        if (namePos == 0x00000044)
                        {
                            _Version     = Version.Feb16;
                            validVersion = true;
                        }

                        if (!validVersion)
                        {
                            dataReader.BaseStream.Position = 0x50;
                            char[] objectName    = dataReader.ReadChars(8);
                            string objectNameStr = new string(objectName);
                            if (objectNameStr == "flamegs_")
                            {
                                _Version     = Version.Feb16;
                                validVersion = true;
                            }
                        }

                        if (!validVersion)
                        {
                            dataReader.BaseStream.Position = 0x4C;
                            char[] objectName    = dataReader.ReadChars(8);
                            string objectNameStr = new string(objectName);
                            if (objectNameStr == "particle")
                            {
                                dataReader.BaseStream.Position = 0x0424;
                                if (dataReader.ReadUInt32() == 0x00000440 &&
                                    dataReader.ReadUInt32() == 0x00003000 &&
                                    dataReader.ReadUInt32() == 0x00003150 &&
                                    dataReader.ReadUInt32() == 0x0000355C &&
                                    dataReader.ReadUInt32() == 0x00003B60 &&
                                    dataReader.ReadUInt32() == 0x00003EE8 &&
                                    dataReader.ReadUInt32() == 0x00003EA0)
                                {
                                    _Version = Version.May12;
                                }
                                else
                                {
                                    _Version = Version.Jun01;
                                }

                                validVersion = true;
                            }
                        }
                    }
                }

                if (!validVersion)
                {
                    _Version     = Version.Jun01;
                    validVersion = true;
                }

                root = new SR1Structures.Object();
            }

            dataReader.BaseStream.Position = 0;

            root.Read(dataReader, null, "");

            if (_IsLevel && (_ImportFlags & ImportFlags.LogScripts) != 0)
            {
                dataReader.ScriptParser.ParseAll(dataReader);
            }

            dataReader.Dispose();
            dataWriter.Dispose();
            dataStream.Close();
        }
Пример #2
0
        public void Initialize(Repository repository, string fileName, SR1_File file)
        {
            FileName    = fileName;
            _repository = repository;

            string textureSetName = fileName;

            pathTextBox.Text = _repository.MakeLevelFilePath(fileName);
            FullPath         = _repository.MakeLevelFilePath(fileName, true);

            Level existingLevel = repository.Levels.Levels.Find(x => x.UnitName == fileName);

            if (existingLevel != null && existingLevel.TextureSet != "")
            {
                textureSetName = existingLevel.TextureSet;
            }

            TexSet currentTextureSet = null;

            foreach (TexSet textureSet in _repository.TextureSets.TexSets)
            {
                textureSetCombo.Items.Add(textureSet.Name);

                if (textureSet.Name == textureSetName)
                {
                    currentTextureSet = textureSet;
                }
            }

            if (currentTextureSet != null)
            {
                textureSetCombo.SelectedIndex = currentTextureSet.Index;
            }
            else
            {
                textureSetCombo.Items.Add(fileName);
                textureSetCombo.SelectedIndex = _repository.TextureSets.Count;
            }

            foreach (string objectName in file._ObjectNames)
            {
                string lowerCase = objectName.ToLower();
                if (_repository.Objects.Find(x => x.ObjectName == lowerCase) == null)
                {
                    requiredObjectList.Items.Add(lowerCase);
                }
            }

            SR1Structures.Level   level   = (SR1Structures.Level)file._Structures[0];
            SR1Structures.Terrain terrain = (SR1Structures.Terrain)file._Structures[level.terrain.Offset];

            _multiSignals = (SR1Structures.SR1_StructureSeries <SR1Structures.MultiSignal>)file._Structures[level.SignalListStart.Offset];
            _portalList   = (SR1Structures.StreamUnitPortalList)file._Structures[terrain.StreamUnits.Offset];

            this.portalList.Items.Clear();
            foreach (SR1Structures.StreamUnitPortal portal in _portalList.portals)
            {
                this.portalList.Items.Add(portal.tolevelname);
                this.portalList.SetItemChecked(this.portalList.Items.Count - 1, true);
            }
        }