最近在打流星洛克人 2 的对战,然而对战音乐只有那一个,听久了也会觉得厌烦。因此,如果我们可以不让其在对战时播放音乐,我们就可以听我们想听的音乐了。
在 Discord 上,找到了一个似乎是“no music”的代码。
220B8CF6 00000000
然而,这个代码不能直接用于对战。原因有下:
- 这段代码仅用于美版,而日版与美版的地址不同,直接使用会出现问题;
- 在美版上测试发现,这段金手指只会使 boss 战无音乐,而不会使对战场景无音乐。
因此,需要我自行寻找适用于日版的代码。
查看美版内存,定位到上面的金手指所提及的地址 020B8CF6
。注意到邻近有一个四字节数据 00082C84
,于是在日版搜索这个值,找到了 020B38A0
这个地址。
因为这段金手指只会使 boss 战无声,所以我们合理推测 1C
为 boss 战的音乐 ID。尝试得出对战音乐 ID 为 25
。
正巧,这段地址下方正是一串频繁出现 25
的数据。可以推测,只需要将里面的 25
全部改为 00
,就可以实现无音乐了。
于是,我编写了程序以输出金手指:
#include <iostream>
using namespace std;
int main(void)
{
int addr = 0x220b3986;
int count = 0;
while (1)
{
cout << std::hex << addr << " 00000000" << "\n";
addr += 0x14;
count++;
if (addr > 0x220b3fb2)
{
break;
}
}
cout << std::hex << count;
return 0;
}
运行结果经测试的确可用,但是又出现一个问题:金手指过长,导致直接将其复制进 melonDS 中会无法应用。为此,需要压缩金手指的长度。
不难发现,相邻的地址总是相差 0x14 字节。
查阅 资料 得知,AR Code 使用 Type C 执行循环。我们要执行 0x50 次循环,因此,我们有
C0000000 00000050
此外,我们需要定位循环开始的位置。事实上,只需有
220B3986 00000000
这里开头的 2 表明了这是 Type 2,代表往地址 20B3986
写入一个字节的数据。
由上文知地址相差 0x14 字节,因此我们可以使用 Type DC,它的作用是调整偏移量。设地址为 addr
,若是 DC000000 00000004
,则相当于 addr += 4
这段语句,即下一次写入的地址为 addr + 4
。在这里则是
DC000000 00000014
金手指执行完后,我们需要终止它的运行。因此我们需要终止运行的相关代码,即
D2000000 00000000
我们还需要结束条件代码(Type D0):这个代码用于恢复之前的代码执行状态。事实上这段代码用于恢复 if 代码(Type 3, 4, 5, 6 和 Type 7, 8, 9, A)所设定的 false 的执行状态,在这里不需要使用,但习惯上我们还是加进这里。
这样,需要的金手指似乎为
C0000000 00000050
220B3986 00000000
DC000000 00000014
D2000000 00000000
D0000000 00000000
后续测试发现,上面的金手指只在非 WiFi 模式的对战可用,而在 WiFi 联网对战下无效。事实上,我们已经有了流洛 3 的对应的金手指:
220F9E66 00000000
查看该地址发现,只有当触发对战白屏过渡时,这个地址的值才会改变为对应的音乐 ID。这样,我们就有可能在流洛 2 中也找到类似的地址。
幸运的是,搜索内存后,我们一次就找到了这个地址。
这样,我们只需把这个地址的值改为 00
,就实现了对战无音乐。
综上所述,日版流星洛克人 2 的对战无音乐金手指为
22196B52 00000000