private void Build()
        {
            const int HeaderLengthOffset = 0x08;

            const int EntriesOffset = 0x20;
            const int EntryLength   = 0x08;

            const int EntryKeyOffset      = 0x00;
            const int EntryPositionOffset = 0x04;

            var buffer = File.GetData();

            var headerLen       = OrderedBitConverter.ToInt32(buffer, HeaderLengthOffset, true);
            var count           = headerLen / EntryLength;
            var currentPosition = EntriesOffset;

            _Rows = new ConcurrentDictionary <int, T>();
            for (var i = 0; i < count; ++i)
            {
                var key = OrderedBitConverter.ToInt32(buffer, currentPosition + EntryKeyOffset, true);
                var off = OrderedBitConverter.ToInt32(buffer, currentPosition + EntryPositionOffset, true);
                _RowOffsets.Add(key, off);
                //_Rows.Add(key, CreateRow(key, off));
                currentPosition += EntryLength;
            }
        }
Exemple #2
0
            public static CharaMakeTypeStruct Read(byte[] buffer)
            {
                int offset = 0;

                CharaMakeTypeStruct cmt = new CharaMakeTypeStruct();

                cmt.Looks = new CharaMakeTypeLooksStruct[28];
                for (int i = 0; i < 28; i++)
                    cmt.Looks[i] = CharaMakeTypeLooksStruct.Read(buffer, ref offset);

                cmt.Voice = CharaMakeTypeVoiceStruct.Read(buffer, ref offset);

                cmt.FaceOption = new CharaMakeTypeFaceOptionStruct[8];
                for (int i = 0; i < 8; i++)
                    cmt.FaceOption[i] = CharaMakeTypeFaceOptionStruct.Read(buffer, ref offset);

                offset += 4;

                cmt.Equip = new CharaMakeTypeEquipStruct[3];
                for (int i = 0; i < 3; i++)
                    cmt.Equip[i] = CharaMakeTypeEquipStruct.Read(buffer, ref offset);

                cmt.Race = OrderedBitConverter.ToInt32(buffer, offset, true);
                offset += 4;
                cmt.Tribe = OrderedBitConverter.ToInt32(buffer, offset, true);
                offset += 4;
                cmt.Gender = (sbyte)buffer[offset];

                return cmt;
            }
Exemple #3
0
            byte[] padding; //2?

            public static CharaMakeTypeLooksStruct Read(byte[] buffer, ref int offset)
            {
                CharaMakeTypeLooksStruct cmtl = new CharaMakeTypeLooksStruct();

                cmtl.Menu = OrderedBitConverter.ToUInt32(buffer, offset, true);
                offset += 4;
                cmtl.SubMenuMask = OrderedBitConverter.ToUInt32(buffer, offset, true);
                offset += 4;
                cmtl.Customize = OrderedBitConverter.ToUInt32(buffer, offset, true);
                offset += 4;
                cmtl.SubMenuParam = new uint[100];

                for (int i = 0; i < 100; i++)
                {
                    cmtl.SubMenuParam[i] = OrderedBitConverter.ToUInt32(buffer, offset, true);
                    offset += 4;
                }

                cmtl.InitVal = buffer[offset];
                cmtl.SubMenuType = buffer[offset + 1];
                cmtl.SubMenuNum = buffer[offset + 2];
                cmtl.LookAt = buffer[offset + 3];
                offset += 4;

                cmtl.SubMenuGraphic = new byte[10];
                for (int i = 0; i < 10; i++)
                {
                    cmtl.SubMenuGraphic[i] = buffer[offset];
                    offset += 1;
                }

                offset += 2;
                
                return cmtl;
            }
        /// <summary>
        ///     Read a column's buffer of a row.
        /// </summary>
        /// <param name="buffer">A byte-array containing the contents of the EX buffer file.</param>
        /// <param name="col"><see cref="Column" /> to read.</param>
        /// <param name="row"><see cref="IDataRow" /> to read in.</param>
        /// <returns>Returns the value read from the given <c>row</c> and <c>column</c>.</returns>
        public override object Read(byte[] buffer, Column col, IDataRow row)
        {
            var fieldOffset = GetFieldOffset(col, row);
            var endOfFixed  = row.Offset + row.Sheet.Header.FixedSizeDataLength;

            var start = endOfFixed + OrderedBitConverter.ToInt32(buffer, fieldOffset, true);

            if (start < 0)
            {
                return(null);
            }

            var end = start - 1;

            while (++end < buffer.Length && buffer[end] != 0)
            {
            }
            var len = end - start;

            if (len == 0)
            {
                return(Text.XivString.Empty);
            }

            var binaryString = new byte[len];

            Array.Copy(buffer, start, binaryString, 0, len);

            return(Text.XivStringDecoder.Default.Decode(binaryString));//.ToString();
        }
Exemple #5
0
        private void Build()
        {
            const uint Magic                     = 0x46485845; // EXHF
            const int  MinimumLength             = 0x2E;
            const int  FixedSizeDataLengthOffset = 0x06;
            const int  VariantOffset             = 0x10;
            const int  DataOffset                = 0x20;

            byte[] buffer = File.GetData();

            if (buffer.Length < MinimumLength)
            {
                throw new InvalidDataException("EXH file is too short");
            }
            if (OrderedBitConverter.ToUInt32(buffer, 0, false) != Magic)
            {
                throw new InvalidDataException("File not a EX header");
            }


            FixedSizeDataLength = OrderedBitConverter.ToUInt16(buffer, FixedSizeDataLengthOffset, true);
            Variant             = OrderedBitConverter.ToUInt16(buffer, VariantOffset, true);
            if (Variant != 1 && Variant != 2)
            {
                throw new NotSupportedException();
            }

            int currentPosition = DataOffset;

            ReadColumns(buffer, ref currentPosition);
            ReadPartialFiles(buffer, ref currentPosition);
            ReadSuffixes(buffer, ref currentPosition);
        }
        public DataRow(IDataSheet sheet, int key, int offset) : base(sheet, key, offset + MetadataLength)
        {
            byte[] b = sheet.GetBuffer();
            if (b.Length < offset + MetadataLength)
            {
                throw new IndexOutOfRangeException();
            }

            Length      = OrderedBitConverter.ToInt32(b, offset, true);
            SubRowCount = OrderedBitConverter.ToInt16(b, offset + 4, true);
        }
Exemple #7
0
        /// <summary>
        ///     Initializes a new instance of the <see cref="Column" /> class.
        /// </summary>
        /// <param name="header">The <see cref="Header" /> of the EX file the column is in.</param>
        /// <param name="index">The index of the column inside the EX file.</param>
        /// <param name="buffer">A byte-array containing the contents of the header file.</param>
        /// <param name="offset">The position of the column information inside <c>buffer</c>.</param>
        public Column(Header header, int index, byte[] buffer, int offset)
        {
            const int TypeOffset     = 0x00;
            const int PositionOffset = 0x02;

            Header = header;
            Index  = index;
            Type   = OrderedBitConverter.ToUInt16(buffer, offset + TypeOffset, true);
            Offset = OrderedBitConverter.ToUInt16(buffer, offset + PositionOffset, true);

            Reader = DataReader.GetReader(Type);
        }
Exemple #8
0
            int[] Option; //7

            public static CharaMakeTypeFaceOptionStruct Read(byte[] buffer, ref int offset)
            {
                CharaMakeTypeFaceOptionStruct cmtf = new CharaMakeTypeFaceOptionStruct();

                cmtf.Option = new int[7];
                for (int i = 0; i < 7; i++)
                {
                    cmtf.Option[i] = OrderedBitConverter.ToInt32(buffer, offset, true);
                    offset += 4;
                }
                return cmtf;
            }
Exemple #9
0
        private void ReadColumns(byte[] buffer, ref int position)
        {
            const int CountOffset = 0x08;
            const int Length      = 0x04;

            ushort count = OrderedBitConverter.ToUInt16(buffer, CountOffset, true);

            _Columns = new Column[count];
            for (int i = 0; i < count; ++i)
            {
                _Columns[i] = CreateColumn(i, buffer, position);
                position   += Length;
            }
        }
Exemple #10
0
        private void ReadSuffixes(byte[] buffer, ref int position)
        {
            const int CountOffset = 0x0C;
            const int Length      = 0x02;

            var count = OrderedBitConverter.ToUInt16(buffer, CountOffset, true);
            var langs = new List <Language>();

            for (var i = 0; i < count; ++i)
            {
                langs.Add(LanguageMap[buffer[position]]);
                position += Length;
            }
            _AvailableLanguages = langs.Where(_ => _ != Language.Unsupported).ToArray();
        }
Exemple #11
0
        public DataRow(IDataSheet sheet, int key, int offset) : base(sheet, key, offset + MetadataLength)
        {
            var b = sheet.GetBuffer();

            if (b.Length < offset + MetadataLength)
            {
                throw new IndexOutOfRangeException();
            }

            Length = OrderedBitConverter.ToInt32(b, offset, true);
            var c = OrderedBitConverter.ToInt16(b, offset + 4, true);

            if (c != 1)
            {
                throw new InvalidDataException();
            }
        }
Exemple #12
0
        private void ReadPartialFiles(byte[] buffer, ref int position)
        {
            const int CountOffset = 0x0A;
            const int Length      = 0x08;

            ushort count = OrderedBitConverter.ToUInt16(buffer, CountOffset, true);

            _DataFileRanges = new Range[count];
            for (int i = 0; i < count; ++i)
            {
                int min = OrderedBitConverter.ToInt32(buffer, position + 0x00, true);
                int len = OrderedBitConverter.ToInt32(buffer, position + 0x04, true);

                _DataFileRanges[i] = new Range(min, len);

                position += Length;
            }
        }
Exemple #13
0
 public static CharaMakeTypeEquipStruct Read(byte[] buffer, ref int offset)
 {
     CharaMakeTypeEquipStruct cmte = new CharaMakeTypeEquipStruct();
     cmte.Helmet = OrderedBitConverter.ToUInt64(buffer, offset, true);
     offset += 8;
     cmte.Top = OrderedBitConverter.ToUInt64(buffer, offset, true);
     offset += 8;
     cmte.Glove = OrderedBitConverter.ToUInt64(buffer, offset, true);
     offset += 8;
     cmte.Down = OrderedBitConverter.ToUInt64(buffer, offset, true);
     offset += 8;
     cmte.Shoes = OrderedBitConverter.ToUInt64(buffer, offset, true);
     offset += 8;
     cmte.Weapon = OrderedBitConverter.ToUInt64(buffer, offset, true);
     offset += 8;
     cmte.SubWeapon = OrderedBitConverter.ToUInt64(buffer, offset, true);
     offset += 8;
     return cmte;
 }
Exemple #14
0
        private void ReadSuffixes(byte[] buffer, ref int position)
        {
            const int CountOffset = 0x0C;
            const int Length      = 0x02;

            // ScreenImage and CutScreenImage reference localized image files,
            // however their available languages are only None.  Perhaps there
            // is a flag to use a global list of available languages in this
            // buffer?

            ushort          count = OrderedBitConverter.ToUInt16(buffer, CountOffset, true);
            List <Language> langs = new List <Language>();

            for (int i = 0; i < count; ++i)
            {
                langs.Add(LanguageMap[buffer[position]]);
                position += Length;
            }
            _AvailableLanguages = langs.Where(_ => _ != Language.Unsupported).ToArray();
        }
Exemple #15
0
        protected virtual void Read()
        {
            _SubRows.Clear();

            var h = Sheet.Header;
            var b = Sheet.GetBuffer();
            var o = Offset;

            for (var i = 0; i < SubRowCount; ++i)
            {
                var key = OrderedBitConverter.ToInt16(b, o, true);
                o += 2;

                var r = new SubRow(this, key, o);
                _SubRows.Add(key, r);

                o += h.FixedSizeDataLength;
            }

            _IsRead = true;
        }
Exemple #16
0
        /// <summary>
        /// Initializes static members of the <see cref="DataReader"/> class.
        /// </summary>
        /// <remarks>
        /// This creates the mappings of type identifiers and <see cref="DataReader"/>s.
        /// </remarks>
        static DataReader()
        {
            DataReaders = new Dictionary <int, DataReader> {
                {
                    0x0000, new StringDataReader()
                }, {
                    0x0001, new DelegateDataReader("bool", 1, typeof(bool), (d, o) => d[o] != 0)
                }, {
                    0x0002, new DelegateDataReader("sbyte", 1, typeof(sbyte), (d, o) => (sbyte)d[o])
                }, {
                    0x0003, new DelegateDataReader("byte", 1, typeof(byte), (d, o) => d[o])
                }, {
                    0x0004,
                    new DelegateDataReader("int16", 2, typeof(short), (d, o) => OrderedBitConverter.ToInt16(d, o, true))
                }, {
                    0x0005,
                    new DelegateDataReader("uint16", 2, typeof(ushort),
                                           (d, o) => OrderedBitConverter.ToUInt16(d, o, true))
                }, {
                    0x0006,
                    new DelegateDataReader("int32", 4, typeof(int), (d, o) => OrderedBitConverter.ToInt32(d, o, true))
                }, {
                    0x0007,
                    new DelegateDataReader("uint32", 4, typeof(uint), (d, o) => OrderedBitConverter.ToUInt32(d, o, true))
                }, {
                    0x0009,
                    new DelegateDataReader("single", 4, typeof(Single),
                                           (d, o) => OrderedBitConverter.ToSingle(d, o, true))
                }, {
                    0x000B,
                    new DelegateDataReader("int64", 8, typeof(Quad), (d, o) => Quad.Read(d, o, true))
                }
            };


            for (byte i = 0; i < 8; ++i)
            {
                DataReaders.Add(0x19 + i, new PackedBooleanDataReader((byte)(1 << i)));
            }
        }
Exemple #17
0
        public static byte[] GetRow(byte[] file, int row)
        {
            int offset = 0;

            //ex header
            offset += 32;

            //seek to offset in table
            for (int i = 0; i < row; i++)
            {
                offset += 8;
            }
            offset += 4;

            int  rowOffset = (int)OrderedBitConverter.ToUInt32(file, offset, true);
            uint length    = OrderedBitConverter.ToUInt32(file, rowOffset, true);

            byte[] rowData = new byte[length];
            Array.Copy(file, rowOffset + 6, rowData, 0, length);

            return(rowData);
        }
        protected virtual void Read()
        {
            _SubRows.Clear();

            Header h = Sheet.Header;

            byte[] b = Sheet.GetBuffer();
            int    o = Offset;

            for (int i = 0; i < SubRowCount; ++i)
            {
                short key = OrderedBitConverter.ToInt16(b, o, true);
                o += 2;

                SubRow r = new SubRow(this, key, o);
                _SubRows.Add(key, r);

                o += h.FixedSizeDataLength;
            }

            _IsRead = true;
        }
Exemple #19
0
        public static Quad Read(byte[] buffer, int offset, bool bigEndian)
        {
            long data = OrderedBitConverter.ToInt64(buffer, offset, bigEndian);

            return(new Quad(data));
        }
Exemple #20
0
 public static uint GetNumRows(byte[] file)
 {
     return(OrderedBitConverter.ToUInt32(file, 8, true) / 8);
 }