Exemple #1
0
        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();
        }
Exemple #2
0
        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();
                            }
                    }
                }
            }
        }
Exemple #3
0
        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);
                    }
        }