public static int GetSizeOf(this ValueTypeDescriptor descriptor) { if (descriptor.IsPrimitive()) { return(-1); } return(descriptor.GetFieldDescriptors().Last().x08_Offset); }
private static void ExamineUnknownTypes(ValueTypeDescriptor valueType, List <KnownType> knownTypes, ref List <ValueTypeDescriptor> unknownTypes) { foreach (var field in valueType.GetFieldDescriptors().OrderBy(a => a.x08_Offset).ThenBy(a => a.x3C_BitOffset).TakeWhile(a => !a.GetFieldType().IsNull())) { var importantType = (field.IsArray() && !field.IsTagMap()) ? field.GetBaseType() : field.GetFieldType(); var isKnownType = knownTypes.Contains(importantType.GetName()); var isAlreadyUnknownType = unknownTypes.Any(a => a.GetName() == importantType.GetName()); if (!isKnownType && !isAlreadyUnknownType) { unknownTypes.Add(importantType); } } }
public static string GetName(this ValueTypeDescriptor descriptor) { var name = descriptor.x04_Name; if (name == "Items" && descriptor.x0C_FieldDescriptors[1].GetTypeName() == "ItemType") { name = "ItemTypes"; } if (name == "Monster" && descriptor.GetFieldDescriptors().All(a => a.GetFieldType().x04_Name != "Monster" && a.GetBaseType().x04_Name != "Monster")) { name = "MonsterData"; } if (name == "QuestRange" && descriptor.GetFieldDescriptors().All(a => a.GetFieldType().x04_Name != "QuestRange" && a.GetBaseType().x04_Name != "QuestRange")) { name = "QuestRangeData"; } return(name); }
private static string GenerateGetter(ValueTypeDescriptor type, FieldDescriptor field) { string hexFormat = "X" + Math.Max(2, type.GetSizeOf().ToString("X").Length); string getter; if (field.IsVariableArray()) { getter = string.Format(" {{ get {{ return Deserialize<{0}>(x{1}_SerializeData); }} }}", field.GetBaseTypeName(), field.GetVariableArraySerializeOffset().ToString(hexFormat)); } else if (field.IsFixedArray()) { getter = string.Format(" {{ get {{ return Read<{0}>(0x{1}, {2}); }} }}", field.GetBaseTypeName(), field.x08_Offset.ToString(hexFormat), field.GetFixedArrayLength()); } else if (field.IsCharArray()) { getter = string.Format(" {{ get {{ return ReadString(0x{0}, {1}); }} }}", field.x08_Offset.ToString(hexFormat), field.GetFixedArrayLength()); } else if (field.IsString() || field.IsFormula()) { getter = string.Format(" {{ get {{ return DeserializeString(x{1}_SerializeData); }} }}", field.GetBaseTypeName(), field.GetVariableArraySerializeOffset().ToString(hexFormat)); } else if (field.IsTagMap()) { // TODO: Figure out what his really is... guessing it's array of ints getter = string.Format(" {{ get {{ return Deserialize<{0}>(x{1}_SerializeData); }} }}", "int", field.GetVariableArraySerializeOffset().ToString(hexFormat)); } else if (field.IsFlag()) { string mask = "0x" + (1 << field.x3C_BitOffset).ToString("X8"); getter = string.Format(" {{ get {{ return (Read<int>(0x{0}) & {1}) != 0; }} }}", field.x08_Offset.ToString(hexFormat), mask); } else { getter = string.Format(" {{ get {{ return Read<{0}>(0x{1}); }} }}", field.GetTypeName(), field.x08_Offset.ToString(hexFormat)); } return(getter); }
private static string GenerateComment(ValueTypeDescriptor type, FieldDescriptor field) { string comment = null; if (field.IsEnum()) { comment = " // " + string.Join(", ", SymbolDescriptor.GetAllSymbols(field.x38_SymbolTable).Select(a => a.GetName() + " = " + a.x00_Id)); } else if (field.IsTranslateable()) { comment = string.Format(" // TranslateFromString = 0x{0:X8}, TranslateFromValue = 0x{1:X8}", field.x40_TranslateFromString, field.x44_TranslateFromValue); } else if (field.IsTagMap()) { comment = " // type: 0x" + field.x34.ToString("X8"); } return(comment); }
public ValueObjectModelBuilder(ValueTypeDescriptor descriptor, EntityModelBuilderConfiguration configuration) { Descriptor = descriptor; Configuration = configuration; }
public static bool IsMeshType(this ValueTypeDescriptor descriptor) { return((descriptor.x18_Flags & (1 << 6)) != 0); }
public static bool ContainsSerializedData(this ValueTypeDescriptor descriptor) { return((descriptor.x18_Flags & (1 << 3)) != 0); }
public static bool IsNative(this ValueTypeDescriptor descriptor) { return(NativeTypes.Contains(descriptor.x04_Name)); }
public static bool IsNull(this ValueTypeDescriptor descriptor) { return(descriptor.x04_Name == "DT_NULL"); }
public static bool IsPrimitive(this ValueTypeDescriptor descriptor) { return(descriptor.x10_FieldCount == 0); }
private static string GenerateFieldName(ValueTypeDescriptor type, FieldDescriptor field) { string hexFormat = "X" + Math.Max(2, type.GetSizeOf().ToString("X").Length); string knownFieldName = null; if (_knownFieldNames.ContainsKey(type.GetName())) { if (!_knownFieldNames[type.GetName()].TryGetValue(field.x08_Offset, out knownFieldName)) { knownFieldName = null; } } string name = string.Format("x{0}", field.x08_Offset.ToString(hexFormat)); if (knownFieldName != null) { name += "_" + knownFieldName; } else if (field.IsTagMap()) { name += "_TagMap"; } else if (field.IsSno()) { name += "_" + (field.x30_GroupId == -1 ? "" : ((SNOType)field.x30_GroupId).ToString()) + "SNO"; } else if (field.IsSnoGroup()) { name += "_" + (field.x30_GroupId == -1 ? "" : ((SNOType)field.x30_GroupId).ToString()) + "SNOGroup"; } else if (field.IsGameBalanceId()) { name += "_" + (field.x30_GroupId == -1 ? "" : ((GBType)field.x30_GroupId).ToString()) + "GBID"; } else if (field.IsStringArray()) { name += "_Text"; } else if (field.IsEnum()) { name += "_Enum"; } else if (field.IsFormula()) { name += "_Formula"; } else if (field.IsArray() && !field.GetBaseType().IsNative()) { name += "_" + field.GetTypeName(); if (name.Last() != 's') { // Plurialize if (!name.EndsWith("Data")) { if (name.Last() == 'y') { name = name.Substring(0, name.Length - 1) + "ies"; } else { name += "s"; } } } } else if (field.IsFlag()) { name += "_Bit" + field.x3C_BitOffset; } else if (!field.IsNative()) { name += "_" + field.GetTypeName(); } return(name); }
private static void Examine(List <KnownType> knownTypes, ValueTypeDescriptor valueType) { var unknownTypes = new List <ValueTypeDescriptor>(); foreach (var field in valueType.GetFieldDescriptors().OrderBy(a => a.x08_Offset).ThenBy(a => a.x3C_BitOffset).TakeWhile(a => !a.GetFieldType().IsNull()) .GroupBy(a => a.x08_Offset + "." + a.x3C_BitOffset).Select(a => a.Last())) // TODO: Added grouping for quick "offset uniqueness". Why is this even needed? { string prefix = GeneratePrefix(field); string name = GenerateFieldName(valueType, field); string getter = GenerateGetter(valueType, field); string comment = GenerateComment(valueType, field); PrintLine(prefix + name + getter + comment); var importantType = (field.IsArray() && !field.IsTagMap()) ? field.GetBaseType() : field.GetFieldType(); var isKnownType = knownTypes.Contains(new KnownType { Address = importantType.Address, Name = importantType.GetName() }); var isAlreadyUnknownType = unknownTypes.Any(a => a.GetName() == importantType.GetName()); if (!isKnownType && !isAlreadyUnknownType) { unknownTypes.Add(importantType); } } knownTypes.AddRange(unknownTypes.Select(a => new KnownType { Address = a.Address, Name = a.GetName() })); for (int i = 0; i < unknownTypes.Count; i++) { ExamineUnknownTypes(unknownTypes[i], knownTypes, ref unknownTypes); } foreach (var type in unknownTypes) { string baseType = type.ContainsSerializedData() ? "SerializeMemoryObject" : "MemoryObject"; int sizeOf = type.GetSizeOf(); string hexFormat = "X" + Math.Max(2, sizeOf.ToString("X").Length); PrintLine(); PrintLine("[CompilerGenerated]"); PrintLine("public {2}class {0} : {1}", type.GetName(), baseType, DeclarePartial ? "partial " : ""); PrintLine("{"); IndentLevel++; PrintLine("public const int SizeOf = 0x{0}; // {1}", sizeOf.ToString(hexFormat), sizeOf); PrintLine(); //Examine(knownTypes, type); foreach (var field in type.GetFieldDescriptors().OrderBy(a => a.x08_Offset).ThenBy(a => a.x3C_BitOffset).TakeWhile(a => !a.GetFieldType().IsNull()) .GroupBy(a => a.x08_Offset + "." + a.x3C_BitOffset).Select(a => a.Last())) // TODO: Added grouping for quick "offset uniqueness". Why is this even needed? { string prefix = GeneratePrefix(field); string name = GenerateFieldName(type, field); string getter = GenerateGetter(type, field); string comment = GenerateComment(type, field); PrintLine(prefix + name + getter + comment); } IndentLevel--; PrintLine("}"); } }