|
本贴主要讲讲如何修改或新增北斗插件中StringPool的汉化
冒险岛的客户端里存在这么一个方法StringPool:使用 id 获取字符串。在客户端里直接搜索是无法搜到这部分字符串的。
好在有大佬提供了一个专门的工具 STREDIT.exe 可以把客户端里的 StringPool 导出来。这里原版的 StringPool 我已经导出在下面可以下载。
导出文件的格式是 id;"字符串"
那么插件是如何对这部分内容进行汉化的呢?
先看代码
- _StringPool__GetString_t _StringPool__GetString_Hook = [](void* pThis, void* edx, ZXString<char>* result, unsigned int nIdx, char formal) -> ZXString<char>*
- {
- auto ret = _StringPool__GetString(pThis, edx, result, nIdx, formal);
- if (nIdx == 1163)
- {
- *ret = "BeiDou";
- }
- switch (nIdx)
- {
- case 1307: //1307_UI_LOGINIMG_COMMON_FRAME = 51Bh
- if (EzorsiaV2WzIncluded && !ownLoginFrame) {
- switch (Client::m_nGameWidth)
- {
- case 1280: //ty teto for the suggestion to use ZXString<char>::Assign and showing me available resources
- *ret = ("UI/MapleEzorsiaV2wzfiles.img/Common/frame1280"); break;
- case 1366:
- *ret = ("UI/MapleEzorsiaV2wzfiles.img/Common/frame1366"); break;
- case 1600:
- *ret = ("UI/MapleEzorsiaV2wzfiles.img/Common/frame1600"); break;
- case 1920:
- *ret = ("UI/MapleEzorsiaV2wzfiles.img/Common/frame1920"); break;
- case 1024:
- *ret = ("UI/MapleEzorsiaV2wzfiles.img/Common/frame1024"); break;
- }
- break;
- }
- case 1301: //1301_UI_CASHSHOPIMG_BASE_BACKGRND = 515h
- if (EzorsiaV2WzIncluded && !ownCashShopFrame) { *ret = ("UI/MapleEzorsiaV2wzfiles.img/Base/backgrnd"); } break;
- case 1302: //1302_UI_CASHSHOPIMG_BASE_BACKGRND1 = 516h
- if (EzorsiaV2WzIncluded && !ownCashShopFrame) { *ret = ("UI/MapleEzorsiaV2wzfiles.img/Base/backgrnd1"); } break;
- case 5361: //5361_UI_CASHSHOPIMG_BASE_BACKGRND2 = 14F1h
- if (EzorsiaV2WzIncluded && !ownCashShopFrame) { *ret = ("UI/MapleEzorsiaV2wzfiles.img/Base/backgrnd2"); } break;
- //case 1302: //BACKGRND??????
- // if (EzorsiaV2WzIncluded && ownCashShopFrame) { *ret = ("UI/MapleEzorsiaV2wzfiles.img/Base/backgrnd1"); } break;
- //case 5361: //SP_1937_UI_UIWINDOWIMG_STAT_BACKGRND2 = 791h
- // if (EzorsiaV2WzIncluded && ownCashShopFrame) { *ret = ("UI/MapleEzorsiaV2wzfiles.img/Base/backgrnd2"); } break;
- default:
- if (Client::SwitchChinese)
- {
- for (const auto& pair : newKeyValuePairs) {
- if (nIdx == pair.key) {
- *ret = pair.value.c_str();
- break;
- }
- }
- }
- break;
- }
- return ret;
- };
复制代码
原理很简单 1 拦截调用 SP 的方法,先调用一遍原函数,获取构造后的结构体,然后根据 id 修改结构体内的字符串返回,就完成了替换。
因此如果你想对汉化结果进行修改或者新增汉化的话,只需要
打开北斗插件的 ReplacementFuncs.h 文件,搜索
- KeyValuePair newKeyValuePairs[] = {
复制代码 里面有很多已经汉化的内容,并且 id 都是按顺序排好的,如果你要修改汉化结果的话,只需要查找到对应的 id,把后面的内容修改掉就可以了。如果 id 不存在的话就自己添加一组键值对进去即可。
注意:
因为要调用一遍原方法,所以如果你要添加的 id 本身就不存在于 StringPool (id>5657 GMSv083的上限)原方法就会报错。
所以如果你要新增自定义的 id 的话,你需要修改这里面的代码逻辑
在代码 auto ret 前面插入下面这段代码即可,当然里面的自定义部分你要自行修改
- if (nIdx > 5657)
- {
- auto ret = _StringPool__GetString(pThis, edx, result, 1, formal);
- if (nIdx == 8888)
- {
- *ret = "返回8888";
- }
- return ret;
- }
复制代码
STREDIT 下载:https://mega.nz/file/2SAmDQwJ#q9 ... TaYUG9V_HUVwBnwlhtU
GMSv83 StringPool 下载:https://mega.nz/file/PeBhVDaI#79 ... T2F-xbeYboSR0DvIbaM
|
|