以下这个本论坛的下载贴中,由于有个字符串在中文系统中不能正常显示,导致游戏不能正常 运行。
E n1 _0 K4 u0 A% k修道院:导演剪辑版(The Abbey: Director's cut)
. c7 n0 V9 ]2 I8 B- Whttps://www.chinaavg.com/forum.php?mod=viewthread&tid=147967
W. [ R( F3 L) C& U' ~/ @0 _0 y: O- r. m% o7 w
具体信息可以参考Messages.log。修改正确后的字符串为Tomas。0 l0 j+ u4 |+ b2 A, ]" T* Q6 @
修改处
( u) h6 {' |8 C9 K6 _《1》以下文件的内容* _& g. [# |- \, W1 x/ F
\The Abbey Directors Cut\English\Data\Game\Game.xmb I, X" D- o0 U7 K
《2》所有游戏的文件和目录名,只要含有那个字符串的都要修改为Tomas
& W/ ]) V! G" [: J3 i1 h 比如\English\Data\Models\Tomas
: x; W' q9 s' Q+ l& _* F* @
! O$ ?7 a4 I, b2 r) Z; z1 e$ d- q. \用ida pro 进行简单分析后,确定游戏是directx9的游戏,
; J1 c% [! x" Y; M" O- .text:004F8D3B push 20h ; SDKVersion; U: i/ B2 E+ x
- .text:004F8D3D mov esi, ecx
1 ~* P3 y2 d: e1 ~! ? - .text:004F8D3F call Direct3DCreate9
复制代码
/ ~2 T2 {; M2 G
6 h! {( r% e& s7 s
9 N& v( [1 Y4 [7 _, _* G5 n& K播放动画的时候,好像用了direct draw
6 V2 |0 J' h" L& o$ e0 f7 a- .text:004F4200 ; int __thiscall CVideo::Create(CVideo *__hidden this)
, I+ V3 K+ R: V - .text:004F4200 public ?Create@CVideo@@QAEHXZ @# _+ Z5 S; {* @1 c- c: E
- .text:004F4200 ?Create@CVideo@@QAEHXZ proc near ; CODE XREF: CSystem::Create(HINSTANCE__ *,int,char *,char *,CWorld *,char const *)+380↑p
- D/ z5 k! K; {5 n; D2 y - .text:004F4200 ; DATA XREF: .rdata:off_5C6668↓o9 y% e/ t2 B/ u3 T' G9 w
- .text:004F4200 push esi
1 J/ B) {; Z. U- f% v# X% H4 x @ - .text:004F4201 push edi
4 ?8 Z! z0 |+ j8 H- i6 R - .text:004F4202 mov esi, ecx+ r9 {# c7 u. s. \& H# J1 U5 U
- .text:004F4204 push 0 ; pUnkOuter
8 `5 A" {* L+ P1 a - .text:004F4206 lea edi, [esi+54h]
+ a5 n0 Z* ]4 g7 U7 J' C - .text:004F4209 push edi ; lplpDD$ u& Q5 `0 ?9 R
- .text:004F420A push 0 ; lpGUID
, ]3 U1 L, u2 V) T+ X3 b! A3 G) H u$ r - .text:004F420C mov byte ptr [esi+79h], 08 i% F4 k5 A+ d; ]5 b; i1 j
- .text:004F4210 call DirectDrawCreate
复制代码
2 h# Q! b2 K4 ]: j
9 w5 |0 S$ b8 E1 W+ I9 n3 j7 @0 Q) f8 ?1 X0 Z. m
本游戏可以窗口化,比较容易调试。
/ e5 g; @. p: M找一句画面有的字符串the son of ,找到显示函数。$ ~: W* h' v) Z2 Z" ^
以后我们用自己的函数替换它即可。
0 k, s/ X ?( ~5 g
/ _8 W; i; I# `4 P8 W8 e对话字幕断点处) H I0 q; Q* \
004B5AF3 |> /8A08 /mov cl, byte ptr [eax]- f* ?! c" \0 s* V3 ^: \5 F
% b" X; y6 b( l: h3 \1 r! f" m5 n6 b, v7 X, T# _
char __thiscall CFadingText::Set( R& E. u) y$ C/ Z, i
(CFadingText *this, char *a2, int a3, int a4, bool a5, bool a6)
4 V8 a1 {3 j& [- G: j$ ?
5 ~+ B& A: v" M! C查了以下调用它的地方,有10多个,看来这个游戏所有地方的字幕应该都是调用这个显示函数了,
" n/ y) S+ C @$ b% K4 ~
5 `. h0 x8 b2 J( `4 M以下是一部分
- E$ L5 E5 y$ t' E+ z7 y7 s- CGLCLayer::Render+97,
- [# _" j0 ^. k, |$ l: c' r9 L - CGameInterface::ShowSentence+2C, 5 `5 H2 U W9 h0 f* j* ^- M
- CGameInterface::CloseDiary+1A,
2 N$ ~; @3 W. ]$ e - CGameInterface::SetDiaryText+6A, ( Z$ y- b! J4 Y
- CGameInterface::OpenMainMenu+17,
: j L" c r1 k - CGameInterface::AddMenu+67,
9 s' @1 o/ j! ?' c, _; y2 g - CGameInterface::OnMenuPressed+0AB, M)
) L- S* Q. _5 p1 k2 w - TheAbbey.CFadingText::Set
复制代码 5 @) h* x% r$ {1 |+ I
& j, E3 B4 I$ @- _
6 S4 r2 v& B( c5 ?0 |# n, ^2 M5 F5 d; z; @: l
1 K" d0 C8 x+ u3 Q$ L+ u |