由@掉叶粽(Xkein,老哈)开发的Dynamic Patcher是新一代YR扩展引擎,拥有许多酷炫的功能。但是,DP的官方说明非常的程序员化(网页链接),对于无编程背景的modder来说完全看不明白,一般人看完了这篇官方文档后,只能得到一个印象:“哇!改ini不用重启游戏了!”

哇!改ini不用重启游戏了!
但是,DP的威力显然不仅如此。实质上,DP与传统YR/Ares是截然不同的两个架构。
Ares体系下,任何新增逻辑都需要经过全局判断,并且还得考虑和其他现存功能的联动问题。举一个简单的例子说明,“单位被打的时候,自动闪现到自己身后3个格子的距离”。Ares不太可能制作这种只有萨尔那加伏击者才能使用的引擎功能,因为这样做,需要在所有单位受伤时,判断这个单位类型是否启用了“被击闪现”的功能,如果启用了,再读取有关代码。一个两个还好说,如果在引擎中增加大量“受伤时触发”的功能,则每个单位的每一次被攻击,都要运行一大堆判定,确定这些单位身上是否启用了受伤时“XX”“OO”“OX”的功能,毫无疑问会使得代码变得臃肿,执行效率变得低下。因此,Ares中就不太可能出现各种只能有一个单位用得上的功能,哪怕提出定制也不会受理的。

单位被打的时候,自动闪现到自己身后3个格子的距离
比如,需要实现“遭遇战动员兵被打死时,在其死亡位置刷出一个工程师”(仅用于举例,这种东西实在毫无意义)——需要的步骤包括:给动员兵设置死亡武器,设定死亡武器的弹头,设置弹头的动画,令动画指定MakeInfantry的序号,并在General里设定AnimToInfantry的列表。

嘲讽(图文无关)
现在看来,这几乎是自然而然的,但是这个流程实质上非常繁琐——从动员兵死亡开始,以死亡能够触发的事件『只有』播放步兵死亡帧序列,播放死亡音效,触发死亡武器,前两者显然都没有什么办法扩展,只能利用死亡武器。生成工程师的方法,要么就是兵营生产,要么就是地图触发直接生成,要么是使用UnitDelivery类超武,要么就是AnimToInfantry,『没有其他门路』。死亡时原地生成,显然和兵营生产没有关系。对于一个没有任何特殊之处的遭遇战动员兵而言,地图触发显然是不可能了。步兵确实可以作为UnitDelivery超武的指示者,但是要求它是活着的,死亡时触发是没有可能的。只有AnimToInfantry还比较有可能,于是需要动员兵死亡时播放一个特别的动画——这个动画可以是死亡武器的弹头动画——于是思路就有了。

单位攻击脚本(图文无关)
也就是说,从单位死亡这一“触发器”开始,到“生成步兵”这一结果,需要走死亡武器-武器弹头-播放弹头动画-动画生成步兵这许多个步骤,我们虽然能够走通这一路径,但是每一步的选择都是极其有限的,比如单位死亡这一触发器只有三个结果——DeathWeapon,DieSound和Die1 Die2,“动画播放”除了调整动画本身的语句和Report外,也只有SpawnsParticle,MakeInfantry这两种产生其他游戏内对象的可能性。也就是说,YR/Ares式流程,在每个触发器上允许的结果都是封装好的,用户只能从指定的步骤中选择,一步一步接近自己需要的目标,最终调用能够实现目标的引擎功能。如,Hares可以实现单位死亡时掉落建筑,因为Hares增加了动画-超武的关联,动画播放时,除了SpawnsParticle,MakeInfantry外还可以直接发射超武,而UnitDelivery类超武就可以刷出任何单位了。目前的Ares/Phobos/Hares体系,都旨在于为INI用户制作出更多封装好的可灵活使用的通用黑箱/桥梁,打通引擎内本来存在的各种壁垒,为触发器增加更多可能的结果。而不是制作各种只能用一次的稀奇古怪脑洞机制。

创造单位(图文无关)
而基于上文,Ares/Phobos/Hares中,虽然同样可以用单位死亡作为触发器,刷出建筑作为结果,但是这种毫无意义,且增加判定次数的功能并不太可能出现在官方发布中。如果想要实现这种东西,需要使用大量中间的繁琐跳板,会耗费许多运算性能,用于“绕弯”实现开发者原本没有打算直接做的功能。Hares因为增加了大量打通的触发节点,确实比较好用,但是各种单一功能看起来都是非常不起眼的,哪怕真的实现了被打一下就闪现到自己身后3个格子并丢出一个虚空球体攻击在场敌人,也得写10kb的ini,使用大量的跳板,组合一大堆看起来跟闪现毫无关系的底层功能。

被打一下就闪现到自己身后3个格子并丢出一个虚空球体攻击在场敌人
DP可以实现大量稀奇古怪的定制化逻辑而不必担心影响效率。这是因为,DP的代码修改都是局部化的,可以只对特定单位类型生效。任何对引擎功能的修改都是局部化的DP脚本,只要在INI里指定单位使用的DP脚本即可——这也约等于是Ares环境下把Ares代码写到单位名下。所有有关判定只会在此单位下运行。比如,被击闪现这种功能,可以作为DP脚本写出来,实现起来也不复杂,无需因为Ares体系下的臃肿判定放弃这个功能,也不需要考虑和其他所有现存功能的联动问题,不会导致所有单位被打一下的时候都需要判定是否启用闪现功能。这就使得DP上可以任意增加花里胡哨的“鸡肋”功能,奢侈地为每一个单位定向实现一种特别性能——就像幻影坦克的变树,依文的炸弹,鲍里斯的空袭一样。因为DP使用GPL协议,任何DP脚本都必须开源,用户只需要自行到有关mod中下载相关功能的DP脚本即可定向获取某一个特定的功能,而不像Ares需要被动等待官方发布,更新一揽子封装好的功能。Ares发布的DLL文件也是无法改动的,而DP则可以实时添加逻辑模块。

多重锁定(图文无关)
但是,这并不意味着DP是个适合小白的工具。要使用DP编写功能,需要掌握基本程度的C#,并且能够阅读YR的反编译代码YRpp。毕竟这是引擎开发者工具,而不是面向最终端的INI用户的。最终的INI用户使用DP的方式,也就是下载一大堆DP脚本,然后在INI里调用——从这方面而言,和Ares的用法也差不多。