Arcaea自制研究笔记
此文用来给我这两天遇到的各种bug写个记录,免得自己将来再遇到相同问题的时候忘了还有这个文档了
另外本贴仅供参考,不提供任何资源的下载,也不能给出具体的函数地址,仅记录逻辑思路与我穷举式的debug过程(……)。网上能找到的相关教程实在不多,有些问题的解决方案如果能帮到其他苦于研究Arcaea程序的人那就再好不过,虽然记录的大多都是些很愚蠢的错误……
V1.0
加入destr0yer:
1. IDA打开Arc-mobile文件,搜索_exit,查看其xref,NOP掉第二个函数所有的调用(一共五个,B.NE与CBNZ调用都NOP掉)
2. 在songlist中加入所需语句,操作成功
V1.1
加入apollo和Omega4:
1. 光速闪退……
原谱师提供的songlist黏贴,发现闪退……
若0,1谱面文件不满足past、present制谱规则时不影响载入,可以正常使用……
songlist中的版本号可以任意修改,不是造成闪退的原因……
将destr0yer的songlist部分黏贴过去并只改id和idx,实测有效可以正常载入……
更改songlist曲师曲名与难度信息并不影响,目测是之前复制的原谱师所给songlist有冲突
2. 验证idx号并无上限问题,且新加曲目无需标注idx号
3. 验证设定在初始包里的曲子使用来自其他曲包的背景图不会导致闪退
4. 验证设定难度13与难度0不会导致闪退
V1.2
加入Wolve Standing Toward Enemies与Cthugha:
1. 验证缺失0,1难度的aff谱面文件可正常游玩,只会在进入相应缺失谱面时闪退
2. 删除其余所有song文件夹下内容,并同步更改songlist与unlocklist,正常进入主菜单,但点开始游戏后闪退,原因待查明
3. 可随意更改char文件夹内搭档图片,但光猫替换初始光存在错位现象,PS可解决。在程序里找到了搭档立绘坐标调整相关函数,但修改方式有待研究
4. 验证可以联网打开而无其他影响,但不要登录账号
V1.3
加入The Angel’s Message,Collapse:
1. 可在img/bg背景文件夹下加入自定义背景图并调用
2. Angel’s Message的songlist中有beyond相关注释,不知道作用但能正常载入
V1.4
加入80%速度的Testify和Pragmatism-RESURRECTION-,给The Angel’s Message加入6k:
1. 通过程序批量修改所有时刻值,aff一键减速程序有待进行bug验证
2. 经程序减速修改后,在arcade中正常运作的谱面放进arcaea里闪退……
尝试背景图不调取曲子专用背景,谱面闪退……
尝试去除songlist所有byd相关语句,谱面闪退……
尝试复制原版谱面文件,谱面正常进入???
尝试删除所有timinggroup部分,谱面正常进入……
目测问题:使用程序批量更改的timinggroup语句有错误,C++写入字符格式的问题?
尝试使用未变更时刻值的原aff文件timinggroup语句,谱面正常打开……
尝试复制原版timinggroup语句后手动更改时刻值,谱面正常打开???
尝试批量更改后统一删掉timinggroup语句中前面的两个进位空格,谱面正常打开
结论:arcade都能认出来ascii=32的空格,放616编译器就不认空格只认null了
解决办法:输出txt的时候把语句前面俩空格给删了……
4. 发现诸多谱面闪退原因:
设置两个同时判定的glass_wave特殊天键时发生闪退(后面发现一个也闪退,可能需要final曲包支持?)
加入scenecontrol(150000,trackhide);与scenecontrol(166000,trackshow);后闪退(后发现不可在相同时间段出现两条trackhide语句,原因待查明)
目测4.0版本可能不支持trackhide与trackdisplay,怎么写都不变黑……
尝试给谱子加入6k,记录6k时note左极限-0.63,右极限1.63,上极限1.61
有时arcade保存的aff放进去闪退,但删掉timinggroup中语句的数字重写一遍就行了???原因未知(字符编码不同?)
V1.5
关于scenecontrol部分判断失误,4.0改动了条件机制,原绕过MD5码验证机制似乎不再可行(且验证MD5码的函数没有xref,迷惑?),或者可能需要对流程进行更改。
此外,scenecontrol控制语句分开识别,以下语句被分在一个读取函数中:
‘trackdisplay’:返回0
‘redline’:返回1
‘arcahvdistort’:返回2
‘arcahvdebris’:返回3
‘hidegroup’:返回4
‘enwidencamera’:返回5
‘enwidenlanes’:返回6
无匹配结果:返回7
查看该函数的xref共有四处调取,其中三处分别判定了函数返回值是否为4、5、6,另外一处为BL强制跳转且无后续判断,尚不明确意图,有待研究……
另外,发现enwidencamera与enwidenlanes语句无需对相关部分进行任何更改即可从谱面中正常调取,即对应上述函数的四处调取。可能616将sc语句分类成了不同的使用条件,亦有可能对某些sc语句单独编写了条件函数。
包含trackhide,trackshow等其他效果在内的scenecontrol语句的识别在另一函数中,此函数待研究……
V1.6
加入testify和白魔王byd的62.5%减速版:
1. 经验证程序输出的减速后aff文件可直接导入并读取,不会闪退!
2. 可直接在对应难度里加"audioOverride": true语句,并在曲子文件夹中加入对应难度的1.ogg文件,这也会导致预览音频被同步替换。
3. 1_Preview.ogg没用,依旧按完整音频的时间轴节选片段预览,白魔王byd音频独立预览的原理未知。
4. 可在对应难度里加入"title_localized"语句改变不同难度的显示名称。
V1.7(本专栏的第三次修改,即最后一更)
更换collapse谱面,尝试加入自己制作封面与描述的曲包并去除锁标:
1. 可更改packlist来加入自定义曲包,但会被上锁(仅影响图标不影响使用)
2. 搜索PackSelectCell字串,找到并进入其xref(两处取其一),函数反编译后发现关键字串“lock_icon”,其所在语句下方有条件判断(v52 & 1) != 0,对其中的变量v52溯源找到检测曲包ID的函数,其中有对single、base等字符串的判断比较。观察函数后可以发现未上锁曲包返回值为1,故将其返回值固定设为1即可去除所有曲包的锁标图案。
3. 曲包图片位于songs/pack文件夹中,自制曲包应该需要加入诸如《"img": "select_judgement.png",》这样的语句行来调取图片。