以下这个本论坛的下载贴中,由于有个字符串在中文系统中不能正常显示,导致游戏不能正常 运行。
" k! _: L! B6 t5 C ^修道院:导演剪辑版(The Abbey: Director's cut)
+ t* X& U" w* Q. K2 y; Hhttps://www.chinaavg.com/forum.php?mod=viewthread&tid=1479679 Z' t! z D9 {" y" x+ s
6 I! R' S% y7 }2 X# L- o7 _4 P6 @
具体信息可以参考Messages.log。修改正确后的字符串为Tomas。$ d( p T: A6 n/ I( k. z
修改处- x& l/ R B' n3 n( b
《1》以下文件的内容+ H+ a2 P* |1 B5 n( ^( U0 @9 x
\The Abbey Directors Cut\English\Data\Game\Game.xmb( j! E; ^# |7 U$ f$ [0 d5 F
《2》所有游戏的文件和目录名,只要含有那个字符串的都要修改为Tomas
% G w, Q3 g/ s0 T 比如\English\Data\Models\Tomas/ ^$ k9 O0 p3 p
- D* ~8 _" ?2 ]7 l用ida pro 进行简单分析后,确定游戏是directx9的游戏,
( d4 Y `3 u* D3 X% b# u- .text:004F8D3B push 20h ; SDKVersion+ ]/ M8 \$ r- }9 K
- .text:004F8D3D mov esi, ecx
9 |# `1 y. u) S, h9 Z8 V - .text:004F8D3F call Direct3DCreate9
复制代码 * u1 {# m" g6 Y2 U
0 l n+ X( b1 R2 F
$ Z. |' ]+ O! N- a! P播放动画的时候,好像用了direct draw: m/ L$ W! }1 s9 U2 t4 Y& `2 [
- .text:004F4200 ; int __thiscall CVideo::Create(CVideo *__hidden this)6 h' l" q7 Q! U& F
- .text:004F4200 public ?Create@CVideo@@QAEHXZ
[+ S7 }- Z3 q3 g& r9 A - .text:004F4200 ?Create@CVideo@@QAEHXZ proc near ; CODE XREF: CSystem::Create(HINSTANCE__ *,int,char *,char *,CWorld *,char const *)+380↑p
* f7 l! N- x& G - .text:004F4200 ; DATA XREF: .rdata:off_5C6668↓o
( I9 ?' z1 c8 Z2 P% s# C - .text:004F4200 push esi9 q! c9 t. h" ?1 ]" W6 `% G4 r
- .text:004F4201 push edi: F4 k: R; P0 i; H! b( D. [- q
- .text:004F4202 mov esi, ecx; ?' ]) T; N: A @! W, p" Y7 @
- .text:004F4204 push 0 ; pUnkOuter: u' e# F: i" ~8 w( c# ]! V
- .text:004F4206 lea edi, [esi+54h]& b9 F. m: X$ Z6 t
- .text:004F4209 push edi ; lplpDD7 i2 r% h9 o' d# s0 D
- .text:004F420A push 0 ; lpGUID- I5 g3 Z8 l* N( E$ K
- .text:004F420C mov byte ptr [esi+79h], 0: _* _% G9 E! J0 h. O% U
- .text:004F4210 call DirectDrawCreate
复制代码 - i# p" J! {) B. f1 A# D! d, C& A
' U" f5 q4 n; T1 B/ w
. K) ~4 q& P! m: \, _# W$ T
本游戏可以窗口化,比较容易调试。2 C& _; Q% f5 P' ?
找一句画面有的字符串the son of ,找到显示函数。- }0 I) N& B' w; C* i6 ~1 r6 i
以后我们用自己的函数替换它即可。
* J; v, E% T8 D# H. J/ n$ b* u
' T* h P6 R" g% N6 g- ?! t对话字幕断点处
) C* F8 p" P8 o. P! |+ g2 O7 _004B5AF3 |> /8A08 /mov cl, byte ptr [eax]
, F% v$ a1 X4 {% {$ Z, C2 {# y+ D8 W/ Q3 b5 r
7 R( S ^& J X1 u' Cchar __thiscall CFadingText::Set
) Q( g3 a% i# E(CFadingText *this, char *a2, int a3, int a4, bool a5, bool a6)" m5 y0 [- e7 D% J) H! i
! W4 A" g1 A; d/ V( I
查了以下调用它的地方,有10多个,看来这个游戏所有地方的字幕应该都是调用这个显示函数了,) E# Y L' v5 z
! M0 m! r* o1 _+ ]( w. s* |以下是一部分
+ v* n j1 k( g q( i% z! C- CGLCLayer::Render+97,
- ^; m2 D/ q3 ^6 W: z" y' m) j6 b6 ` - CGameInterface::ShowSentence+2C,
5 W J" V: z* s. |7 a1 Y+ j% P: f - CGameInterface::CloseDiary+1A, * x4 V* J' L& @
- CGameInterface::SetDiaryText+6A,
% X# B1 {; b9 z - CGameInterface::OpenMainMenu+17, 3 O: N. b5 a9 ^) k
- CGameInterface::AddMenu+67,
2 c: j( c. u. \# i - CGameInterface::OnMenuPressed+0AB, M)/ h2 ~4 t8 J4 M8 A
- TheAbbey.CFadingText::Set
复制代码
3 c' y: X7 A' a; w
; ?, O1 p" H: @; a
, ^6 m; V0 h" u3 Q* N4 l' }/ I, L- _
0 v4 h' [6 D/ V6 V8 x: J9 r7 \0 O
' k" f& D# W3 E* G r: {4 S$ v |