Newer
Older
DungeonShooting / DungeonShooting_Godot / addons / dungeonShooting_plugin / generator / BuffGenerator.cs
@小李xl 小李xl on 15 Mar 2024 5 KB buff系统重构中
#if TOOLS
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using Godot;

namespace Generator;

/// <summary>
/// 生成 Buff 属性表
/// </summary>
public static class BuffGenerator
{
    private const string SavePath = "src/game/manager/BuffRegister.cs";
    
    public static bool Generate()
    {
        try
        {
            var buffInfos = new Dictionary<string, BuffInfo>();
            var types = typeof(BuffGenerator).Assembly.GetTypes();
            //包含[BuffAttribute]特性
            var enumerable = types.Where(type =>
                type.IsClass && !type.IsAbstract && type.IsAssignableTo(typeof(BuffFragment)));
            foreach (var type in enumerable)
            {
                var attribute = (BuffAttribute)type.GetCustomAttribute(typeof(BuffAttribute), false);
                if (attribute != null)
                {
                    if (buffInfos.ContainsKey(attribute.BuffName))
                    {
                        GD.PrintErr($"Buff '{attribute.BuffName}' 重名!");
                        return false;
                    }
                    var buffInfo = new BuffInfo(attribute.BuffName, attribute.Description, type);
                    buffInfos.Add(attribute.BuffName, buffInfo);
                    //判断重写参数情况
                    //1参数
                    var methodInfo1 = type.GetMethod(nameof(BuffFragment.InitParam),
                        BindingFlags.Instance | BindingFlags.Public, new Type[] { typeof(float) });
                    if (methodInfo1 != null &&
                        methodInfo1.GetBaseDefinition().DeclaringType != methodInfo1.DeclaringType)
                    {
                        buffInfo.Params.Add(1);
                    }

                    //2参数
                    var methodInfo2 = type.GetMethod(nameof(BuffFragment.InitParam),
                        BindingFlags.Instance | BindingFlags.Public, new Type[] { typeof(float), typeof(float) });
                    if (methodInfo2 != null &&
                        methodInfo2.GetBaseDefinition().DeclaringType != methodInfo2.DeclaringType)
                    {
                        buffInfo.Params.Add(2);
                    }

                    //3参数
                    var methodInfo3 = type.GetMethod(nameof(BuffFragment.InitParam),
                        BindingFlags.Instance | BindingFlags.Public,
                        new Type[] { typeof(float), typeof(float), typeof(float) });
                    if (methodInfo3 != null &&
                        methodInfo3.GetBaseDefinition().DeclaringType != methodInfo3.DeclaringType)
                    {
                        buffInfo.Params.Add(3);
                    }

                    //4参数
                    var methodInfo4 = type.GetMethod(nameof(BuffFragment.InitParam),
                        BindingFlags.Instance | BindingFlags.Public,
                        new Type[] { typeof(float), typeof(float), typeof(float), typeof(float) });
                    if (methodInfo4 != null &&
                        methodInfo4.GetBaseDefinition().DeclaringType != methodInfo4.DeclaringType)
                    {
                        buffInfo.Params.Add(4);
                    }
                }
            }
            
            GenerateCode(buffInfos);
        }
        catch (Exception e)
        {
            GD.PrintErr(e.Message + "\n" + e.StackTrace);
            return false;
        }

        return true;
    }
    
    private static void GenerateCode(Dictionary<string, BuffInfo> buffInfo)
    {
        var str = "";
        foreach (var kv in buffInfo)
        {
            var info = kv.Value;
            var s = "";
            for (var i = 0; i < info.Params.Count; i++)
            {
                if (i > 0) s += ", ";
                s += info.Params[i];
            }

            str += $"        BuffInfos.Add(\"{info.Name}\", new BuffInfo(\"{info.Name}\", null, new List<int>() {{ {s} }}, typeof({info.Type.FullName})));\n";
        }
        
        var code = $"using System.Collections.Generic;\n" +
                   $"/// <summary>\n" +
                   $"/// buff 注册类, 调用 Init() 函数初始化数据\n" +
                   $"/// 注意: 该类为 Tools 面板下自动生成的, 请不要手动编辑!\n" +
                   $"/// </summary>\n" +
                   $"public class BuffRegister\n" +
                   $"{{\n" +
                   $"    /// <summary>\n" +
                   $"    /// 所有 buff 信息\n" +
                   $"    /// </summary>\n" +
                   $"    public static Dictionary<string, BuffInfo> BuffInfos {{ get; private set; }}\n" +
                   $"    /// <summary>\n" +
                   $"    /// 初始化 buff\n" +
                   $"    /// </summary>\n" +
                   $"    public static void Init()\n" +
                   $"    {{\n" +
                   $"        BuffInfos = new Dictionary<string, BuffInfo>();\n" +
                   str +
                   $"    }}\n" +
                   $"}}";
        File.WriteAllText(SavePath, code);
    }
}
#endif