Beispiel #1
0
        private static void GenerateSetReferencesTable(Indenter sb, BdatTableDesc table)
        {
            sb.AppendLine($"foreach ({table.Type.Name} item in tables.{table.Name}.Items)");
            sb.AppendLineAndIncrease("{");
            foreach (BdatFieldInfo fieldRef in table.TableRefs.OrderBy(x => x.Field))
            {
                if (fieldRef.Member?.Type == BdatMemberType.Array)
                {
                    sb.AppendLine($"for (int i = 0; i < {fieldRef.Member.ArrayCount}; i++)");
                    sb.AppendLineAndIncrease("{");

                    switch (fieldRef.Type)
                    {
                    case BdatFieldType.Reference:
                        sb.AppendLine(
                            $"item._{fieldRef.Field}[i] = tables.{fieldRef.RefTable}.GetItemOrNull(item.{PrintFieldRefId(fieldRef)}[i]);");
                        break;

                    default:
                        throw new NotImplementedException();
                    }
                    sb.DecreaseAndAppendLine("}");
                }
                else
                {
                    switch (fieldRef.Type)
                    {
                    case BdatFieldType.Reference:
                        sb.AppendLine(
                            $"item._{fieldRef.Field} = tables.{fieldRef.RefTable}.GetItemOrNull(item.{PrintFieldRefId(fieldRef)});");
                        break;

                    case BdatFieldType.Message:
                        sb.AppendLine(
                            $"item._{fieldRef.Field} = tables.{fieldRef.RefTable}.GetItemOrNull(item.{PrintFieldRefId(fieldRef)});");
                        break;

                    case BdatFieldType.Item:
                        sb.AppendLine(
                            $"item._{fieldRef.Field} = tables.GetItem(item.{PrintFieldRefId(fieldRef)});");
                        break;

                    case BdatFieldType.Task:
                        sb.AppendLine(
                            $"item._{fieldRef.Field} = tables.GetTask((TaskType)item.{fieldRef.RefField}, item.{PrintFieldRefId(fieldRef)});");
                        break;

                    case BdatFieldType.Condition:
                        sb.AppendLine(
                            $"item._{fieldRef.Field} = tables.GetCondition((ConditionType)item.{fieldRef.RefField}, item.{PrintFieldRefId(fieldRef)});");
                        break;

                    case BdatFieldType.Enum:
                        sb.AppendLine($"item._{fieldRef.Field} = ({fieldRef.EnumType.Name})item.{fieldRef.Field};");
                        break;

                    default:
                        if (fieldRef.EnumType != null)
                        {
                            sb.AppendLine(
                                $"item._{fieldRef.Field} = ({fieldRef.EnumType.Name})item.{PrintFieldRefId(fieldRef)};");
                        }

                        break;
                    }
                }
            }

            foreach (BdatArrayInfo array in table.Arrays.OrderBy(x => x.Name))
            {
                sb.AppendLine($"item._{array.Name} = new[]");
                sb.AppendLineAndIncrease("{");

                int elementCount = array.Elements.Count;
                for (int i = 0; i < elementCount; i++)
                {
                    string name = (array.IsReferences ? "_" : "") + array.Elements[i];
                    sb.AppendLine($"item.{name}{(i < elementCount - 1 ? "," : "")}");
                }

                sb.DecreaseAndAppendLine("};");
            }

            sb.DecreaseAndAppendLine("}");
        }
Beispiel #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("}");
        }
Beispiel #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("}");
        }