Open cztBlue opened 1 year ago
Misaka采用的是一个根据Textractor2020年(不知道是哪一个版本)特制的一个HOOK(该HOOK已经很久没更新了......)
我恰好发现其能够获取不被处理的完整源文本(但是Misaka开始翻译后会有HOOK丢失这种更大的bug,所以我没有用那个翻译器)。
我试着将旧版HOOK替换新版后重新编译,结果由于特制版的HOOK参数似乎与原版差异较大,在TsubakiTranslator不能正常工作,尝试将TsubakiTranslator的HOOK调用文件重构与旧版HOOK适配,但囿于个人水平,目前没有成功。
2fcd4d082e21e4393272c897906c51bc#5038181583#IxSHE Tell.7z
这里提供实例中使用的游戏资源。
我利用文本特性添加了一个正则,以此更改了一些On_TextHook_OutputDataReceived()中的调用逻辑来解决这个问题: 现在这个(特定的)游戏可以正常显示原文了,但是这个方法太过愚.蠢以至于问题没有真正被解决。
最好的解决方法还是到textractor提issue,让原项目的作者对这类引擎的提取做优化,因为这个问题肯定也不止在我这存在
其实也可以匹配前面的[*]
,但这种解决方法不优雅,回调函数本来的目的就是每次处理一个hook结果,每次调用都是独立无关联的,对于绝大部分游戏都能符合这个规则,为了其中一个引擎去改这里的核心逻辑我感觉不太合适
在此@DDWSdwqdq 大佬,我对逆向和c++都不懂,就先闪了
感谢探讨
其实翻译器开发者自己直接控制textractor是最好的。lgztx老哥弄有一个texthost可以直接将几个文本提取器cli的几个函数提出来作为dll供其他语言使用。
这比cli通过管道更高效,而且可控性更大,还可以卸载不需要的钩子。直接用texthost也是原生的文本没有处理br和其他换行符之类的。
textractor 的CLI 好像维护不是很积极,而且也不支持GUI的extension. Ad-Hoc 的解决方法是手动打开textractor-> 用extension 替换<br>
-> 监视剪贴板. 最好解决方法是直接魔改CLI.
当前框架下的解决方案只能是把管道输出当成file-stream 并且维护一个当前钩子的state. 因为适用范围有限做成一个可选的tickbox比较符合逻辑,这样也不会影响原有的功能.
https://github.com/jacklishufan/TsubakiTranslator/commit/30d10276c4dd9b1f24fca0d40f2ade729127f0b8
在阅读《IxSHE Tell》的的时候发现了一个bug实例。此游戏经过一次国外的英化,英化组用
标签表示文本换行。(2020版的hook会将\<br>不处理的展示出来)
作者所用的当前的最新版本的Textractor会将该\<br>标签自动处理成换行文本,采用的BeginOutputReadLine() 方法一次event只能读取导致一行控制台文本导致了这一bug。
该bug导致游戏中大段文本的丢失:每次HookDisplay()只能展示游戏中第一行的文本,而完整的hook文本分多次event放出,第一行\<b\r>后的文本被丢弃(注:"pretty grloomy girl"不会被翻译器展示)
以上就是一个bug实例,作者能给出一个比较好的解决方案吗?。