如果你的东方地灵殿使用了某全开档,你所保存的每一个 REP 的机签后面都会莫名其妙地多出 2 个字母 "Ai" ,使得原本应该只有 8 个字符的机签奇迹般地变成 10 个。



由于我自己也用这个全开档,所以每次看到自己打的REP里多出这两个字母都很不爽。于是利用最近空余时间分析了一下游戏主程序 th11.exe ,发现原因貌似跟默认机签有关。
我们知道游戏会保存你上次输入的机签(如果你从未输入过,那么就是 8 个空格)。而每次你保存 REP 时,默认的机签即为你上次输入的机签。而在游戏内部,会先把上次输入的机签拷贝到一个 buffer 中,玩家输入机签时所修改的,以及最终在 REP 里保存的便是这个 buffer 里的内容。而这个拷贝操作使用的是类似 C语言库函数 strcpy() 的操作,也就是循环拷贝字符,直至遇到 *\0* 结束。
而问题在于这个全开档的默认机签,她的第 9 和 第 10 个字节分别为 *A* 和 *i*。我们知道东方STG的机签应该固定为 8 个字符(你没填的地方其实都填了空格,而不是没有字符哦),所以第 9 个字符应该为 *\0* (字符串结束标志)。那为什么这个全开档的默认机签的第 9 个字符不是 *\0* 呢?那就只有问全开档的作者了。
正常情况下,因为玩家只能在游戏中输入长度为 8 个字节的机签。那么玩家不管怎么努力,都无法改变 buffer 中第 9 个字节及其之后的内容。于是,从默认机签中拷贝而来的 "Ai" 自然也是改不掉的,所以最终就跑到了所有你保存的 REP 里。
那么,解决的办法就是,在游戏运行时直接改游戏内存,把默认机签的第9个字节改成 *\0*,关掉游戏。以后再保存 REP 时就不会有 "Ai" 了。
默认机签的地址在 th11.exe 进程内存的 [4a8ebc]+2dde0 处 。如果使用了全开档,那你应该看到 第9 和 第 10 个字符(偏移 8 和 9)分别为 *A* 和 *i*,把 *A* 的十六进制值改成 00 ,改好后为了保险可以先退出游戏,以后你保存的 REP 的机签就不会再拖个 "Ai" 了。
如果你不懂内存修改,或者懒得自己动手,可以下载我写的补丁程序。该补丁只需应用一次,以后保存的 REP 机签就正常了(除非你又重新用了没打补丁的全开档)。
无论哪种改法理论上都不会影响除了默认机签以外的游戏数据。不过为了保险起见,建议先备份一下游戏数据文件 scoreth11.dat 。



由于我自己也用这个全开档,所以每次看到自己打的REP里多出这两个字母都很不爽。于是利用最近空余时间分析了一下游戏主程序 th11.exe ,发现原因貌似跟默认机签有关。
我们知道游戏会保存你上次输入的机签(如果你从未输入过,那么就是 8 个空格)。而每次你保存 REP 时,默认的机签即为你上次输入的机签。而在游戏内部,会先把上次输入的机签拷贝到一个 buffer 中,玩家输入机签时所修改的,以及最终在 REP 里保存的便是这个 buffer 里的内容。而这个拷贝操作使用的是类似 C语言库函数 strcpy() 的操作,也就是循环拷贝字符,直至遇到 *\0* 结束。
而问题在于这个全开档的默认机签,她的第 9 和 第 10 个字节分别为 *A* 和 *i*。我们知道东方STG的机签应该固定为 8 个字符(你没填的地方其实都填了空格,而不是没有字符哦),所以第 9 个字符应该为 *\0* (字符串结束标志)。那为什么这个全开档的默认机签的第 9 个字符不是 *\0* 呢?那就只有问全开档的作者了。
正常情况下,因为玩家只能在游戏中输入长度为 8 个字节的机签。那么玩家不管怎么努力,都无法改变 buffer 中第 9 个字节及其之后的内容。于是,从默认机签中拷贝而来的 "Ai" 自然也是改不掉的,所以最终就跑到了所有你保存的 REP 里。
那么,解决的办法就是,在游戏运行时直接改游戏内存,把默认机签的第9个字节改成 *\0*,关掉游戏。以后再保存 REP 时就不会有 "Ai" 了。
默认机签的地址在 th11.exe 进程内存的 [4a8ebc]+2dde0 处 。如果使用了全开档,那你应该看到 第9 和 第 10 个字符(偏移 8 和 9)分别为 *A* 和 *i*,把 *A* 的十六进制值改成 00 ,改好后为了保险可以先退出游戏,以后你保存的 REP 的机签就不会再拖个 "Ai" 了。
如果你不懂内存修改,或者懒得自己动手,可以下载我写的补丁程序。该补丁只需应用一次,以后保存的 REP 机签就正常了(除非你又重新用了没打补丁的全开档)。
无论哪种改法理论上都不会影响除了默认机签以外的游戏数据。不过为了保险起见,建议先备份一下游戏数据文件 scoreth11.dat 。