冒险解谜游戏中文网 ChinaAVG
标题:
【Directx9游戏汉化 #6】 静物2 (Still Life 2) 字幕显示函数
[打印本页]
作者:
shane007
时间:
2023-8-26 12:30
标题:
【Directx9游戏汉化 #6】 静物2 (Still Life 2) 字幕显示函数
本帖最后由 shane007 于 2023-8-26 14:47 编辑
4 P: Y- H b b4 |
, t$ Z# j# ?& [9 k1 G
这个有的在上一波(第4波)中进行了比较深入的分析。
9 M. p1 ]/ J9 j5 S7 `
本次在以前分析的基础上,排除无关内容,只抓和汉化有关的要点。
8 H4 H. b9 f, v2 B6 g# r; T ~
# Y9 y5 q0 P, {3 \
《1》这个游戏的初始化Directx9共有2处,一处是xcDxShader.dll,还有一处是xcDxOldschool.dll
7 }9 {1 w; p, H5 I# G x* y
具体要抓取哪个CreateDevice用于往屏幕上写字,需要写代码测试一下。
7 ]. @) ~' N% a5 P, C: N4 x! x
( k4 Y! Q+ h. }% D
《2》这个函数,以ida pro的静态分析为主,暂时认为字幕显示函数是xcEngine.dll中的SetTextString方法。
0 v$ f- t1 v6 m2 t: Y, K
0 @9 x( D3 D! K
关键是这2句,Str是完整的字幕,char_unicode是其中一个字符。
* F# q1 w, S8 C2 f
从代码上看,这个游戏是支持双字节的。但是由于采用的是图片字库,搞清楚结构不容易,因此暂定用hook方法自己写一个显示函数。
4 i. V8 M( A! S" ~$ s/ w
这函数传入一个text_object,里边也许会有颜色和坐标。
& l; a ?- w: z* }; ]* ]
char_unicode = (unsigned __int16 *)(*str + 2 * counter);
* [# v' ^, G* r/ u- }% I& G0 }1 }
*char_unicode = xccTextureFont::GetCharacterIndex((xccTextureFont *)text_object[20], *char_unicode);
复制代码
" N9 z+ d9 d4 c& O1 _/ K. A+ i
此外,该游戏在字体文件Sl2fnt.dat不存在的时候调用系统字库,
* c+ M( M: s, ?+ A' J
因此,也许在调用createfont的时候,能用修改参数的方法让该游戏支持中文。
1 S) y& i# \$ P2 Q
P5 g! }2 I- F4 }' ^: q/ r" q
7 S3 `! }. O3 W8 _# q5 Z9 X' A: W
以下是修改过变量名的代码。
) H9 S9 O' a' N4 y
int __thiscall xccFrameText::SetTextString(_DWORD *this, int length, _DWORD *a3, int show_subtitle_flag)
8 Q) k5 J5 M( A9 h, b$ l
{
# d% c, g+ w( L" \
_DWORD *text_object; // esi
) m% j* N B" ]7 t) j
int offset; // ebx
6 f U5 V! ]* b9 a
int counter; // edi
. X1 M; o, u' i" A7 V
_DWORD *str; // eax
$ A& d9 e& z) `3 }8 a. w2 h c
unsigned __int16 *char_unicode; // ebp
4 i- g5 C' P. G
int v9; // edx
+ y% `) K8 w/ @3 @
2 P* |5 G: |4 q" x! L
text_object = this;
% [. t$ |* E* ~! B7 z
offset = 32 * length;
9 @; O) H Y v5 G7 s
counter = 0;
8 Y: W" e% A0 k- i
*(_DWORD *)(32 * length + this[21] + 8) = 0;
. }: E$ @0 f/ U$ L
xctArray<unsigned short>::add(*a3, a3[2]);
# U$ ?1 l5 o9 p1 ?' w7 {+ [2 g
if ( !show_subtitle_flag )
F5 S* Y3 Z8 p* p2 a3 N( `
{
1 b5 R5 l$ h# H
str = (_DWORD *)(offset + text_object[21]);
- U: K. j& D2 `% B
if ( str[2] > 0 )
& I6 [4 ]& e" o! C4 f
{
2 V" `7 _% H7 ?* }/ C
do
% k- z) F z. E: @
{
7 u/ j3 e7 ]4 n' g9 Z
char_unicode = (unsigned __int16 *)(*str + 2 * counter);
) z$ t( A# T0 O; g$ ^4 `' }! `% H$ Z
*char_unicode = xccTextureFont::GetCharacterIndex((xccTextureFont *)text_object[20], *char_unicode);
6 T5 p. d* y+ D* ^) a
++counter;
* A( k& b$ _) P# c
str = (_DWORD *)(offset + text_object[21]);
. W: l4 w, J3 P5 F5 r. o. `4 {
}
* [. p7 S: \" [
while ( counter < str[2] );
+ i0 F2 L! Y$ Z
}
, t7 ?7 G1 Z: s& T
}
" Y" x" S p5 Q
v9 = text_object[21];
. `& j$ _' |. Y/ f$ U ^/ _
*(_DWORD *)(offset + v9 + 28) |= 4u;
! c, V; q2 ]; L! t# \ p7 e% L
return offset + v9 + 28;
% U: v6 F' z) L0 t @0 ]
}
复制代码
' f) E6 M _. ?% l0 j, I) d
xcEngine.dll 中的CreateFontA代码,可以尝试修改字符集和字符名称,看看是否能显示出中文。
0 O- E4 m/ \ _( O
h = CreateFontA(
' u& R9 v9 j( }' a5 H/ X
-*((_DWORD *)a1 + 1), // 字体高度(负值用于可变尺寸字体)
, [: o- Q# W8 U3 x1 |/ n4 I
0, // 字体宽度(0 表示由系统选择合适的宽度)
0 E, v1 f1 D J) n& L; x
0, // 文本输出方向角度
5 P' a6 ?/ R; e0 g. U
0, // 字体基线方向角度
7 P; E# m \% |" D8 l2 ~! C
*((_DWORD *)a1 + 3), // 字体重量(例如:FW_NORMAL、FW_BOLD)
/ T2 `5 m9 c+ v
*((_DWORD *)a1 + 4), // 是否斜体
]8 B V7 j) O0 B2 T1 u- I& G
*((_DWORD *)a1 + 5), // 是否下划线
% ?$ [/ a Q" K$ s8 [
*((_DWORD *)a1 + 6), // 是否删除线
0 S8 d* C7 F# m
*((_DWORD *)a1 + 7), // 字符集(例如:ANSI_CHARSET、DEFAULT_CHARSET)
4 ]% {. \0 i$ |+ R. T5 [+ \
6u, // 输出精度(OUT_DEFAULT_PRECIS)
. M; w! L( m% O
0, // 剪裁精度(默认剪裁精度:CLIP_DEFAULT_PRECIS)
) _1 Q; S- y+ s0 [+ j( m
4u, // 字体质量(DEFAULT_QUALITY)
/ m8 e' b8 t) M& v- N2 ~
2u, // 字体族和固定/可变宽标志(字符剪裁精度:CLIP_CHARACTER_PRECIS)
$ N$ Z8 m, Y J' k
*(LPCSTR *)a1); // 字体名称
复制代码
8 ^/ Z( k" w/ F% r5 Z# o
用API monitor 跟踪了一下GetDrawnCharCount ,发现和画面都能对应上,比如一下2行的24和8,就是对应画面上2行字幕的字符数。
& x% K! m4 ^5 R, g9 W
% V! Z* u" {7 ?( M' ^
# Time of Day Thread Module API Return Value Error Duration
" G9 I7 R" D" z* T$ |% I6 G* d% z
6353 2:44:57.277 PM 1 SL2.exe xccFrameText::GetDrawnCharCount ( ... ) 24 0.0000002
% G# K ^' l E+ `& ^
6354 2:44:57.277 PM 1 SL2.exe xccFrameText::GetDrawnCharCount ( ... ) 8 0.0000001
1 r4 w+ m- y" q7 O
复制代码
' k; O0 ]1 C9 N" Z e
7 ^# w1 G' U. E3 h
/ K# k* Y- b9 w9 k
1 Z2 x* f3 ]! T$ f) y/ \$ L
) Z) T) B1 W, t: d( J
1 \6 U6 J, C4 F9 x* k, p
8 K( X3 T. g, Q* y
作者:
匿名
时间:
2023-10-22 04:09
等了十年了这游戏的汉化,还有望吗?
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2