Ejemplo n.º 1
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);
            }
        }