最近想对疯人院这个游戏进行一些汉化分析。希望能想办法解决这个大家盼望已久的游戏的汉化问猓由于本人对汇编的经验尚浅,不太可能在短时间内解决,不过会不断更新阶段性的成果? & c7 Y6 Q- m% n" B3 q; n7 a
/ Q M/ u3 x# {1 i* ]/ I下面说一下发现字符串显示函数的过程:
# A8 {1 ~6 Q- j, p% _首先在通用游戏窗口化工具中加入这个游戏的主文件,然后运行游戏,游戏正常运行。 . j2 n; g1 E% l% x0 T
退出游戏,用OD载入以后,游戏也可以正常运行。
+ H v! d0 N, M我找了一个比较简单的字符串,比如,New Game,用OD在内存中寻找,很容易就找到了。 * ]/ j0 F8 ], d0 Q% K" S# a
在这个字符串上下内存断点。然后把鼠标放到New Game按钮上,游戏被断下,仔细一看,New Game这个字符串就躺在寄存器ESI里,断下的地方就是字符串显示函数。
! l0 X) r1 e& h5 W+ @; S( v# ?, |2 H! [( w
字符串显示函数如下: ; y5 @ Y' X/ [/ x. _5 p
004357C0 /$ 56 push esi ; 字符串显示函数 * a' l: J) {6 V4 ^
004357C1 |. 8B7424 08 mov esi, dword ptr [esp+8] : M5 f2 X1 v& C% J+ |6 g! S, d
004357C5 |. 57 push edi & h5 v; r1 L- s9 \- r; [0 n
004357C6 |. 33FF xor edi, edi
3 {6 ]$ A8 z! T& f8 S$ f004357C8 |. 85F6 test esi, esi
" y4 f5 J0 e) a9 l) a004357CA |. 74 3E je short 0043580A
2 [, U8 z7 [. _$ w+ g) }1 p3 G004357CC |. 8A06 mov al, byte ptr [esi] ------〉在这一行被断下
" y8 O2 A& r/ `, L004357CE |. 84C0 test al, al
$ k" R& \" d: m8 p) m3 ?1 i004357D0 |. 74 38 je short 0043580A
( e& h' E2 P- n004357D2 |> 25 FF000000 /and eax, 0FF
9 C- D! w% \, H9 C' f) M2 Q1 C004357D7 |. 50 |push eax
9 O4 B$ J. u; ` K/ B004357D8 |. A1 88764500 |mov eax, dword ptr [457688]
8 |- P/ z* I7 ^004357DD |. 50 |push eax
2 N5 [. N" z9 c5 F+ } [) d3 y004357DE |. E8 3DD0FFFF |call 00432820 ; 3 Q" R+ U0 N# h( e& h" \( Q8 l
004357E3 |. 33C9 |xor ecx, ecx 9 a$ s9 Z9 D k) N. z0 K' y
004357E5 |. 33D2 |xor edx, edx
; u3 {, i7 _" Z2 Q004357E7 |. 66:8B48 08 |mov cx, word ptr [eax+8]
5 A' j& @3 z! c6 ~' `6 ~# {0 Y004357EB |. 66:8B50 0E |mov dx, word ptr [eax+E] 7 H/ V! [6 X* e* A7 s
004357EF |. A1 80914500 |mov eax, dword ptr [459180] / A/ n ]+ B' ]: A# d4 \; f+ u
004357F4 |. 03CA |add ecx, edx ; f: t3 Q. }) e* [5 y
004357F6 |. 25 FF000000 |and eax, 0FF 4 ^2 C% J9 l& n1 W: l
004357FB |. 83C4 08 |add esp, 8 & r4 z& t$ s3 w, h$ V- x1 `
004357FE |. 2BC8 |sub ecx, eax ' _" N }, z& R0 Q1 }2 E9 x8 D
00435800 |. 8A46 01 |mov al, byte ptr [esi+1]
( ?# c; c3 V% I1 r5 v) l+ x00435803 |. 03F9 |add edi, ecx # e* o: a! [( I0 n
00435805 |. 46 |inc esi 指向下一个字符
* i( x* v3 ~6 z! g! S00435806 |. 84C0 |test al, al
[" z# `7 L# E" D% l' M00435808 |.^ 75 C8 \jnz short 004357D2 循环
" T. J7 ^& j0 s F7 }0 y0043580A |> 8BC7 mov eax, edi
! {$ b2 m! D2 ^# I! p9 x& u" R' F2 @0043580C |. 5F pop edi
! V- F4 s, F/ S' V3 ~0043580D |. 5E pop esi
2 V6 P0 u& s3 b/ K3 S0043580E \. C3 retn 9 V9 u+ ^2 I$ v3 p
3 A3 z. R1 Q+ Y* |5 q0 N& d-------------------------------------------------------------------- + d% S2 b7 ]8 N. u+ ~
2009.1.11 第一次更新 , v0 O) I+ P1 h7 C+ l
这个游戏的文本在Data\RES.000文件里,老外早就开发好了文本编辑器。 {* D1 A+ m6 M! C+ O" E; y3 i4 T
最大的问题是字库问题,游戏中使用的是一种自定义的图片格式字库,还不是点阵的。 ' }, D! {+ }, j% k0 t+ p) c
要自己追加中文图片格式字库几乎不可能。
1 M+ l( x2 }3 x' s. S2 z2 V f7 L& g, t M所以要汉化这个游戏的唯一方法就是显示函数的移花接木法了。研究中。 |