private void ProcessLayout(TagLayoutGuess layout)
 {
     for (uint offset = 0; offset < layout.Size; offset += 4)
     {
         var guess = layout.TryGet(offset);
         if (guess != null)
         {
             guess.Accept(offset, this);
             offset += guess.Size - 4;
         }
         else
         {
             var remaining = layout.Size - offset;
             switch (remaining)
             {
                 case 3:
                     _result.Add(MakeField(offset, BasicFieldType.Int16));
                     _result.Add(MakeField(offset, BasicFieldType.Int8));
                     break;
                 case 2:
                     _result.Add(MakeField(offset, BasicFieldType.Int16));
                     break;
                 case 1:
                     _result.Add(MakeField(offset, BasicFieldType.Int8));
                     break;
                 default: // >= 4
                     _result.Add(MakeField(offset, BasicFieldType.Int32));
                     break;
             }
         }
     }
 }
        private void ProcessLayout(TagLayoutGuess layout)
        {
            for (uint offset = 0; offset < layout.Size; offset += 4)
            {
                var guess = layout.TryGet(offset);
                if (guess != null)
                {
                    guess.Accept(offset, this);
                    offset += guess.Size - 4;
                }
                else
                {
                    var remaining = layout.Size - offset;
                    switch (remaining)
                    {
                    case 3:
                        _result.Add(MakeField(offset, BasicFieldType.Int16));
                        _result.Add(MakeField(offset, BasicFieldType.Int8));
                        break;

                    case 2:
                        _result.Add(MakeField(offset, BasicFieldType.Int16));
                        break;

                    case 1:
                        _result.Add(MakeField(offset, BasicFieldType.Int8));
                        break;

                    default:     // >= 4
                        _result.Add(MakeField(offset, BasicFieldType.Int32));
                        break;
                    }
                }
            }
        }
Example #3
0
        public static void Write(HaloTag tag, TagLayoutGuess layout, ITagLayoutWriter writer)
        {
            if (tag != null)
            {
                writer.Begin(tag.Class, tag.ClassId, layout);
            }
            else
            {
                writer.Begin(new MagicNumber(0), 0, layout);
            }

            for (uint offset = 0; offset < layout.Size; offset += 4)
            {
                var guess = layout.TryGet(offset);
                if (guess != null)
                {
                    writer.AddGuess(offset, guess);
                    offset += guess.Size - 4;
                }
                else
                {
                    var remaining = layout.Size - offset;
                    switch (remaining)
                    {
                    case 3:
                        writer.AddUnknownInt16(offset);
                        writer.AddUnknownByte(offset + 2);
                        break;

                    case 2:
                        writer.AddUnknownInt16(offset);
                        break;

                    case 1:
                        writer.AddUnknownByte(offset);
                        break;

                    default:                             // >= 4
                        writer.AddUnknownInt32(offset);
                        break;
                    }
                }
            }
            writer.End();
        }
        public static void Write(HaloTag tag, TagLayoutGuess layout, ITagLayoutWriter writer)
        {
            if (tag != null)
                writer.Begin(tag.Class, tag.ClassId, layout);
            else
                writer.Begin(new MagicNumber(0), StringId.Null, layout);

            for (uint offset = 0; offset < layout.Size; offset += 4)
            {
                var guess = layout.TryGet(offset);
                if (guess != null)
                {
                    writer.AddGuess(offset, guess);
                    offset += guess.Size - 4;
                }
                else
                {
                    var remaining = layout.Size - offset;
                    switch (remaining)
                    {
                        case 3:
                            writer.AddUnknownInt16(offset);
                            writer.AddUnknownByte(offset + 2);
                            break;
                        case 2:
                            writer.AddUnknownInt16(offset);
                            break;
                        case 1:
                            writer.AddUnknownByte(offset);
                            break;
                        default: // >= 4
                            writer.AddUnknownInt32(offset);
                            break;
                    }
                }
            }
            writer.End();
        }