以下这个本论坛的下载贴中,由于有个字符串在中文系统中不能正常显示,导致游戏不能正常 运行。# A) M( } y. @; G m. N' ?9 W
修道院:导演剪辑版(The Abbey: Director's cut); w' |, Z& U- X) H1 K
https://www.chinaavg.com/forum.php?mod=viewthread&tid=147967$ `: F, C- C( E5 N
5 _/ V3 g# r4 Y. n0 l& q9 J具体信息可以参考Messages.log。修改正确后的字符串为Tomas。% q4 f0 w1 u9 l5 t
修改处2 _. |! |3 r! z0 M$ L$ f6 W
《1》以下文件的内容' _0 q1 y( K; Y# f
\The Abbey Directors Cut\English\Data\Game\Game.xmb" `1 [9 R; y# r( _" }
《2》所有游戏的文件和目录名,只要含有那个字符串的都要修改为Tomas
. d! G8 m4 p/ E 比如\English\Data\Models\Tomas: G5 j3 B2 Z" B0 m E% J
& H1 B) W$ @/ N! t, g
用ida pro 进行简单分析后,确定游戏是directx9的游戏,6 Y* Z5 N8 p! [; H i8 ?
- .text:004F8D3B push 20h ; SDKVersion/ ^5 {2 k( R3 A Z9 O2 X7 [
- .text:004F8D3D mov esi, ecx
$ Y/ ^9 H% \; D% m$ ^* J. \0 A1 J - .text:004F8D3F call Direct3DCreate9
复制代码
$ `6 u* S& O5 L- q" A. |8 ~0 |) C$ Q. c! F0 L) c
$ N. o4 t0 ~# y! i( V
播放动画的时候,好像用了direct draw, L/ i/ y; \7 z; z
- .text:004F4200 ; int __thiscall CVideo::Create(CVideo *__hidden this)$ n* V; i2 n. y* q2 H
- .text:004F4200 public ?Create@CVideo@@QAEHXZ8 j I7 ]( N8 N: t, \8 ^9 y
- .text:004F4200 ?Create@CVideo@@QAEHXZ proc near ; CODE XREF: CSystem::Create(HINSTANCE__ *,int,char *,char *,CWorld *,char const *)+380↑p
9 ]' W# D% R4 ?' } - .text:004F4200 ; DATA XREF: .rdata:off_5C6668↓o- i: u; F$ y1 { b' X
- .text:004F4200 push esi
8 p# D' `% O. ^ - .text:004F4201 push edi! ^$ i1 G& P6 @) U- G4 Z7 @
- .text:004F4202 mov esi, ecx$ u& A/ u( s6 |
- .text:004F4204 push 0 ; pUnkOuter3 y2 [& R2 z! [/ D2 x
- .text:004F4206 lea edi, [esi+54h]- }/ [5 r2 ?3 D2 p+ w0 R" K
- .text:004F4209 push edi ; lplpDD* d. V9 i4 }9 N
- .text:004F420A push 0 ; lpGUID
% x+ N1 }0 T5 o1 s# N: n6 y - .text:004F420C mov byte ptr [esi+79h], 0
" i- q3 W, Z+ e# Y% b. y - .text:004F4210 call DirectDrawCreate
复制代码 * J4 u+ N* n7 Z; b0 Q
- o7 X f; I3 w0 J3 B2 [* d: T' L( d" l9 w& D( D
本游戏可以窗口化,比较容易调试。
$ v' P1 m% U6 N: E0 m找一句画面有的字符串the son of ,找到显示函数。
9 ?- K& g* @+ h6 R; g2 }以后我们用自己的函数替换它即可。$ D2 H) e0 o, s; o2 U0 Q9 r
! f$ C- q9 o0 f0 N
对话字幕断点处
: [7 m/ Z8 w c7 D, T- F004B5AF3 |> /8A08 /mov cl, byte ptr [eax]2 |2 o$ E0 ~7 Y* t, n+ p
8 k0 _+ i. c; N5 d4 g1 n; l7 h
3 l' c' l' x- s8 C# k9 A% rchar __thiscall CFadingText::Set
& H; v' D# c9 D: h4 O(CFadingText *this, char *a2, int a3, int a4, bool a5, bool a6)
, y+ [- P" q% ]# t& p. R- _- D9 a3 _" p1 l- v
查了以下调用它的地方,有10多个,看来这个游戏所有地方的字幕应该都是调用这个显示函数了,) z0 \2 K" z4 i/ n3 {4 N
% X" e, u x$ P7 @6 K
以下是一部分
- G5 p$ W9 K. N/ P, y; x- CGLCLayer::Render+97, 6 M3 O2 Y; u! {$ C6 Y, c
- CGameInterface::ShowSentence+2C, , R) p H* m* r$ {6 ?9 @; i) K9 B
- CGameInterface::CloseDiary+1A, 1 f3 u9 q5 X+ `! f5 F j4 y3 t: G7 o
- CGameInterface::SetDiaryText+6A,
{* r2 g o4 U# f' A - CGameInterface::OpenMainMenu+17,
2 F8 h0 |: F/ L8 C0 } - CGameInterface::AddMenu+67, / p7 q8 X2 H2 p* Z
- CGameInterface::OnMenuPressed+0AB, M)& l. C) U. V* Y8 T5 L6 ^1 X
- TheAbbey.CFadingText::Set
复制代码 % M6 v9 p! K& A1 e3 C5 R
& N* _. a" j, M( O% U
j$ E1 P( F- o. k: f4 p
9 d1 U9 X: S0 [; l% ~2 s7 f: a. [
" e1 s3 k3 d4 K3 u7 E6 [9 w |