コード例 #1
0
ファイル: BlockControl.cs プロジェクト: MikeMatt16/Abide
        private void blockSelectComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            ITagBlock selectedBlock = (ITagBlock)blockSelectComboBox.SelectedItem;

            for (int i = 0; i < selectedBlock.FieldCount; i++)
            {
                switch (selectedBlock[i].Type)
                {
                case FieldType.FieldBlock:
                    ((BlockControl)controlsFlowLayoutPanel.Controls[i]).Field = (BlockField)selectedBlock[i];
                    break;

                case FieldType.FieldStruct:
                    ((StructControl)controlsFlowLayoutPanel.Controls[i]).Field = (StructField)selectedBlock[i];
                    break;

                case FieldType.FieldExplanation:
                    continue;

                default:
                    ((GuerillaControl)controlsFlowLayoutPanel.Controls[i]).Field = selectedBlock[i];
                    break;
                }
            }
        }
コード例 #2
0
ファイル: BlockViewForm.cs プロジェクト: MikeMatt16/Abide
        private void BlockField_CreateDataBlock(BlockField field, long baseOffset, ref long offset)
        {
            //Create a condensed block
            if (field.BlockList.Count > 0)
            {
                //Prepare
                ITagBlock block       = field.BlockList[0];
                int       localOffset = (int)(field.BlockAddress - baseOffset);

                //Create
                using (VirtualStream vs = new VirtualStream(offset))
                    using (BinaryWriter writer = new BinaryWriter(vs))
                    {
                        //Align
                        vs.Align(block.Alignment);

                        //Write
                        foreach (ITagBlock child in field.BlockList)
                        {
                            child.Write(writer);
                        }

                        //Add
                        tagBlockView.Blocks.Add(localOffset, (int)vs.Length, block.BlockName);
                        offset = field.BlockAddress + vs.Length;
                    }
            }

            //Create child blocks
            foreach (ITagBlock block in field.BlockList)
            {
                TagBlock_CreateChildBlocks(block, baseOffset, ref offset);
            }
        }
コード例 #3
0
ファイル: StructControl.cs プロジェクト: MikeMatt16/Abide
        protected virtual void OnFieldChanged(EventArgs e)
        {
            ITagBlock tagBlock = (ITagBlock)m_Field.Value;

            for (int i = 0; i < tagBlock.FieldCount; i++)
            {
                switch (tagBlock[i].Type)
                {
                case FieldType.FieldBlock:
                    ((BlockControl)controlsFlowLayoutPanel.Controls[i]).Field = (BlockField)tagBlock[i];
                    break;

                case FieldType.FieldStruct:
                    ((StructControl)controlsFlowLayoutPanel.Controls[i]).Field = (StructField)tagBlock[i];
                    break;

                case FieldType.FieldExplanation:
                    continue;

                default:
                    ((GuerillaControl)controlsFlowLayoutPanel.Controls[i]).Field = tagBlock[i];
                    break;
                }
            }
        }
コード例 #4
0
        private TreeNode TagBlock_CreateTreeNode(ITagBlock block)
        {
            //Prepare
            TreeNode node = new TreeNode(TagBlock_GetDisplayName(block))
            {
                Tag = block
            };

            //Loop through fields
            foreach (Field field in block)
            {
                //Check type
                switch (field.Type)
                {
                case FieldType.FieldBlock: node.Nodes.Add(BlockField_CreateTreeNode((BlockField)field)); break;

                case FieldType.FieldStruct: node.Nodes.Add(StructField_CreateTreeNode(field)); break;

                case FieldType.FieldData: node.Nodes.Add(DataField_CreateTreeNode((DataField)field)); break;
                }
            }

            //Return
            return(node);
        }
コード例 #5
0
ファイル: BlockViewForm.cs プロジェクト: MikeMatt16/Abide
        private void TagBlock_CreateChildBlocks(ITagBlock block, long baseOffset, ref long offset)
        {
            //Loop through fields
            foreach (Field field in block)
            {
                switch (field.Type)
                {
                case FieldType.FieldStruct:
                    StructField structField = (StructField)field;
                    TagBlock_CreateChildBlocks((ITagBlock)structField.Value, baseOffset, ref offset);
                    break;

                case FieldType.FieldBlock:
                    BlockField blockField = (BlockField)field;
                    BlockField_CreateDataBlock(blockField, baseOffset, ref offset);
                    break;

                case FieldType.FieldData:
                    DataField dataField   = (DataField)field;
                    int       localOffset = (int)(dataField.DataAddress - baseOffset);
                    tagBlockView.Blocks.Add(localOffset, dataField.BufferLength, block.BlockName);
                    offset = dataField.DataAddress + dataField.BufferLength;
                    break;
                }
            }
        }
コード例 #6
0
ファイル: BlockControl.cs プロジェクト: MikeMatt16/Abide
        private void addBlockButton_Click(object sender, EventArgs e)
        {
            ITagBlock newBlock = m_Field.Add(out bool success);

            if (success)
            {
            }
        }
コード例 #7
0
        private string TagBlock_GetDisplayName(ITagBlock tagBlock)
        {
            //Find name fields
            Field[] nameFields = tagBlock.Where(f => f.IsBlockName).Select(f => f as Field).ToArray();
            if (nameFields.Length == 0)
            {
                return(tagBlock.DisplayName);
            }

            //Join
            return(string.Join(", ", nameFields.Select(f => Field_GetName(f))));
        }
コード例 #8
0
        private void RenderModelTagGroup_CreateResources(ITagGroup guerillaTagGroup, IndexEntry entry, BinaryWriter writer, ref TagGroupHeader header)
        {
            List <long>   addresses = new List <long>();
            List <byte[]> buffers   = new List <byte[]>();

            foreach (ITagBlock section in ((BlockField)guerillaTagGroup[0][7]).BlockList)
            {
                ITagBlock geometry = (ITagBlock)section[6].Value;
                int       address  = (int)geometry[1].Value;

                if (entry.Resources.TryGetResource(address, out var resource))
                {
                    header.TagResourceCount++;
                    addresses.Add(address);
                    buffers.Add(resource.GetBuffer());
                }
            }

            foreach (ITagBlock prtInfo in ((BlockField)guerillaTagGroup[0][24]).BlockList)
            {
                ITagBlock geometry = (ITagBlock)prtInfo[13].Value;
                int       address  = (int)geometry[1].Value;

                if (entry.Resources.TryGetResource(address, out var resource))
                {
                    header.TagResourceCount++;
                    addresses.Add(address);
                    buffers.Add(resource.GetBuffer());
                }
            }

            if (header.TagResourceCount > 0)
            {
                header.RawOffsetsOffset = (uint)writer.BaseStream.Position;
                for (int i = 0; i < header.TagResourceCount; i++)
                {
                    writer.Write((int)addresses[i]);
                }

                header.RawLengthsOffset = (uint)writer.BaseStream.Position;
                for (int i = 0; i < header.TagResourceCount; i++)
                {
                    writer.Write(buffers[i].Length);
                }

                header.RawDataOffset = (uint)writer.BaseStream.Position;
                for (int i = 0; i < header.TagResourceCount; i++)
                {
                    writer.Write(buffers[i]);
                }
            }
        }
コード例 #9
0
        public void CollectResources(ITagBlock tagBlock)
        {
            //Check
            if (tagBlock == null)
            {
                throw new ArgumentNullException(nameof(tagBlock));
            }

            //Loop through fields
            foreach (Field field in tagBlock)
            {
                //Get value
                string     value      = field.Value?.ToString() ?? string.Empty;
                BlockField blockField = field as BlockField;

                //Handle type
                switch (field.Type)
                {
                case FieldType.FieldStruct:
                    CollectResources((ITagBlock)field.Value);
                    break;

                case FieldType.FieldBlock:
                    foreach (ITagBlock nestedTagBlock in blockField.BlockList)
                    {
                        CollectResources(nestedTagBlock);
                    }
                    break;

                case FieldType.FieldOldStringId:
                case FieldType.FieldStringId:
                    if (!string.IsNullOrEmpty(value) && !m_StringsList.Contains(value))
                    {
                        m_StringsList.Add(value);
                    }
                    break;

                case FieldType.FieldTagIndex:
                case FieldType.FieldTagReference:
                    if (!string.IsNullOrEmpty(value) && !m_ResourceList.Contains(value))
                    {
                        m_ResourceList.Add(value);
                        CollectResources(ResolveResource.Invoke(value));
                    }
                    break;
                }
            }
        }
コード例 #10
0
ファイル: BlockViewForm.cs プロジェクト: MikeMatt16/Abide
        private void TagBlock_CreateDataBlock(ITagBlock block, long baseOffset, ref long offset)
        {
            //Preapre
            int localOffset = (int)(offset - baseOffset);

            //Create
            using (VirtualStream vs = new VirtualStream(offset))
                using (BinaryWriter writer = new BinaryWriter(vs))
                {
                    //Align
                    vs.Align(block.Alignment);

                    //Writer
                    block.Write(writer);

                    //Add
                    tagBlockView.Blocks.Add(localOffset, (int)vs.Length, block.BlockName);
                    offset += vs.Length;
                }
        }
コード例 #11
0
        private void WeatherSystemTagGroup_CreateResources(ITagGroup guerillaTagGroup, IndexEntry entry, BinaryWriter writer, ref TagGroupHeader header)
        {
            List <long>   addresses = new List <long>();
            List <byte[]> buffers   = new List <byte[]>();

            // TODO: get weather system resources
            foreach (ITagBlock lightmapGeometrySectionBlock in ((BlockField)guerillaTagGroup[0][0]).BlockList)
            {
                ITagBlock geometry = (ITagBlock)lightmapGeometrySectionBlock[1].Value;
                int       address  = (int)geometry[1].Value;

                if (entry.Resources.TryGetResource(address, out var resource))
                {
                    header.TagResourceCount++;
                    addresses.Add(address);
                    buffers.Add(resource.GetBuffer());
                }
            }

            if (header.TagResourceCount > 0)
            {
                header.RawOffsetsOffset = (uint)writer.BaseStream.Position;
                for (int i = 0; i < header.TagResourceCount; i++)
                {
                    writer.Write((int)addresses[i]);
                }

                header.RawLengthsOffset = (uint)writer.BaseStream.Position;
                for (int i = 0; i < header.TagResourceCount; i++)
                {
                    writer.Write(buffers[i].Length);
                }

                header.RawDataOffset = (uint)writer.BaseStream.Position;
                for (int i = 0; i < header.TagResourceCount; i++)
                {
                    writer.Write(buffers[i]);
                }
            }
        }
コード例 #12
0
        private void TagBlock_LoadControls(ITagBlock tagBlock)
        {
            //Prepare
            FrameworkElement    control             = null;
            List <ITagField>    fields              = tagBlock.ToList();
            UIElementCollection children            = mainStackPanel.Children;
            TagBlockModel       structTagBlockModel = null;
            FieldModel          fieldModel          = null;

            //Loop through fields
            for (int i = 0; i < fields.Count; i++)
            {
                //Check if the children of the stack panel already contain the field data context
                if (children.Count > i && children[i] is FrameworkElement element && element.DataContext is FieldModel)
                {
                    //Get model
                    fieldModel = (FieldModel)element.DataContext;

                    //Update
                    fieldModel.Owner    = Model.Owner;
                    fieldModel.TagField = fields[i];
                }
コード例 #13
0
ファイル: TagExportButton.cs プロジェクト: MikeMatt16/Abide
 private void TagBock_BuildReferences(TagManifest manifest, ITagBlock tagBlock, string outputDirectory)
 {
     //Loop through each field
     foreach (var field in tagBlock)
     {
         if (field.Type == FieldType.FieldOldStringId && field.Value is StringId oldStringId)
         {
             if (!manifest.StringIds.Contains(Map.Strings[oldStringId.Index]))
             {
                 manifest.StringIds.Add(Map.Strings[oldStringId.Index]);
             }
         }
         else if (field.Type == FieldType.FieldStringId && field.Value is StringId stringId)
         {
             if (!manifest.StringIds.Contains(Map.Strings[stringId.Index]))
             {
                 manifest.StringIds.Add(Map.Strings[stringId.Index]);
             }
         }
         else if (field.Type == FieldType.FieldTagReference && field.Value is TagReference tagRef && !tagRef.Id.IsNull)
         {
             IndexEntry_Export(manifest, Map.IndexEntries[tagRef.Id], m_SoundCacheFileGestalt, outputDirectory);
         }
コード例 #14
0
        private void DecoratorSetTagGroup_CreateResources(ITagGroup guerillaTagGroup, IndexEntry entry, BinaryWriter writer, ref TagGroupHeader header)
        {
            List <long>   addresses = new List <long>();
            List <byte[]> buffers   = new List <byte[]>();

            ITagBlock geometry = (ITagBlock)guerillaTagGroup[0][8].Value;
            int       address  = (int)geometry[1].Value;

            if (entry.Resources.TryGetResource(address, out var resource))
            {
                header.TagResourceCount++;
                addresses.Add(address);
                buffers.Add(resource.GetBuffer());
            }

            if (header.TagResourceCount > 0)
            {
                header.RawOffsetsOffset = (uint)writer.BaseStream.Position;
                for (int i = 0; i < header.TagResourceCount; i++)
                {
                    writer.Write((int)addresses[i]);
                }

                header.RawLengthsOffset = (uint)writer.BaseStream.Position;
                for (int i = 0; i < header.TagResourceCount; i++)
                {
                    writer.Write(buffers[i].Length);
                }

                header.RawDataOffset = (uint)writer.BaseStream.Position;
                for (int i = 0; i < header.TagResourceCount; i++)
                {
                    writer.Write(buffers[i]);
                }
            }
        }
コード例 #15
0
ファイル: Conversion.cs プロジェクト: MikeMatt16/Abide
        private static Group MultilingualUnicode_ToGuerilla(StringContainer strings)
        {
            List <string> stringIds = new List <string>();
            Group         tagGroup  = new Abide.Tag.Guerilla.Generated.MultilingualUnicodeStringList();
            ITagBlock     unicodeStringListBlock = tagGroup.TagBlocks[0];

            foreach (var str in strings.English)
            {
                if (!stringIds.Contains(str.ID))
                {
                    stringIds.Add(str.ID);
                }
            }
            foreach (var str in strings.Japanese)
            {
                if (!stringIds.Contains(str.ID))
                {
                    stringIds.Add(str.ID);
                }
            }
            foreach (var str in strings.German)
            {
                if (!stringIds.Contains(str.ID))
                {
                    stringIds.Add(str.ID);
                }
            }
            foreach (var str in strings.French)
            {
                if (!stringIds.Contains(str.ID))
                {
                    stringIds.Add(str.ID);
                }
            }
            foreach (var str in strings.Spanish)
            {
                if (!stringIds.Contains(str.ID))
                {
                    stringIds.Add(str.ID);
                }
            }
            foreach (var str in strings.Italian)
            {
                if (!stringIds.Contains(str.ID))
                {
                    stringIds.Add(str.ID);
                }
            }
            foreach (var str in strings.Korean)
            {
                if (!stringIds.Contains(str.ID))
                {
                    stringIds.Add(str.ID);
                }
            }
            foreach (var str in strings.Chinese)
            {
                if (!stringIds.Contains(str.ID))
                {
                    stringIds.Add(str.ID);
                }
            }
            foreach (var str in strings.Portuguese)
            {
                if (!stringIds.Contains(str.ID))
                {
                    stringIds.Add(str.ID);
                }
            }

            using (MemoryStream ms = new MemoryStream())
                using (BinaryWriter writer = new BinaryWriter(ms))
                {
                    foreach (string stringId in stringIds)
                    {
                        if (((BlockField)unicodeStringListBlock[0]).AddNew(out Block stringReferenceBlock))
                        {
                            stringReferenceBlock.Fields[0].Value = stringId;
                            stringReferenceBlock.Fields[1].Value = -1;
                            stringReferenceBlock.Fields[2].Value = -1;
                            stringReferenceBlock.Fields[3].Value = -1;
                            stringReferenceBlock.Fields[4].Value = -1;
                            stringReferenceBlock.Fields[5].Value = -1;
                            stringReferenceBlock.Fields[6].Value = -1;
                            stringReferenceBlock.Fields[7].Value = -1;
                            stringReferenceBlock.Fields[8].Value = -1;
                            stringReferenceBlock.Fields[9].Value = -1;

                            if (strings.English.Any(e => e.ID == stringId))
                            {
                                stringReferenceBlock.Fields[1].Value = (int)ms.Position;
                                writer.WriteUTF8NullTerminated(strings.English.First(s => s.ID == stringId).Value);
                            }

                            if (strings.Japanese.Any(e => e.ID == stringId))
                            {
                                stringReferenceBlock.Fields[2].Value = (int)ms.Position;
                                writer.WriteUTF8NullTerminated(strings.Japanese.First(s => s.ID == stringId).Value);
                            }

                            if (strings.German.Any(e => e.ID == stringId))
                            {
                                stringReferenceBlock.Fields[3].Value = (int)ms.Position;
                                writer.WriteUTF8NullTerminated(strings.German.First(s => s.ID == stringId).Value);
                            }

                            if (strings.French.Any(e => e.ID == stringId))
                            {
                                stringReferenceBlock.Fields[4].Value = (int)ms.Position;
                                writer.WriteUTF8NullTerminated(strings.French.First(s => s.ID == stringId).Value);
                            }

                            if (strings.Spanish.Any(e => e.ID == stringId))
                            {
                                stringReferenceBlock.Fields[5].Value = (int)ms.Position;
                                writer.WriteUTF8NullTerminated(strings.Spanish.First(s => s.ID == stringId).Value);
                            }

                            if (strings.Spanish.Any(e => e.ID == stringId))
                            {
                                stringReferenceBlock.Fields[5].Value = (int)ms.Position;
                                writer.WriteUTF8NullTerminated(strings.Italian.First(s => s.ID == stringId).Value);
                            }

                            if (strings.Korean.Any(e => e.ID == stringId))
                            {
                                stringReferenceBlock.Fields[6].Value = (int)ms.Position;
                                writer.WriteUTF8NullTerminated(strings.Korean.First(s => s.ID == stringId).Value);
                            }

                            if (strings.Chinese.Any(e => e.ID == stringId))
                            {
                                stringReferenceBlock.Fields[7].Value = (int)ms.Position;
                                writer.WriteUTF8NullTerminated(strings.Chinese.First(s => s.ID == stringId).Value);
                            }

                            if (strings.Portuguese.Any(e => e.ID == stringId))
                            {
                                stringReferenceBlock.Fields[8].Value = (int)ms.Position;
                                writer.WriteUTF8NullTerminated(strings.Portuguese.First(s => s.ID == stringId).Value);
                            }
                        }
                    }

                    DataField stringData = (DataField)unicodeStringListBlock[1];
                    stringData.SetBuffer(ms.ToArray());
                }

            return(tagGroup);
        }
コード例 #16
0
        private void SoundTagGroup_CreateResources(ITagGroup tagGroup, IndexEntry entry, BinaryWriter writer, ref TagGroupHeader header)
        {
            List <long>   addresses = new List <long>();
            List <byte[]> buffers   = new List <byte[]>();

            foreach (ITagBlock pitchRange in ((BlockField)tagGroup[0][13]).BlockList)
            {
                foreach (ITagBlock permutation in ((BlockField)pitchRange[7]).BlockList)
                {
                    foreach (ITagBlock chunk in ((BlockField)permutation[6]).BlockList)
                    {
                        int address = (int)chunk[0].Value;

                        if (entry.Resources.TryGetResource(address, out var resource))
                        {
                            header.TagResourceCount++;
                            addresses.Add(address);
                            buffers.Add(resource.GetBuffer());
                        }
                        else if ((address & 0xC0000000) == 0)
                        {
                            System.Diagnostics.Debugger.Break();
                        }
                    }
                }
            }

            foreach (ITagBlock extraInfo in ((BlockField)tagGroup[0][15]).BlockList)
            {
                ITagBlock geometry = (ITagBlock)extraInfo[2].Value;
                int       address  = (int)geometry[1].Value;

                if (entry.Resources.TryGetResource(address, out var resource))
                {
                    header.TagResourceCount++;
                    addresses.Add(address);
                    buffers.Add(resource.GetBuffer());
                }
            }

            if (header.TagResourceCount > 0)
            {
                header.RawOffsetsOffset = (uint)writer.BaseStream.Position;
                for (int i = 0; i < header.TagResourceCount; i++)
                {
                    writer.Write((int)addresses[i]);
                }

                header.RawLengthsOffset = (uint)writer.BaseStream.Position;
                for (int i = 0; i < header.TagResourceCount; i++)
                {
                    writer.Write(buffers[i].Length);
                }

                header.RawDataOffset = (uint)writer.BaseStream.Position;
                for (int i = 0; i < header.TagResourceCount; i++)
                {
                    writer.Write(buffers[i]);
                }
            }
        }
コード例 #17
0
        public static void GenerateControls(FlowLayoutPanel panel, ITagBlock block)
        {
            //Suspend
            panel.SuspendLayout();

            //Loop
            foreach (Field field in block)
            {
                //Prepare
                Control control = null;

                //Handle
                switch (field.Type)
                {
                case FieldType.FieldExplanation:
                    control = new ExplanationControl()
                    {
                        Title       = field.Name,
                        Explanation = ((ExplanationField)field).Explanation
                    };
                    break;

                case FieldType.FieldBlock:
                    control = new BlockControl()
                    {
                        Title = field.Name,
                        List  = ((BlockField)field).BlockList
                    };
                    break;

                case FieldType.FieldStruct:
                    if (field.Value is Block child)
                    {
                        GenerateControls(panel, child);
                    }
                    break;

                case FieldType.FieldString:
                case FieldType.FieldLongString:
                    control = new StringControl()
                    {
                        Field        = field,
                        Title        = field.Name,
                        IsReadOnly   = field.IsReadOnly,
                        StringValue  = field.Value.ToString(),
                        ValueChanged = StringControl_ValueChanged
                    };
                    break;

                case FieldType.FieldTagReference:
                    control = new TagReferenceControl()
                    {
                        Field         = field,
                        Title         = field.Name,
                        IsReadOnly    = field.IsReadOnly,
                        RefernceValue = (TagReference)field.Value,
                        ValueChanged  = TagReference_ValueChanged
                    };
                    break;

                case FieldType.FieldStringId:
                case FieldType.FieldOldStringId:
                    break;

                case FieldType.FieldCharInteger:
                case FieldType.FieldShortInteger:
                case FieldType.FieldLongInteger:
                case FieldType.FieldAngle:
                case FieldType.FieldTag:
                case FieldType.FieldReal:
                case FieldType.FieldRealFraction:
                    control = new ValueControl()
                    {
                        Field        = field,
                        Title        = field.Name,
                        IsReadOnly   = field.IsReadOnly,
                        Information  = field.Information,
                        Details      = field.Details,
                        Value        = field.Value.ToString(),
                        ValueChanged = ValueControl_ValueChanged
                    };
                    break;

                case FieldType.FieldCharEnum:
                    control = new EnumControl()
                    {
                        Field        = field,
                        Title        = field.Name,
                        IsReadOnly   = field.IsReadOnly,
                        Information  = field.Information,
                        Details      = field.Details,
                        Options      = ((CharEnumField)field).Options.Select(o => o.Name).ToArray(),
                        Value        = field.Value,
                        ValueChanged = EnumControl_ValueChanged
                    };
                    break;

                case FieldType.FieldEnum:
                    control = new EnumControl()
                    {
                        Field        = field,
                        Title        = field.Name,
                        IsReadOnly   = field.IsReadOnly,
                        Information  = field.Information,
                        Details      = field.Details,
                        Options      = ((EnumField)field).Options.Select(o => o.Name).ToArray(),
                        Value        = field.Value,
                        ValueChanged = EnumControl_ValueChanged
                    };
                    break;

                case FieldType.FieldLongEnum:
                    control = new EnumControl()
                    {
                        Field        = field,
                        Title        = field.Name,
                        IsReadOnly   = field.IsReadOnly,
                        Information  = field.Information,
                        Details      = field.Details,
                        Options      = ((LongEnumField)field).Options.Select(o => o.Name).ToArray(),
                        Value        = field.Value,
                        ValueChanged = EnumControl_ValueChanged
                    };
                    break;

                case FieldType.FieldLongFlags:
                    control = new FlagsControl()
                    {
                        Field        = field,
                        Title        = field.Name,
                        IsReadOnly   = field.IsReadOnly,
                        Information  = field.Information,
                        Options      = ((LongFlagsField)field).Options.Select(o => o.Name).ToArray(),
                        Details      = field.Details,
                        Value        = field.Value,
                        ValueChanged = FlagsControl_ValueChanged
                    };
                    break;

                case FieldType.FieldWordFlags:
                    control = new FlagsControl()
                    {
                        Field        = field,
                        Title        = field.Name,
                        IsReadOnly   = field.IsReadOnly,
                        Information  = field.Information,
                        Options      = ((WordFlagsField)field).Options.Select(o => o.Name).ToArray(),
                        Details      = field.Details,
                        Value        = field.Value,
                        ValueChanged = FlagsControl_ValueChanged
                    };
                    break;

                case FieldType.FieldByteFlags:
                    control = new FlagsControl()
                    {
                        Field        = field,
                        Title        = field.Name,
                        IsReadOnly   = field.IsReadOnly,
                        Information  = field.Information,
                        Options      = ((ByteFlagsField)field).Options.Select(o => o.Name).ToArray(),
                        Details      = field.Details,
                        Value        = field.Value,
                        ValueChanged = FlagsControl_ValueChanged
                    };
                    break;

                case FieldType.FieldShortBounds:
                    control = new RangeControl()
                    {
                        Field      = field,
                        Title      = field.Name,
                        IsReadOnly = field.IsReadOnly,
                        RangeValue = new string[] { ((ShortBounds)field.Value).Min.ToString(), ((ShortBounds)field.Value).Max.ToString() }
                    };
                    break;

                case FieldType.FieldAngleBounds:
                case FieldType.FieldRealBounds:
                case FieldType.FieldRealFractionBounds:
                    control = new RangeControl()
                    {
                        Field      = field,
                        Title      = field.Name,
                        IsReadOnly = field.IsReadOnly,
                        RangeValue = new string[] { ((FloatBounds)field.Value).Min.ToString(), ((FloatBounds)field.Value).Max.ToString() }
                    };
                    break;

                case FieldType.FieldPoint2D:
                    control = new TwoTupleControl()
                    {
                        LabelA     = "x",
                        LabelB     = "y",
                        Field      = field,
                        Title      = field.Name,
                        IsReadOnly = field.IsReadOnly,
                        TupleValue = new string[] { ((Point2)field.Value).X.ToString(), ((Point2)field.Value).Y.ToString() }
                    };
                    break;

                case FieldType.FieldRealPoint2D:
                    control = new TwoTupleControl()
                    {
                        LabelA     = "x",
                        LabelB     = "y",
                        Field      = field,
                        Title      = field.Name,
                        IsReadOnly = field.IsReadOnly,
                        TupleValue = new string[] { ((Point2F)field.Value).X.ToString(), ((Point2F)field.Value).Y.ToString() }
                    };
                    break;

                case FieldType.FieldRealPoint3D:
                    control = new ThreeTupleControl()
                    {
                        LabelA     = "x",
                        LabelB     = "y",
                        LabelC     = "z",
                        Field      = field,
                        Title      = field.Name,
                        IsReadOnly = field.IsReadOnly,
                        TupleValue = new string[] { ((Point3F)field.Value).X.ToString(), ((Point3F)field.Value).Y.ToString(), ((Point3F)field.Value).Z.ToString() }
                    };
                    break;

                case FieldType.FieldRealVector2D:
                    control = new TwoTupleControl()
                    {
                        LabelA     = "i",
                        LabelB     = "j",
                        Field      = field,
                        Title      = field.Name,
                        IsReadOnly = field.IsReadOnly,
                        TupleValue = new string[] { ((Vector2)field.Value).I.ToString(), ((Vector2)field.Value).J.ToString() }
                    };
                    break;

                case FieldType.FieldRealVector3D:
                    control = new ThreeTupleControl()
                    {
                        LabelA     = "i",
                        LabelB     = "j",
                        LabelC     = "k",
                        Field      = field,
                        Title      = field.Name,
                        IsReadOnly = field.IsReadOnly,
                        TupleValue = new string[] { ((Vector3)field.Value).I.ToString(), ((Vector3)field.Value).J.ToString(), ((Vector3)field.Value).K.ToString() }
                    };
                    break;


                case FieldType.FieldRectangle2D:
                    control = new FourTupleControl()
                    {
                        LabelA     = "t",
                        LabelB     = "l",
                        LabelC     = "r",
                        LabelD     = "b",
                        Field      = field,
                        Title      = field.Name,
                        IsReadOnly = field.IsReadOnly,
                        TupleValue = new string[] { ((Rectangle2)field.Value).Top.ToString(), ((Rectangle2)field.Value).Left.ToString(),
                                                    ((Rectangle2)field.Value).Right.ToString(), ((Rectangle2)field.Value).Bottom.ToString() }
                    };
                    break;

                case FieldType.FieldRgbColor:
                    control = new ThreeTupleControl()
                    {
                        LabelA     = "r",
                        LabelB     = "g",
                        LabelC     = "b",
                        Field      = field,
                        Title      = field.Name,
                        IsReadOnly = field.IsReadOnly,
                    };
                    break;

                case FieldType.FieldArgbColor:
                    control = new FourTupleControl()
                    {
                        LabelA     = "a",
                        LabelB     = "r",
                        LabelC     = "g",
                        LabelD     = "b",
                        Field      = field,
                        Title      = field.Name,
                        IsReadOnly = field.IsReadOnly,
                    };
                    break;

                case FieldType.FieldRealRgbColor:
                    control = new ThreeTupleControl()
                    {
                        LabelA     = "r",
                        LabelB     = "g",
                        LabelC     = "b",
                        Field      = field,
                        Title      = field.Name,
                        IsReadOnly = field.IsReadOnly,
                    };
                    break;

                case FieldType.FieldRealArgbColor:
                    control = new FourTupleControl()
                    {
                        LabelA     = "a",
                        LabelB     = "r",
                        LabelC     = "g",
                        LabelD     = "b",
                        Field      = field,
                        Title      = field.Name,
                        IsReadOnly = field.IsReadOnly,
                    };
                    break;

                case FieldType.FieldRealHsvColor:
                    control = new ThreeTupleControl()
                    {
                        LabelA     = "h",
                        LabelB     = "s",
                        LabelC     = "v",
                        Field      = field,
                        Title      = field.Name,
                        IsReadOnly = field.IsReadOnly,
                    };
                    break;

                case FieldType.FieldRealAhsvColor:
                    control = new FourTupleControl()
                    {
                        LabelA     = "a",
                        LabelB     = "h",
                        LabelC     = "s",
                        LabelD     = "v",
                        Field      = field,
                        Title      = field.Name,
                        IsReadOnly = field.IsReadOnly,
                    };
                    break;

                case FieldType.FieldQuaternion:
                    control = new FourTupleControl()
                    {
                        LabelA     = "w",
                        LabelB     = "i",
                        LabelC     = "j",
                        LabelD     = "k",
                        Field      = field,
                        Title      = field.Name,
                        IsReadOnly = field.IsReadOnly,
                        TupleValue = new string[] { ((Quaternion)field.Value).W.ToString(), ((Quaternion)field.Value).I.ToString(),
                                                    ((Quaternion)field.Value).J.ToString(), ((Quaternion)field.Value).K.ToString() }
                    };
                    break;

                case FieldType.FieldEulerAngles2D:
                    control = new TwoTupleControl()
                    {
                        LabelA     = "i",
                        LabelB     = "j",
                        Field      = field,
                        Title      = field.Name,
                        IsReadOnly = field.IsReadOnly,
                        TupleValue = new string[] { ((Vector2)field.Value).I.ToString(), ((Vector2)field.Value).J.ToString() }
                    };
                    break;

                case FieldType.FieldEulerAngles3D:
                    control = new ThreeTupleControl()
                    {
                        LabelA     = "i",
                        LabelB     = "j",
                        LabelC     = "k",
                        Field      = field,
                        Title      = field.Name,
                        IsReadOnly = field.IsReadOnly,
                        TupleValue = new string[] { ((Vector3)field.Value).I.ToString(), ((Vector3)field.Value).J.ToString(), ((Vector3)field.Value).K.ToString() }
                    };
                    break;

                case FieldType.FieldRealPlane2D:
                    control = new ThreeTupleControl()
                    {
                        LabelA     = "i",
                        LabelB     = "j",
                        LabelC     = "d",
                        Field      = field,
                        Title      = field.Name,
                        IsReadOnly = field.IsReadOnly,
                        TupleValue = new string[] { ((Vector3)field.Value).I.ToString(), ((Vector3)field.Value).J.ToString(), ((Vector3)field.Value).K.ToString() }
                    };
                    break;

                case FieldType.FieldRealPlane3D:
                    control = new FourTupleControl()
                    {
                        LabelA     = "i",
                        LabelB     = "j",
                        LabelC     = "k",
                        LabelD     = "d",
                        Field      = field,
                        Title      = field.Name,
                        IsReadOnly = field.IsReadOnly,
                        TupleValue = new string[] { ((Vector4)field.Value).I.ToString(), ((Vector4)field.Value).J.ToString(), ((Vector4)field.Value).K.ToString(), ((Vector4)field.Value).W.ToString() }
                    };
                    break;


                case FieldType.FieldLongBlockFlags:
                    break;

                case FieldType.FieldWordBlockFlags:
                    break;

                case FieldType.FieldByteBlockFlags:
                    break;

                case FieldType.FieldCharBlockIndex1:
                    break;

                case FieldType.FieldCharBlockIndex2:
                    break;

                case FieldType.FieldShortBlockIndex1:
                    break;

                case FieldType.FieldShortBlockIndex2:
                    break;

                case FieldType.FieldLongBlockIndex1:
                    break;

                case FieldType.FieldLongBlockIndex2:
                    break;

                case FieldType.FieldData:
                    break;

                case FieldType.FieldVertexBuffer:
                    break;
                }

                //Check
                if (control != null)
                {
                    panel.Controls.Add(control);
                }
            }
            //Resume
            panel.ResumeLayout();
        }
コード例 #18
0
ファイル: TagExportButton.cs プロジェクト: MikeMatt16/Abide
        private void IndexEntry_Export(TagManifest manifest, IndexEntry entry, ITagGroup soundCacheFileGestalt, string outputDirectory)
        {
            //Check
            if (entry == null || manifest == null || outputDirectory == null)
            {
                return;
            }
            if (manifest.TagIdReferences.Contains(entry.Id.Dword))
            {
                return;
            }

            //Prepare
            AbideTagGroupFile tagGroupFile = new AbideTagGroupFile()
            {
                Id = entry.Id
            };
            Group  tagGroup     = TagLookup.CreateTagGroup(entry.Root);
            string localPath    = $"{entry.Filename}.{tagGroup.GroupName}";
            string absolutePath = Path.Combine(outputDirectory, localPath);

            //Check
            using (BinaryReader reader = entry.TagData.CreateReader())
            {
                //Add reference
                manifest.TagIdReferences.Add(entry.Id.Dword);

                //Read
                entry.TagData.Seek((uint)entry.PostProcessedOffset, SeekOrigin.Begin);
                tagGroup.Read(reader);

                //Get references
                foreach (ITagBlock tagBlock in tagGroup)
                {
                    TagBock_BuildReferences(manifest, tagBlock, outputDirectory);
                }

                //Add file
                manifest.TagFileNames.Add(localPath);

                //Add raws
                foreach (RawSection section in Enum.GetValues(typeof(RawSection)))
                {
                    foreach (RawStream raw in entry.Raws[section])
                    {
                        tagGroupFile.SetRaw(raw.RawOffset, raw.ToArray());
                    }
                }

                //Convert cache to guerilla
                tagGroup = Guerilla.Library.Convert.ToGuerilla(tagGroup, soundCacheFileGestalt, entry, Map);

                //Copy raws
                if (tagGroup.GroupTag == HaloTags.snd_)
                {
                    int        rawOffset = 0;
                    IndexEntry soundCacheFileGestaltEntry = Map.GetSoundCacheFileGestaltEntry();
                    Block      soundBlock = tagGroup.TagBlocks[0];
                    foreach (Block pitchRangeBlock in ((BlockField)soundBlock.Fields[13]).BlockList)
                    {
                        foreach (Block permutationBlock in ((BlockField)pitchRangeBlock.Fields[7]).BlockList)
                        {
                            foreach (Block permutationChunkBlock in ((BlockField)permutationBlock.Fields[6]).BlockList)
                            {
                                rawOffset = (int)permutationChunkBlock.Fields[0].Value;
                                if (soundCacheFileGestaltEntry.Raws[RawSection.Sound].ContainsRawOffset(rawOffset))
                                {
                                    tagGroupFile.SetRaw(rawOffset, soundCacheFileGestaltEntry.Raws[RawSection.Sound][rawOffset].ToArray());
                                }
                            }
                        }
                    }
                    foreach (Block extraInfoBlock in ((BlockField)soundBlock.Fields[15]).BlockList)
                    {
                        ITagBlock globalGeometryBlockInfoStruct = (ITagBlock)extraInfoBlock.Fields[2].Value;
                        if (soundCacheFileGestaltEntry.Raws[RawSection.LipSync].ContainsRawOffset(rawOffset))
                        {
                            tagGroupFile.SetRaw(rawOffset, soundCacheFileGestaltEntry.Raws[RawSection.LipSync][rawOffset].ToArray());
                        }
                    }
                }

                //Create
                Directory.CreateDirectory(Path.GetDirectoryName(absolutePath));

                //Set tag group
                tagGroupFile.TagGroup = tagGroup;

                //Create file
                using (FileStream fs = new FileStream(absolutePath, FileMode.Create, FileAccess.ReadWrite, FileShare.Read))
                    tagGroupFile.Save(fs);
            }
        }
コード例 #19
0
ファイル: Program.cs プロジェクト: MikeMatt16/Abide
        private static void TagBlock_Search(ITagBlock tagBlock, IndexEntry source)
        {
            int index = 0;

            //Loop
            foreach (Field tagField in tagBlock)
            {
                switch (tagField.Type)
                {
                case FieldType.FieldLongInteger:
                    if (tagField is LongIntegerField intField && intField.Value is int integer)
                    {
                        if (map.IndexEntries.ContainsID(new TagId(integer)))
                        {
                            Console.WriteLine("Found Tag ID as a {0} within {1}. Index {2} ({3}.{4})", "field_long_integer", tagBlock, index, map.IndexEntries[(TagId)integer].Filename, map.IndexEntries[(TagId)integer].Root);
                            Console.WriteLine("From {0}.{1}", source.Filename, source.Root);
                        }
                    }
                    break;

                case FieldType.FieldPad:
                    if (tagField is PadField padField && padField.Length == 4 && padField.Value is byte[] pad)
                    {
                        if (map.IndexEntries.ContainsID(BitConverter.ToUInt32(pad, 0)))
                        {
                            Console.WriteLine("Found Tag ID as a {0} within {1}. Index {2} ({3}.{4})", "field_pad", tagBlock, index, map.IndexEntries[(TagId)BitConverter.ToInt32(pad, 0)].Filename, map.IndexEntries[(TagId)BitConverter.ToInt32(pad, 0)].Root);
                            Console.WriteLine("From {0}.{1}", source.Filename, source.Root);
                        }
                    }
                    break;

                case FieldType.FieldSkip:
                    if (tagField is SkipField skipField && skipField.Length == 4 && skipField.Value is byte[] skip)
                    {
                        if (map.IndexEntries.ContainsID(BitConverter.ToUInt32(skip, 0)))
                        {
                            Console.WriteLine("Found Tag ID as a {0} within {1}. Index {2} ({3}.{4})", "field_skip", tagBlock, index, map.IndexEntries[(TagId)BitConverter.ToInt32(skip, 0)].Filename, map.IndexEntries[(TagId)BitConverter.ToInt32(skip, 0)].Root);
                            Console.WriteLine("From {0}.{1}", source.Filename, source.Root);
                        }
                    }
                    break;

                case FieldType.FieldStruct:
                    if (tagField.Value is ITagBlock structBlock)
                    {
                        TagBlock_Search(structBlock, source);
                    }
                    break;

                case FieldType.FieldBlock:
                    if (tagField is BlockField blockField)
                    {
                        foreach (ITagBlock block in blockField.BlockList)
                        {
                            TagBlock_Search(block, source);
                        }
                    }
                    break;
                }

                //Increment
                index++;
            }
        }
コード例 #20
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);
                    }
        }
コード例 #21
0
        private void tagStructureTreeView_AfterSelect(object sender, TreeViewEventArgs e)
        {
            //Hide
            deleteBlockToolStripButton.Visible     = false;
            cloneBlockToolStripButton.Visible      = false;
            addBlockToolStripButton.Visible        = false;
            deleteTagBlocksToolStripButton.Visible = false;
            toolStripSeparator2.Visible            = false;
            copyToolStripMenuItem.Enabled          = false;
            pasteToolStripMenuButton.Enabled       = false;
            toolStripSeparator3.Visible            = false;
            moveBlockUpToolStripButton.Visible     = false;
            moveBlockDownToolStripButton.Visible   = false;

            //Prepare
            BlockField tagBlockField = null;
            DataField  dataField     = null;
            ITagBlock  tagBlock      = null;

            //Check
            if (e.Node.Tag is ITagBlock && e.Node.Parent != null && e.Node.Parent.Tag is BlockField)
            {
                //Get variables
                tagBlock      = (ITagBlock)e.Node.Tag;
                tagBlockField = (BlockField)e.Node.Parent.Tag;

                //Show
                toolStripSeparator2.Visible          = true;
                deleteBlockToolStripButton.Visible   = true;
                copyToolStripMenuItem.Enabled        = true;
                pasteToolStripMenuButton.Enabled     = true;
                cloneBlockToolStripButton.Visible    = tagBlockField.BlockList.Count < tagBlockField.Create().MaximumElementCount;
                toolStripSeparator3.Visible          = true;
                moveBlockUpToolStripButton.Visible   = true;
                moveBlockDownToolStripButton.Visible = true;
            }
            else if (e.Node.Tag is BlockField)
            {
                //Get variables
                tagBlockField = (BlockField)e.Node.Tag;

                //Show
                toolStripSeparator2.Visible            = true;
                deleteTagBlocksToolStripButton.Visible = true;
                copyToolStripMenuItem.Enabled          = true;
                pasteToolStripMenuButton.Enabled       = true;
                addBlockToolStripButton.Visible        = tagBlockField.BlockList.Count < tagBlockField.Create().MaximumElementCount;
            }
            else if (e.Node.Tag is DataField)
            {
                //Get vairables
                dataField = (DataField)e.Node.Tag;

                //Do nothing for now...
                toolStripSeparator2.Visible      = true;
                copyToolStripMenuItem.Enabled    = true;
                pasteToolStripMenuButton.Enabled = true;
            }
            else if (e.Node.Tag is StructField structField)
            {
                //Show
                toolStripSeparator2.Visible      = true;
                copyToolStripMenuItem.Enabled    = true;
                pasteToolStripMenuButton.Enabled = true;
            }
        }
コード例 #22
0
        private void ScenarioStructureBspTagGroup_CreateResources(ITagGroup guerillaTagGroup, IndexEntry entry, BinaryWriter writer, ref TagGroupHeader header)
        {
            List <long>   addresses = new List <long>();
            List <byte[]> buffers   = new List <byte[]>();

            foreach (ITagBlock structureBspCluster in ((BlockField)guerillaTagGroup[0][19]).BlockList)
            {
                ITagBlock geometry = (ITagBlock)structureBspCluster[1].Value;
                int       address  = (int)geometry[1].Value;

                if (entry.Resources.TryGetResource(address, out var resource))
                {
                    header.TagResourceCount++;
                    addresses.Add(address);
                    buffers.Add(resource.GetBuffer());
                }
            }

            foreach (ITagBlock structureBspInstancedGeometryDefinition in ((BlockField)guerillaTagGroup[0][39]).BlockList)
            {
                ITagBlock renderInfo = (ITagBlock)structureBspInstancedGeometryDefinition[0].Value;
                ITagBlock geometry   = (ITagBlock)renderInfo[1].Value;
                int       address    = (int)geometry[1].Value;

                if (entry.Resources.TryGetResource(address, out var resource))
                {
                    header.TagResourceCount++;
                    addresses.Add(address);
                    buffers.Add(resource.GetBuffer());
                }
            }

            foreach (ITagBlock structureBspWaterDefinition in ((BlockField)guerillaTagGroup[0][50]).BlockList)
            {
                ITagBlock geometry = (ITagBlock)structureBspWaterDefinition[2].Value;
                int       address  = (int)geometry[1].Value;

                if (entry.Resources.TryGetResource(address, out var resource))
                {
                    header.TagResourceCount++;
                    addresses.Add(address);
                    buffers.Add(resource.GetBuffer());
                }
            }

            foreach (ITagBlock decoratorPlacementDefinition in ((BlockField)guerillaTagGroup[0][54]).BlockList)
            {
                foreach (ITagBlock decoratorCacheBlock in ((BlockField)decoratorPlacementDefinition[2]).BlockList)
                {
                    ITagBlock geometry = (ITagBlock)decoratorCacheBlock[0].Value;
                    int       address  = (int)geometry[1].Value;

                    if (entry.Resources.TryGetResource(address, out var resource))
                    {
                        header.TagResourceCount++;
                        addresses.Add(address);
                        buffers.Add(resource.GetBuffer());
                    }
                }
            }

            if (header.TagResourceCount > 0)
            {
                header.RawOffsetsOffset = (uint)writer.BaseStream.Position;
                for (int i = 0; i < header.TagResourceCount; i++)
                {
                    writer.Write((int)addresses[i]);
                }

                header.RawLengthsOffset = (uint)writer.BaseStream.Position;
                for (int i = 0; i < header.TagResourceCount; i++)
                {
                    writer.Write(buffers[i].Length);
                }

                header.RawDataOffset = (uint)writer.BaseStream.Position;
                for (int i = 0; i < header.TagResourceCount; i++)
                {
                    writer.Write(buffers[i]);
                }
            }
        }
コード例 #23
0
        private void ScenarioStructureLightmapTagGroup_CreateResources(ITagGroup guerillaTagGroup, IndexEntry entry, BinaryWriter writer, ref TagGroupHeader header)
        {
            List <long>   addresses = new List <long>();
            List <byte[]> buffers   = new List <byte[]>();

            foreach (ITagBlock structureLightmapGroup in ((BlockField)guerillaTagGroup[0][16]).BlockList)
            {
                foreach (ITagBlock cluster in ((BlockField)structureLightmapGroup[6]).BlockList)
                {
                    ITagBlock geometry = (ITagBlock)cluster[1].Value;
                    int       address  = (int)geometry[1].Value;

                    if (entry.Resources.TryGetResource(address, out var resource))
                    {
                        header.TagResourceCount++;
                        addresses.Add(address);
                        buffers.Add(resource.GetBuffer());
                    }
                }

                foreach (ITagBlock lightmapGeometrySectionBlock in ((BlockField)structureLightmapGroup[8]).BlockList)
                {
                    ITagBlock geometry = (ITagBlock)lightmapGeometrySectionBlock[1].Value;
                    int       address  = (int)geometry[1].Value;

                    if (entry.Resources.TryGetResource(address, out var resource))
                    {
                        header.TagResourceCount++;
                        addresses.Add(address);
                        buffers.Add(resource.GetBuffer());
                    }
                }

                foreach (ITagBlock lightmapVertexBufferBucket in ((BlockField)structureLightmapGroup[10]).BlockList)
                {
                    ITagBlock geometry = (ITagBlock)lightmapVertexBufferBucket[3].Value;
                    int       address  = (int)geometry[1].Value;

                    if (entry.Resources.TryGetResource(address, out var resource))
                    {
                        header.TagResourceCount++;
                        addresses.Add(address);
                        buffers.Add(resource.GetBuffer());
                    }
                }
            }

            if (header.TagResourceCount > 0)
            {
                header.RawOffsetsOffset = (uint)writer.BaseStream.Position;
                for (int i = 0; i < header.TagResourceCount; i++)
                {
                    writer.Write((int)addresses[i]);
                }

                header.RawLengthsOffset = (uint)writer.BaseStream.Position;
                for (int i = 0; i < header.TagResourceCount; i++)
                {
                    writer.Write(buffers[i].Length);
                }

                header.RawDataOffset = (uint)writer.BaseStream.Position;
                for (int i = 0; i < header.TagResourceCount; i++)
                {
                    writer.Write(buffers[i]);
                }
            }
        }