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