// See https://aka.ms/new-console-template for more information using System.Collections.Immutable; using System.Reflection; using System.Text; var assemblyPath = args[0]; var targetPath = args[1]; var assembly = Assembly.LoadFrom(assemblyPath); var types = assembly.GetTypes().Where(t => t.FullName.StartsWith("DB.") && t.FullName.EndsWith("IDEnum")).ToImmutableList(); foreach (var type in types) { var tableRecordType = assembly.GetType(type.FullName.Replace("IDEnum", "TableRecord"))!; var patchClassName = $"patch_{type.Name}"; var readCommands = new StringBuilder(); var writeCommands = new StringBuilder(); var tableRecordFields = new StringBuilder(); foreach (var field in tableRecordType.GetFields(BindingFlags.Public | BindingFlags.Instance)) { tableRecordFields.Append("public "); if (field.FieldType.IsEnum) { tableRecordFields.Append("System.Int32 "); } else { tableRecordFields.Append(field.FieldType.FullName); tableRecordFields.Append(" "); } tableRecordFields.Append(field.Name); tableRecordFields.AppendLine(";"); readCommands.Append(field.Name) .Append(" = (") .Append(field.FieldType.FullName) .Append(")src[i].") .Append(field.Name) .Append(", "); writeCommands.Append(field.Name) .Append(" = (") .Append(field.FieldType.IsEnum ? "int" : field.FieldType.FullName) .Append(")src[i].") .Append(field.Name) .Append(", "); } using var sw = File.CreateText(Path.Combine(targetPath, patchClassName + ".cs")); sw.WriteLine($$""" // ReSharper disable CheckNamespace // ReSharper disable InconsistentNaming using System; using System.CodeDom.Compiler; using System.IO; using System.Text; using MonoMod; using LooseDBTables; using UnityEngine; namespace DB; [MonoModIgnore] [GeneratedCode("LooseDBTables.GeneratePatches", "1.0.0.0")] public class {{type.Name}} { public static extern bool LoadFromFile(string filename); public static extern void DumpToFile(string filename); protected static {{tableRecordType.Name}}[] records; } [GeneratedCode("LooseDBTables.GeneratePatches", "1.0.0.0")] [Serializable] public class Serializable{{tableRecordType.Name}} { {{tableRecordFields}} } [GeneratedCode("LooseDBTables.GeneratePatches", "1.0.0.0")] public class {{patchClassName}} : {{type.Name}} { public new static bool LoadFromFile(string filename) { if (!File.Exists(filename)) { return false; } var table = JsonUtility.FromJson