在上一篇日志中,简要叙述了组成桌游的一系列元素,因为回合,区域等概念比较浅显,就不做过多描述,而卡牌上的文本描述的效果,是最为重要也繁琐复杂的一个内容,我会进行着重分析,按照触发时机,效果的目标寻找,效果的执行三个部分,这里先写时时机。
一,时机的概念
如果读者玩过游戏王懂得【时点】这个概念,那么会很容易的理解。这里还是拿游戏王和万智牌进行举例说明。如下图【在每位牌手的维持开始时】这种,对应某些场合可以触发的效果即为时机。
二,时机的种类。
这一部分的分类比较抽象,如果你有不同的理解可以在评论区提出。这里使用光环类效果来做说明,时机可能不会直接出现在文本描述中,但是在效果执行的程序中存在。如下图中的【辉煌的赞美诗】(这里为不懂万智的读者解释下,【由你操控的生物得+1/+1】的效果只会在此卡牌处于战场上才会生效)。
同理,效果的运作也根据这三种时机来运行,这个说法比较抽象,如果你结合【辉煌的赞美诗】的内容将会更好的理解。
第一种:生效类时机:【辉煌的赞美诗】的【进入战场时】即为生效类时机 ,将会触发生效运作,执行【由你操控的生物得+1/+1】来增强你的生物。
第二种:刷新类时机:当你场上的生物离开战场时,或者你的生物进入战场时,将会触发【辉煌的赞美诗】的刷新运作,判断哪些卡将会失去这个光环的增益,哪些卡将会获得这个光环的增益。(具体内容在效果的执行部分讲述)。
第三种:失效类时机:【辉煌的赞美诗】的【离开战场时】即为失效类时机,将会触发【辉煌的赞美诗】的失效运作,会时你控制的生物失去光环的增益。
三,时机的使用
在我的上一篇概要中简述了效果的执行流程,可以先回顾一下上一篇文章的效果内容。
如果要使用代码实现这个逻辑,则需要理解【事件】和【监听】,例如回合的某一阶段的开始和结束,卡牌进入手牌进入墓地,都会产生对应的【事件】,而效果将会持续监听这些【事件】,如果满足效果的生效要求就可以发动效果。
如上图中的【绝情筛除者】,就需要在代码中注册【回合的维持开始时】这个时机的监听,然后当代码进行回合阶段更替时,会发送对应的【事件】到监听注册器,由监听注册器找出监听此【事件】的效果,然后进行判断是否可以发动效果。流程如下图所示:
四,时机的生效判断
在上一节使用中,提到需要对时机是否满足效果的发动进行判断,这一节讲分析如果进行判断。
在进行判断时,需要时机提供触发时机的内容。例如【目标生物】进入战场时,【一张法术牌】被施放时,那么【目标生物】,【目标法术牌】即为触发时机的内容,也会存在一个时机由多个触发内容的情况,例如【当一个生物上放置一个指示物时】,【生物】与【指示物】均为触发时机的内容。
下面以【元祖尼米捷】为例进行展开分析。
分析① 每当你抓一张牌时
回顾上一篇所说,抓一张牌:一张牌从【牌库区域】移动至【玩家手牌区域】。那么这张牌的这个效果监听的是卡牌的区域移动,当一张卡牌变动了所在区域,首先判断触发时机的卡牌的上一个所在区域是否为你的牌库,当前所在区域是否为你的手牌区。另外,因为生物只有位于战场上才会发动这个效果,所以需要判断效果所归属的卡牌是否在战场上。
分析②每当任意牌手施放瞬间或法术咒语时:
监听的是一张牌被施放的时机,然后需要判断被施放的牌是否为瞬间或法术牌(瞬间,法术为卡牌的类别)。同①,需要判断效果所归属的卡牌是否在战场上。
所以,一般来说,进行时机判断时,需要提供的参数有触发时机的内容,和进行判断的效果所归属的元素(不一定是卡牌,也可能是指示物,或者系统的规则),此外还会用到一些游戏当前进行的共用元素,例如当前回合的控制者,当前是什么阶段等等。
四,时机监听注册器
在第二节中提到了时机监听注册器,这里做一个比较详细的介绍和分析。
首先可以回顾一下上一章中关于时机部分的流程图。
上一期的内容
时机执行完毕的回调委托函数。这是一个比较重要的元素,用于处理在一个时机中产生了新的时机的特殊情况。例如【在你的准备阶段开始时你抽一张牌】,这个效果将会在【准备阶段开始时】触发生效,然后将会产生一个【抽一张牌的时机】,需要等待【准备阶段开始时】时机触发激活的所有新时机和效果都结算完毕后,才能进入到【准备阶段执行】
这里再使用一个例子做补充说明,例如【在你的准备阶段结束,召唤一个衍生物,你抽一张牌】,请注意使用到了队列和栈来解决逻辑问题。
① 在你的准备阶段结束时,将会产生时机并触发这个效果,产生的准备阶段结束时机将会有一个【进入到下一个阶段的回调函数】,讲这个时机放入待检测时机队列中
② 因为触发了效果,产生了【衍生物进入战场】的时机,【抽一张牌】时机,依次放入了待检测时机队列。
③【在你的准备阶段结束】这个时机检测完毕后放入执行完毕的时机栈。从队列中取出【衍生物进入战场】的时机进行检测。
④【衍生物进入战场】这个时机检测完毕后放入执行完毕的时机栈。从队列中取出【抽一张牌】的时机进行检测。
⑤所有待检测时机检测完毕后,开始进行 执行完毕的时机栈 的回调函数的执行,从【抽一张牌】的回调,【衍生物进入战场】的回调,【在你的准备阶段结束】的回调,依次执行,最后进入到下一个阶段。不一定所有的时机都存在需要回调的内容,需要根据需求编写。
五,特殊的时机应用
在我个人的项目中,使用了一些比较特殊的时机,这里也做一下分享。
1,游戏开始时:这个时机可以用于分发初始手牌等操作。
2,进行主动操作的时机:
例如,在设计的游戏中,你希望玩家在每回合可以发动一次属于玩家的技能,那么可以设置一个按钮,为玩家设置一个主动发动技能的时点,当你点击按钮时,将会触发在注册好的玩家技能效果。
同理,你也可以将按钮绑定在战场上,墓地里的卡牌,点击卡牌可以触发卡牌拥有的需要主动发动的效果。
3,时机监听的优化,如果在游戏开始时,就为所有需要监听的效果进行注册,那么一局游戏里大概会存在数百个甚至更多正在进行监听的效果,每触发一次时机检测将耗费大量时间,我的做法时为每个效果预先设置生效区域,只有当效果绑定的目标存在于指定的区域集合类,才会进行检测。
暂无关于此日志的评论。