protected override void ReadMembers(SR1_Reader reader, SR1_Structure parent)
        {
            while (true)
            {
                byte next = reader.ReadByte();
                reader.BaseStream.Position--;

                if (next == 0xFF)
                {
                    break;
                }

                SR1_String name = new SR1_String(16);
                name.SetReadMax(true).Read(reader, this, "[" + _List.Count.ToString() + "]");
                _List.Add(name);
            }

            pad.Read(reader, this, "pad");
            listStart.Read(reader, this, "listStart");

            for (int i = 0; i < _List.Count; i++)
            {
                string objectName = _List[i].ToString();
                if (objectName == "Shadow" ||
                    objectName == "Shadow2" ||
                    objectName == "Shadow3")
                {
                    continue;
                }

                reader.File._ObjectNames.Add(_List[i].ToString());
            }
        }
        public void Read(SR1_Reader reader, SR1_Structure parent, string name)
        {
            Start  = (uint)reader.BaseStream.Position;
            End    = (uint)reader.BaseStream.Position;
            Parent = parent;
            Name   = name;

            if (Parent == null)
            {
                reader.File._Structures.Add(Start, this);
            }
            else
            {
                Parent.MembersRead.Add(this);
            }

            try
            {
                ReadMembers(reader, parent);

                if (_padding != null &&
                    reader.PlanMarkerList != null &&
                    reader.PlanMarkerList.Offset != 0 &&
                    reader.BaseStream.Position == reader.PlanMarkerList.Offset)
                {
                    _padding = null;
                }

                if (_padding != null)
                {
                    uint mod = (uint)reader.BaseStream.Position % (uint)_padding.Length;
                    if (mod > 0)
                    {
                        uint padding = (uint)_padding.Length - mod;
                        for (int i = 0; i < padding; i++)
                        {
                            _padding[i] = reader.ReadByte();
                        }
                    }
                }

                End = (uint)reader.BaseStream.Position;

                ReadReferences(reader, parent);
            }
            catch (Exception exception)
            {
                reader.LogError(GetTypeName(true) + " (0x" + Start.ToString("X8") + "):\r\n" + exception.Message);
            }

            reader.BaseStream.Position = End;
        }
        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.");
            }
        }
        protected override void ReadMembers(SR1_Reader reader, SR1_Structure parent)
        {
            int  bufferLength = 0;
            long oldPos       = reader.BaseStream.Position;

            while (true)
            {
                bufferLength++;

                byte next = reader.ReadByte();
                if (next == 0xD3)
                {
                    break;
                }
            }

            reader.BaseStream.Position = oldPos;

            data = new SR1_PrimativeArray <byte>(bufferLength);
            data.SetPadding(4);
            data.Read(reader, this, "data");
        }
예제 #5
0
        protected override void ReadMembers(SR1_Reader reader, SR1_Structure parent)
        {
            sectionCount.Read(reader, this, "sectionCount");
            s0TailTime.Read(reader, this, "s0TailTime");
            s1TailTime.Read(reader, this, "s1TailTime");
            s2TailTime.Read(reader, this, "s2TailTime");
            keyCount.Read(reader, this, "keyCount");

            if (sectionCount.Value == 255)
            {
                objectName.SetPadding(4);
                objectName.Read(reader, this, "objectName");
            }
            else
            {
                ReadSectionData(reader);

                timePerKey.Read(reader, this, "timePerKey");
                pad00.Read(reader, this, "pad00");
                pad01.Read(reader, this, "pad01");
                pad10.Read(reader, this, "pad10");
                pad11.Read(reader, this, "pad11");
                fxList.Read(reader, this, "fxList");

                uint mod;
                long segKeyList = 0;

                if (sectionData.numSections > 0)
                {
                    segKeyList = channels[0].ReadChanData(reader, this);
                }
                if (sectionData.numSections > 1)
                {
                    segKeyList = channels[1].ReadChanData(reader, this);
                }
                if (sectionData.numSections > 2)
                {
                    segKeyList = channels[2].ReadChanData(reader, this);
                }

                int  flagBitOffset = 8;
                int  segIndex      = ((sectionData.numSegments * 3) + 7) & unchecked ((int)0xfffffff8);
                byte wombatFlags   = reader.ReadByte();
                reader.BaseStream.Position--;

                if ((wombatFlags & 0x01) != 0)
                {
                    flagBitOffset += segIndex;
                }
                if ((wombatFlags & 0x02) != 0)
                {
                    flagBitOffset += segIndex;
                }
                if ((wombatFlags & 0x04) != 0)
                {
                    flagBitOffset += segIndex;
                }

                int nextOffset = 0;
                mod = (uint)flagBitOffset % 16;                 // Need 16 bits to pad the buffer to 2 bytes.
                if (mod > 0)
                {
                    flagBitOffset += (int)(16 - mod);                     // Need 16 bits to pad the buffer to 2 bytes.
                }
                nextOffset += flagBitOffset / 8;

                chanDataflags = new SR1_PrimativeArray <byte>(nextOffset);
                chanDataflags.Read(reader, this, "chanDataFlags");

                if (sectionData.numSections > 0)
                {
                    channels[0].ReadChanDataBuf(reader, this, keyCount.Value, 0, sectionData.sectionA, sectionData.numSegments, segKeyList);
                }

                if (sectionData.numSections > 1)
                {
                    channels[1].ReadChanDataBuf(reader, this, keyCount.Value, sectionData.sectionA + 1, sectionData.sectionB, sectionData.numSegments, segKeyList);
                }

                if (sectionData.numSections > 2)
                {
                    channels[2].ReadChanDataBuf(reader, this, keyCount.Value, sectionData.sectionB + 1, sectionData.sectionC, sectionData.numSegments, segKeyList);
                }

                if (padOverrideLength >= 0)
                {
                    pad = new SR1_PrimativeArray <byte>(padOverrideLength);
                }
                else
                {
                    mod = (uint)(reader.BaseStream.Position) % 4;
                    if (mod > 0)
                    {
                        uint padding = 4 - mod;
                        pad = new SR1_PrimativeArray <byte>((int)padding);
                    }
                }
                pad.Read(reader, this, "pad");

                //G2EmulationSetStartAndEndSegment(&Raziel.State, 0, 0, 0xd);
                //G2EmulationSetStartAndEndSegment(&Raziel.State, 1, 0xe, 0x31);
                //G2EmulationSetStartAndEndSegment(&Raziel.State, 2, 0x32, 0x41);
            }
        }
예제 #6
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);
        }