冒险解谜游戏中文网 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.dll7 }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* }; ]* ]
  1. char_unicode = (unsigned __int16 *)(*str + 2 * counter);
    * [# v' ^, G* r/ u- }% I& G0 }1 }
  2. *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" q7 S3 `! }. O3 W8 _# q5 Z9 X' A: W
以下是修改过变量名的代码。
) H9 S9 O' a' N4 y
  1. int __thiscall xccFrameText::SetTextString(_DWORD *this, int length, _DWORD *a3, int show_subtitle_flag)8 Q) k5 J5 M( A9 h, b$ l
  2. {
    # d% c, g+ w( L" \
  3.   _DWORD *text_object; // esi
    ) m% j* N  B" ]7 t) j
  4.   int offset; // ebx6 f  U5 V! ]* b9 a
  5.   int counter; // edi. X1 M; o, u' i" A7 V
  6.   _DWORD *str; // eax$ A& d9 e& z) `3 }8 a. w2 h  c
  7.   unsigned __int16 *char_unicode; // ebp
    4 i- g5 C' P. G
  8.   int v9; // edx
    + y% `) K8 w/ @3 @
  9. 2 P* |5 G: |4 q" x! L
  10.   text_object = this;% [. t$ |* E* ~! B7 z
  11.   offset = 32 * length;
    9 @; O) H  Y  v5 G7 s
  12.   counter = 0;
    8 Y: W" e% A0 k- i
  13.   *(_DWORD *)(32 * length + this[21] + 8) = 0;
    . }: E$ @0 f/ U$ L
  14.   xctArray<unsigned short>::add(*a3, a3[2]);# U$ ?1 l5 o9 p1 ?' w7 {+ [2 g
  15.   if ( !show_subtitle_flag )  F5 S* Y3 Z8 p* p2 a3 N( `
  16.   {1 b5 R5 l$ h# H
  17.     str = (_DWORD *)(offset + text_object[21]);- U: K. j& D2 `% B
  18.     if ( str[2] > 0 )
    & I6 [4 ]& e" o! C4 f
  19.     {2 V" `7 _% H7 ?* }/ C
  20.       do% k- z) F  z. E: @
  21.       {7 u/ j3 e7 ]4 n' g9 Z
  22.         char_unicode = (unsigned __int16 *)(*str + 2 * counter);) z$ t( A# T0 O; g$ ^4 `' }! `% H$ Z
  23.         *char_unicode = xccTextureFont::GetCharacterIndex((xccTextureFont *)text_object[20], *char_unicode);6 T5 p. d* y+ D* ^) a
  24.         ++counter;* A( k& b$ _) P# c
  25.         str = (_DWORD *)(offset + text_object[21]);. W: l4 w, J3 P5 F5 r. o. `4 {
  26.       }
    * [. p7 S: \" [
  27.       while ( counter < str[2] );+ i0 F2 L! Y$ Z
  28.     }
    , t7 ?7 G1 Z: s& T
  29.   }
    " Y" x" S  p5 Q
  30.   v9 = text_object[21];. `& j$ _' |. Y/ f$ U  ^/ _
  31.   *(_DWORD *)(offset + v9 + 28) |= 4u;
    ! c, V; q2 ]; L! t# \  p7 e% L
  32.   return offset + v9 + 28;
    % U: v6 F' z) L0 t  @0 ]
  33. }
复制代码

' f) E6 M  _. ?% l0 j, I) dxcEngine.dll 中的CreateFontA代码,可以尝试修改字符集和字符名称,看看是否能显示出中文。0 O- E4 m/ \  _( O
  1. h = CreateFontA(
    ' u& R9 v9 j( }' a5 H/ X
  2.         -*((_DWORD *)a1 + 1),      // 字体高度(负值用于可变尺寸字体), [: o- Q# W8 U3 x1 |/ n4 I
  3.         0,                         // 字体宽度(0 表示由系统选择合适的宽度)
    0 E, v1 f1 D  J) n& L; x
  4.         0,                         // 文本输出方向角度5 P' a6 ?/ R; e0 g. U
  5.         0,                         // 字体基线方向角度
    7 P; E# m  \% |" D8 l2 ~! C
  6.         *((_DWORD *)a1 + 3),       // 字体重量(例如:FW_NORMAL、FW_BOLD)
    / T2 `5 m9 c+ v
  7.         *((_DWORD *)a1 + 4),       // 是否斜体
      ]8 B  V7 j) O0 B2 T1 u- I& G
  8.         *((_DWORD *)a1 + 5),       // 是否下划线% ?$ [/ a  Q" K$ s8 [
  9.         *((_DWORD *)a1 + 6),       // 是否删除线0 S8 d* C7 F# m
  10.         *((_DWORD *)a1 + 7),       // 字符集(例如:ANSI_CHARSET、DEFAULT_CHARSET)4 ]% {. \0 i$ |+ R. T5 [+ \
  11.         6u,                        // 输出精度(OUT_DEFAULT_PRECIS)
    . M; w! L( m% O
  12.         0,                         // 剪裁精度(默认剪裁精度:CLIP_DEFAULT_PRECIS)) _1 Q; S- y+ s0 [+ j( m
  13.         4u,                        // 字体质量(DEFAULT_QUALITY)/ m8 e' b8 t) M& v- N2 ~
  14.         2u,                        // 字体族和固定/可变宽标志(字符剪裁精度:CLIP_CHARACTER_PRECIS)$ N$ Z8 m, Y  J' k
  15.         *(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' ^
  1. #        Time of Day        Thread        Module        API        Return Value        Error        Duration" G9 I7 R" D" z* T$ |% I6 G* d% z
  2. 6353        2:44:57.277 PM        1        SL2.exe        xccFrameText::GetDrawnCharCount ( ... )        24                0.0000002% G# K  ^' l  E+ `& ^
  3. 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, p8 K( X3 T. g, Q* y

作者: 匿名    时间: 2023-10-22 04:09
等了十年了这游戏的汉化,还有望吗?




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2