Ra2map:本文转载自【教程】平台bug:注册号漂移 - 红警任务之家
本教程整理自我在2021.5.10回复visa6000提问的邮件。感谢他的提问。
相信不少任务制作者都遇到过一个坑:
在FinalAlert中,有些地方需要使用注册号作为触发或者脚本的参数(比如触发条件“19 建造特定类型的建筑…”,触发结果“41 播放动画在…”,脚本“移动到己方建筑”等)。
但我们时常发现,在使用原版的rules文件时,对于一些序号比较大的建筑或者动画,游戏内部实际起作用的序号(就是“填写这个注册号,触发和脚本才会正确的起作用”,下文全部用蓝色表示)、地图编辑器中显示的序号(就是“地图编辑器下拉框中,我所需要的正确物品的名称对应的序号”,下文全部用绿色表示)和在rules文件中这一条目的注册号(下文全部用红色表示)是存在差异的,或者说,是有“漂移”的。
先举一个例子说明这三种序号的差别,以建筑列表的尤里建造厂为例:
- 在rules文件中这一条目的注册号——305:在rulesmd.ini中可以查到,305=YACNST
- 地图编辑器中显示的序号——301:在地图编辑器中的下拉框中可以看到,301 尤里建造厂
- 游戏内部实际起作用的序号——300:经过试验可以确认(地图编辑器里面300号是公车站,囧)。

这种漂移在建筑序号中是漂移一点点,但在动画列表中就是大幅度跳跃了。
一个非常典型的例子就是超时空传送效果的动画,CHRONOTG,其正确的内部号码是257,然而在rulesmd的[Animations]注册表中的注册号是668,在地图编辑器中显示的号码是261。如果按照后两个号码来填写,前者会导致游戏直接出错,后者会播放错误的动画。
这种漂移已经算是bug了。那么这个bug有没有规律可言呢?答案是有的。
在阅读原版的rulesmd.ini的时候,你会发现这些列表中的注册是有重复的,也有序号大幅度跳跃的状况:

上图是原版的rulesmd.ini中[Animations]注册表的一部分。可以注意到有效的注册号并不是连续的,318之后跳到了321,334之后直接跨越到了500,然后又跳步到510。游戏内部读取这些动画的时候,明显是按照读取的顺序,给每一项重新依次编号了。
种种迹象表明,从在rules文件中的注册号到游戏内部实际起作用的序号之间,重新编号的规律是这样的:
- 从上到下按顺序读取每一个项目。
- 空白的项目(只有注册号,等号后面没有东西)原样保留,不进行合并和删除。
- 非空的重复项目,以先读取的项目为准,后面的会被删除。
- 读取所有项目以后,再从头到尾从0开始重新编号。
如果你有编程基础,你可以写一个程序来处理这种改变。
而地图编辑器读取序号的时候,处理了“跳步”的问题,但是没有处理“重复”的问题,这导致地图编辑器中显示的序号与另外两种序号可能都不一样。
下面举一个例子,以开头的尤里建造厂为例,手工分析一下各种序号的漂移状况:
建筑列表的注册号从1=GAPOWR开始的(而不是从0开始,这直接导致了漂移1号);在253、273和304各跳了1号;而241=NAPSYA和185=NAPSYA注册了两次。没有其余的异常状况。
因此对于305=YACNST:
- 游戏内部实际起作用的序号漂移了5号,因此是305-5=300
- 地图编辑器中显示的序号相对游戏内部实际起作用的序号只漂移了1号(只有“NAPSYA注册了2次”影响它),因此是300+1=301
其实对于建筑列表,由于地图编辑器中显示的序号相对游戏内部实际起作用的序号只受“NAPSYA注册了2次”影响,因此就是241之前不漂移,241之后漂移1号,就这么简单。
至于动画列表的漂移状况十分复杂,我还是用程序来处理吧……
说了这么多,有什么可以直接使用的结论吗?
有。
(2021.5.23更新:修复了由于搞错一个物体注册多次时的判定顺序而引发的局部漂移。)
这其中的两个文件就是经过程序处理完毕的原版[Animations]和[BuildingTypes]注册表。你可以有两种办法来使用它:
- 在你需要寻找某一个物体游戏内部实际起作用的序号的时候,就可以在对应的文件里面查找,找到的就是正确的序号,填到地图编辑器里面没问题。
- 把这两个文件里面的列表复制到rulesmd.ini里面,覆盖原来的列表(如果你添加了新的物体,在后面按顺序正常注册即可)。覆盖完成以后,游戏内部实际起作用的序号、地图编辑器中显示的序号和在rules文件中这一条目的注册号会变得完全一致,也就是一劳永逸的修复了这个bug。
2021.5.21更新:
我把计算注册号漂移的JavaScript程序打包进了一个网页,这样无需别的运行环境,只要一个浏览器就能打开运行了:
(2021.5.22更新:修复了自动合并空条目的bug。现在不会合并空条目,与游戏内部表现一致。)
可以直接使用这个程序导入你的rulesmd.ini来计算正确的注册号。
2021.5.23更新:
更改了一处错误的程序逻辑:一个物体注册多次,应该以先出现的那次为准,而非后出现的。