以下这个本论坛的下载贴中,由于有个字符串在中文系统中不能正常显示,导致游戏不能正常 运行。6 H$ _. s+ N) A9 s
修道院:导演剪辑版(The Abbey: Director's cut)
4 x9 X' g9 |6 P1 j% N Ihttps://www.chinaavg.com/forum.php?mod=viewthread&tid=147967
' w3 E) T/ n6 p+ T+ i7 d5 ?* t8 p: b- Z
具体信息可以参考Messages.log。修改正确后的字符串为Tomas。
7 ?8 @6 T( J' `2 k' ?/ b; L修改处* x, C; x4 p% l( }0 u/ |4 z/ s
《1》以下文件的内容
. v; W! i. ]7 G# }\The Abbey Directors Cut\English\Data\Game\Game.xmb
, j$ ~7 Q7 o1 F' x《2》所有游戏的文件和目录名,只要含有那个字符串的都要修改为Tomas" `/ X1 E4 I& l+ | i; g
比如\English\Data\Models\Tomas
+ Z5 z# ~% d/ {3 j6 \: @! U6 ~( {( ?. _( v) A/ q, v
用ida pro 进行简单分析后,确定游戏是directx9的游戏,
* t3 e" ]! A' ?5 @- .text:004F8D3B push 20h ; SDKVersion
/ b. z- E, M3 E* n. @) T - .text:004F8D3D mov esi, ecx
- c: ^ D( o) e4 E+ p: @ - .text:004F8D3F call Direct3DCreate9
复制代码
7 {9 q5 p7 h* `5 v! |; P5 \
3 s. {! U6 `! Q r' ~1 d, _2 @% W/ X# e" H% n
播放动画的时候,好像用了direct draw
! ?0 C! \$ R* e6 l3 g3 s- .text:004F4200 ; int __thiscall CVideo::Create(CVideo *__hidden this)
6 @# ~! i( L; P. b1 v2 H - .text:004F4200 public ?Create@CVideo@@QAEHXZ+ j: n3 A! }% n N( P
- .text:004F4200 ?Create@CVideo@@QAEHXZ proc near ; CODE XREF: CSystem::Create(HINSTANCE__ *,int,char *,char *,CWorld *,char const *)+380↑p2 l6 u: f' x6 C" u$ ~" }! L$ A
- .text:004F4200 ; DATA XREF: .rdata:off_5C6668↓o
3 Q3 E5 G4 o2 {4 y) ?! P2 S r1 E - .text:004F4200 push esi
! U$ z) z& d4 {" T - .text:004F4201 push edi
" e6 f+ |) g5 i$ ^ - .text:004F4202 mov esi, ecx' |0 p8 B, R, ~' u1 B+ F
- .text:004F4204 push 0 ; pUnkOuter* s; M% {% K; A# ]1 y3 d' p' e( B
- .text:004F4206 lea edi, [esi+54h]
4 z. _1 F# l8 D( _* M1 Y - .text:004F4209 push edi ; lplpDD
7 u a% b o5 x9 ?6 r* w! F - .text:004F420A push 0 ; lpGUID2 Y; O4 V: ^- u7 l" z: z; b9 u9 X
- .text:004F420C mov byte ptr [esi+79h], 0
; V( `9 f6 A0 Z/ I/ U* {( q4 } - .text:004F4210 call DirectDrawCreate
复制代码
* R% i. C* t/ D b. k1 h, R+ {$ |: u& n! U( i6 a
h' s" b8 Z2 p0 |0 H2 ~# U9 t
本游戏可以窗口化,比较容易调试。
2 V# c, F; `0 N! b找一句画面有的字符串the son of ,找到显示函数。
5 y6 Z' v8 b# v$ C! a以后我们用自己的函数替换它即可。- _( g% Y1 u7 U9 R% T
, `5 s+ p$ D) H) n8 A9 I对话字幕断点处
" ~4 D9 d, W H+ ^8 i6 o7 \004B5AF3 |> /8A08 /mov cl, byte ptr [eax]9 p3 `6 p, V& U+ v
0 M1 H P y" k. q2 i% n
' A x G" Y6 {" Achar __thiscall CFadingText::Set3 b3 j# Y/ o, W- _
(CFadingText *this, char *a2, int a3, int a4, bool a5, bool a6)/ V1 G9 q+ |' d# p
$ p7 p' u& |: s' Q) H2 w) W查了以下调用它的地方,有10多个,看来这个游戏所有地方的字幕应该都是调用这个显示函数了,$ S3 g$ H2 [# O+ f, S
" ?6 U& P8 v- q1 o1 g以下是一部分
4 p! [1 m. _3 j- CGLCLayer::Render+97,
5 e, D! O" V( [$ e& s5 { - CGameInterface::ShowSentence+2C, ) D3 H! z. Y$ E* V5 v' n
- CGameInterface::CloseDiary+1A, 3 K" Y8 A/ {9 Z
- CGameInterface::SetDiaryText+6A,
: }. ~ |% F+ R. J l0 ?6 W - CGameInterface::OpenMainMenu+17,
: m V. J o! X& w - CGameInterface::AddMenu+67, ) j' [/ b+ l! [* U3 q
- CGameInterface::OnMenuPressed+0AB, M)
0 u' g9 z8 p$ G: @0 } - TheAbbey.CFadingText::Set
复制代码
U' ?1 d" P4 c' {
+ T" O2 d; i, M% U0 H7 K5 j2 k; |
?1 r6 z3 G+ A7 @5 i* U, q% `8 ?9 i& z) Q1 R6 q$ l" w8 r/ g
7 v8 y0 I1 s. n: t8 x0 {, P! @9 G# M |