/// <summary> /// Writes the value to the tag data. /// </summary> /// <returns>true if the value is successfully written; otherwise false.</returns> public bool WriteValue() { //Prepare bool success = false; //Goto dataStream.Seek(address, SeekOrigin.Begin); using (BinaryWriter writer = dataStream.CreateWriter()) try { switch (node.Type) { case IfpNodeType.Single: writer.Write((float)value); break; case IfpNodeType.Double: writer.Write((double)value); break; case IfpNodeType.SignedByte: writer.Write((sbyte)value); break; case IfpNodeType.Byte: case IfpNodeType.Enumerator8: case IfpNodeType.Bitfield8: writer.Write((byte)value); break; case IfpNodeType.Short: writer.Write((short)value); break; case IfpNodeType.UnsignedShort: case IfpNodeType.Enumerator16: case IfpNodeType.Bitfield16: writer.Write((ushort)value); break; case IfpNodeType.Int: writer.Write((int)value); break; case IfpNodeType.UnsignedInt: case IfpNodeType.Enumerator32: case IfpNodeType.Bitfield32: writer.Write((uint)value); break; case IfpNodeType.Long: writer.Write((long)value); break; case IfpNodeType.UnsignedLong: case IfpNodeType.Enumerator64: case IfpNodeType.Bitfield64: writer.Write((ulong)value); break; case IfpNodeType.String32: writer.WriteUTF8(((string)value).PadRight(32, '\0').Substring(0, 32)); break; case IfpNodeType.String64: writer.WriteUTF8(((string)value).PadRight(64, '\0').Substring(0, 32)); break; case IfpNodeType.Unicode128: writer.WriteUTF8(((string)value).PadRight(128, '\0').Substring(0, 128)); break; case IfpNodeType.Unicode256: writer.WriteUTF8(((string)value).PadRight(256, '\0').Substring(0, 256)); break; case IfpNodeType.Tag: writer.Write((TagFourCc)value); break; case IfpNodeType.TagId: writer.Write((TagId)value); break; case IfpNodeType.StringId: writer.Write((StringId)value); break; } //Set success = true; } catch (InvalidCastException) { } //Return return(success); }
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); } }