2019-11-26-dll记录

汉化核心技术

BGI2的:

封包法:

宽窄字符转换函数两个,均932to936,可能是前期处理压入,这个务必别用exe修改

NewWideCharToMultiByte与NewMultiByteToWideChar:932to936

不封包的字典翻译:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
bool loadText()
{
ifstream ftxt("sens1.txt"); //日文SJIS的存储
ifstream fetxt("sens2.txt"); //中文GBK的存储
if (!ftxt.is_open())
{
return false;
}
if (!fetxt.is_open())
{
return false;
}
int idx = 0;

while (!ftxt.eof() && !fetxt.eof())
{
char tmp[0x1000];
ftxt.getline(tmp, 0x1000);
CString text(tmp);

//cout << text << endl;

char tmp2[0x1000];
fetxt.getline(tmp2, 0x1000);
CString text2(tmp2);

//cout << text2 << endl;

LPCWSTR lpcwStr = text2.AllocSysString();;

m1.insert(pair<CString, LPCWSTR>(text, lpcwStr));
idx++;
}
ftxt.close();
fetxt.close();
cout << "Load Texts:0x" << hex << idx << endl;
return true;
}

然而我还想进一步处理utf-8:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
bool loadText()
{
ifstream ftxt("sens1.txt");
ifstream fetxt("sens2.txt");
if (!ftxt.is_open())
{
return false;
}
if (!fetxt.is_open())
{
return false;
}
int idx = 0;
while (!ftxt.eof() && !fetxt.eof())
{
char tmp[0x8000];
ftxt.getline(tmp, 0x8000);
CString text(tmp);
//cout << text << endl;
char tmp2[0x8000];
fetxt.getline(tmp2, 0x8000);
CString text2(tmp2);
//cout << text2 << endl;
LPCWSTR lpcwStr = text2.AllocSysString();;
m1.insert(pair<CString, LPCWSTR>(text, lpcwStr));
idx++;
}
ftxt.close();
fetxt.close();
cout << "Load Texts:0x" << hex << idx << endl;
return true;
}

开字典务必要注意,C++编程的陷阱,那就是要一般的字符串比较是否在字典中,默认是比较地址,所以内容相同还是在字典中找不到!所以map <LPCWSTR, LPCWSTR> m1;是不能使用来判断m1[key]的!还好C++有CString这种天才发明,用map <CString, LPCWSTR> m1;写就行了。

开字典测试通过,不过貌似查字典太累了,内存大不说,skip模式容易程序崩溃(字典才存了1000多行啊,每点击一句话就要拿到map容器里判断,太脑残了),适合于没有合适封包方法的慢玩/录制,不适合于做补丁。不过总算是解决了我的遗憾,实现了类似VNR的文本提取与离线转换,(而且VNR大部分还不能内嵌)。

NewWideCharToMultiByte里使用

1
2
3
4
5
6
7
8
setlocale(LC_ALL, "chs");
CString str(lpWideCharStr);
if (m1[str] != NULL){
wprintf(L"old : %ls\r\n", lpWideCharStr);
wchar_t * pointer = (wchar_t *)lpWideCharStr;
wcscpy(pointer, m1[str]);
wprintf(L"new : %ls\r\n", lpWideCharStr);
}

接下来是读取文本:

最果てのイマ COMPLETE,一个字符三次调用全局变量

NewGetGlyphOutlineA:

1
2
3
4
BaseMove = (BaseMove + 1) % 3;
if (BaseMove == 0) {
cout << uChar;
}

读出来的就是sjis日文

等等句子呢?

借助VNRHOOK.dll方法