private void BlockViewForm_Load(object sender, EventArgs e) { //Begin tagBlockView.BeginUpdate(); //Clear tagBlockView.Clear(); //Load if (m_TagGroup != null) { //Setup Text = m_TagGroup.Name; //Read using (var reader = m_Entry.TagData.CreateReader()) { //Goto m_Entry.TagData.Seek((uint)m_Entry.PostProcessedOffset, SeekOrigin.Begin); //Read m_TagGroup.Read(reader); } //Start long baseOffset = (uint)m_Entry.PostProcessedOffset; long offset = (uint)m_Entry.PostProcessedOffset; //Create blocks foreach (ITagBlock block in m_TagGroup) { TagBlock_CreateDataBlock(block, baseOffset, ref offset); } //Create child blocks foreach (ITagBlock block in m_TagGroup) { TagBlock_CreateChildBlocks(block, baseOffset, ref offset); } } //End tagBlockView.EndUpdate(); }
private void TagExportButton_Click(object sender, EventArgs e) { //Prepare TagManifest manifest = null; m_SoundCacheFileGestaltEntry = Map.GetSoundCacheFileGestaltEntry(); m_SoundCacheFileGestalt = null; //Check if (SelectedEntry != null) { //Create new FolderBrowserDialog instance using (FolderBrowserDialog folderDlg = new FolderBrowserDialog()) { //Setup folderDlg.Description = "Select the folder you wish to extract the tags to."; manifest = new TagManifest(); //Show if (folderDlg.ShowDialog() == DialogResult.OK) { //Read sound cache file gestalt using (BinaryReader reader = m_SoundCacheFileGestaltEntry.TagData.CreateReader()) { m_SoundCacheFileGestalt = new SoundCacheFileGestalt(); reader.BaseStream.Seek(m_SoundCacheFileGestaltEntry.Offset, SeekOrigin.Begin); m_SoundCacheFileGestalt.Read(reader); } //Export entry IndexEntry_Export(manifest, SelectedEntry, m_SoundCacheFileGestalt, folderDlg.SelectedPath); //Create manifest file XmlWriterSettings settings = new XmlWriterSettings() { Indent = true }; using (FileStream fs = new FileStream(Path.Combine(folderDlg.SelectedPath, $"{SelectedEntry.Filename.Split('\\').Last()}.{SelectedEntry.Root}.xml"), FileMode.Create, FileAccess.Write)) using (XmlWriter writer = XmlWriter.Create(fs, settings)) { //Write document writer.WriteStartDocument(); //Write manifest writer.WriteStartElement("Manifest"); //Write tags writer.WriteStartElement("Tags"); //Loop foreach (string localTag in manifest.TagFileNames) { //Write tag writer.WriteStartElement("Tag"); //Write path writer.WriteStartAttribute("Path"); writer.WriteValue(localTag); writer.WriteEndAttribute(); //End tag writer.WriteEndElement(); } //End tags writer.WriteEndElement(); //Write strings writer.WriteStartElement("Strings"); //Loop foreach (string stringId in manifest.StringIds) { //Write tag writer.WriteStartElement("String"); //Write path writer.WriteStartAttribute("value"); writer.WriteValue(stringId); writer.WriteEndAttribute(); //End tag writer.WriteEndElement(); } //End strings writer.WriteEndElement(); //End manifest writer.WriteEndElement(); //End document writer.WriteEndDocument(); } } } } }
private void FixSystemLinkButton_Click(object sender, EventArgs e) { /* * Heh I guess Entity is good for something :P */ //Prepare ITagGroup tagGroup = null; ITagGroup scenario = new Scenario(); ITagBlock scenarioBlock = null, simulationDefinitionTableElementBlock = null; BlockField simulationDefinitionTableField = null; List <IndexEntry> simulationDefinitionEntries = new List <IndexEntry>(); bool success = false; //Build table foreach (IndexEntry entry in Map.IndexEntries) { switch (entry.Root) { case "bipd": case "bloc": case "ctrl": case "jpt!": case "mach": case "scen": case "ssce": case "vehi": simulationDefinitionEntries.Add(entry); break; case "eqip": case "garb": case "proj": simulationDefinitionEntries.Add(entry); simulationDefinitionEntries.Add(entry); break; case "weap": simulationDefinitionEntries.Add(entry); simulationDefinitionEntries.Add(entry); simulationDefinitionEntries.Add(entry); break; } } //Read scenario using (BinaryReader reader = Map.Scenario.TagData.CreateReader()) { reader.BaseStream.Seek((uint)Map.Scenario.PostProcessedOffset, SeekOrigin.Begin); scenario.Read(reader); } //Re-create simulation definition table scenarioBlock = scenario[0]; simulationDefinitionTableField = (BlockField)scenarioBlock[143]; simulationDefinitionTableField.BlockList.Clear(); foreach (IndexEntry entry in simulationDefinitionEntries) { //Attempt to add tag block simulationDefinitionTableElementBlock = simulationDefinitionTableField.Add(out success); if (success) { simulationDefinitionTableElementBlock[0].Value = entry.Id; } } //Rebuild map using (VirtualStream tagDataStream = new VirtualStream(Map.TagDataStream.MemoryAddress)) using (BinaryWriter writer = tagDataStream.CreateWriter()) using (BinaryReader reader = Map.TagDataStream.CreateReader()) { //Loop foreach (IndexEntry entry in Map.IndexEntries.Where(ie => ie.Offset > 0 && ie.Size > 0)) { //Read (unless it's our modified scenario) if (entry != Map.Scenario) { tagGroup = TagLookup.CreateTagGroup(entry.Root); reader.BaseStream.Seek(entry.Offset, SeekOrigin.Begin); tagGroup.Read(reader); } else { tagGroup = scenario; } //Create buffer using (VirtualStream stream = new VirtualStream(tagDataStream.Position)) using (BinaryWriter tagWriter = stream.CreateWriter()) using (BinaryReader tagReader = stream.CreateReader()) { //Write tagGroup.Write(tagWriter); //Recalculate raw addresses Helper.RecalculateRawAddresses(entry.Raws, entry.Root, stream, tagReader, tagWriter); //Setup tag entry.Offset = (uint)stream.MemoryAddress; entry.Size = (int)stream.Length; //Write to tag data stream writer.Write(stream.ToArray()); } } //Align tagDataStream.Align(4096); //Swap Map.SwapTagBuffer(tagDataStream.ToArray(), tagDataStream.MemoryAddress); } }