Skip to content
View ra2inier's full-sized avatar

Block or report ra2inier

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Please don't include any personal information such as legal names or email addresses. Maximum 100 characters, markdown supported. This note will be visible to only you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
ra2inier/README.md

Ra2inier

Ra2inier🔨是一个为著名RTS游戏红色警戒2(Ra2)定制的,用于方便书写Ra2规则代码文件.ini和开发Ra2游戏扩展模组(mod)的编辑器。

Ra2inier会为mod开发者带来什么?[🚧alpha stage⚠️]

它提供了一个独具特色的UI界面来表达ini文件的编写,相较于通用的文本编辑器,它更专注于ra2游戏的ini规则文件的编写,针对于ra2 ini文件与其他普通ini文件的独特之处提供了特色功能支持👍。

1. 代码抽象和管理:

正如mod开发者们所熟知的,ra2 ini文件中的一个代码块(section)可以代表一个步兵、坦克、建筑、飞机等游戏单位,也可以是全局配置、武器、注册表、弹头等抽象数据……这些代码之间,有的具有相同性,有的不具有相同性。而在配置文件中,由于游戏平台的限制,开发者不得不将不同类型的代码强行塞到一起,随着代码规模的扩大,代码开始不具备可维护性,这主要体现在:

  • 代码定位,在一堆不同类型和功能的代码之间来回跳转,消耗精力😫;
  • 代码块之间存在相互依赖,当一个块改变时,另一块也需要改变,如何处理这些依赖是一个棘手的问题😢;
  • 代码的重复编写,对不同的类似的单位的相同功能,开发者会重复书写这些代码;对同一个单位,开发者会为玩家编写一份代码,为AI人机编写一份专用代码,为战役编写一份代码……这些代码之间有少许差异,却存在着大量的重复💢;

使用纯文本编辑器的代码编写是低效且危险的,混乱的代码非常容易导致游戏运行的bug🐛,甚至是弹窗崩溃🚨,而且由于游戏平台提供了较少的可用崩溃信息,很多bug非常难以排查。

ra2inier会帮助mod开发者将不同的代码类型进行抽象,以实体对象类型的概念来表达这些ini代码,如一个坦克的配置代码将会被抽象表达为一个类型VechicleTypes实体对象,一个步兵会被抽象表达成一个类型InfantryTypes实体对象,这样有助于开发者对这些不同类型的代码进行分类管理、检索、处理依赖关系,将不同类型和职责的代码进行抽离、分块,这样可以显著降低代码管理的复杂程度,提高代码的可维护性和效率。同时当开发者对这些对象上的属性进行修改时,也就意味着对应的ini代码会发生修改。

2. 词条编写智能提示

在ra2的代码文件中存在着大量的配置项,这些配置项一般被mod开发者们称为词条。词条的数量有很多,而且词条之间存在着数据类型的差异,一些词条需要一个由yesno组成的bool值,一些词条需要一个在一定范围内的数字,或者更多,例如:一个浮点值、一个枚举值、一个颜色值、一个其他对象的引用,在编写词条的时候,很容易出现一些问题如:

拼写错误 类型错误 值域错误 依赖错误

而且,由于原生平台的功能较弱,mod开发者会倾向于引入AresPhobos等扩展平台,以增加游戏的中能够实现的逻辑,同时也带来了大量的新词条,淘汰了一些旧的词条,词条的数量是一个未知数。词条的记忆为mod开发者带来了很大的心智负担,增加了代码出错的概率。

ra2inier致力于解决这部分痛点,它定义了一类特殊的抽象类型——Word类型,允许开发者自定义Word,ra2inier将根据Word的定义在编写界面提供代码智能提示和补全。例如,对象预测提示和颜色提示:

对象预测 颜色提示
对象预测 颜色提示

同时,允许开发者在Word中使用JavaScript语言编写脚本定义hook函数hook用以处理更高等级的词条校验逻辑,实现代码的转译。这意味开发者可以定义完全自定义的Word词条,它可能不局限于目前任何一个游戏平台所提供的词条,并且在需要的时候按需引入。

3. 代码处理和构建:

如上2中提及,hook函数允许用户自定义脚本,在需要对词条进行转译的时候由ra2inier调用,借此完成对一些复杂功能的支持,例如:

  • 根据具体类型的对象转译生成最终的ini输出文件,可以直接用于游戏的运行。
  • 统计单位的数量,生成单位注册表
  • 自定义全新的功能性词条,如$Name,该词条可以自动生成string table.csf文件。
  • 检查常见的词条冲突和隐性bug,很多词条之间存在隐式依赖,当一个词条发生作用时,可能会导致一些其他词条失效,甚至导致游戏运行崩溃。
  • 更多......

抽象类型——Word是ra2inier提出一个重要概念,它拥有强大的灵活性,并且ra2inier的提供的基本代码功能也是基于此,这可能不是那么容易让人理解,但这并会影响开发者上手,开发者可以循序渐进地使用到其功能,以此体会其重要性。

4. 代码管理、分享、引用:

ra2inier提供了一套具有较高灵活性的解决方案,用于完成,抽象、组织和管理mod工程文件,发布mod成品文件,持续更新mod工程文件,通过引用复用其他开发者已经编写的代码。该方案是基于Github仓库提出,并秉持着面向开源的理念。通过ra2inier构建的代码工程文件,会产生一个包文件夹,开发者可以自行或通过ra2inier进行上传,将中的工程文件托管到Github仓库中,并发布相应的Github release,而其他开发人员可以通过在ra2inier中引用仓库链接地址的形式,获得其他开发者开发的代码,ra2inier将自动执行解析包文件的功能,从而达到快速分享代码、快速复用代码的目的。

当然,你更可以通过打包文件的形式,将代码文件以本地文件的方式进行分享和复用。这不是一套强制的方案。但是它提供了一套实践方法,从而尽可能地减少向以往一样出现代码分享和复用繁琐,代码环境导致的运行失败问题。

当然,在复用代码的过程中,开发者可能会遭遇一些,意想不到的问题,例如,依赖冲突、循环依赖、版本冲突等问题,不用担心,ra2inier提出了一个简单而有效的就近原则来解决这些问题,如果这还不能满足实际的需要,那么hook函数将会再次发挥它的强大功效。

Ra2inier未来还会为mod开发者带来什么?[⏲️planning features]

ra2inier是一个计划长时间支持的免费软件,在今后的持续更新中,应用也计划将会加入更多的ini编写实用功能,以不断提高其使用价值。

5. 代码热调试和内置启动器

为ra2的ini代码编写提供调试功能,开发者无需再频繁重复地启动游戏以加载配置文件,调试单个单位时,开发者只需更改相应的ini对象即可,ra2inier将加载ini代码,并执行代码热更新,从而动态地在不关闭游戏的前提下调试代码。这是或许将会是每个mod开发者梦寐以求的体验😍。

内置启动器代码调试功能的附属产物,它允许用户只安装ra2inier而无需安装游戏就可体验ra2游戏,对于很多存在游戏兼容性问题的设备,这些玩家也能够从中获益。同时,地图作者和任务者也可以利用ra2inier的包管理解决方案,将自己的代码发布到Github以进行代码复用和分享。

6. 资源文件管理

  • 图标文件.pcx的自动生成。为没有图标的单位自动生成一个带有名字的假图标,根据一个.png.jpg等常见的图片文件格式生成一个风格统一的图标,并尝试将其转换为游戏能够识别的形式。
  • 音频文件的剪辑和格式转换,生成.wav,提供将常见音乐格式mp3等转换为wav文件和soundmd.ini文件的代码,降低引入音频文件的复杂度。
  • 使用硬链接实现的资源文件的本地仓库,减少资源文件的对磁盘的占用,并提供资源文件的分类管理能力和检索能力。

还有更多功能,期待你的contribute

Pinned Loading

  1. ra2inier Public

    A powerful editor for the ini rule file of Red Alert 2.

    TypeScript 1

  2. awesome-ra2inier Public

    Awesome lists for ra2inier.

  3. root-package Public

    The root package used for ra2inier to develop ini configuration.

    JavaScript

  4. ra2inier.github.io Public

    Docs for Ra2inier.

    JavaScript