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; } } }
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); } }
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; } } }
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); }
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; } } }
private void addBlockButton_Click(object sender, EventArgs e) { ITagBlock newBlock = m_Field.Add(out bool success); if (success) { } }
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)))); }
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]); } } }
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; } } }
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; } }
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]); } } }
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]; }
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); }
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]); } } }
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); }
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]); } } }
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(); }
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); } }
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++; } }
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); } }
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; } }
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]); } } }
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]); } } }