예제 #1
0
        /// <summary>
        /// 获取数据表行片段。
        /// </summary>
        /// <param name="dataTableData">要解析的数据表数据。</param>
        /// <returns>数据表行片段。</returns>
        public override GameFrameworkDataSegment[] GetDataRowSegments(object dataTableData)
        {
            try
            {
                string dataTableText = dataTableData as string;
                if (dataTableText != null)
                {
                    List <GameFrameworkDataSegment> dataRowSegments = new List <GameFrameworkDataSegment>();
                    GameFrameworkDataSegment        dataRowSegment;
                    int position = 0;
                    while ((dataRowSegment = ReadDataRowSegment(dataTableText, ref position)) != default(GameFrameworkDataSegment))
                    {
                        if (dataTableText[dataRowSegment.Offset] == '#')
                        {
                            continue;
                        }

                        dataRowSegments.Add(dataRowSegment);
                    }

                    return(dataRowSegments.ToArray());
                }

                byte[] dataTableBytes = dataTableData as byte[];
                if (dataTableBytes != null)
                {
                    using (MemoryStream memoryStream = new MemoryStream(dataTableBytes, false))
                    {
                        using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
                        {
                            int stringsOffset       = binaryReader.ReadInt32();
                            int dataRowSegmentCount = binaryReader.Read7BitEncodedInt32();
                            GameFrameworkDataSegment[] dataRowSegments = new GameFrameworkDataSegment[dataRowSegmentCount];
                            for (int i = 0; i < dataRowSegmentCount; i++)
                            {
                                int length = binaryReader.Read7BitEncodedInt32();
                                dataRowSegments[i] = new GameFrameworkDataSegment(dataTableBytes, (int)binaryReader.BaseStream.Position, length);
                                binaryReader.BaseStream.Position += length;
                            }

                            if (binaryReader.BaseStream.Position != stringsOffset)
                            {
                                throw new GameFrameworkException("Verification failed.");
                            }

                            return(dataRowSegments);
                        }
                    }
                }

                Log.Warning("Can not get data row segments which type '{0}' is invalid.", dataTableData.GetType().FullName);
                return(null);
            }
            catch (Exception exception)
            {
                Log.Warning("Can not get data row segments with exception '{0}'.", exception.ToString());
                return(null);
            }
        }
예제 #2
0
        public override bool ParseDataRow(GameFrameworkDataSegment dataRowSegment, object dataTableUserData)
        {
            Type dataType = dataRowSegment.DataType;

            if (dataType == typeof(string))
            {
                string[] columnTexts = ((string)dataRowSegment.Data).Substring(dataRowSegment.Offset, dataRowSegment.Length).Split(DataTableExtension.DataSplitSeparators);
                for (int i = 0; i < columnTexts.Length; i++)
                {
                    columnTexts[i] = columnTexts[i].Trim(DataTableExtension.DataTrimSeparators);
                }

                int index = 0;
                index++;
                m_Id = int.Parse(columnTexts[index++]);
                index++;
                ThrusterId   = int.Parse(columnTexts[index++]);
                WeaponId0    = int.Parse(columnTexts[index++]);
                WeaponId1    = int.Parse(columnTexts[index++]);
                WeaponId2    = int.Parse(columnTexts[index++]);
                ArmorId0     = int.Parse(columnTexts[index++]);
                ArmorId1     = int.Parse(columnTexts[index++]);
                ArmorId2     = int.Parse(columnTexts[index++]);
                DeadEffectId = int.Parse(columnTexts[index++]);
                DeadSoundId  = int.Parse(columnTexts[index++]);
            }
            else if (dataType == typeof(byte[]))
            {
                string[] strings = (string[])dataTableUserData;
                using (MemoryStream memoryStream = new MemoryStream((byte[])dataRowSegment.Data, dataRowSegment.Offset, dataRowSegment.Length, false))
                {
                    using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
                    {
                        m_Id         = binaryReader.Read7BitEncodedInt32();
                        ThrusterId   = binaryReader.Read7BitEncodedInt32();
                        WeaponId0    = binaryReader.Read7BitEncodedInt32();
                        WeaponId1    = binaryReader.Read7BitEncodedInt32();
                        WeaponId2    = binaryReader.Read7BitEncodedInt32();
                        ArmorId0     = binaryReader.Read7BitEncodedInt32();
                        ArmorId1     = binaryReader.Read7BitEncodedInt32();
                        ArmorId2     = binaryReader.Read7BitEncodedInt32();
                        DeadEffectId = binaryReader.Read7BitEncodedInt32();
                        DeadSoundId  = binaryReader.Read7BitEncodedInt32();
                    }
                }
            }
            else
            {
                Log.Warning("Can not parse data row which type '{0}' is invalid.", dataType.FullName);
                return(false);
            }

            GeneratePropertyArray();
            return(true);
        }
예제 #3
0
        public override bool ParseDataRow(GameFrameworkDataSegment dataRowSegment, object dataTableUserData)
        {
            Type dataType = dataRowSegment.DataType;

            if (dataType == typeof(string))
            {
                string[] columnTexts = ((string)dataRowSegment.Data).Substring(dataRowSegment.Offset, dataRowSegment.Length).Split(DataTableExtension.DataSplitSeparators);
                for (int i = 0; i < columnTexts.Length; i++)
                {
                    columnTexts[i] = columnTexts[i].Trim(DataTableExtension.DataTrimSeparators);
                }

                int index = 0;
                index++;
                m_Id = int.Parse(columnTexts[index++]);
                index++;
                AssetName    = columnTexts[index++];
                Priority     = int.Parse(columnTexts[index++]);
                Loop         = bool.Parse(columnTexts[index++]);
                Volume       = float.Parse(columnTexts[index++]);
                SpatialBlend = float.Parse(columnTexts[index++]);
                MaxDistance  = float.Parse(columnTexts[index++]);
            }
            else if (dataType == typeof(byte[]))
            {
                string[] strings = (string[])dataTableUserData;
                using (MemoryStream memoryStream = new MemoryStream((byte[])dataRowSegment.Data, dataRowSegment.Offset, dataRowSegment.Length, false))
                {
                    using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
                    {
                        m_Id         = binaryReader.Read7BitEncodedInt32();
                        AssetName    = strings[binaryReader.Read7BitEncodedInt32()];
                        Priority     = binaryReader.Read7BitEncodedInt32();
                        Loop         = binaryReader.ReadBoolean();
                        Volume       = binaryReader.ReadSingle();
                        SpatialBlend = binaryReader.ReadSingle();
                        MaxDistance  = binaryReader.ReadSingle();
                    }
                }
            }
            else
            {
                Log.Warning("Can not parse data row which type '{0}' is invalid.", dataType.FullName);
                return(false);
            }

            GeneratePropertyArray();
            return(true);
        }
예제 #4
0
        private GameFrameworkDataSegment ReadDataRowSegment(string dataTableText, ref int position)
        {
            int length = dataTableText.Length;
            int offset = position;

            while (offset < length)
            {
                char ch = dataTableText[offset];
                switch (ch)
                {
                case '\r':
                case '\n':
                    if (offset - position > 0)
                    {
                        GameFrameworkDataSegment dataRowSegment = new GameFrameworkDataSegment(dataTableText, position, offset - position);
                        position = offset + 1;
                        if ((ch == '\r') && (position < length) && (dataTableText[position] == '\n'))
                        {
                            position++;
                        }

                        return(dataRowSegment);
                    }

                    offset++;
                    position++;
                    break;

                default:
                    offset++;
                    break;
                }
            }

            if (offset > position)
            {
                GameFrameworkDataSegment dataRowSegment = new GameFrameworkDataSegment(dataTableText, position, offset - position);
                position = offset;
                return(dataRowSegment);
            }

            return(default(GameFrameworkDataSegment));
        }
예제 #5
0
            /// <summary>
            /// 增加数据表行。
            /// </summary>
            /// <param name="dataRowSegment">要解析的数据表行片段。</param>
            /// <param name="dataTableUserData">数据表用户自定义数据。</param>
            /// <returns>是否增加数据表行成功。</returns>
            public override bool AddDataRow(GameFrameworkDataSegment dataRowSegment, object dataTableUserData)
            {
                try
                {
                    T dataRow = new T();
                    if (!dataRow.ParseDataRow(dataRowSegment, dataTableUserData))
                    {
                        return(false);
                    }

                    InternalAddDataRow(dataRow);
                    return(true);
                }
                catch (Exception exception)
                {
                    if (exception is GameFrameworkException)
                    {
                        throw;
                    }

                    throw new GameFrameworkException(Utility.Text.Format("Can not parse data table '{0}' with exception '{1}'.", new TypeNamePair(typeof(T), Name).ToString(), exception.ToString()), exception);
                }
            }
예제 #6
0
        public override bool ParseDataRow(GameFrameworkDataSegment dataRowSegment, object dataTableUserData)
        {
            Type dataType = dataRowSegment.DataType;

            if (dataType == typeof(string))
            {
                string[] columnTexts = ((string)dataRowSegment.Data).Substring(dataRowSegment.Offset, dataRowSegment.Length).Split(DataTableExtension.DataSplitSeparators);
                for (int i = 0; i < columnTexts.Length; i++)
                {
                    columnTexts[i] = columnTexts[i].Trim(DataTableExtension.DataTrimSeparators);
                }

                int index = 0;
                index++;
                m_Id = int.Parse(columnTexts[index++]);
                index++;
                BoolValue    = bool.Parse(columnTexts[index++]);
                ByteValue    = byte.Parse(columnTexts[index++]);
                CharValue    = char.Parse(columnTexts[index++]);
                Color32Value = DataTableExtension.ParseColor32(columnTexts[index++]);
                ColorValue   = DataTableExtension.ParseColor(columnTexts[index++]);
                index++;
                DateTimeValue   = DateTime.Parse(columnTexts[index++]);
                DecimalValue    = decimal.Parse(columnTexts[index++]);
                DoubleValue     = double.Parse(columnTexts[index++]);
                FloatValue      = float.Parse(columnTexts[index++]);
                IntValue        = int.Parse(columnTexts[index++]);
                LongValue       = long.Parse(columnTexts[index++]);
                QuaternionValue = DataTableExtension.ParseQuaternion(columnTexts[index++]);
                RectValue       = DataTableExtension.ParseRect(columnTexts[index++]);
                SByteValue      = sbyte.Parse(columnTexts[index++]);
                ShortValue      = short.Parse(columnTexts[index++]);
                StringValue     = columnTexts[index++];
                UIntValue       = uint.Parse(columnTexts[index++]);
                ULongValue      = ulong.Parse(columnTexts[index++]);
                UShortValue     = ushort.Parse(columnTexts[index++]);
                Vector2Value    = DataTableExtension.ParseVector2(columnTexts[index++]);
                Vector3Value    = DataTableExtension.ParseVector3(columnTexts[index++]);
                Vector4Value    = DataTableExtension.ParseVector4(columnTexts[index++]);
            }
            else if (dataType == typeof(byte[]))
            {
                string[] strings = (string[])dataTableUserData;
                using (MemoryStream memoryStream = new MemoryStream((byte[])dataRowSegment.Data, dataRowSegment.Offset, dataRowSegment.Length, false))
                {
                    using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
                    {
                        m_Id            = binaryReader.Read7BitEncodedInt32();
                        BoolValue       = binaryReader.ReadBoolean();
                        ByteValue       = binaryReader.ReadByte();
                        CharValue       = binaryReader.ReadChar();
                        Color32Value    = binaryReader.ReadColor32();
                        ColorValue      = binaryReader.ReadColor();
                        DateTimeValue   = binaryReader.ReadDateTime();
                        DecimalValue    = binaryReader.ReadDecimal();
                        DoubleValue     = binaryReader.ReadDouble();
                        FloatValue      = binaryReader.ReadSingle();
                        IntValue        = binaryReader.Read7BitEncodedInt32();
                        LongValue       = binaryReader.Read7BitEncodedInt64();
                        QuaternionValue = binaryReader.ReadQuaternion();
                        RectValue       = binaryReader.ReadRect();
                        SByteValue      = binaryReader.ReadSByte();
                        ShortValue      = binaryReader.ReadInt16();
                        StringValue     = strings[binaryReader.Read7BitEncodedInt32()];
                        UIntValue       = binaryReader.Read7BitEncodedUInt32();
                        ULongValue      = binaryReader.Read7BitEncodedUInt64();
                        UShortValue     = binaryReader.ReadUInt16();
                        Vector2Value    = binaryReader.ReadVector2();
                        Vector3Value    = binaryReader.ReadVector3();
                        Vector4Value    = binaryReader.ReadVector4();
                    }
                }
            }
            else
            {
                Log.Warning("Can not parse data row which type '{0}' is invalid.", dataType.FullName);
                return(false);
            }

            GeneratePropertyArray();
            return(true);
        }
예제 #7
0
 /// <summary>
 /// 数据表行解析器。
 /// </summary>
 /// <param name="dataRowSegment">要解析的数据表行片段。</param>
 /// <param name="dataTableUserData">数据表用户自定义数据。</param>
 /// <returns>是否解析数据表行成功。</returns>
 public virtual bool ParseDataRow(GameFrameworkDataSegment dataRowSegment, object dataTableUserData)
 {
     Log.Warning("Not implemented ParseDataRow.");
     return(false);
 }
예제 #8
0
 /// <summary>
 /// 增加数据表行。
 /// </summary>
 /// <param name="dataRowSegment">要解析的数据表行片段。</param>
 /// <param name="dataTableUserData">数据表用户自定义数据。</param>
 /// <returns>是否增加数据表行成功。</returns>
 public abstract bool AddDataRow(GameFrameworkDataSegment dataRowSegment, object dataTableUserData);