示例#1
0
        public ATR1(ref FileBase file)
        {
            int start = file.ReadInt32();

            file.Skip(0x8);
            int baseOffset = file.Position();
            int entryCount = file.ReadInt32();

            file.Skip(0x4);

            mAttributes = new List <AttributeEntry>();

            for (int i = 0; i < entryCount; i++)
            {
                AttributeEntry e = new AttributeEntry
                {
                    _0 = file.ReadByte(),
                    _1 = file.ReadByte(),
                    _2 = file.ReadByte(),
                    _3 = file.ReadByte(),
                    _4 = file.ReadByte(),
                    _5 = file.ReadByte(),
                    _6 = file.ReadByte(),
                    _7 = file.ReadByte()
                };

                int offs = file.ReadInt32();
                int orig = file.Position();

                file.Seek(baseOffset + offs);
                e.mString = file.ReadStringUTF16();

                file.Seek(orig);
            }

            file.Seek(start + baseOffset);

            while (file.Position() % 0x10 != 0)
            {
                file.Skip(0x1);
            }
        }
示例#2
0
        public BCSV(FileBase file)
        {
            mFile = file;

            mFields  = new Dictionary <int, Field>();
            mEntries = new List <Entry>();

            if (mFile.GetLength() == 0)
            {
                return;
            }

            int entryCount    = mFile.ReadInt32();
            int fieldCount    = mFile.ReadInt32();
            int dataOffs      = mFile.ReadInt32();
            int entryDataSize = mFile.ReadInt32();

            int stringTableOffs = (dataOffs + (entryCount * entryDataSize));

            for (int i = 0; i < fieldCount; i++)
            {
                Field f = new Field();
                mFile.Seek(0x10 + (0xC * i));

                f.mHash        = mFile.ReadInt32();
                f.mMask        = mFile.ReadInt32();
                f.mEntryOffset = mFile.ReadUInt16();
                f.mShiftAmount = mFile.ReadByte();
                f.mType        = mFile.ReadByte();

                string fieldName = HashToFieldName(f.mHash);
                f.mName = fieldName;
                mFields.Add(f.mHash, f);
            }

            for (int i = 0; i < entryCount; i++)
            {
                Entry e = new Entry();

                foreach (Field f in mFields.Values)
                {
                    mFile.Seek(dataOffs + (i * entryDataSize) + f.mEntryOffset);

                    object val = null;

                    switch (f.mType)
                    {
                    case 0:
                    case 3:
                        val = Convert.ToInt32((mFile.ReadInt32() & f.mMask) >> f.mShiftAmount);
                        break;

                    case 4:
                        val = (short)((mFile.ReadInt16() & f.mMask) >> f.mShiftAmount);
                        break;

                    case 5:
                        val = Convert.ToByte((mFile.ReadByte() & f.mMask) >> f.mShiftAmount);
                        break;

                    case 2:
                        val = mFile.ReadSingle();
                        break;

                    case 6:
                        int offs = mFile.ReadInt32();
                        mFile.Seek(stringTableOffs + offs);
                        val = mFile.ReadString();
                        break;

                    default:
                        throw new Exception($"BCSV::BCSV() - Unknown field type {f.mType}.");
                    }

                    e[f.mHash] = val;
                }

                mEntries.Add(e);
            }
        }