protected static object ReadPrimativeType <T>(SR1_Reader reader)
        {
            TypeCode typeCode = Type.GetTypeCode(typeof(T));

            switch (typeCode)
            {
            case TypeCode.Boolean:
                return(reader.ReadBoolean());

            case TypeCode.Char:
                return((char)reader.ReadSByte());

            case TypeCode.SByte:
                return(reader.ReadSByte());

            case TypeCode.Byte:
                return(reader.ReadByte());

            case TypeCode.Int16:
                return(reader.ReadInt16());

            case TypeCode.UInt16:
                return(reader.ReadUInt16());

            case TypeCode.Int32:
                return(reader.ReadInt32());

            case TypeCode.UInt32:
                return(reader.ReadUInt32());

            case TypeCode.Int64:
                return(reader.ReadInt64());

            case TypeCode.UInt64:
                return(reader.ReadUInt64());

            case TypeCode.Single:
                return(reader.ReadSingle());

            case TypeCode.Double:
                return(reader.ReadDouble());

            default:
                throw new Exception("Unhandled primative type.");
            }
        }
Esempio n. 2
0
        static int FooBar(SR1_Reader reader, long segKeyList, int chanData, int keyCount, int firstSeg, int lastSeg, int totalSegments)
        {
            long oldPos = reader.BaseStream.Position;

            reader.BaseStream.Position = segKeyList;

            int oldChanData = chanData;

            int flagBitOffset = (firstSeg * 3) + 8;
            int segIndex      = ((totalSegments * 3) + 7) & unchecked ((int)0xfffffff8);

            G2AnimSegKeyflagInfo_Type[] kfInfos = new G2AnimSegKeyflagInfo_Type[3];

            byte wombatFlags = reader.ReadByte();

            reader.BaseStream.Position = segKeyList;

            if ((wombatFlags & 0x01) != 0)
            {
                Wombat(reader, segKeyList, flagBitOffset, ref kfInfos[0]);
                flagBitOffset += segIndex;
            }
            if ((wombatFlags & 0x02) != 0)
            {
                Wombat(reader, segKeyList, flagBitOffset, ref kfInfos[1]);
                flagBitOffset += segIndex;
            }
            if ((wombatFlags & 0x04) != 0)
            {
                Wombat(reader, segKeyList, flagBitOffset, ref kfInfos[2]);
                flagBitOffset += segIndex;
            }

            flagBitOffset = 0;
            for (int i = firstSeg; i <= lastSeg; i++)
            {
                uint kangaroo0 = Kangaroo(reader, ref kfInfos[0]);
                uint kangaroo1 = Kangaroo(reader, ref kfInfos[1]);
                uint kangaroo2 = Kangaroo(reader, ref kfInfos[2]);

                uint kangarooAll = kangaroo0 | (kangaroo1 << 4) | (kangaroo2 << 8);

                while (kangarooAll != 0)
                {
                    int currentChanData = chanData;

                    if ((kangaroo0 & 1) != 0)
                    {
                        reader.BaseStream.Position = chanData + 1;
                        byte channelType = reader.ReadByte();
                        reader.BaseStream.Position--;
                        channelType &= 0xE0;
                        if (channelType == 0xE0)
                        {
                            channelType = 0;
                        }
                        if (channelType == 0)
                        {
                            currentChanData = chanData + (keyCount * 2);
                        }
                        else
                        {
                            currentChanData = chanData + 4;                             // Short pointer, so add double. (Quadruple, based on no$psx???)
                            if (channelType != 0x20)
                            {
                                if (flagBitOffset == 0)
                                {
                                    flagBitOffset = 8;
                                }

                                if (channelType == 0x40)
                                {
                                    // _G2Anim_InitializeChannel_AdaptiveDelta
                                    chanData += (((keyCount + 3) >> 2) + 2) * 2;                                     // Short pointer, so add double.
                                }
                                else if (channelType == 0x60)
                                {
                                    // _G2Anim_InitializeChannel_Linear
                                    long oldPos0 = reader.BaseStream.Position;

                                    reader.BaseStream.Position = chanData;
                                    short sVar4 = reader.ReadInt16();
                                    chanData += ((sVar4 & 0xfff) + 1) * 2;                                     // Short pointer, so add double.

                                    reader.BaseStream.Position = oldPos0;
                                }

                                flagBitOffset--;
                                currentChanData = chanData;
                            }
                        }
                    }

                    chanData      = currentChanData;
                    kangarooAll >>= 1;
                    kangaroo0     = kangarooAll;
                }
            }

            reader.BaseStream.Position = oldPos;

            return(chanData - oldChanData);
        }