Beispiel #1
0
        public void ReadBFG(string FilePath)
        {
            FileName = FilePath;
            BigEndianReader Reader = new BigEndianReader(new MemoryStream(File.ReadAllBytes(FilePath)));

            BFG.Entries  = new List <Entry>();
            BFG.Unknown1 = Reader.ReadUInt32();
            BFG.Unknown2 = Reader.ReadSingle();
            for (int i = 0; i < 3; i++)
            {
                BFG.Entries.Add(new Entry()
                {
                    Distance = Reader.ReadSingle(),
                    RGBA     = Reader.ReadUInt32(),
                    Unknown1 = Reader.ReadUInt16(),
                    Unknown2 = Reader.ReadUInt16(),
                    Float1B  = Reader.ReadSingle(),
                    Unknown3 = Reader.ReadUInt32(),
                    Unknown4 = Reader.ReadUInt32(),
                    Padding  = Reader.ReadUInt32(),
                });
            }
            BFG.Float4A   = Reader.ReadSingle();
            BFG.Bytes4A   = Reader.ReadUInt32();
            BFG.Unknown4A = Reader.ReadUInt16();
            BFG.Unknown4B = Reader.ReadUInt16();
            BFG.Float4B   = Reader.ReadSingle();
            BFG.Unknown4C = Reader.ReadUInt32();
            bfgComponent1.AddData(BFG);

            this.Show();
            Reader.Close();
        }
Beispiel #2
0
        private void ImportLOBJ_Click(object sender, EventArgs e)
        {
            OpenFileDialog o = new OpenFileDialog();

            o.Filter = "Binary Light Object (*blobj)|*.blobj";
            if (o.ShowDialog() == DialogResult.OK)
            {
                BigEndianReader Reader = new BigEndianReader(new MemoryStream(File.ReadAllBytes(o.FileName)));
                LOBJ.Magic = Encoding.ASCII.GetString(Reader.ReadBytes(0x04)); if (LOBJ.Magic != "LOBJ")
                {
                    throw new WrongMagicException(LOBJ.Magic, "LOBJ", Reader.BaseStream.Position - 4);
                }
                LOBJ.SectionSize = Reader.ReadUInt32(); if (LOBJ.SectionSize != 0x50)
                {
                    MessageBox.Show("Please give this file to Wexos!");
                }
                LOBJ.Unknown1          = Reader.ReadUInt64();
                LOBJ.Unknown2          = Reader.ReadUInt16();
                LOBJ.LightType         = Reader.ReadByte();
                LOBJ.Unknown3          = Reader.ReadByte();
                LOBJ.LightID           = Reader.ReadUInt16();
                LOBJ.Unknown4          = Reader.ReadUInt16();
                LOBJ.OriginVector      = Reader.ReadSingles(3);
                LOBJ.DestinationVector = Reader.ReadSingles(3);
                LOBJ.Scale             = Reader.ReadSingle();
                LOBJ.RGBA     = Reader.ReadBytes(4);
                LOBJ.Unknown5 = Reader.ReadUInt32();
                LOBJ.Unknown6 = Reader.ReadSingle();
                LOBJ.Unknown7 = Reader.ReadSingle();
                LOBJ.Unknown8 = Reader.ReadSingle();
                LOBJ.Padding  = Reader.ReadUInt64();
                Reader.Close();
                dgwLOBJ.Rows.Add(HexUtil.Hex8(Convert.ToByte(dgwLOBJ.Rows.Count)), HexUtil.Hex8(LOBJ.LightType), HexUtil.Hex8(LOBJ.Unknown3), LOBJ.OriginVector[0], LOBJ.OriginVector[1], LOBJ.OriginVector[2], LOBJ.DestinationVector[0], LOBJ.DestinationVector[1], LOBJ.DestinationVector[2], LOBJ.Scale, LOBJ.Unknown6, LOBJ.Unknown7, LOBJ.Unknown8, HexUtil.Hex16(LOBJ.LightID), HexUtil.Hex16(LOBJ.Unknown4), HexUtil.Hex32(LOBJ.Unknown5), HexUtil.Hex8(LOBJ.RGBA[0]), HexUtil.Hex8(LOBJ.RGBA[1]), HexUtil.Hex8(LOBJ.RGBA[2]), HexUtil.Hex8(LOBJ.RGBA[3]), HexUtil.Hex64(LOBJ.Unknown1), HexUtil.Hex16(LOBJ.Unknown2), HexUtil.Hex64(LOBJ.Padding));
            }
        }
Beispiel #3
0
        public void ReadBLIGHT(string FilePath)
        {
            FileName = FilePath;
            BigEndianReader Reader = new BigEndianReader(new MemoryStream(File.ReadAllBytes(FilePath)));

            BLIGHT.Magic = Encoding.ASCII.GetString(Reader.ReadBytes(0x04)); if (BLIGHT.Magic != "LGHT")
            {
                throw new WrongMagicException(BLIGHT.Magic, "LGHT", Reader.BaseStream.Position - 4);
            }
            BLIGHT.FileSize       = Reader.ReadUInt32();
            BLIGHT.Unknown1       = Reader.ReadUInt32();
            BLIGHT.Unknown2       = Reader.ReadUInt32();
            BLIGHT.NrLOBJ         = Reader.ReadUInt16();
            BLIGHT.NrAmbientLight = Reader.ReadUInt16();
            BLIGHT.Unknown3       = Reader.ReadUInt32();
            BLIGHT.Padding        = Reader.ReadUInt64();
            BLIGHT.Padding2       = Reader.ReadUInt64();
            for (int i = 0; i < BLIGHT.NrLOBJ; i++)
            {
                LOBJ.Magic = Encoding.ASCII.GetString(Reader.ReadBytes(0x04)); if (LOBJ.Magic != "LOBJ")
                {
                    throw new WrongMagicException(LOBJ.Magic, "LOBJ", Reader.BaseStream.Position - 4);
                }
                LOBJ.SectionSize = Reader.ReadUInt32(); if (LOBJ.SectionSize != 0x50)
                {
                    MessageBox.Show("Please give this file to Wexos!");
                }
                LOBJ.Unknown1          = Reader.ReadUInt64();
                LOBJ.Unknown2          = Reader.ReadUInt16();
                LOBJ.LightType         = Reader.ReadByte();
                LOBJ.Unknown3          = Reader.ReadByte();
                LOBJ.LightID           = Reader.ReadUInt16();
                LOBJ.Unknown4          = Reader.ReadUInt16();
                LOBJ.OriginVector      = Reader.ReadSingles(3);
                LOBJ.DestinationVector = Reader.ReadSingles(3);
                LOBJ.Scale             = Reader.ReadSingle();
                LOBJ.RGBA     = Reader.ReadBytes(4);
                LOBJ.Unknown5 = Reader.ReadUInt32();
                LOBJ.Unknown6 = Reader.ReadSingle();
                LOBJ.Unknown7 = Reader.ReadSingle();
                LOBJ.Unknown8 = Reader.ReadSingle();
                LOBJ.Padding  = Reader.ReadUInt64();
                dgwLOBJ.Rows.Add(HexUtil.Hex8(Convert.ToByte(i)), HexUtil.Hex8(LOBJ.LightType), HexUtil.Hex8(LOBJ.Unknown3), LOBJ.OriginVector[0], LOBJ.OriginVector[1], LOBJ.OriginVector[2], LOBJ.DestinationVector[0], LOBJ.DestinationVector[1], LOBJ.DestinationVector[2], LOBJ.Scale, LOBJ.Unknown6, LOBJ.Unknown7, LOBJ.Unknown8, HexUtil.Hex16(LOBJ.LightID), HexUtil.Hex16(LOBJ.Unknown4), HexUtil.Hex32(LOBJ.Unknown5), HexUtil.Hex8(LOBJ.RGBA[0]), HexUtil.Hex8(LOBJ.RGBA[1]), HexUtil.Hex8(LOBJ.RGBA[2]), HexUtil.Hex8(LOBJ.RGBA[3]), HexUtil.Hex64(LOBJ.Unknown1), HexUtil.Hex16(LOBJ.Unknown2), HexUtil.Hex64(LOBJ.Padding));
            }
            for (int i = 0; i < BLIGHT.NrAmbientLight; i++)
            {
                Ambient.RGBALight = Reader.ReadBytes(4);
                Ambient.Padding   = Reader.ReadUInt32();
                dgwAmbient.Rows.Add(HexUtil.Hex8(Convert.ToByte(i)), HexUtil.Hex8(Ambient.RGBALight[0]), HexUtil.Hex8(Ambient.RGBALight[1]), HexUtil.Hex8(Ambient.RGBALight[2]), HexUtil.Hex8(Ambient.RGBALight[3]), HexUtil.Hex32(Ambient.Padding));
            }
            LOBJColor.BackColor    = Color.FromArgb(byte.Parse(dgwLOBJ.Rows[0].Cells[16].Value.ToString(), NumberStyles.HexNumber), byte.Parse(dgwLOBJ.Rows[0].Cells[17].Value.ToString(), NumberStyles.HexNumber), byte.Parse(dgwLOBJ.Rows[0].Cells[18].Value.ToString(), NumberStyles.HexNumber));
            AmbientColor.BackColor = Color.FromArgb(byte.Parse(dgwAmbient.Rows[0].Cells[1].Value.ToString(), NumberStyles.HexNumber), byte.Parse(dgwAmbient.Rows[0].Cells[2].Value.ToString(), NumberStyles.HexNumber), byte.Parse(dgwAmbient.Rows[0].Cells[3].Value.ToString(), NumberStyles.HexNumber));
            this.Show();
            Reader.Close();
        }
Beispiel #4
0
 public Section3(BigEndianReader Reader)
 {
     NameOffset    = Reader.ReadUInt16();
     Alpha         = Reader.ReadUInt16();
     Animation     = Reader.ReadUInt16();
     Padding       = Reader.ReadUInt16();
     Delay         = Reader.ReadSingle();
     TranslationWS = Reader.ReadSingles(3);
     ScaleWS       = Reader.ReadSingles(2);
     Translation   = Reader.ReadSingles(3);
     Scale         = Reader.ReadSingles(2);
     Section4ID    = Reader.ReadUInt16();
     NrSection4    = Reader.ReadUInt16();
     Section5ID    = Reader.ReadUInt16();
     NrSection5    = Reader.ReadUInt16();
 }
        private void ImportLTEX_Click(object sender, EventArgs e)
        {
            OpenFileDialog o = new OpenFileDialog();

            o.Filter = "Binary Light Texture (*bltex)|*.bltex";
            if (o.ShowDialog() == DialogResult.OK)
            {
                BigEndianReader Reader = new BigEndianReader(new MemoryStream(File.ReadAllBytes(o.FileName)));
                BLMAPLTEX       LTEX   = new BLMAPLTEX();
                LTEX.Magic = Reader.ReadASCII(4); if (LTEX.Magic != "LTEX")
                {
                    throw new WrongMagicException(LTEX.Magic, "LTEX", Reader.BaseStream.Position - 4);
                }
                LTEX.SectionSize = Reader.ReadUInt32();
                LTEX.Padding     = Reader.ReadUInt32();
                LTEX.Unknown     = Reader.ReadUInt32();
                LTEX.NrEntries   = Reader.ReadUInt16();
                LTEX.Unknown1    = Reader.ReadUInt16();
                LTEX.Texture     = Reader.ReadASCII(4);
                LTEX.Unknown2    = Reader.ReadUInt32();
                LTEX.Unknown3    = Reader.ReadUInt32();
                LTEX.Unknown4    = Reader.ReadUInt32();
                LTEX.Unknown5    = Reader.ReadUInt32();
                LTEX.Unknown6    = Reader.ReadUInt32();
                LTEX.Unknown7    = Reader.ReadUInt32();
                LTEX.Unknown8    = Reader.ReadUInt32();
                LTEX.Unknown9    = Reader.ReadUInt32();
                LTEX.EntriesSize = Reader.ReadUInt32();
                LTEX.Entries     = new List <Entry>();
                for (int j = 0; j < LTEX.NrEntries; j++)
                {
                    LTEX.Entries.Add(new Entry()
                    {
                        Unknown1 = Reader.ReadSingle(), Unknown2 = Reader.ReadUInt32()
                    });
                }
                listLTEX.Add(LTEX);
                treeView1.Nodes[0].Nodes[1].Nodes.Add("LTEX " + HexUtil.ConvertToHex(treeView1.Nodes[0].Nodes[1].Nodes.Count));
                treeView1.Nodes[0].Nodes[1].Nodes[treeView1.Nodes[0].Nodes[1].Nodes.Count - 1].ContextMenuStrip = cmsDelete;
                Reader.Close();
            }
        }
Beispiel #6
0
        public void ReadBBLM(string FilePath)
        {
            FileName = FilePath;
            BigEndianReader Reader = new BigEndianReader(new MemoryStream(File.ReadAllBytes(FilePath)));

            BBLM.Magic = Reader.ReadASCII(4); if (BBLM.Magic != "PBLM")
            {
                throw new WrongMagicException(BBLM.Magic, "PBLM", Reader.BaseStream.Position - 4);
            }
            BBLM.FileSize = Reader.ReadUInt32(); if (BBLM.FileSize != 0xA4)
            {
                MessageBox.Show("Please give this file to Wexos!");
            }
            BBLM.Unknown1    = Reader.ReadUInt64();
            BBLM.ScaleFactor = Reader.ReadSingle();
            BBLM.RGB         = Reader.ReadUInt32();
            BBLM.blurrRGB    = Reader.ReadUInt32();
            BBLM.Unknown2    = Reader.ReadUInt16();
            BBLM.Unknown3    = Reader.ReadUInt16();
            BBLM.Entries     = new List <Entry>();
            for (int i = 0; i < 3; i++)
            {
                BBLM.Entries.Add(new Entry()
                {
                    Unknown1 = Reader.ReadSingle(),
                    Unknown2 = Reader.ReadSingle(),
                    Unknown3 = Reader.ReadUInt32(),
                    Unknown4 = Reader.ReadUInt32(),
                    Unknown5 = Reader.ReadUInt32(),
                    Unknown6 = Reader.ReadUInt32(),
                    Unknown7 = Reader.ReadUInt32(),
                    Unknown8 = Reader.ReadUInt32()
                });
            }
            BBLM.Unknown4 = Reader.ReadUInt32();
            BBLM.Unknown5 = Reader.ReadUInt32();
            BBLM.Unknown6 = Reader.ReadUInt32();
            BBLM.Unknown7 = Reader.ReadUInt32();
            BBLM.Unknown8 = Reader.ReadUInt32();
            BBLM.Unknown9 = Reader.ReadUInt32();
            BBLM.float1   = Reader.ReadSingle();
            BBLM.float2   = Reader.ReadSingle();
            BBLM.float3   = Reader.ReadSingle();

            bblmComponent1.AddData(BBLM);
            Reader.Close();
            this.Show();
        }
        public void ReadBLMAP(string FilePath)
        {
            FileName = FilePath;
            BigEndianReader Reader = new BigEndianReader(new MemoryStream(File.ReadAllBytes(FilePath)));

            treeView1.Nodes[0].Nodes.Clear();
            treeView1.Nodes[0].Text = Path.GetFileName(FilePath);
            treeView1.Nodes[0].Nodes.Add("Header");
            treeView1.Nodes[0].Nodes.Add("LTEX");
            listLTEX.Clear();
            BLMAP.Magic = Reader.ReadASCII(4); if (BLMAP.Magic != "LMAP")
            {
                throw new WrongMagicException(BLMAP.Magic, "LMAP", Reader.BaseStream.Position - 4);
            }
            BLMAP.FileSize = Reader.ReadUInt32();
            BLMAP.Unknown1 = Reader.ReadUInt32();
            BLMAP.Unknown2 = Reader.ReadUInt32();
            BLMAP.NrLTEX   = Reader.ReadUInt16();
            BLMAP.Unknown3 = Reader.ReadUInt16();
            BLMAP.Unknown4 = Reader.ReadUInt32();
            BLMAP.Unknown5 = Reader.ReadUInt32();
            BLMAP.Unknown6 = Reader.ReadUInt32();
            for (int i = 0; i < BLMAP.NrLTEX; i++)
            {
                BLMAPLTEX LTEX   = new BLMAPLTEX();
                long      Offset = Reader.BaseStream.Position;
                LTEX.Magic = Reader.ReadASCII(4); if (LTEX.Magic != "LTEX")
                {
                    throw new WrongMagicException(LTEX.Magic, "LTEX", Reader.BaseStream.Position - 4);
                }
                LTEX.SectionSize = Reader.ReadUInt32();
                LTEX.Padding     = Reader.ReadUInt32();
                LTEX.Unknown     = Reader.ReadUInt32();
                LTEX.NrEntries   = Reader.ReadUInt16();
                LTEX.Unknown1    = Reader.ReadUInt16();
                LTEX.Texture     = Reader.ReadASCII(4);
                LTEX.Unknown2    = Reader.ReadUInt32();
                LTEX.Unknown3    = Reader.ReadUInt32();
                LTEX.Unknown4    = Reader.ReadUInt32();
                LTEX.Unknown5    = Reader.ReadUInt32();
                LTEX.Unknown6    = Reader.ReadUInt32();
                LTEX.Unknown7    = Reader.ReadUInt32();
                LTEX.Unknown8    = Reader.ReadUInt32();
                LTEX.Unknown9    = Reader.ReadUInt32();
                LTEX.EntriesSize = Reader.ReadUInt32();
                LTEX.Entries     = new List <Entry>();
                for (int j = 0; j < LTEX.NrEntries; j++)
                {
                    LTEX.Entries.Add(new Entry()
                    {
                        Unknown1 = Reader.ReadSingle(), Unknown2 = Reader.ReadUInt32()
                    });
                }
                listLTEX.Add(LTEX);
                treeView1.Nodes[0].Nodes[1].Nodes.Add("LTEX " + HexUtil.ConvertToHex(i));
                treeView1.Nodes[0].Nodes[1].Nodes[treeView1.Nodes[0].Nodes[1].Nodes.Count - 1].ContextMenuStrip = cmsDelete;
                Reader.BaseStream.Position = Offset + LTEX.SectionSize;
            }
            Reader.Close();
            lmapComponent1.AddData(BLMAP);
            if (BLMAP.NrLTEX >= 1)
            {
                ltexComponent1.AddData(listLTEX[0]);
                AddLTEX(listLTEX[0].Entries);
            }
            else
            {
                SelectedNode = -1;
            }
            this.Show();
        }
Beispiel #8
0
 public Section2(BigEndianReader Reader)
 {
     NameOffsets = Reader.ReadUInt16s(4);
     Unknown     = Reader.ReadSingle();
 }
Beispiel #9
0
        public List<TableRow> DeserializeUTFChunk(byte[] chunk)
        {
            m_chunk = chunk;
            if (!Binary.AsciiEqual (m_chunk, 0, "@UTF"))
                throw new InvalidFormatException();
            var chunk_length = BigEndian.ToInt32 (m_chunk, 4);
            using (var mem = new MemoryStream (m_chunk, 8, chunk_length))
            using (var input = new BigEndianReader (mem))
            {
                int rows_offset     = input.ReadInt32();
                int strings_offset  = input.ReadInt32() + 8;
                int data_offset     = input.ReadInt32() + 8;
                input.Skip (4);
                int column_count    = input.ReadInt16();
                int row_length      = input.ReadInt16();
                int row_count       = input.ReadInt32();

                var columns = new List<Column> (column_count);
                for (int i = 0; i < column_count; ++i)
                {
                    byte flags = input.ReadByte();
                    if (0 == flags)
                    {
                        input.Skip (3);
                        flags = input.ReadByte();
                    }
                    int name_offset = strings_offset + input.ReadInt32();
                    var column = new Column
                    {
                        Flags = (TableFlags)flags,
                        Name  = ReadString (name_offset),
                    };
                    columns.Add (column);
                }

                var table = new List<TableRow> (row_count);
                int next_offset = rows_offset;
                for (int i = 0; i < row_count; ++i)
                {
                    input.Position = next_offset;
                    next_offset += row_length;
                    var row = new TableRow (column_count);
                    table.Add (row);
                    foreach (var column in columns)
                    {
                        var storage = column.Flags & TableFlags.StorageMask;
                        if (TableFlags.StorageNone == storage
                            || TableFlags.StorageZero == storage
                            || TableFlags.StorageConstant == storage)
                            continue;
                        switch (column.Flags & TableFlags.TypeMask)
                        {
                        case TableFlags.TypeByte:
                            row[column.Name] = (int)input.ReadByte();
                            break;

                        case TableFlags.TypeSByte:
                            row[column.Name] = (int)input.ReadSByte();
                            break;

                        case TableFlags.TypeUInt16:
                            row[column.Name] = (int)input.ReadUInt16();
                            break;

                        case TableFlags.TypeInt16:
                            row[column.Name] = (int)input.ReadInt16();
                            break;

                        case TableFlags.TypeUInt32:
                        case TableFlags.TypeInt32:
                            row[column.Name] = input.ReadInt32();
                            break;

                        case TableFlags.TypeUInt64:
                        case TableFlags.TypeInt64:
                            row[column.Name] = input.ReadInt64();
                            break;

                        case TableFlags.TypeFloat32:
                            row[column.Name] = input.ReadSingle();
                            break;

                        case TableFlags.TypeString:
                            {
                                int offset = strings_offset + input.ReadInt32();
                                row[column.Name] = ReadString (offset);
                                break;
                            }

                        case TableFlags.TypeData:
                            {
                                int offset = data_offset + input.ReadInt32();
                                int length = input.ReadInt32();
                                row[column.Name] = m_chunk.Skip (offset).Take (length).ToArray();
                                break;
                            }

                        default:
                            throw new NotSupportedException();
                        }
                    }
                }
                return table;
            }
        }
Beispiel #10
0
        public NbtTag Read(NbtTagType type)
        {
            int length;

            switch (type)
            {
            case NbtTagType.End:
                return(null);

            case NbtTagType.Byte:
                return(NbtTag.Create(_reader.ReadByte()));

            case NbtTagType.Short:
                return(NbtTag.Create(_reader.ReadInt16()));

            case NbtTagType.Int:
                return(NbtTag.Create(_reader.ReadInt32()));

            case NbtTagType.Long:
                return(NbtTag.Create(_reader.ReadInt64()));

            case NbtTagType.Float:
                return(NbtTag.Create(_reader.ReadSingle()));

            case NbtTagType.Double:
                return(NbtTag.Create(_reader.ReadDouble()));

            case NbtTagType.ByteArray:
                length = _reader.ReadInt32();
                return(NbtTag.Create(_reader.ReadBytes(length)));

            case NbtTagType.String:
                length = _reader.ReadInt16();
                byte[] array = _reader.ReadBytes(length);
                return(NbtTag.Create(Encoding.UTF8.GetString(array)));

            case NbtTagType.List:
                NbtTagType listType = (NbtTagType)_reader.ReadByte();
                if (listType < NbtTagType.End || listType > NbtTagType.Compound)
                {
                    throw new FormatException("'" + (int)type + "' is not a valid ListType.");
                }
                int    count = _reader.ReadInt32();
                NbtTag list  = NbtTag.CreateList(listType);
                for (int i = 0; i < count; i++)
                {
                    list.Add(Read(listType));
                }
                return(list);

            case NbtTagType.Compound:
                NbtTag compound = NbtTag.CreateCompound();
                while (true)
                {
                    string name;
                    NbtTag item = Read(out name);
                    if (item == null)
                    {
                        return(compound);
                    }
                    compound.Add(name, item);
                }

            case NbtTagType.IntArray:
                length = _reader.ReadInt32();
                int[] intArray = new int[length];
                for (int i = 0; i < length; i++)
                {
                    intArray[i] = _reader.ReadInt32();
                }
                return(NbtTag.Create(intArray));

            default:
                throw new FormatException("'" + (int)type + "' is not a valid TagType.");
            }
        }
Beispiel #11
0
        public IEnumerable GetContents()
        {
            var chars        = TypeTag.ToArray();
            var activeArrays = new Stack <ArrayList>();

            using (var reader = new BigEndianReader(GetContentStream()))
            {
                for (int i = 1; i < chars.Length; i++)
                {
                    object content;
                    switch (chars[i])
                    {
                    case Osc.TypeTag.Int32:
                        content = reader.ReadInt32();
                        break;

                    case Osc.TypeTag.Float:
                        content = reader.ReadSingle();
                        break;

                    case Osc.TypeTag.String:
                    case Osc.TypeTag.Alternate:
                        content = MessageParser.ReadString(reader);
                        break;

                    case Osc.TypeTag.Blob:
                        content = MessageParser.ReadBlob(reader);
                        break;

                    case Osc.TypeTag.Int64:
                        content = reader.ReadInt64();
                        break;

                    case Osc.TypeTag.TimeTag:
                        content = MessageParser.ReadTimeTag(reader);
                        break;

                    case Osc.TypeTag.Double:
                        content = reader.ReadDouble();
                        break;

                    case Osc.TypeTag.Char:
                        content = MessageParser.ReadChar(reader);
                        break;

                    case Osc.TypeTag.True:
                        content = true;
                        break;

                    case Osc.TypeTag.False:
                        content = false;
                        break;

                    case Osc.TypeTag.Infinitum:
                        content = float.PositiveInfinity;
                        break;

                    case Osc.TypeTag.ArrayBegin:
                        activeArrays.Push(new ArrayList());
                        continue;

                    case Osc.TypeTag.ArrayEnd:
                        var array = activeArrays.Pop();
                        content = array.ToArray();
                        break;

                    default:
                    case Osc.TypeTag.Nil:
                        content = null;
                        break;
                    }

                    if (activeArrays.Count > 0)
                    {
                        var array = activeArrays.Peek();
                        array.Add(content);
                    }
                    else
                    {
                        yield return(content);
                    }
                }
            }
        }