以下这个本论坛的下载贴中,由于有个字符串在中文系统中不能正常显示,导致游戏不能正常 运行。$ l9 N s, q W0 X
修道院:导演剪辑版(The Abbey: Director's cut)
5 {2 W4 j# F/ s! ^- J/ v% ~ ahttps://www.chinaavg.com/forum.php?mod=viewthread&tid=147967& _" f: f# p# |" Q! W [
3 s( d: c/ ]1 a) K7 N4 d) n7 X+ [: x' [
具体信息可以参考Messages.log。修改正确后的字符串为Tomas。
2 x( {- ^, K8 \# _9 z修改处 y* I7 v# @) F5 W; H
《1》以下文件的内容
U7 @7 r1 y: @" Y* X\The Abbey Directors Cut\English\Data\Game\Game.xmb' G/ X" C! K6 S) X
《2》所有游戏的文件和目录名,只要含有那个字符串的都要修改为Tomas# ]0 d1 I. D4 D% y- d
比如\English\Data\Models\Tomas% R6 N+ M) r: w( o
& ?1 a) V! k2 R- d2 k用ida pro 进行简单分析后,确定游戏是directx9的游戏,
- o5 N( k7 ]- z# X9 M. P- .text:004F8D3B push 20h ; SDKVersion
0 H, ~- w# M; ?/ J: X - .text:004F8D3D mov esi, ecx: r1 L0 x0 ]1 V* @4 L
- .text:004F8D3F call Direct3DCreate9
复制代码
. W: j$ D$ Z7 P! A6 \2 \7 |6 T
( }, |1 D! w- q3 r) i3 `
3 K9 G% L% H# O3 r! B# H0 u3 b9 M播放动画的时候,好像用了direct draw
9 E3 k+ u) L& h6 K- .text:004F4200 ; int __thiscall CVideo::Create(CVideo *__hidden this)4 M& h! R1 r4 I6 O
- .text:004F4200 public ?Create@CVideo@@QAEHXZ3 W8 \( ~5 M1 |1 m# g; N6 F
- .text:004F4200 ?Create@CVideo@@QAEHXZ proc near ; CODE XREF: CSystem::Create(HINSTANCE__ *,int,char *,char *,CWorld *,char const *)+380↑p6 k W9 n' ~! y+ V4 I9 e3 v7 `0 |
- .text:004F4200 ; DATA XREF: .rdata:off_5C6668↓o! p& w, g4 r7 W' ^9 p2 ]* J
- .text:004F4200 push esi
4 s9 X5 f6 z# D - .text:004F4201 push edi
: p+ g' H; p4 X - .text:004F4202 mov esi, ecx$ q; N1 a) g$ i* H& E
- .text:004F4204 push 0 ; pUnkOuter
: G% ~- D& {, I& Y - .text:004F4206 lea edi, [esi+54h]9 Y8 y8 P( M$ ?% O% L6 A, E2 J; T$ f
- .text:004F4209 push edi ; lplpDD
+ J- ^$ Z6 m7 L - .text:004F420A push 0 ; lpGUID
1 j6 g* ?6 r: O, H1 J8 G - .text:004F420C mov byte ptr [esi+79h], 0! R3 `( k8 Z! |8 L6 w
- .text:004F4210 call DirectDrawCreate
复制代码 ! I4 J" t* U. @7 u
! U, [! C9 X. m2 B5 s1 }3 ^: ^% P: _; w9 h _" u
本游戏可以窗口化,比较容易调试。
. p7 L& p" [9 [% w) `$ ]找一句画面有的字符串the son of ,找到显示函数。4 M8 X! y' P k
以后我们用自己的函数替换它即可。" t$ j2 C6 z! \$ q9 ]7 ~- ~5 N
9 Y# |/ H0 j! ?7 T, ]# D, [
对话字幕断点处0 S- u4 S7 A9 Q" k: D8 }
004B5AF3 |> /8A08 /mov cl, byte ptr [eax]
9 L$ X1 r6 R i! G: w2 U2 ?
1 k$ T3 n0 W8 }' o8 g9 o8 w8 V3 W9 Z M5 p" O, ]
char __thiscall CFadingText::Set1 _& V+ D+ C& y4 |; j1 M
(CFadingText *this, char *a2, int a3, int a4, bool a5, bool a6)/ S/ }! f# Q8 M. I6 v/ w2 {
; E7 r+ W! Y( U. Z+ n查了以下调用它的地方,有10多个,看来这个游戏所有地方的字幕应该都是调用这个显示函数了,
# P! h) Z9 O8 m7 D& G! _7 o/ A Z; B6 z# c0 z- e9 w1 w
以下是一部分! x; C6 k" r# {* q4 M
- CGLCLayer::Render+97, " q) |' a; _1 _1 f" [3 a
- CGameInterface::ShowSentence+2C,
2 S3 [: T8 n) y6 |% h - CGameInterface::CloseDiary+1A, # d8 H$ m$ T' X* S* h* P6 R. F
- CGameInterface::SetDiaryText+6A, 5 i! [- \7 r+ m
- CGameInterface::OpenMainMenu+17,
- Q8 `& w4 V. q& R8 | - CGameInterface::AddMenu+67, : i2 o. n' f( \+ x. b1 V
- CGameInterface::OnMenuPressed+0AB, M)1 b4 P! j+ M" A; s- Y
- TheAbbey.CFadingText::Set
复制代码 ) Z2 O( t2 @2 G$ Y- ^# h3 j) D
% S* k, D, ]8 n2 c6 L- Q
% d4 W4 L+ o& v, [' U3 H- @
" M& k8 H0 `, s/ w& W; q" e# ?& q6 O. J4 X
|