示例#1
0
        private static void GenerateReadFunction(BdatType type, Indenter sb)
        {
            sb.AppendLine($"public static {type.Name} Read{type.Name}(byte[] file, int itemId, int itemOffset, int tableOffset)");
            sb.AppendLineAndIncrease("{");
            sb.AppendLine($"var item = new {type.Name}();");
            sb.AppendLine("item.Id = itemId;");

            foreach (var member in type.Members.Where(x => x.Type == BdatMemberType.Scalar))
            {
                sb.AppendLine(GetReader(member));
            }

            foreach (var member in type.Members.Where(x => x.Type == BdatMemberType.Array))
            {
                GetArrayReader(member, sb);
            }

            foreach (var member in type.Members.Where(x => x.Type == BdatMemberType.Flag))
            {
                var flagVarName = GetIdentifier(type.Members[member.FlagVarIndex].Name);
                sb.AppendLine($"item.{GetIdentifier(member.Name)} = (item.{flagVarName} & {member.FlagMask}) != 0;");
            }

            sb.AppendLine("return item;");
            sb.DecreaseAndAppendLine("}");
        }
示例#2
0
        private static void GenerateType(BdatType type, Indenter sb)
        {
            var added = new HashSet <string>();

            sb.AppendLine("[BdatType]");
            sb.AppendLine("[Serializable]");
            sb.AppendLine($"public class {type.Name}");
            sb.AppendLineAndIncrease("{");
            sb.AppendLine("public int Id;");

            foreach (var member in type.Members)
            {
                if (added.Contains(member.Name))
                {
                    continue;
                }
                added.Add(member.Name);

                var memberType = member.Type;
                var name       = GetIdentifier(member.Name);
                switch (memberType)
                {
                case BdatMemberType.Flag:
                    sb.AppendLine($"public bool {name};");
                    break;

                case BdatMemberType.Scalar:
                    sb.AppendLine($"public {GetType(member.ValType)} {name};");
                    break;

                case BdatMemberType.Array:
                    int length  = member.ArrayCount;
                    var valType = GetType(member.ValType);
                    sb.AppendLine($"public readonly {valType}[] {name} = new {valType}[{length}];");
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            foreach (var bdatRef in type.TableRefs)
            {
                switch (bdatRef.Type)
                {
                case BdatFieldType.Reference:
                case BdatFieldType.Message:
                    sb.AppendLine($"public {bdatRef.ChildType} _{bdatRef.Field};");
                    break;

                case BdatFieldType.Item:
                case BdatFieldType.Task:
                case BdatFieldType.Condition:
                    sb.AppendLine($"public object _{bdatRef.Field};");
                    break;

                case BdatFieldType.Enum:
                    sb.AppendLine($"public {bdatRef.EnumType.Name} _{bdatRef.Field};");
                    break;

                default:
                    if (bdatRef.EnumType != null)
                    {
                        sb.AppendLine($"public {bdatRef.EnumType.Name} _{bdatRef.Field};");
                    }
                    break;
                }
            }

            foreach (var array in type.Arrays)
            {
                sb.AppendLine($"public {array.Type}[] _{array.Name};");
            }

            sb.DecreaseAndAppendLine("}");
        }
示例#3
0
        private static void GenerateType(BdatType type, Indenter sb)
        {
            var added = new HashSet <string>();

            sb.AppendLine("[BdatType]");
            sb.AppendLine("[Serializable]");
            sb.AppendLine($"public class {type.Name} : BdatItem");
            sb.AppendLineAndIncrease("{");

            foreach (BdatMember member in type.Members)
            {
                if (added.Contains(member.Name))
                {
                    continue;
                }
                added.Add(member.Name);

                BdatMemberType memberType = member.Type;
                string         name       = GetIdentifier(member.Name);
                switch (memberType)
                {
                case BdatMemberType.Flag:
                    sb.AppendLine($"public bool {name};");
                    break;

                case BdatMemberType.Scalar:
                    sb.AppendLine($"public {GetType(member.ValType)} {name};");
                    break;

                case BdatMemberType.Array:
                    int    length  = member.ArrayCount;
                    string valType = GetType(member.ValType);
                    sb.AppendLine($"public readonly {valType}[] {name} = new {valType}[{length}];");
                    break;

                case BdatMemberType.None:
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            foreach (BdatFieldInfo bdatRef in type.TableRefs)
            {
                bdatRef.Member = type.Members.First(x => x.Name == bdatRef.Field);
                string itemType = "";
                string itemName = bdatRef.Field;

                switch (bdatRef.Type)
                {
                case BdatFieldType.Reference:
                case BdatFieldType.OneWayReference:
                case BdatFieldType.Message:
                    itemType = bdatRef.ChildType;
                    break;

                case BdatFieldType.Item:
                case BdatFieldType.Task:
                case BdatFieldType.Condition:
                    itemType = "object";
                    break;

                case BdatFieldType.Enum:
                    itemType = bdatRef.EnumType.Name;
                    break;

                default:
                    if (bdatRef.EnumType != null)
                    {
                        itemType = bdatRef.EnumType.Name;
                    }
                    break;
                }

                switch (bdatRef.Member.Type)
                {
                case BdatMemberType.Scalar:
                    sb.AppendLine($"public {itemType} _{itemName};");
                    break;

                case BdatMemberType.Array:
                    sb.AppendLine($"public {itemType}[] _{itemName} = new {itemType}[{bdatRef.Member.ArrayCount}];");
                    break;

                case BdatMemberType.None:
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            foreach (BdatArrayInfo array in type.Arrays)
            {
                sb.AppendLine($"public {array.Type}[] _{array.Name};");
            }

            sb.DecreaseAndAppendLine("}");
        }