以下这个本论坛的下载贴中,由于有个字符串在中文系统中不能正常显示,导致游戏不能正常 运行。
" S5 W: v& F7 M5 R; }8 D! L) Q修道院:导演剪辑版(The Abbey: Director's cut)# L5 [ P6 u/ g4 \" h4 S0 j
https://www.chinaavg.com/forum.php?mod=viewthread&tid=147967
. {4 g& V1 }' D% i) O, s
# Q/ V! S; Z6 u具体信息可以参考Messages.log。修改正确后的字符串为Tomas。, i ]1 k' V$ M7 a% K5 B. m F
修改处! N* o) n9 z1 v1 I- Y
《1》以下文件的内容9 A, z* |2 C7 @. U# b1 F$ w
\The Abbey Directors Cut\English\Data\Game\Game.xmb
* p% q" }3 [- C+ s+ K; n5 B《2》所有游戏的文件和目录名,只要含有那个字符串的都要修改为Tomas
! K! x4 c+ G6 E4 W# | 比如\English\Data\Models\Tomas
% e/ M$ h: W7 |" {3 a! \) z y `8 X6 Q. G( Q$ b y
用ida pro 进行简单分析后,确定游戏是directx9的游戏,
# c& S, ^( U9 o' {- .text:004F8D3B push 20h ; SDKVersion
' U% _$ i3 h# w" z4 h - .text:004F8D3D mov esi, ecx0 I$ b4 |1 U, q! _4 T; a% }' _0 [
- .text:004F8D3F call Direct3DCreate9
复制代码 5 j/ B: r: r/ }; J5 S3 R
6 k! f% v" ^$ D5 G) E0 w0 I4 _
1 N, ~* R, t6 m2 h. X$ h播放动画的时候,好像用了direct draw
# k1 V- i. R6 P* P$ b9 ?- .text:004F4200 ; int __thiscall CVideo::Create(CVideo *__hidden this)
3 D' K: A! ^# b D/ R: P7 }1 b - .text:004F4200 public ?Create@CVideo@@QAEHXZ3 Z( f5 L/ T8 X8 ~7 j3 d' `
- .text:004F4200 ?Create@CVideo@@QAEHXZ proc near ; CODE XREF: CSystem::Create(HINSTANCE__ *,int,char *,char *,CWorld *,char const *)+380↑p
, p/ i0 R' A$ B; u$ i, \- F - .text:004F4200 ; DATA XREF: .rdata:off_5C6668↓o, l! W3 l8 n; K0 Z7 u
- .text:004F4200 push esi% |3 v/ x% X; H0 N8 ~
- .text:004F4201 push edi
: K' J5 I, e7 ]: t' } e; J - .text:004F4202 mov esi, ecx( }" @( M7 d# a
- .text:004F4204 push 0 ; pUnkOuter; p' j- b# Z. C4 P1 T
- .text:004F4206 lea edi, [esi+54h]/ G3 k7 y+ h6 }, O3 j$ J& f
- .text:004F4209 push edi ; lplpDD
3 c: q( o) N8 i( o' X: l - .text:004F420A push 0 ; lpGUID: }0 t* h2 m' B, W: J
- .text:004F420C mov byte ptr [esi+79h], 06 m) X# L8 _5 \1 A! {; D- G
- .text:004F4210 call DirectDrawCreate
复制代码 f x* T% T( A, r" W
0 ]1 ]' d5 W/ A! p. k. ] `
8 k: E4 k7 f! T$ ?" B" A5 M) Y7 l本游戏可以窗口化,比较容易调试。2 P/ Y( m( \' M7 |4 W- I
找一句画面有的字符串the son of ,找到显示函数。
8 z1 ^; g- |# F( |3 N" @& {以后我们用自己的函数替换它即可。
' r+ t+ e6 Z9 w `; p9 y- y" Y0 Y0 j0 @- z% L) S
对话字幕断点处4 v( c2 d3 D4 w
004B5AF3 |> /8A08 /mov cl, byte ptr [eax]9 Z7 ?! ~, S2 k6 D: p
1 }" Q/ t; D: V; ^ `( B1 l3 x3 ?6 F7 {# c3 F, l' n- h' _
char __thiscall CFadingText::Set+ G! X/ K2 H9 }5 n7 I- O9 O/ y7 K
(CFadingText *this, char *a2, int a3, int a4, bool a5, bool a6)
+ i& R5 o$ d8 N6 ]& `+ C1 L9 U; G; H- W
查了以下调用它的地方,有10多个,看来这个游戏所有地方的字幕应该都是调用这个显示函数了,- w( z2 U' j5 U# l) Q
% _$ B$ N! ]' F& `. y0 m以下是一部分( W6 H# O0 h( c# k4 W
- CGLCLayer::Render+97,
9 L( i# O( A' N - CGameInterface::ShowSentence+2C,
. c1 Z# U4 O3 e4 j& L4 x, S4 h - CGameInterface::CloseDiary+1A, & _: p: @4 s, f. H0 ^- g+ y5 _9 s
- CGameInterface::SetDiaryText+6A,
1 W% K* J7 \2 w. j- x/ Q - CGameInterface::OpenMainMenu+17, 3 s. i" Z- i! `
- CGameInterface::AddMenu+67,
3 X; {+ m9 C3 M9 G - CGameInterface::OnMenuPressed+0AB, M)$ B) _1 `1 L* O
- TheAbbey.CFadingText::Set
复制代码 % W% @; j; S8 A* ]& G" w, t# i) S
6 R3 u5 n7 Z: X. m6 t
. I! \- r! G" z9 V5 Q1 t
7 A/ Z7 p4 f9 L6 ^4 V% \% C+ U; d+ D- R( b4 Q+ h5 a, ~" g& ^- Q
|