红警DIY论坛

标题: 一个自己制作的RA2 rules.ini修改器 [打印本页]

作者: colt    时间: 2022-3-5 08:42
标题: 一个自己制作的RA2 rules.ini修改器
本帖最后由 colt 于 2022-3-11 09:32 编辑

2022.3.11更新,v1.2.2
这个周末未必会更新,嗯,虽然我知道这种工具意义不大,但还是希望大家可以帮我测试一下,或者给一点儿修改建议。

新功能:


主要缺点:


注意事项:

[attach]20835[/attach][attach]20836[/attach]

--------------------------------------分割线--------------------------------------
2022.3.8 更新,v1.2.1
新功能:


GitHub 地址:coltlv1994/RulesChanged: A Red Alert 2 rule file modifier (github.com)
可执行文件:[attach]20791[/attach]
注:需要.NET DESKTOP RUNTIME, 下载地址:https://dotnet.microsoft.com/en-us/download/dotnet/6.0
自带Runtime的版本的压缩包过大无法上传,可移步GitHub. Release Version 1.2.1 · coltlv1994/RulesChanged (github.com)
--------------------------------------分割线--------------------------------------
2022.3.7 更新,v1.1.5,GitHub:coltlv1994/RulesChanged: A Red Alert 2 rule file modifier (github.com)

这次看起来应该比之前的版本好一些了。大部分的Projectile和Weapon都已经被正确分类了,但还剩了一小部分没来得及精确分类:
1. 有一部分tag,比如[BlimpBombPE],它是一个弹道类型,却不属于任何的弹头,因此无法归类为弹道类型;
2. 另有一部分tag,比如[GRIZAPE],它是一个弹头类型,灰熊坦克的精英主武器使用它作为弹头,但它却奇怪地没有出现在[Warheads]的下面,因此没有被分类到弹头类型。

关于这两点的解决方案的思考:
1. 第一部分比较简单,可以直接写死在程序逻辑里面,强制将其分类为弹道类型;
2. 这一部分相对复杂,需要在所有的武器分类完成之后再过一遍其中的弹头;但由于弹头本身有列表来登记,需要额外考虑这部分弹头需不需要写回列表。

欢迎有想法的朋友批评指正。

--------------------------------------分割线--------------------------------------
大家好,萌新报到。

我是一个非常非常菜的modder,大概就停留在自己修改rules.ini的水平,解锁点儿奇怪的建筑,然后虐虐电脑什么的。但是在娱乐的过程中我发现修改rules.ini实在是很复杂,我就有了一个做自己的修改器的想法。

源代码发布在GitHub上,欢迎大家去查看,留言,提出建议或者测试它的功能。coltlv1994/RulesChanged: A Red Alert 2 rule file modifier (github.com)
目前版本可以打开rules.ini/rulesmd.ini,并且保存成为可以正常进入游戏的文件。在打开之后可以修改对应的栏目。

当然目前的功能还非常原始,我大概下一步的方向是:
1. 加入查找功能,迅速找到对应的条目;
2. Projectile和Weapon正确归类,目前他们还属于uncategorized;
3. 汉化做得好一点。
4. 加入一些外挂的说明信息,这样修改起来也容易。

程序是用.NET CORE,WPF和C#写的,我在这方面也是个萌新,所以欢迎各路大神对代码做review,有什么功能上的建议当然可以提,非常欢迎。

GitHub上的代码可以用VS2022打开sln文件,然后编译运行;或者直接用Examples/下面的两个zip,文件名比较短的不带.NET Desktop Runtime,需要去MS那里下载:https://dotnet.microsoft.com/en-us/download/dotnet/6.0

如果觉得麻烦就用Examples/下面那个文件名长的标注_runtimeincluded的压缩包,里面的RulesChangedWPFNET.exe就是可执行文件。

欢迎留言或者联系我的邮件:colt.github@outlook.com


作者: 双杀步枪    时间: 2022-3-5 12:10
十几年前就有冷晓辉编辑器这类工具,但是实际用了之后会发现工具没有记事本好使,因为ini文件本质上就是个配置表,需要做的也就是复制粘贴改数值而已。
作者: colt    时间: 2022-3-5 18:58
双杀步枪 发表于 2022-3-5 12:10
十几年前就有冷晓辉编辑器这类工具,但是实际用了之后会发现工具没有记事本好使,因为ini文件本质上就是个 ...

yeah,我也是受到这种工具的启发才决定自己编写一个的。目前的功能还比较原始,不过我期待以后可以做的更简单一些,比如添加Prerequisite的时候可以直接从已有的里面选,然后给各个属性加上中文说明,省得大家看不明白。
作者: ganyuansi    时间: 2022-3-6 13:16
对菜鸟来说,支持你,加油
作者: colt    时间: 2022-3-6 20:06
ganyuansi 发表于 2022-3-6 13:16
对菜鸟来说,支持你,加油

真到开始做才意识到这里面的麻烦挺多的。我试图联系过当年Westwood的开发组成员,试图询问他们当时解读rulesmd.ini的思路,但很遗憾,他们表示对此无能为力,无法提供信息。
作者: 双杀步枪    时间: 2022-3-6 21:03
?就读个表还要什么解读思路
作者: 2244106363    时间: 2022-3-6 21:09
我的评价是:
不如CtrlcCtrlv

作者: colt    时间: 2022-3-6 22:09
双杀步枪 发表于 2022-3-6 21:03
?就读个表还要什么解读思路

比如说基洛夫的精英主武器使用的弹头是KTSTLEXP,但是这个弹头出现在Animations列表里,并不出现在Warheads列表;可是看它的内容又能看出这是一个弹头。
作者: colt    时间: 2022-3-6 22:10
2244106363 发表于 2022-3-6 21:09
我的评价是:
不如CtrlcCtrlv

可能吧?
就算真的是白费工夫,我就当练练C#和WPF了。
作者: 双杀步枪    时间: 2022-3-6 23:15
colt 发表于 2022-3-6 22:09
比如说基洛夫的精英主武器使用的弹头是KTSTLEXP,但是这个弹头出现在Animations列表里,并不出现在Warhea ...

那是wwsb写错了,不是什么思路
作者: 双杀步枪    时间: 2022-3-6 23:31
写在哪个注册表就是什么东西,找到名字读需要的内容,就这么简单一件事。
作者: colt    时间: 2022-3-7 02:13
双杀步枪 发表于 2022-3-6 23:15
那是wwsb写错了,不是什么思路

我还在研究如果把这个从Animations里面拿掉会有什么结果,我猜应该没事。然后再试试把它从手动加入Warheads里面会怎么样,如果行那就行,不行就再说了。编程实现确实不难,也就是V3和无畏的Warhead=Special需要处理一下。
作者: 双杀步枪    时间: 2022-3-7 03:08
colt 发表于 2022-3-7 02:13
我还在研究如果把这个从Animations里面拿掉会有什么结果,我猜应该没事。然后再试试把它从手动加入Warhea ...

按名字读取设置,section重名无所谓,只要section里有需要的内容。
KTSTLEXP既是弹头也是动画,这俩重名,wwsb只是忘了注册在弹头的注册表里而已。
作者: 蓝镜VIP    时间: 2022-3-7 03:24
在我看来,如果是作为新手向的工具,那么你应该更专注于对于代码词条的外挂解释,类似于双击代码即可查看该代码的详细解释。大部分的代码都已经被新手教程包收录,只不过这大概是个体力活。
作者: 蓝镜VIP    时间: 2022-3-7 03:29
抛射体和弹头的归类其实没有必要,要搞什么武器直接新建就好了,反正20年前的单核老游戏,改ini连“基础编程”都不算,只能说是搭积木,根本不存在什么代码写成一坨shit会导致运行变慢需要优化之类的。
着重实现类似于可视化编程的方式可能会更好。一个武器所使用的弹体和弹体被标注出来,点击一下即可直接看到整个section的内容,甚至可以包括整个武器内用到的所有的动画在ART.ini里的内容。
作者: colt    时间: 2022-3-7 05:30
蓝镜VIP 发表于 2022-3-7 03:29
抛射体和弹头的归类其实没有必要,要搞什么武器直接新建就好了,反正20年前的单核老游戏,改ini连“基础编 ...

我准备先给这个程序加一个搜索功能。新建条目的功能我还没有研究明白,因为根据别人的研究来看,单位的数量设有上限,大概是不能随意无上限添加的。

至于你说的可视化编程,我其实很同意这个思路。显示说明应该是挺不错的,这样对新手更友好。我对于WPF这一套也不熟,还得摸索一下。

目前的代码集中在code本身,解释说明还没有开始动手。等我结合各种信息和文件内的注释再整理一下吧。
作者: colt    时间: 2022-3-7 05:32
双杀步枪 发表于 2022-3-7 03:08
按名字读取设置,section重名无所谓,只要section里有需要的内容。
KTSTLEXP既是弹头也是动画,这俩重名 ...

有点儿意思。我刚才试了试把KTSTLEXP从Animations里面拿掉了,加入了Warheads,弄了几个三星基洛夫没出什么问题,包括被击毁之类的都看起来还好。
作者: ganyuansi    时间: 2022-3-7 09:40
实话,原版码儿也挺乱的,估计是WWSB动荡的时候
作者: 意外之喜    时间: 2022-3-7 09:43
这边建议你使用的模板替换为马王神修复后的ini,具体可以在置顶帖使用一个积分下载到。那个ini修复了挺多WWSB的东西,你可以直接在那个的基础上进行制作,可以增加代码词典功能、快速新建单位模板自动注册以及附带的一整套武器代码模板和新建护甲模板(选择单位类型后提供一整套模板)、快速新建注册超武模板(选择创建什么类型的超武后直接相应一整套模板)、搜索单位同时提供该单位所有相关的武器系统以及拓展可选的生产需求建筑。
暂时就想到这些
作者: 意外之喜    时间: 2022-3-7 09:44
意外之喜 发表于 2022-3-7 09:43
这边建议你使用的模板替换为马王神修复后的ini,具体可以在置顶帖使用一个积分下载到。那个ini修复了挺多WW ...

当然咯用人家的东西得遵守相对应的授权协议
作者: 蓝镜VIP    时间: 2022-3-7 12:48
colt 发表于 2022-3-7 05:30
我准备先给这个程序加一个搜索功能。新建条目的功能我还没有研究明白,因为根据别人的研究来看,单位的数 ...

条目上限仅限于原版,比如在原版注册的单位超过第100个会导致AI不受任何控制乱造,需要用拓展平台来解决。
而现在搞mod的谁不用Ares平台,就算只是随便改ini玩的人也应该直接用Ares平台了,因为它功能太强大了,用过都说好。
作者: 双杀步枪    时间: 2022-3-7 13:19
colt 发表于 2022-3-7 05:32
有点儿意思。我刚才试了试把KTSTLEXP从Animations里面拿掉了,加入了Warheads,弄了几个三星基洛夫没出什 ...

为什么会出问题,动画不注册最多就是不播放而已,就像天启的开火动画。弹头不注册在原版也没什么关系,只有改版如Ares才有强制注册的要求,第三方逻辑需要从弹头注册表中获取弹头的参数,不注册就会NullpointException。
作者: colt    时间: 2022-3-7 17:33
蓝镜VIP 发表于 2022-3-7 12:48
条目上限仅限于原版,比如在原版注册的单位超过第100个会导致AI不受任何控制乱造,需要用拓展平台来解决 ...

Ares对我就是一个完全不懂的新领域了,看版主说的意思是,只有Ares才有强制注册的要求,这个我估计得继续修改代码逻辑,否则肯定没办法和Ares做到兼容。目前我的所有测试都是在原版的基础上进行的。
作者: colt    时间: 2022-3-7 17:35
双杀步枪 发表于 2022-3-7 13:19
为什么会出问题,动画不注册最多就是不播放而已,就像天启的开火动画。弹头不注册在原版也没什么关系,只 ...

Ares我还没有研究过,估计得实装一下看看才行。Animations如果不注册不会导致NullPointerException的话,那就优先考虑Warheads,目前我还没计划这个修改器要和Artmd.ini联动。
作者: colt    时间: 2022-3-7 17:39
蓝镜VIP 发表于 2022-3-7 12:48
条目上限仅限于原版,比如在原版注册的单位超过第100个会导致AI不受任何控制乱造,需要用拓展平台来解决 ...

具体的这个数字有人研究过是多少吗?YR2 1.001来看,步兵65种,车辆80种,飞行器12种,建筑402种,弹头106种,这是写在表里的;如果把没写进去的和没使用的都算上,弹头应该是120种,建筑403种。
作者: 蓝镜VIP    时间: 2022-3-7 22:09
colt 发表于 2022-3-7 17:39
具体的这个数字有人研究过是多少吗?YR2 1.001来看,步兵65种,车辆80种,飞行器12种,建筑402种,弹头10 ...

我没有见过有人归纳过,其实大概地直接按照99上限搞就可以了。
至于Ares,它所提供的新功能对你现在写的工具其实没有影响的,和注册条目相关的新功能也就一个“+=”功能,一个让注册表不需要按照数字顺序注册,而是始终排在已有的被注册单位的数字顺序后面。
既步兵注册表中最后是65=XX,那么在它后面使用+=YY就可以正常地注册这个YY单位,即使在一些内置ini的地图任务也不会导致这个YY单位的注册序号被挤走。这个功能不会给你制作额外的工作。
另外一个功能是ini文件拆分,这个看一眼说明书就能理解了,而且你也不需要管这个功能。
作者: 蓝镜VIP    时间: 2022-3-7 22:34
colt 发表于 2022-3-7 17:39
具体的这个数字有人研究过是多少吗?YR2 1.001来看,步兵65种,车辆80种,飞行器12种,建筑402种,弹头10 ...

ares的强制注册也仅限于动画,和没有被使用过的武器,既[WeaponTypes],用来给那些溅射武器或空爆武器使用的,严格来说对你的工作也是没有太大影响了。
作者: colt    时间: 2022-3-7 23:44
蓝镜VIP 发表于 2022-3-7 22:34
ares的强制注册也仅限于动画,和没有被使用过的武器,既[WeaponTypes],用来给那些溅射武器或空爆武器使 ...

那就行。我现在在趁休假的时间,先把项目的wiki搞起来,要不然很多思路我注释了也还是会忘。这几天看看能不能把搜索功能和“双击weapon/projectile/warhead可直接进入编辑”给做了。
作者: 双杀步枪    时间: 2022-3-8 00:29
蓝镜VIP 发表于 2022-3-7 22:09
我没有见过有人归纳过,其实大概地直接按照99上限搞就可以了。
至于Ares,它所提供的新功能对你现在写的 ...

注册表前面那个数字只是为了【不重复】,并不是什么【顺序】,行序才是顺序。
[ooxx]
999=A
20=B
fuck=C
0=D
顺序是0=A,1=B,2=C,3=D
作者: colt    时间: 2022-3-8 01:45
双杀步枪 发表于 2022-3-8 00:29
注册表前面那个数字只是为了【不重复】,并不是什么【顺序】,行序才是顺序。
[ooxx]
999=A

大概只有Countries还有少数几个需要有特定的顺序,Animations里面也有说明前两个必须是固定的顺序,后面的随意。我猜,不按原始顺序写回去,不会有什么问题的吧。
作者: 双杀步枪    时间: 2022-3-8 10:07
colt 发表于 2022-3-8 01:45
大概只有Countries还有少数几个需要有特定的顺序,Animations里面也有说明前两个必须是固定的顺序,后面 ...

有,动画,建筑,阵营的注册表顺序不能修改,前两个涉及地图触发,后一个涉及AI。都有严格要求。
作者: kenosis    时间: 2022-3-8 11:11
https://bbs.ra2diy.com/forum.php?mod=viewthread&tid=9471&mobile=2
作者: colt    时间: 2022-3-8 17:17
双杀步枪 发表于 2022-3-8 10:07
有,动画,建筑,阵营的注册表顺序不能修改,前两个涉及地图触发,后一个涉及AI。都有严格要求。 ...

如果是这样的话,那代码得修改了。C#里面的Dictionary<>是不能保证读取的时候的顺序和写入相同的。
作者: colt    时间: 2022-3-8 17:19
kenosis 发表于 2022-3-8 11:11
https://bbs.ra2diy.com/forum.php?mod=viewthread&tid=9471&mobile=2

所以我想问这个被实现过了吗?
作者: 双杀步枪    时间: 2022-3-8 18:58
colt 发表于 2022-3-8 17:17
如果是这样的话,那代码得修改了。C#里面的Dictionary是不能保证读取的时候的顺序和写入相同的。 ...

SortedDictionary
作者: colt    时间: 2022-3-8 19:30
双杀步枪 发表于 2022-3-8 18:58
SortedDictionary

https://docs.microsoft.com/en-us ... DN&view=net-6.0

Represents a collection of key/value pairs that are sorted on the key.


MS只保证了SortedDictionary是按照key来排序的,但没有保证可以复现insertion order.

或者可以用non-generic的OrderedDictionary来做,要不然就用一个List<>来和Dictionary<>同步更新,就能保证顺序了。
作者: colt    时间: 2022-3-10 17:55
意外之喜 发表于 2022-3-7 09:43
这边建议你使用的模板替换为马王神修复后的ini,具体可以在置顶帖使用一个积分下载到。那个ini修复了挺多WW ...

目前正在编程实现了,希望能这个周末做出来。
作者: Light_Cone    时间: 2022-3-11 04:34
有点意思,虽然类似功能的工具早就有了。
不过现在大家都用ARES,ARES支持把一个RULES拆成多个文件,如果有分类整理的功能会比较方便(比如vehicle types放一个文件 武器放一个文件 粒子系统放一个文件 等等,很多模组都是随便摆位置的,日后维护会变得头疼)
另外注册表里的东西其实不全,有不少还写错了,建议直接从每一个单位或者武器的数据里读(比如上面提到的弹头注册名出现在ANIMATION里了)
作者: Light_Cone    时间: 2022-3-11 04:48
colt 发表于 2022-3-7 17:33
Ares对我就是一个完全不懂的新领域了,看版主说的意思是,只有Ares才有强制注册的要求,这个我估计得继续 ...

原版引擎已经基本上没人用了,限制和错误太多,还是建议去了解一下Ares拓展平台(这个也是开源的你可以去github找)
当然增加的一些ini标签对于你的编辑器的功能影响不大,只有三个比较重要的功能(“+=” ,拆文件,有些东西必须注册,刚才也有人提到了)可能有影响。前两个用的人不多,第三个比较重要,所以对于注册表的缺漏排查会比较实用,从单位和武器的数据里获取引用到的东西,然后检查注册表里是不是漏了。
作者: Light_Cone    时间: 2022-3-11 04:52
蓝镜VIP 发表于 2022-3-7 03:29
抛射体和弹头的归类其实没有必要,要搞什么武器直接新建就好了,反正20年前的单核老游戏,改ini连“基础编 ...

这个设想确实会很实用,点一下被引用的项目 打开这个被引用的项目的详细数据,不用每一次都去搜索了。
作者: Light_Cone    时间: 2022-3-11 05:27
其实2011年也有人做过比较实用的这种工具, https://forums.revora.net/topic/ ... revenge-ini-editor/
作者: colt    时间: 2022-3-11 08:13
Light_Cone 发表于 2022-3-11 04:34
有点意思,虽然类似功能的工具早就有了。
不过现在大家都用ARES,ARES支持把一个RULES拆成多个文件,如果有 ...

目前已经有一部分是这么读的了,但想要完全排查还要很久。点一下就打开详细数据的功能已经部分实现了,至少武器和弹头是可以的,prerequisite还需要特别处理一下,希望可以尽快。拆分文件以及和artmd.ini联动的功能暂时还没有实现,以后可以考虑。

其实这样的工具肯定有人做过,我不意外,但很可惜大部分前辈没有留下可供参考的源代码,殊为遗憾。这也是我选择发布到github的原因。如果以后有人愿意看一眼参考一下,也算是功德无量了。
作者: 双杀步枪    时间: 2022-3-11 09:48
colt 发表于 2022-3-11 08:13
目前已经有一部分是这么读的了,但想要完全排查还要很久。点一下就打开详细数据的功能已经部分实现了,至 ...

从冷晓辉到现在20年的经验总结就一个,不如复制粘贴改数值,没有留下什么痕迹说明了这玩意儿没什么卵用。
作者: colt    时间: 2022-3-12 02:40
双杀步枪 发表于 2022-3-11 09:48
从冷晓辉到现在20年的经验总结就一个,不如复制粘贴改数值,没有留下什么痕迹说明了这玩意儿没什么卵用。 ...

无所谓,反正都是用爱发电,图个乐呵完事了。
作者: 2244106363    时间: 2022-3-12 09:55
Light_Cone 发表于 2022-3-11 06:27
其实2011年也有人做过比较实用的这种工具, https://forums.revora.net/topic/82195-a-new-yuris-revenge-i ...

手感我个人觉着不如notepad++……
作者: Safari    时间: 2022-3-12 21:03
什么ini修改器都不如文本编辑器,我更倾向一个针对ts/fs/ra2/yr/yr++附带语句注解和基本模板的文本编辑器。我记得十年前有人做过一个YR的,留了个永硕盘的地址,但是早就失效了。另外,子ini拆分可以搞个工作区的形式,把子ini全部列在侧边栏。不过目前的公共词典解释也有诸多疏漏,把编辑器做精并不轻松。
除此以外,看楼主的发言,推荐先学好ini修改再去制作ini修改所使用的的工具,否则修改工具的设计会很难顺应大多修改者的使用需求和习惯,最后因为各种手感问题塞进回收站
作者: colt    时间: 2022-3-13 00:31
Safari 发表于 2022-3-12 21:03
什么ini修改器都不如文本编辑器,我更倾向一个针对ts/fs/ra2/yr/yr++附带语句注解和基本模板的文本编辑器。 ...

那可能不如去做一个notepad++/sublime text/vs code的插件,也许更实用。我知道我并不了解大多修改者的使用需求和习惯,所以才来到这里试图寻求帮助的。
作者: Safari    时间: 2022-3-13 00:38
colt 发表于 2022-3-13 00:31
那可能不如去做一个notepad++/sublime text/vs code的插件,也许更实用。我知道我并不了解大多修改者的使 ...

对奥,你一说我才想起来,我想要的那种用插件确实是个很好的办法
作者: colt    时间: 2022-3-14 18:12
Safari 发表于 2022-3-13 00:38
对奥,你一说我才想起来,我想要的那种用插件确实是个很好的办法 ...

等我把这个里面想做的功能做完了,再考虑插件的问题吧。说起来VSC的性能好一些,不过我完全没研究过。
作者: Netsu_Negi    时间: 2022-3-25 11:59
这种东西对新手一定要友好啊毕竟老手来说都喜欢直接上NotePad++或者VS Code或者其他文本编辑器
作者: cmis    时间: 2022-3-27 12:22
windows11 打不开,运行后无反应
作者: alexmmc    时间: 2022-4-6 16:52
合伙吗?我也在写
作者: Light_Cone    时间: 2022-4-8 16:08
colt 发表于 2022-3-14 18:12
等我把这个里面想做的功能做完了,再考虑插件的问题吧。说起来VSC的性能好一些,不过我完全没研究过。 ...

vscode 确实在改INI方面很舒服,比如自动补全,查找和目录总览,对比文件之类的,基于vscode做一个专门适配RA2引擎的拓展功能会比完全重新做一个工具要舒服得多。




欢迎光临 红警DIY论坛 (https://bbs.ra2diy.com/) Powered by Discuz! X3.5