最近我又想出来一种新的汉化方法,按照惯例,在动手实现之前,先把思路写出来。然后再逐步实现。
$ B- ?2 H5 X) Z5 R+ @4 Y2 F& k3 y9 o0 G% q" O! C; P6 f" h8 L
基本思路 0 w7 _6 b9 d }: b8 k
* S$ s% W, R+ Z( C8 a
我们知道,现在大多数AVG都是全程语音的,也就是说,有一部分字幕每个都各自对应了一个语音文件。 " M: `, Q6 c( R$ K
这个语音文件可以是一个单独的文件,也可以是一个包含在包文件里面的子文件。语音文件和字幕文件不同,一般不是在游戏的一开始载入内存,而是在游戏播放语音文件文件时才打开这个文件。
& W7 N* o! m' J+ U6 `
" V0 {1 G3 }4 g" c: C所以,如果我们可以监视到游戏打开一个语音文件或者是打开一个含有语音文件的包文件并且在语音文件所在的偏移处进行读取操作的话,就说明游戏马上就要播放这个语音文件。同时也就是说明游戏马上就要显示和这个语音文件相对应的字幕了。这就是一个切入口。
9 j; n: K5 h2 G! O, I
# P5 [ @+ \1 o: A1.监视文件操作
# N( i* d1 z, V, ?( F$ B2 c3 l# T下面来说说如何监视文件操作,其实还是用老方法,那就是HOOK。具体怎么个HOOK法呢?我最近找到了一份著名文件监视工具Filemon的源代码,只要我们把这份源代码研究清楚了,可以说,Filemon能监视到的文件操作我们也能监视到。
) X# K7 G; V4 _$ S8 I! ~. f" M! E1 D- ]3 J3 g1 K
2.利用共享内存文件实现进程间通讯 ' `7 N) k& K$ Z( g: l) u
在监视到文件操作以后再怎么办呢?自然是要报告给我们的一个程序,然后让这个程序在屏幕上输出 # I! p7 h) I; [. `
我们翻译以后的中文字幕。那么通过什么机制向我们的程序报告呢?我想,利用共享内存文件是一个
" Q/ T: p5 \; u) F" P/ C好方法。HOOK工具监视到语音文件的操作以后,就向共享内存文件里写入一些标志和有关的信息。共享内存文件主要的功能就是用来实现进程间通讯的嘛。 3 o9 S/ G* ~) d u& T
! s, d9 K4 J% w& A% A+ Q1 g3.利用代理DLL或是OverLay技术实现输出中文字幕 ' v* g5 }9 E3 a" V, E) j1 Z ^
上面说的HOOK工具是信息的发送方,那么信息的接受方是说谁呢?接受方应该是向屏幕输出中文字幕的程序。我考虑可以用代理DLL或是OverLay技术来实现。
1 s6 O* z+ b/ }# T* T. x+ R对于DirectX8,9的游戏,我们可以用代理DLL,由于游戏在不断地刷新游戏画面的时候都会调用present函数, 在present中我们可以插入一段代码来监视共享内存文件,如果发现共享内存文件存在有关语音文件的信息的时候,就向屏幕输出相应的中文字幕。注意在输出中文字幕以后要把共享内存文件里面的有关语音文件信息删除掉。中文字幕输出的时间长度可以实现设定好或者是根据字幕的长度计算后得出。 ' D: p0 `% J+ Q0 ?" T; w# j
$ o# H9 @6 y0 f未完待续。。。 |