public static int GetSizeOf(this ValueTypeDescriptor descriptor)
 {
     if (descriptor.IsPrimitive())
     {
         return(-1);
     }
     return(descriptor.GetFieldDescriptors().Last().x08_Offset);
 }
Esempio n. 2
0
 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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
 }
Esempio n. 12
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);
        }
Esempio n. 13
0
        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("}");
            }
        }