PvZ2修改大典 第十一章 贴图合成及动画修改——动画文件转换与XFL动画结构

前言:随着技术的发展和进步,贴图合成、动画修改、属性组合、关卡制作、音乐编码早已不是秘密。其实从2021年9月Ftp2Res制作出来时候就已经打破了贴图合成和动画修改垄断,然而由于核心圈大佬仍然使用一些漏洞百出的工具而且不愿变通,导致了我制作的相关工具在2021-2023年期间使用人数仍然保持在个位数,传播力度极窄,我早已声明相关工具公开,但是收效甚微。以前并没有时间去写相关教程,而且不少人入门看的就是我那个已经严重过时的RTON修改教程,在此真的劝退不少修改玩家。去年10月我将我当时所有自己写的工具都集成在EBToolBox上,以方便使用,同时为了照顾无法安装.NET 4.8的玩家和便于调试,保留了各个功能的单文件版并同步更新。所以在此专门抽时间写新版工具相关的教程,以供来者学习观摩。
在此特别感谢那些帮助我完善工具和教程的大佬们。
注:若汝目前在升学考试(小升初、中考、高考、专转本、考研等)期间,请立即停止阅读PvZ2修改相关文献,作者自然无法限制您的阅读自由,但是为了您的未来着想,请立即停止修改相关的学习,全身心投入考试当中,吾不希望踏足PvZ2修改的任何玩家因为学习这门技术而丢了本业。
第十一章 贴图合成及动画修改
2.动画文件转换与XFL动画结构
准备材料:全资源解包文件夹,太极,Adobe Animate(下面简称AN)
I.PAM与XFL文件夹之间的转换
根据代码篇,我们了解到,我们想要新增一个单位,便是要去types里找到符合自己要求的单位,然后复制粘贴那个单位的代码,再根据这个代码去props之类的里去创建符合自己要求的属性和其余代码。动画也不例外,所谓动画的运行,就是代码驱动了贴图在移动翻转变色等操作。然而决定了贴图的动作的,不仅是packages里面的代码,还有一个重要的文件——PAM。
根据第十章资源分布,我们很轻松地在全资源解包文件夹或者RSGP解包文件夹中找到了符合我们要求的单位的PAM,将其复制出来,我们要单独对其进行处理。现在我们由于用到的是凯撒衍生出的单位,所以应当使用凯撒的PAM。
对于PAM,我们最好的处理方式是对其进行转换,其中,转换为XFL文件夹供AN修改是最为直观的。
现在,我们将PAM拖入太极,输入6即可将PAM转换为XFL。


当我们对XFL动画进行一系列修改之后,我们需要对XFL文件夹进行改名,记住是XFL文件夹,不是XFL文件。由于PAM和XFL互转的名称是”名称”.PAM文件和”名称”.xfl文件夹,所以PAM的文件名是被XFL文件夹名决定的(虽然说咱们可以转换成PAM之后对PAM改名就是了,但是改XFL文件夹更有区分度而不至于弄混工程文件)。现在,我们对XFL文件夹进行改名。由于我的是国王拓展僵尸,应该改名为zombie_dark_veteran_king.xfl。
而后将XFL文件夹拖入太极,选择0 2即可将XFL转换为PAM。

其中有一些小提示,通过这些提示可以知晓XFL转PAM导致崩溃的原因。
当太极停留在a序号.xml或者i序号.xml时崩溃,则需要检查a元件和i元件是否有问题,extra.json和DOMDocument.xml是否有它们的记录等等。
当太极停留在l序号或者图层_序号或者其余的图层名称时候崩溃,则需要检查该图层是否是全空图层,全空帧图层或者是图层中间末尾有空帧。具体这个图层在哪个元件中,图层提示的上方有in xxx.xml字样,表示该图层是xxx元件的图层。
如果直接崩溃,则需要检查DOMDocument.xml中label, animation以及main元件的帧长度是否一致,以及main元件或者a元件的部分动画是否为没来得及转换为逐帧动画的补间或者骨骼动画,亦或是是否由于未在使用AN修改XFL动画前载入位图导致AN干掉了DOMDocument.xml的media节点。
如果出现下图提示,则需要在DOMDocument.xml中的DOMDocument节点添加__ABOUT__属性,具体如图所示。


当太极转换完成了,但是提示中出现如图字样,那么表示该图层是太极允许的,但是太极不喜欢,给你删了。这样导致的后果就是合成的PAM将很大概率无法被转换为XFL,这个也是PAM加密的原理。

转换完成后,我们便可看到PAM成品,说明动画制作完成。这时候需要动用第十章的资源分布的知识,对PAM进行打包之类的操作,在此不表。

II.XFL动画结构
在太极生成的XFL文件夹中,所有的数据都被分为了这几个部分:
Adobe Animate入口文件main.xfl、文档信息DOMDocument.xml、库文件夹LIBRARY、动画拓展描述文件extra.json。

各个部分解析如下:
main.xfl:名字随便改,只要内容是那一段代码,后缀是.xfl即可。
LIBRARY文件夹:用来装载库中存储的元件和位图。
其中i开头的xml是image图像文件。i元件中,有且仅有一个图层,该图层有且仅有一帧。并且这一帧中仅能引用一张位图。
这一位图可以使用如下属性:指定变换原点、平移、缩放。这三种属性以外的属性,会在编码PAM过程中被忽略。

其中a开头的xml是animate动画元件。a元件中,可以包含任意数量的图层(即使是0)。每一图层中,仅能引用同一元件。这个元件可以是任意的i元件,也可以是序号小于该a元件序号的a元件。在该图层中,每帧仅能引用一个元件。当该帧引用元件的时候,该帧呈白色我们可以叫作实帧。没有引用元件的帧呈深灰色我们叫作空帧。黑色或者透明表示不存在帧。当图层中出现实帧,那么该实帧以后的帧要么都不存在帧,要么就为实帧,不能存在空帧,即其为一段连续的动画,实帧之间不能存在空帧,图层动画末尾不能存在空帧,空帧只能存在于该图层第一个实帧之前。否则回PAM崩溃。
a元件可以有以下几种属性:平移、缩放、旋转、倾斜。这四种属性以外的属性,会在编码PAM过程中被忽略。

其中main.xml(不是main.xfl)是主元件。主元件性质同a元件,但是受DOMDocument影响,我们修改也是修改主元件。

目前太極可处理的XFL动画有诸多限制,例如:只能使用PNG位图、不允许渐变(目前似乎允许)、只能进行逐帧制作(可以使用传统补帧、并在要进行转码前在AN中将至转化为逐帧动画)。如果违反这些规则,很有可能无法成功将XFL转换为PAM(程序进行转换时将会崩溃)。
DOMDocument.xml:分为文档信息DOMDocument、位图引用media、元件引用symbols、场景main(labels动作标注信息图层、actions动作命令图层、audio音乐信息图层和animation动画信息图层)
DOMDocument:包含多个属性,其中__ABOUT__="this XFL is convert from Popcap-AniMation file , by TaiJi ."这一属性太极合成必需。其余的属性一般通过AN修改得到,比如:
舞台背景颜色(灰色)backgroundColor="#999999"
网格颜色(白色)gridColor="#FFFFFF",
舞台宽高(宽384高384)width="384" height="384"
网格宽高(宽128高128)gridSpacingX="128" gridSpacingY="128"
开启网格gridVisible="true"
开启标尺rulerVisible="true"
其中手动开启如上属性方法如下:
首先,双击main.xfl进入XFL舞台界面,点击左上角梅花花色按钮,选择main元件后进入main元件编辑界面,随后点击右上角的属性按钮,设置舞台宽高为384,设置舞台背景颜色为灰色。


随后在舞台处右键,显示标尺,随后编辑网格,勾选显示网格,设置宽高为128,设置网格颜色为白色。


至此,宝开标准手动设置完成,返回场景即可。
media、symbols :涉及XFL引用的位图和元件信息,一般情况下不用修改,AN会处理这些的。
labels:此图层异常重要,而且在代码篇讲过,单位types的AnimRigClass决定了该单位能播放什么动作标注的动画,动作标注可以多,因为它可以不读;但是不能少,因为一旦读不到,游戏直接崩溃,不崩溃也会卡死在上一个动作标注中。搞移植的核心就是这里。一般来说,单位的AnimRigClass需要哪些动作标注,由对应原版PAM内的labels决定。

actions:存储着能够播放指令的帧和对应的执行指令,一般使用AN处理。
audio:存储着能够播放音乐的指令的帧和对应的执行指令,一般使用AN处理。
animation:和main元件的帧长度一致,一般不做修改。
extra.json:分为默认头数据unk、缩放比率origin、资源引用信息及大小imgSz、i元件引用资源名称imgMapper、a元件代表图层名称animMapper
unk:默认为54 19 F0 BA 06 00 00 00 1E 00 00 00 00,不要改动。
origin:一般为78.0, 78.0,即使不是也不要擅自改动。
imgSz:前半部分为引用的资源id,后半部分为缩放后大小,一般为资源尺寸x0.78125。
imgMapper:i元件对应引用的资源id,所以i元件仅能引用一个位图。
animMapper:a元件代表图层名称,一般来说可以随意命名,允许重名。但是有些特殊图层名称需要注意,比如:
zombie_arm_outer_upper_bone为僵尸残血无下臂情况下的露骨上臂
zombie_arm_outer_upper为僵尸满血状态上臂
zombie_arms_outer_upper为僵尸上臂集合(a元件两个图层,上层放完好上臂元件,下层放残破上臂元件)
zombie_arm_outer_lower为满血状态时僵尸小臂
zombie_hand_outer_01为满血状态时僵尸左手
ink为僵尸中毒面部
butter为僵尸被黄油定身状态面部
ground_swatch为僵尸移动参考平面
ground_swatch_plane为僵尸移动参考水平线
particle_head为掉落的头颅
particle_arm为掉落下臂
_particles为掉落物(多个图层,放置防具、头颅、下臂等元件)
还有自己在防具定义的损伤点等等。
这些图层,在特定情况下会隐形。比如满血状态便不会显示残破手臂;残血状态会显示残破手臂,不会显示小臂和左手;没有中毒面部不会覆盖;参考平面和水平线始终隐形等等。
一般来说,extra.json的修改在以前是手动的,但是自从Res2Ext的出现,这些东西都开始了自动化,所以除了a元件代表的图层名称,其余的都不需要手动修改。
在AN修改动画完成后,会出现其它文件和文件夹,那些会被太极忽略,不需要删除。