我是谁004 发表于 2019-1-5 23:51:48

利用1.5的功能显示任意单位图像

本帖最后由 我是谁004 于 2019-1-6 19:44 编辑

前言
  在我的《004时代》MOD中,有修改单位图像的触发效果,可以随意地使用图像资源。而侧重实用性的UserPatch 1.5补丁,就不具备这样的触发效果。不过我们仍然可以巧妙地运用1.5的特征,来完成类似的功能。在这里,我们介绍一种“在固定位置显示特定单位图像”效果及其实现方法。
  举个例子,战役制作者觉得铁匠铺的烟很好看,想把它运用在地图上;但是如果直接放置兵工厂建筑,又要把本体遮挡起来,比较麻烦;何况有的情况下根本无法遮挡——比如要在空地上放置烟雾。那么,这时候该怎么办呢?我们可以利用UP 1.5的某个隐藏特性,来实现这种效果。

原理
  众所周知,1.5增加了许多科技参数,让以前不能通过科技改变的属性也可以变动了。而1.5的自定义科技触发效果,又可以在剧情中自由修改,自由设定玩家的科技树或某些单位。
  在诸多新可变属性中,有一项叫做“单位帮助”(Language File Help)。这是一个4字节属性,本意为单位的帮助说明文本ID,但游戏中该ID是通过另一个属性“训练提示”计算得出的,因此这个属性实际上是无用的。然而在UP 1.5中,该属性被赋予了新的作用:控制僧侣单位的治疗图像,和捡起圣物后转变为的单位。因为这两项属性一个位于单位指令中,是所有文明共用的,另一个是硬编码;所以,在原版中这两项属性是不能被简单修改的。因而1.5的这个特性对MOD制作者来说很有帮助,虽然该功能在文档中未被提及。单位帮助这个属性在用作对僧侣的配置时,需要设置其最高二进制位为1,低16位为治疗图像ID,中间的15位则为拾取圣物后转变的单位的ID。也就是说,此值满足
  S=231+216×Q+P=2147483648+65536×Q+P,
  其中P、Q分别为治疗图像ID和转变单位后的ID。
  这也是唯一一个UP 1.5中能够设置单位图像的属性。所以,我们可以考虑在地图上放置一个玩家1以外的僧侣,然后指派令其不断进行治疗,那么游戏中他的图像就会一直处于治疗图像的状态。这样,就模拟出了在地图上某个固定地点显示特定单位图像的效果。
  不过,在UP 1.5的自定义科技触发效果中,数值的精度是有限的。因为在计算的过程中,数据会被替换成单精度浮点数,其二进制只有24个有效数字。而如我们之前所言,该属性的最高位为1,因此有效数字有32位,按照如上的方法计算后会导致低8位被舍弃,得到的结果就不准确了。
  那么我们应该如何来避免低位被舍去呢?其实也很简单,不用上述的算式,而用S=P-65536。这样得到的结果是一个有效位数不超过16的负数,但在32位无符号运算中它等于被加上了一个4294967296,实际上就相当于前式中Q=32767的情况。
  设置了僧侣的治疗图像,还需要令其一直保持治疗状态。要产生这个效果是很容易的,只需要令僧侣附近的一个单位生命值始终保持一个很低的水平,然后指派僧侣治疗即可。如果无法遮挡,可用OLD-GOLDMINER等无形单位。于是,我们可以使用下列触发,来实现“特定位置放置铁匠铺烟雾”的效果。

方法
  (以下X代表僧侣,A代表僧侣附近的单位,触发0效果0中的-60222=5314-65536)
触发0, 否是否
【效果0】改变目标名字1, 对象=X, 数目=1, 信息=“up-attribute 0,52,-60222,1”
【效果1】改变目标名字1, 对象=A, 数目=1, 信息=“up-attribute 0,0,30000,1”
【效果2】激活触发, 触发=触发1

触发1, 否否是
【条件0】定时器, 定时器=4
【效果0】摧毁目标, 对象=A, 数量=35000
【效果1】改变目标的生命值2, 对象=A, 数量=1
【效果2】指派目标, 对象=X, 目标=A
  如果只需要图像暂时出现一段时间,则定时器数秒后移除僧侣A即可。对于某些不循环的图像(例如爆炸、单位的死亡图像),想要令其循环播放,则可以在触发1的效果2之前加上一个效果:
【效果2】单位停止, 对象=X  这样就达到了令X的治疗动画重新播放的效果。不过在这个过程中会有一瞬出现僧侣的站立图像,可以考虑将其遮盖起来,例如用两个僧侣交替进行动作。

效果
  该触发执行后的效果如下图所示。


  下面列出了几个可设置的属性值,供大家参考
-63803(1733) 小火
-63799(1737) 中火
-63795(1741) 大火
-60222(5314) 铁匠铺烟
-61125(4411) 船坞的海鸟
-61064(4472) 驻扎旗帜
-62074(3462) 测试版骑士(站立)

cxt 发表于 2019-1-6 00:44:01

这个太厉害了,mod技术才是第一生产力啊!最近我也要开始正式学习mod了!

夜游神 发表于 2019-1-6 16:37:18

前些日子正在纠结怎么弄出没有帆的船,这样一来就可以实现了。

被治疗单位不用局限于OLD-GOLDMINER之类的东西(顺便wk里面这单位被换掉了),完全可以使用另一个指定了空图像的僧侣,让两者互相治疗。

我是谁004 发表于 2019-1-6 19:15:41

夜游神 发表于 2019-1-6 16:37
前些日子正在纠结怎么弄出没有帆的船,这样一来就可以实现了。

被治疗单位不用局限于OLD-GOLDMINER之类的 ...

当然可以,包括指定另一个图像为树木、岩石等普通装饰物

newtonerdai 发表于 2019-1-7 14:19:31

别看原理这么多,其实实际操作很简单,并不麻烦

春田一九零三 发表于 2019-1-27 13:19:59

教材建议先展示效果,再讲做法,最后说原理哈。
这个方法是不是可以把僧侣的治疗动画替代成其它图像的意思?

newtonerdai 发表于 2019-11-12 00:19:10

特地整理了一下一些实用的图像编号,可以利用僧侣治疗图像做到很多事情了——

比如用系统移动箭头图像(ID:2961)或者集结点旗(ID:2962)来做教程模式的步骤提示。

还有更多有趣的用法,值得发掘!



newtonerdai 发表于 2019-11-12 00:23:57

顺带一提,我想问问4哥,这些个治疗中的僧侣能否被选中?以及有没有治疗音效?

用负ID僧侣可以解决选中问题吗

我是谁004 发表于 2019-11-12 18:24:38

newtonerdai 发表于 2019-11-12 00:23
顺带一提,我想问问4哥,这些个治疗中的僧侣能否被选中?以及有没有治疗音效?

用负ID僧侣可以解决选中问 ...

那还是僧侣,自然可以被选中。至于声音,您可以思考一下治疗的风铃声是由什么决定的
页: [1]
查看完整版本: 利用1.5的功能显示任意单位图像