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(); }
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); } }