/// <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); } }
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); }
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); }
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)); }
/// <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); } }
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); }
/// <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); }
/// <summary> /// 增加数据表行。 /// </summary> /// <param name="dataRowSegment">要解析的数据表行片段。</param> /// <param name="dataTableUserData">数据表用户自定义数据。</param> /// <returns>是否增加数据表行成功。</returns> public abstract bool AddDataRow(GameFrameworkDataSegment dataRowSegment, object dataTableUserData);