以下这个本论坛的下载贴中,由于有个字符串在中文系统中不能正常显示,导致游戏不能正常 运行。
6 \8 i+ t# M6 R/ o8 m& a' R修道院:导演剪辑版(The Abbey: Director's cut), l3 X5 O* E1 S- B- g1 ?% E) V
https://www.chinaavg.com/forum.php?mod=viewthread&tid=147967) w4 H v# p4 @4 w- ]) d
9 _! Y8 \' e# R2 P2 ?
具体信息可以参考Messages.log。修改正确后的字符串为Tomas。
7 a. a; G1 [6 V8 a- p1 m+ V0 [修改处
) Z5 t( H" X& I《1》以下文件的内容8 `3 J2 `" ~+ {
\The Abbey Directors Cut\English\Data\Game\Game.xmb
1 }; g* { `. A8 {6 a: M《2》所有游戏的文件和目录名,只要含有那个字符串的都要修改为Tomas+ m F# N! W' v' y# j2 }
比如\English\Data\Models\Tomas
) E" X6 V/ ^; P0 A' I% E# z3 h, l6 q3 c! y1 l$ T% J
用ida pro 进行简单分析后,确定游戏是directx9的游戏,
0 N1 R9 T9 J6 C; a- .text:004F8D3B push 20h ; SDKVersion; ?6 Z; c9 u( \5 }8 q
- .text:004F8D3D mov esi, ecx9 V* n% L6 b: H& a) o
- .text:004F8D3F call Direct3DCreate9
复制代码
; C! {8 B0 z+ \5 S" I3 z/ v0 c. P/ H% |+ Q% N9 U2 P
& ^% O/ R' G1 a/ R; S& e1 o: H
播放动画的时候,好像用了direct draw
: S- ? S p1 O: S- .text:004F4200 ; int __thiscall CVideo::Create(CVideo *__hidden this)
9 I( K- n0 |+ V. i7 W( o1 Q - .text:004F4200 public ?Create@CVideo@@QAEHXZ
! }8 \ ^. \: e1 H) B - .text:004F4200 ?Create@CVideo@@QAEHXZ proc near ; CODE XREF: CSystem::Create(HINSTANCE__ *,int,char *,char *,CWorld *,char const *)+380↑p
8 D. j0 D- V; u3 [1 v - .text:004F4200 ; DATA XREF: .rdata:off_5C6668↓o
- M( K5 D# z- } - .text:004F4200 push esi6 [" Y* j* Z, q- e3 P5 I
- .text:004F4201 push edi5 y7 ^0 c9 h6 a$ h9 v! H, l
- .text:004F4202 mov esi, ecx
3 J( ~. T' x0 c, `4 W# l - .text:004F4204 push 0 ; pUnkOuter* p' a- Y$ S% Q X" b
- .text:004F4206 lea edi, [esi+54h]
$ U; K' U* W$ q. W - .text:004F4209 push edi ; lplpDD9 o4 g1 ^( S, r
- .text:004F420A push 0 ; lpGUID
% |9 ?1 C2 e4 [$ G7 ?3 B$ K6 M - .text:004F420C mov byte ptr [esi+79h], 05 @2 j2 j8 q: n: e F2 R& R6 O( r
- .text:004F4210 call DirectDrawCreate
复制代码
, ]# z& Q2 y- }% m0 e
9 f8 f6 h. E5 x& D) J2 T9 O* E" J$ P, t+ f3 o3 A8 S k& n
本游戏可以窗口化,比较容易调试。4 U( z# G! y/ N" j
找一句画面有的字符串the son of ,找到显示函数。& }' K/ X; v* T7 a% v
以后我们用自己的函数替换它即可。
% k' G, s6 l7 P5 @# J! ?( f ~9 K4 h+ W* H
对话字幕断点处( j% T% c6 [3 F4 _' o: n/ R8 q
004B5AF3 |> /8A08 /mov cl, byte ptr [eax]
! y2 n# U+ i% l g" v9 l: m) z+ `; V& T; Z( N- ~- M
5 T: w" E, P, W0 C
char __thiscall CFadingText::Set
0 J5 D1 Z7 b# F" R& h8 h(CFadingText *this, char *a2, int a3, int a4, bool a5, bool a6), V- {+ }: u4 G% |! i
9 k, B4 _9 Q1 ~/ K查了以下调用它的地方,有10多个,看来这个游戏所有地方的字幕应该都是调用这个显示函数了,
B2 E" X% g' x, Z$ p
# e) a, _" V; N# c( n( Y以下是一部分
- P1 L, ?" G0 X: N- CGLCLayer::Render+97, L6 a% W: E) ]0 E D, C& }' `
- CGameInterface::ShowSentence+2C, 3 _1 Q K4 U$ N$ U' {/ N2 c
- CGameInterface::CloseDiary+1A,
+ r0 P6 m- s0 W: v x M" M. B% r) U# L - CGameInterface::SetDiaryText+6A,
8 i. b( i: b4 K. t4 J$ K$ r$ F4 \: p - CGameInterface::OpenMainMenu+17, & w# k1 j$ @4 B) K
- CGameInterface::AddMenu+67, + s* ]/ l) ?4 e
- CGameInterface::OnMenuPressed+0AB, M)
, ?& X- |7 [2 R9 |3 w3 i - TheAbbey.CFadingText::Set
复制代码
8 M# z1 N7 h6 L% T8 Q/ |! C, N: o
; J/ q$ }- j/ k# O! E: t
7 h$ e, o5 ?$ m5 \8 M) W
( n- [1 J; t9 I. _ |