예제 #1
0
        /// <summary>
        /// 通过反射的方式加载所有目标程序集中的动作定义,包括派生的动作定义和反射方法生成的动作定义。
        /// </summary>
        /// <param name="assemblies"></param>
        /// <returns></returns>
        public static Dictionary <string, ActionDefine> loadDefinesFromAssemblies(Assembly[] assemblies)
        {
            Dictionary <string, ActionDefine> defineDict = new Dictionary <string, ActionDefine>();

            foreach (var assembly in assemblies)
            {
                foreach (var type in assembly.GetTypes())
                {
                    //是ActionDefine的子类,不是抽象类,具有零参数构造函数
                    if (type.IsSubclassOf(typeof(ActionDefine)) &&
                        !type.IsAbstract &&
                        type.GetConstructor(new Type[0]) is ConstructorInfo constructor)
                    {
                        ActionDefine actionDefine = (ActionDefine)constructor.Invoke(new object[0]);
                        string       name         = actionDefine.GetType().Name;
                        if (name.EndsWith("ActionDefine"))
                        {
                            name = name.Substring(0, name.Length - 12);
                        }
                        defineDict.Add(name, actionDefine);
                    }
                }
            }
            foreach (var pair in MethodActionDefine.loadMethodsFromAssemblies(assemblies))
            {
                defineDict.Add(pair.Key, pair.Value);
            }
            return(defineDict);
        }
예제 #2
0
 public Task init(Assembly[] assemblies, Rule rule, GameOption options, IRoomPlayer[] players)
 {
     this.rule = rule;
     if (isInited)
     {
         logger.logError("游戏已经初始化");
         return(Task.CompletedTask);
     }
     isInited = true;
     //初始化随机
     random = new Random(options.randomSeed);
     //初始化卡片定义
     foreach (CardDefine define in rule.cardList)
     {
         addDefine(define);
     }
     //初始化动作定义
     foreach (var pair in ActionDefine.loadDefinesFromAssemblies(assemblies))
     {
         addActionDefine(pair.Key, pair.Value);
     }
     return(rule.onGameInit(this, options, players));
 }