以下这个本论坛的下载贴中,由于有个字符串在中文系统中不能正常显示,导致游戏不能正常 运行。" D7 a" q& V$ }0 n3 j6 g( x
修道院:导演剪辑版(The Abbey: Director's cut) X5 }5 I% ]$ [- }* A& b
https://www.chinaavg.com/forum.php?mod=viewthread&tid=147967# ?! u" V9 k7 ` |1 `
' h( v( K- }1 j' t E* l/ e8 J具体信息可以参考Messages.log。修改正确后的字符串为Tomas。
0 v& S+ E. z& B( S. v& {修改处6 Q/ P6 U+ O: f# k0 t6 l
《1》以下文件的内容
6 b F/ s$ a; N2 I/ U7 x\The Abbey Directors Cut\English\Data\Game\Game.xmb2 |3 ?& F0 s9 X' e3 p5 Q: C
《2》所有游戏的文件和目录名,只要含有那个字符串的都要修改为Tomas
. Z/ V. E$ p' u# f% Z! N 比如\English\Data\Models\Tomas; D% Y' S( \) C; _& ~
! m; n' } X q: s& K
用ida pro 进行简单分析后,确定游戏是directx9的游戏,
/ w9 _- n7 b- f" d/ u5 o- .text:004F8D3B push 20h ; SDKVersion
! f0 S. u! U8 T' u, @ - .text:004F8D3D mov esi, ecx
; u3 |: i4 A1 w$ a7 C( @ - .text:004F8D3F call Direct3DCreate9
复制代码
/ P8 M% \7 N. U0 d8 u, J8 n- o# c3 F# |7 E6 n
' ^7 G5 G2 J- s5 }
播放动画的时候,好像用了direct draw
, L7 q( F5 z; Y: s' V8 |, P- .text:004F4200 ; int __thiscall CVideo::Create(CVideo *__hidden this)
$ _! t- e% K7 c1 i$ l - .text:004F4200 public ?Create@CVideo@@QAEHXZ
$ ~, U- j- M8 \) g2 X. s - .text:004F4200 ?Create@CVideo@@QAEHXZ proc near ; CODE XREF: CSystem::Create(HINSTANCE__ *,int,char *,char *,CWorld *,char const *)+380↑p8 q+ ?7 q# O! U% P
- .text:004F4200 ; DATA XREF: .rdata:off_5C6668↓o
1 r1 ^/ V: u) t' P1 \" V - .text:004F4200 push esi
/ {: t1 i/ V$ h - .text:004F4201 push edi) ~$ Y! f' |8 F1 s7 B T3 ^6 b
- .text:004F4202 mov esi, ecx$ _; x5 @ a ?- S; B% [# }
- .text:004F4204 push 0 ; pUnkOuter
) N. h% a, R3 S7 ~, L - .text:004F4206 lea edi, [esi+54h]) ^! _; L4 [" U+ P5 z
- .text:004F4209 push edi ; lplpDD
& Z: w* }6 N k9 @9 p - .text:004F420A push 0 ; lpGUID1 J! b1 ?5 V" C D
- .text:004F420C mov byte ptr [esi+79h], 06 p) n$ ?& n1 q" Q
- .text:004F4210 call DirectDrawCreate
复制代码 m2 c, S7 c6 j% \" w" [" i$ R
8 ^" s$ E! D8 [7 `6 w5 G% D @2 q5 l7 J' A; L4 u2 e0 o
本游戏可以窗口化,比较容易调试。
T( _: ]" f6 X& i% n" W找一句画面有的字符串the son of ,找到显示函数。4 w, g% t/ d7 r9 l
以后我们用自己的函数替换它即可。" P' C3 J+ v0 T- }
; V' V8 F2 p. A" f6 x. N' l" n
对话字幕断点处4 h/ O5 e1 x0 R( E" h+ U
004B5AF3 |> /8A08 /mov cl, byte ptr [eax]9 f) t$ L* Q2 a% ?
/ q% Y7 u6 f3 T6 R" v- p4 B; m0 t! U! J3 D& r) c$ h, L% G
char __thiscall CFadingText::Set& M: `6 ~7 H# V* i8 v1 h# J3 L
(CFadingText *this, char *a2, int a3, int a4, bool a5, bool a6), n. |0 d/ H2 t
; u) g& o1 x- K1 r查了以下调用它的地方,有10多个,看来这个游戏所有地方的字幕应该都是调用这个显示函数了,
( L l) d0 ]8 S2 E, T
" K0 O/ X6 i0 L F. j; @0 Y以下是一部分
- S6 i( B4 c) `+ G ~" C- CGLCLayer::Render+97, 2 C, Z: T! O& a* [7 U! N" ^
- CGameInterface::ShowSentence+2C,
. a m }: y# i - CGameInterface::CloseDiary+1A, ( Y' t0 m! p* Z, Z& ]
- CGameInterface::SetDiaryText+6A, - f. I! [( v8 I! \$ t" Y
- CGameInterface::OpenMainMenu+17,
8 |& `1 f! r5 W0 n - CGameInterface::AddMenu+67, % B7 Y# e9 T7 ^/ ^& O3 f0 U
- CGameInterface::OnMenuPressed+0AB, M)* Q4 r/ k4 A% U; C
- TheAbbey.CFadingText::Set
复制代码 1 ?1 X$ _0 k8 k, [2 S
* P/ N& |, A, h% u
3 @# V1 L n) d( _, v' [+ v9 x6 w
! d2 u' g9 z/ h
- J4 Q( t7 s) U' z# t |