예제 #1
0
        private static string GenerateReadFunctionsFile(BdatTables info)
        {
            var sb = new Indenter();

            sb.AppendLine("// ReSharper disable InconsistentNaming");
            sb.AppendLine("// ReSharper disable UnusedMember.Global");
            sb.AppendLine("// ReSharper disable UseObjectOrCollectionInitializer");
            sb.AppendLine("// ReSharper disable UnusedParameter.Global").AppendLine();
            sb.AppendLine("using System;");
            sb.AppendLine("using XbTool.Types").AppendLine();
            sb.AppendLine("namespace XbTool.Serialization");
            sb.AppendLineAndIncrease("{");
            sb.AppendLine("public static class ReadFunctions");
            sb.AppendLineAndIncrease("{");
            bool firstFunction = true;

            foreach (var type in info.Types)
            {
                if (!firstFunction)
                {
                    sb.AppendLine();
                }
                firstFunction = false;
                GenerateReadFunction(type, sb);
            }

            sb.AppendLine();
            GenerateSetReferencesFunction(sb, info);

            sb.DecreaseAndAppendLine("}");
            sb.DecreaseAndAppendLine("}");
            return(sb.ToString());
        }
예제 #2
0
        private static string GenerateBdatCollectionFile(BdatTables info)
        {
            var sb = new Indenter();

            sb.AppendLine("// ReSharper disable InconsistentNaming");
            sb.AppendLine("// ReSharper disable UnassignedField.Global");
            sb.AppendLine("// ReSharper disable UnusedMember.Global").AppendLine();
            sb.AppendLine("using System;");
            sb.AppendLine("using XbTool.Bdat;").AppendLine();
            sb.AppendLine("using XbTool.Types");
            sb.AppendLineAndIncrease("{");
            sb.AppendLine("[Serializable]");
            sb.AppendLine("public class BdatCollection");
            sb.AppendLineAndIncrease("{");

            foreach (var type in info.Types)
            {
                foreach (string table in type.TableNames.OrderBy(x => x))
                {
                    sb.AppendLine($"public BdatTable<{type.Name}> {table};");
                }
            }

            sb.DecreaseAndAppendLine("}");
            sb.DecreaseAndAppendLine("}");
            return(sb.ToString());
        }
예제 #3
0
        private static void GenerateSetReferencesTable(Indenter sb, BdatTableDesc table)
        {
            sb.AppendLine($"foreach ({table.Type.Name} item in tables.{table.Name}.Items)");
            sb.AppendLineAndIncrease("{");
            foreach (var fieldRef in table.TableRefs.OrderBy(x => x.Field))
            {
                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 (var array in table.Arrays.OrderBy(x => x.Name))
            {
                sb.AppendLine($"item._{array.Name} = new[]");
                sb.AppendLineAndIncrease("{");

                var 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("}");
        }
예제 #4
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("}");
        }
예제 #5
0
        private static string GenerateTypesFile(BdatTables info)
        {
            var sb = new Indenter();

            sb.AppendLine("// ReSharper disable InconsistentNaming");
            sb.AppendLine("// ReSharper disable NotAccessedField.Global");
            sb.AppendLine();
            sb.AppendLine("using System;");
            sb.AppendLine("using XbTool.Bdat;");
            sb.AppendLine();
            sb.AppendLine("namespace XbTool.Types");
            sb.AppendLineAndIncrease("{");

            for (int i = 0; i < info.Types.Length; i++)
            {
                if (i != 0)
                {
                    sb.AppendLine();
                }
                GenerateType(info.Types[i], sb);
            }

            sb.DecreaseAndAppendLine("}");
            return(sb.ToString());
        }
예제 #6
0
        private static void GetArrayReader(BdatMember member, Indenter sb)
        {
            string name      = GetIdentifier(member.Name);
            int    itemSize  = GetSize(member.ValType);
            string memberPos = member.MemberPos > 0 ? $" + {member.MemberPos}" : string.Empty;

            sb.AppendLine($"for (int i = 0, offset = itemOffset{memberPos}; i < {member.ArrayCount}; i++, offset += {itemSize})");
            sb.AppendLineAndIncrease("{");

            switch (member.ValType)
            {
            case BdatValueType.UInt8:
                sb.AppendLine($"item.{name}[i] = file[offset];");
                break;

            case BdatValueType.UInt16:
                sb.AppendLine($"item.{name}[i] = BitConverter.ToUInt16(file, offset);");
                break;

            case BdatValueType.UInt32:
                sb.AppendLine($"item.{name}[i] = BitConverter.ToUInt32(file, offset);");
                break;

            case BdatValueType.Int8:
                sb.AppendLine($"item.{name}[i] = (sbyte)file[offset];");
                break;

            case BdatValueType.Int16:
                sb.AppendLine($"item.{name}[i] = BitConverter.ToInt16(file, offset);");
                break;

            case BdatValueType.Int32:
                sb.AppendLine($"item.{name}[i] = BitConverter.ToInt32(file, offset);");
                break;

            case BdatValueType.String:
                sb.AppendLine($"item.{name}[i] = Stuff.GetUTF8Z(file, tableOffset + BitConverter.ToInt32(file, offset));");
                break;

            case BdatValueType.FP32:
                sb.AppendLine($"item.{name}[i] = BitConverter.ToSingle(file, offset);");
                break;
            }

            sb.DecreaseAndAppendLine("}");
        }
예제 #7
0
        private static void GenerateSetReferencesFunction(Indenter sb, BdatTables info)
        {
            sb.AppendLine("public static void SetReferences(BdatCollection tables)");
            sb.AppendLineAndIncrease("{");
            bool firstTable = true;

            foreach (var table in info.TableDesc)
            {
                if (!firstTable)
                {
                    sb.AppendLine();
                }
                firstTable = false;

                GenerateSetReferencesTable(sb, table);
            }

            sb.DecreaseAndAppendLine("}");
        }
예제 #8
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("}");
        }
예제 #9
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("}");
        }