以下这个本论坛的下载贴中,由于有个字符串在中文系统中不能正常显示,导致游戏不能正常 运行。
' W1 r0 u* G% t0 X: z5 M" }- ?修道院:导演剪辑版(The Abbey: Director's cut)
7 E! E# i& F' U- ?3 B5 z! Whttps://www.chinaavg.com/forum.php?mod=viewthread&tid=147967
) K0 e! W4 @$ u! f; X+ }' E- _6 o' |+ @
具体信息可以参考Messages.log。修改正确后的字符串为Tomas。- `) [; V a9 _. f
修改处
- v( b k$ g0 w/ T《1》以下文件的内容2 B6 {5 @0 V) k- S7 |. w
\The Abbey Directors Cut\English\Data\Game\Game.xmb
Q# ^7 c9 U) I, T《2》所有游戏的文件和目录名,只要含有那个字符串的都要修改为Tomas% i- V j/ N# E+ r8 d- ?0 @
比如\English\Data\Models\Tomas3 n$ A5 V5 G) @; T+ r
0 k+ {2 @3 a) [' L! l9 T9 v% y f
用ida pro 进行简单分析后,确定游戏是directx9的游戏,
! _0 }/ e& L+ Q% _7 o- .text:004F8D3B push 20h ; SDKVersion! }" t& O' c) q1 |1 p3 j; A
- .text:004F8D3D mov esi, ecx
) B) L" |0 [2 H6 W, h* ~5 c2 f - .text:004F8D3F call Direct3DCreate9
复制代码
Q' i- E( Y$ ?/ D% R5 m9 {4 W }" K6 z* ]4 Y& {, a! A
/ q$ y& X( {) W. }* E% ^3 S# d5 x播放动画的时候,好像用了direct draw
0 [% r' Q4 `$ P$ r- .text:004F4200 ; int __thiscall CVideo::Create(CVideo *__hidden this)" B5 r! M+ u( j, r
- .text:004F4200 public ?Create@CVideo@@QAEHXZ
4 t# [0 B: J5 C- A4 l - .text:004F4200 ?Create@CVideo@@QAEHXZ proc near ; CODE XREF: CSystem::Create(HINSTANCE__ *,int,char *,char *,CWorld *,char const *)+380↑p
2 U. `5 e8 u1 I7 _0 H0 k( P( d; M - .text:004F4200 ; DATA XREF: .rdata:off_5C6668↓o
, b+ A4 P, y4 z% R/ j - .text:004F4200 push esi
" T; o) _$ ]+ ]3 p7 X# R' P - .text:004F4201 push edi% N& p0 L" u' }( \
- .text:004F4202 mov esi, ecx2 G- H+ ^7 Q" u6 e8 L* x, L. x2 D
- .text:004F4204 push 0 ; pUnkOuter2 H2 g: L# @/ I9 }
- .text:004F4206 lea edi, [esi+54h]/ h* a/ x( f* \; g
- .text:004F4209 push edi ; lplpDD! g+ u* O( _9 _! c
- .text:004F420A push 0 ; lpGUID% f, t4 B) [- n2 @) O, W& X
- .text:004F420C mov byte ptr [esi+79h], 0) c2 T7 e, W7 Z4 [% ~
- .text:004F4210 call DirectDrawCreate
复制代码 $ J' K$ U; S' l3 @) U: W" U) X
{ y" ~; @5 Q g8 H8 v( ^/ x
0 \! t$ F2 z7 Z本游戏可以窗口化,比较容易调试。 N7 `3 V; E# w. O/ [: v' O
找一句画面有的字符串the son of ,找到显示函数。
& D: ?/ X3 \1 i/ R L5 P+ I, q以后我们用自己的函数替换它即可。: x6 j* |, B3 M" k
7 `3 Q# x R* G8 m5 a# Q3 t对话字幕断点处0 t# c0 j& G0 z9 \! m
004B5AF3 |> /8A08 /mov cl, byte ptr [eax] u6 D! \4 h6 M9 W8 k3 z: O. c9 M
8 ?9 l& W+ q: \& r& T/ ^# ?
) { t! Q z$ g4 T
char __thiscall CFadingText::Set
6 R* W/ n6 n: b. B, u(CFadingText *this, char *a2, int a3, int a4, bool a5, bool a6)2 {. t; Y7 v; C! _. i" Y# e
: f8 L$ d( O! M! p1 F! {查了以下调用它的地方,有10多个,看来这个游戏所有地方的字幕应该都是调用这个显示函数了,9 {* \+ L, v+ ]) R6 z" S
: I; k2 [( x1 \0 z以下是一部分
. x6 a2 z9 N9 C; T- CGLCLayer::Render+97, D% x/ t- {* q( [! {$ l+ V4 F
- CGameInterface::ShowSentence+2C, 8 O& w) S/ n) j4 u1 ~
- CGameInterface::CloseDiary+1A,
- O8 Q2 `% z, C& \* E - CGameInterface::SetDiaryText+6A, : z! a2 {+ U* y
- CGameInterface::OpenMainMenu+17,
! i+ [5 w- q& x% T" s# c% ~2 u - CGameInterface::AddMenu+67,
( C" D9 M3 K7 n9 b - CGameInterface::OnMenuPressed+0AB, M)
, ^3 R7 D2 m1 ^2 N - TheAbbey.CFadingText::Set
复制代码
" q; ~4 A1 ~, {) c* W# c8 h( ?9 [7 e" S
& u3 R) m' w, `# ?7 p
. E3 a+ c2 C5 x! I2 p* d& |+ y0 O5 j
! v2 `$ y, U3 O. n6 y. E8 E b3 ]
|