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("}"); }
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("}"); }
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("}"); }