コード例 #1
0
ファイル: TagData.cs プロジェクト: MikeMatt16/Abide
        /// <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);
        }
コード例 #2
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);
                    }
        }