PvZ2修改大典 第四章 代码基础

前言:随着技术的发展和进步,贴图合成、动画修改、属性组合、关卡制作、音乐编码早已不是秘密。其实从2021年9月Ftp2Res制作出来时候就已经打破了贴图合成和动画修改垄断,然而由于核心圈大佬仍然使用一些漏洞百出的工具而且不愿变通,导致了我制作的相关工具在2021-2023年期间使用人数仍然保持在个位数,传播力度极窄,我早已声明相关工具公开,但是收效甚微。以前并没有时间去写相关教程,而且不少人入门看的就是我那个已经严重过时的RTON修改教程,在此真的劝退不少修改玩家。去年10月我将我当时所有自己写的工具都集成在EBToolBox上,以方便使用,同时为了照顾无法安装.NET 4.8的玩家和便于调试,保留了各个功能的单文件版并同步更新。所以在此专门抽时间写新版工具相关的教程,以供来者学习观摩。
在此特别感谢那些帮助我完善工具和教程的大佬们。
注:若汝目前在升学考试(小升初、中考、高考、专转本、考研等)期间,请立即停止阅读PvZ2修改相关文献,作者自然无法限制您的阅读自由,但是为了您的未来着想,请立即停止修改相关的学习,全身心投入考试当中,吾不希望踏足PvZ2修改的任何玩家因为学习这门技术而丢了本业。
第四章 代码基础
该篇章在下可能讲得不太好,毕竟自身代码组合能力有限,目前来说就先讲讲最基础的地方。
首先我们需要清楚,代码是PvZ2修改中最为重要的部分,有些地方是被西宝直接写死的,但是其余的地方则是有着很大的自由度,通过JSON中的自由组合达到自己想要的效果。
目前来说,对于入门修改的玩家,往往是摸不着头脑,像7年前的2016年(什么?2016年不是4年前吗?),RTON还是在大多数用WinHex十六进制修改,少部分人转换成JSON修改的时代,更是一塌糊涂,关卡制作难,属性修改也难,能替换一下子弹就算是掌握高端技术了。由于旧版教程此篇章没有更新,只能说万幸,没害到人,新篇章就用不着拿着十六进制编辑器修改RTON的字节了。
废话说了那么多,现在正式开始代码基础教程。
准备材料:解包文件夹,太极,PvZ2Tool
1.Packages提取以及JR转换
通过第三章的群组解包,我们获得了一大堆的RSGP,也提到过这些RSGP功能各异,目前本章仅会用到其中最核心的RSGP:Packages.rsgp

将Packages.rsgp拖入太极,选择5后解包

得到解包文件夹Packages.rsgp.dir(看不到的话刷新一下packet文件夹即可),接下来,关于PvZ2的修改,你得一直靠着它。
打开解包文件夹,可以看到PACKAGES里面一大堆RTON

现在,你需要打开PvZ2Tool,点击按钮,找到你的PACKAGE路径,然后选择批处理模式,Start,等待转换完成。

这时候你会获得一个全转换为JSON的Convert文件夹


然而,这真的是我们想要的吗,并不是,这些大写字母看上去就让人心烦。所以我们并不推荐将RSGP里面的PACKAGES转换为JSON,而是,转向我们之前全资源解包的文件夹的res文件夹中的packages文件夹。里面的RTON都是经过大小写重命名的,辨识度高,用PvZ2Tool批量转换。


当JSON修改完毕后,便可以将JSON拖入太极,选择6将JSON转换为RTON,然后剪切到RSGP解包文件夹里面的PACKAGES文件夹中覆盖掉以前的RTON。

将RSGP解包文件夹拖入太极,选择0 0打包完成。

等到所有RSGP都处理完成打包完成后,将数据包解包文件夹拖入太极,选择0 1 0即可打包完成。

关于10.4及以后版本的改版数据包处理详见第三章最后拓展部分。
以后搞的修改也大多数是在全资源解包里面改完之后用太极encode转RTON之类的,把文件放在群组解包文件夹的RSGP解包文件夹里覆盖对应文件然后打包RSGP,最后打包数据包完成修改,所以打包解包JR转换这些基础操作便不会再讲第二次。
2.单位基础结构
接下来便开始讲解最基础的地方了。
每一个JSON掌管不同的资源引用以及对于西宝写在源码里面的代码的引用,所以修改数据包这件事本身算不得修改游戏源码。就算是Paradox那个改版,修改SO也不算修改源码,那个叫反编译。真正修改源码,就应该是获得西宝开源项目进行修改并且编译得到的游戏MOD,当然PvZ2开源怕是得等个几百年了。
一般地,对于一个单位的修改,分为类型types和属性props(properties)。
类型相当于单位的注册表,属性相当于单位的词条。
例如障碍物的GridItemTypes和GridItemProps,植物的PlantTypes和PlantProperties,僵尸的ZombieTypes和ZombieProperties。
当然他们还有特殊的动作,比如某些特殊植物的动作Powers,某些特殊僵尸的动作ZombieActions。
关于抛射体(子弹),它是类型和属性的集合,名称叫作ProjectileTypes。
至于弹头……串了串了,和RA2串了,没有这类()。
目前需要掌握的就这些JSON,其余的JSON,应该算是更高级一点的,等到以后再讲(有没有可能是EB不会?)。
每个JSON中,每个节点的名称aliases都是独一无二的,能自定义。属性以及其它中的objclass是源码写死的,只能用JSON之中提供的,不能自定义。类型的Framework和AnimRigClass都是源码写死的,只能用JSON之中提供的,不能自定义。至于其它的节点,暂时不表。
对于类型和属性之类的之间的关系,只能这样说,是类型引用属性和位图动画信息,特殊单位的属性引用特殊单位的动作。毕竟注册表嘛,引用啥都不足为奇了。
要修改属性,可以新建属性,然后把类型里面引用的属性名称改成想用的属性名称。
也可以直接修改类型引用的属性,但是不推荐这样做。
要增加单位,需要在类型中新建类型,把类型里面引用的属性名称改成想用的属性名称。
也可以直接修改你想开刀的类型,但是不推荐这样做。
增加其它JSON节点原理相通。
接下来,关于代码的修改,应该会分成数章来讲,这里仅仅提供基础入门。
理解了单位组成的基本架构,之后的修改便会清晰明了了。