Ra2inier🔨是一个为著名RTS游戏红色警戒2(Ra2)定制的,用于方便书写Ra2规则代码文件.ini
和开发Ra2游戏扩展模组(mod)的编辑器。
它提供了一个独具特色的UI界面来表达ini文件的编写,相较于通用的文本编辑器,它更专注于ra2游戏的ini规则文件的编写,针对于ra2 ini文件与其他普通ini文件的独特之处提供了特色功能支持👍。
正如mod开发者们所熟知的,ra2 ini文件中的一个代码块(section)可以代表一个步兵、坦克、建筑、飞机等游戏单位,也可以是全局配置、武器、注册表、弹头等抽象数据……这些代码之间,有的具有相同性,有的不具有相同性。而在配置文件中,由于游戏平台的限制,开发者不得不将不同类型的代码强行塞到一起,随着代码规模的扩大,代码开始不具备可维护性,这主要体现在:
- 代码定位,在一堆不同类型和功能的代码之间来回跳转,消耗精力😫;
- 代码块之间存在相互依赖,当一个块改变时,另一块也需要改变,如何处理这些依赖是一个棘手的问题😢;
- 代码的重复编写,对不同的类似的单位的相同功能,开发者会重复书写这些代码;对同一个单位,开发者会为玩家编写一份代码,为AI人机编写一份专用代码,为战役编写一份代码……这些代码之间有少许差异,却存在着大量的重复💢;
使用纯文本编辑器的代码编写是低效且危险的,混乱的代码非常容易导致游戏运行的bug🐛,甚至是弹窗崩溃🚨,而且由于游戏平台提供了较少的可用崩溃信息,很多bug非常难以排查。
ra2inier会帮助mod开发者将不同的代码类型进行抽象,以实体对象和类型的概念来表达这些ini代码,如一个坦克的配置代码将会被抽象表达为一个类型为VechicleTypes
的实体对象,一个步兵会被抽象表达成一个类型为InfantryTypes
的实体对象,这样有助于开发者对这些不同类型的代码进行分类管理、检索、处理依赖关系,将不同类型和职责的代码进行抽离、分块,这样可以显著降低代码管理的复杂程度,提高代码的可维护性和效率。同时当开发者对这些对象上的属性进行修改时,也就意味着对应的ini代码会发生修改。
在ra2的代码文件中存在着大量的配置项,这些配置项一般被mod开发者们称为词条。词条的数量有很多,而且词条之间存在着数据类型的差异,一些词条需要一个由yes
和no
组成的bool值,一些词条需要一个在一定范围内的数字,或者更多,例如:一个浮点值、一个枚举值、一个颜色值、一个其他对象的引用,在编写词条的时候,很容易出现一些问题如:
拼写错误 类型错误 值域错误 依赖错误
而且,由于原生平台的功能较弱,mod开发者会倾向于引入Ares、Phobos等扩展平台,以增加游戏的中能够实现的逻辑,同时也带来了大量的新词条,淘汰了一些旧的词条,词条的数量是一个未知数。词条的记忆为mod开发者带来了很大的心智负担,增加了代码出错的概率。
ra2inier致力于解决这部分痛点,它定义了一类特殊的抽象类型——Word
类型,允许开发者自定义Word
,ra2inier将根据Word的定义在编写界面提供代码智能提示和补全。例如,对象预测提示和颜色提示:
对象预测 | 颜色提示 |
---|---|
![]() |
![]() |
同时,允许开发者在Word中使用JavaScript语言编写脚本定义hook函数,hook用以处理更高等级的词条校验逻辑,实现代码的转译。这意味开发者可以定义完全自定义的Word
词条,它可能不局限于目前任何一个游戏平台所提供的词条,并且在需要的时候按需引入。
如上2中提及,hook函数允许用户自定义脚本,在需要对词条进行转译的时候由ra2inier调用,借此完成对一些复杂功能的支持,例如:
- 根据具体类型的对象转译和生成最终的ini输出文件,可以直接用于游戏的运行。
- 统计单位的数量,生成单位注册表。
- 自定义全新的功能性词条,如
$Name
,该词条可以自动生成string table.csf
文件。 - 检查常见的词条冲突和隐性bug,很多词条之间存在隐式依赖,当一个词条发生作用时,可能会导致一些其他词条失效,甚至导致游戏运行崩溃。
- 更多......
抽象类型——Word
是ra2inier提出一个重要概念,它拥有强大的灵活性,并且ra2inier的提供的基本代码功能也是基于此,这可能不是那么容易让人理解,但这并会影响开发者上手,开发者可以循序渐进地使用到其功能,以此体会其重要性。
ra2inier提供了一套具有较高灵活性的解决方案,用于完成,抽象、组织和管理mod工程文件,发布mod成品文件,持续更新mod工程文件,通过引用复用其他开发者已经编写的代码。该方案是基于Github仓库提出,并秉持着面向开源的理念。通过ra2inier构建的代码工程文件,会产生一个包文件夹,开发者可以自行或通过ra2inier进行上传,将包中的工程文件托管到Github仓库中,并发布相应的Github release,而其他开发人员可以通过在ra2inier中引用仓库链接地址的形式,获得其他开发者开发的代码,ra2inier将自动执行解析包文件的功能,从而达到快速分享代码、快速复用代码的目的。
当然,你更可以通过打包文件的形式,将代码文件以本地文件的方式进行分享和复用。这不是一套强制的方案。但是它提供了一套实践方法,从而尽可能地减少向以往一样出现代码分享和复用繁琐,代码环境导致的运行失败问题。
当然,在复用代码的过程中,开发者可能会遭遇一些,意想不到的问题,例如,依赖冲突、循环依赖、版本冲突等问题,不用担心,ra2inier提出了一个简单而有效的就近原则来解决这些问题,如果这还不能满足实际的需要,那么hook函数将会再次发挥它的强大功效。
ra2inier是一个计划长时间支持的免费软件,在今后的持续更新中,应用也计划将会加入更多的ini编写实用功能,以不断提高其使用价值。
为ra2的ini代码编写提供调试功能,开发者无需再频繁重复地启动游戏以加载配置文件,调试单个单位时,开发者只需更改相应的ini对象即可,ra2inier将加载ini代码,并执行代码热更新,从而动态地在不关闭游戏的前提下调试代码。这是或许将会是每个mod开发者梦寐以求的体验😍。
内置启动器代码调试功能的附属产物,它允许用户只安装ra2inier而无需安装游戏就可体验ra2游戏,对于很多存在游戏兼容性问题的设备,这些玩家也能够从中获益。同时,地图作者和任务者也可以利用ra2inier的包管理解决方案,将自己的代码发布到Github以进行代码复用和分享。
- 图标文件
.pcx
的自动生成。为没有图标的单位自动生成一个带有名字的假图标,根据一个.png
、.jpg
等常见的图片文件格式生成一个风格统一的图标,并尝试将其转换为游戏能够识别的形式。 - 音频文件的剪辑和格式转换,生成
.wav
,提供将常见音乐格式mp3等转换为wav文件和soundmd.ini文件的代码,降低引入音频文件的复杂度。 - 使用硬链接实现的资源文件的本地仓库,减少资源文件的对磁盘的占用,并提供资源文件的分类管理能力和检索能力。