以下这个本论坛的下载贴中,由于有个字符串在中文系统中不能正常显示,导致游戏不能正常 运行。
9 E5 c/ q+ ]8 j: { _+ G修道院:导演剪辑版(The Abbey: Director's cut)
8 c9 b# n, l5 F% l5 Nhttps://www.chinaavg.com/forum.php?mod=viewthread&tid=147967
. U8 Y/ ~" o# X s. z5 {- Y1 t" _$ u2 @* @( O
具体信息可以参考Messages.log。修改正确后的字符串为Tomas。
/ w5 C3 P) l: X: a. K1 Z% N& @; S修改处
: N- u9 ^( G, ?' ^% s6 b《1》以下文件的内容
7 I& H/ F' k1 c9 T- y\The Abbey Directors Cut\English\Data\Game\Game.xmb
. L2 ]) j8 d7 Q) i《2》所有游戏的文件和目录名,只要含有那个字符串的都要修改为Tomas) X$ f: Q3 e I Q' x* K7 \
比如\English\Data\Models\Tomas! A8 ~9 f1 O2 T1 B
0 R2 Y& V7 Y$ P( Z: W5 T
用ida pro 进行简单分析后,确定游戏是directx9的游戏,/ x1 X3 I: k# |
- .text:004F8D3B push 20h ; SDKVersion
" R/ Z6 M# o% d; p2 x! P7 W - .text:004F8D3D mov esi, ecx
( L5 q" J7 s$ n$ _ - .text:004F8D3F call Direct3DCreate9
复制代码
8 g' W! C" O& ]/ X( F
: q1 Z7 }% ]1 B1 G/ n; [5 A% c+ W7 e
播放动画的时候,好像用了direct draw
9 u) `: ?) g6 l8 Y' P9 k- .text:004F4200 ; int __thiscall CVideo::Create(CVideo *__hidden this)+ N( x# q( @) d. o S. P
- .text:004F4200 public ?Create@CVideo@@QAEHXZ
/ H' W( Q$ l- n/ }3 ~/ Z - .text:004F4200 ?Create@CVideo@@QAEHXZ proc near ; CODE XREF: CSystem::Create(HINSTANCE__ *,int,char *,char *,CWorld *,char const *)+380↑p
3 I9 b- h: E' L' P; a6 O - .text:004F4200 ; DATA XREF: .rdata:off_5C6668↓o
. R4 U/ _( z% w& q2 a8 b - .text:004F4200 push esi
& J( V# ^8 [2 E1 r - .text:004F4201 push edi
: _0 S3 y. a: p( T - .text:004F4202 mov esi, ecx0 [/ e V, `# y/ V1 D8 l% N
- .text:004F4204 push 0 ; pUnkOuter' b" j9 v4 l7 k( U6 R% w
- .text:004F4206 lea edi, [esi+54h]
+ Z+ p1 @$ X, a2 D% T; } - .text:004F4209 push edi ; lplpDD) U" r6 ]9 ?0 H1 @8 ^- A' G
- .text:004F420A push 0 ; lpGUID
5 u# Y. g* C; ?9 Z8 }7 U - .text:004F420C mov byte ptr [esi+79h], 0
3 A! U- ^: |1 k/ d& Z$ M+ T$ D- H - .text:004F4210 call DirectDrawCreate
复制代码 # l2 g3 K! { ~5 m: e
) }. I$ W$ v! J, ?+ K8 e( N b& F( w' v( s
本游戏可以窗口化,比较容易调试。
7 K8 `: W4 c: S- Q( y& d2 A$ S找一句画面有的字符串the son of ,找到显示函数。6 o& A, `: S, Z6 r
以后我们用自己的函数替换它即可。
2 o/ j( q, H p5 _9 h! B: ^5 K$ ~% z+ c! t7 C
对话字幕断点处7 U1 W4 e5 \' k5 e6 u, c% D
004B5AF3 |> /8A08 /mov cl, byte ptr [eax]
4 H+ B. E3 M9 Q i! ?8 |2 g
* Z6 O+ ` e' o& T t) D% Y
3 S. a6 U X! a! Schar __thiscall CFadingText::Set9 x6 h1 F; I" ?
(CFadingText *this, char *a2, int a3, int a4, bool a5, bool a6)
5 z2 _( n+ r6 p. d$ N4 G+ l, c) D) h: T! R& ^7 R
查了以下调用它的地方,有10多个,看来这个游戏所有地方的字幕应该都是调用这个显示函数了,, L/ O' }% {4 g, H9 j. Q* _" A% t, V
( S- n9 D2 n: V( U0 g3 _
以下是一部分
1 e% F8 X# w- ^+ Z- S3 R4 i- CGLCLayer::Render+97,
! a& h' d7 \; n1 } X# x - CGameInterface::ShowSentence+2C,
) {, H! X) J, J. T* z - CGameInterface::CloseDiary+1A,
# l% O3 d0 R; G - CGameInterface::SetDiaryText+6A, : ?' h) L0 o7 ? U; a
- CGameInterface::OpenMainMenu+17,
4 C) d! I, \& Z# L" W - CGameInterface::AddMenu+67, 9 c, X. G6 [- j5 } \
- CGameInterface::OnMenuPressed+0AB, M)
; U: L8 j7 h' o/ m" L - TheAbbey.CFadingText::Set
复制代码 ( e' \2 k M1 P# _, r
1 Y8 C& ~% Z' O' T4 J. @
4 C' w( V6 ]& |6 c" L
/ x, [0 E6 K8 }; h) B3 v8 y1 ^& n
1 s; `- P, R, X8 g* n |