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