设为首页收藏本站官方微博

建议 【Directx9游戏汉化 #6】 静物2 (Still Life 2) 字幕显示函数

  [复制链接]
查看: 643|回复: 1
打印 上一主题 下一主题

[建议] 【Directx9游戏汉化 #6】 静物2 (Still Life 2) 字幕显示函数

跳转到指定楼层
楼主
发表于 2023-8-26 12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

【Directx9游戏汉化 #6】 静物2 (Still Life 2) 字幕显示函数

本帖最后由 shane007 于 2023-8-26 14:47 编辑
* d8 |, e+ G, v% }! F3 f* R9 m- ~1 n  L) y
这个有的在上一波(第4波)中进行了比较深入的分析。
, a2 f- w" [* O本次在以前分析的基础上,排除无关内容,只抓和汉化有关的要点。8 a$ V6 U3 c5 I- u

7 \6 ^( I2 \( {! z" B《1》这个游戏的初始化Directx9共有2处,一处是xcDxShader.dll,还有一处是xcDxOldschool.dll
+ P' C7 Z" @4 G9 W# v8 I. y0 n' B     具体要抓取哪个CreateDevice用于往屏幕上写字,需要写代码测试一下。
. A" G' F+ J' ~2 ~" j/ @% U& C% W8 l4 H9 _
5 O$ t" M" _& G+ m《2》这个函数,以ida pro的静态分析为主,暂时认为字幕显示函数是xcEngine.dll中的SetTextString方法。
7 c3 z' [' ^$ Z2 F
) K0 E2 W/ \, Q6 l2 l/ g% S1 R关键是这2句,Str是完整的字幕,char_unicode是其中一个字符。) ^! G9 s3 f! P
从代码上看,这个游戏是支持双字节的。但是由于采用的是图片字库,搞清楚结构不容易,因此暂定用hook方法自己写一个显示函数。
4 ~, C4 ]+ r- Y6 u, ]这函数传入一个text_object,里边也许会有颜色和坐标。
' u$ U8 K/ G5 K
  1. char_unicode = (unsigned __int16 *)(*str + 2 * counter);
    ! ~: B/ H6 z2 c. Q7 I7 _/ @
  2. *char_unicode = xccTextureFont::GetCharacterIndex((xccTextureFont *)text_object[20], *char_unicode);
复制代码
1 n3 H/ J: Z0 w4 F1 ^4 K
此外,该游戏在字体文件Sl2fnt.dat不存在的时候调用系统字库,
: v; n1 O. E' ~" _% ?/ g因此,也许在调用createfont的时候,能用修改参数的方法让该游戏支持中文。
3 W/ d6 R7 {+ h! o( Z9 p: `
+ `; z4 T, y0 Z
) h3 _: j! x' R6 n以下是修改过变量名的代码。  }. D+ }# Z+ h
  1. int __thiscall xccFrameText::SetTextString(_DWORD *this, int length, _DWORD *a3, int show_subtitle_flag), ]6 W( w+ X: ]
  2. {
    . l5 d" c% R/ T7 t. \
  3.   _DWORD *text_object; // esi
    2 o/ Z& S: r  K4 H
  4.   int offset; // ebx+ J5 J) @- b; Y4 v) j' a3 G% B. ~- G: D
  5.   int counter; // edi
    ) s. A. ~8 e6 \" c2 G/ k: M
  6.   _DWORD *str; // eax7 R* g8 i- z9 `# x; V  H) L
  7.   unsigned __int16 *char_unicode; // ebp
    ' n6 e: U: S( C: P1 I
  8.   int v9; // edx* M8 Q  m9 O' |1 V: {7 ^
  9.   f; W3 z$ H* C
  10.   text_object = this;
    ' M: T/ f2 p5 |
  11.   offset = 32 * length;
    " `* w' T6 x; q7 W
  12.   counter = 0;% f  M) c4 h& e! B* Q# P) @
  13.   *(_DWORD *)(32 * length + this[21] + 8) = 0;; C4 Q& A. d" i' E4 U
  14.   xctArray<unsigned short>::add(*a3, a3[2]);4 o: b( J/ Z4 f0 V9 p
  15.   if ( !show_subtitle_flag )' w0 g) Q4 e5 \. V) D% y
  16.   {
    + r7 f3 c7 N9 A* Y7 o4 }
  17.     str = (_DWORD *)(offset + text_object[21]);
    : y3 ?6 s' W" d+ N# d: @
  18.     if ( str[2] > 0 )' w& {" _/ U, B( ]: K+ {
  19.     {1 v+ }* K9 `. E' Z
  20.       do
    4 W6 i. S$ {/ h+ P
  21.       {
    . C" V" Q0 B- d8 ~3 e. ?# ~
  22.         char_unicode = (unsigned __int16 *)(*str + 2 * counter);
    ) P$ K/ h" W( F) H- ]% R9 v
  23.         *char_unicode = xccTextureFont::GetCharacterIndex((xccTextureFont *)text_object[20], *char_unicode);
    , K4 V) P2 s9 F
  24.         ++counter;# y- @# Z- A5 j4 @" ?/ ^! M
  25.         str = (_DWORD *)(offset + text_object[21]);2 P& ?6 X# i- s+ g$ Q2 K+ a
  26.       }7 h/ U- J' A8 y  b" E8 d
  27.       while ( counter < str[2] );! Z7 F- T, Z! ?' k( K- n: b
  28.     }
    . m4 L! w& v# L6 N3 h+ o
  29.   }- q3 P5 l0 ?/ B+ ~+ @$ D9 s; w& V
  30.   v9 = text_object[21];& ~! b5 }7 L" e% r! g2 D
  31.   *(_DWORD *)(offset + v9 + 28) |= 4u;7 e0 y! ~! f3 J2 {$ q6 ^
  32.   return offset + v9 + 28;. t+ P4 x8 B" ]
  33. }
复制代码

- @6 Z6 K2 o3 |/ I4 txcEngine.dll 中的CreateFontA代码,可以尝试修改字符集和字符名称,看看是否能显示出中文。
5 v2 w+ b* e: s( i" A9 J
  1. h = CreateFontA(
    , ~& @) f. n% Q
  2.         -*((_DWORD *)a1 + 1),      // 字体高度(负值用于可变尺寸字体)# l$ n, i/ {; B7 s( f8 r
  3.         0,                         // 字体宽度(0 表示由系统选择合适的宽度)/ }' E! R9 u& F3 I2 F9 R7 |
  4.         0,                         // 文本输出方向角度
    3 [/ D' K4 F& t: P0 l' q
  5.         0,                         // 字体基线方向角度- M" j8 ~  {1 ?* o" i
  6.         *((_DWORD *)a1 + 3),       // 字体重量(例如:FW_NORMAL、FW_BOLD)( \7 m/ [1 k  S- T5 }! B: h
  7.         *((_DWORD *)a1 + 4),       // 是否斜体) [5 [* Q% y/ @0 Q1 T
  8.         *((_DWORD *)a1 + 5),       // 是否下划线1 I5 M- @! h. R- C0 u
  9.         *((_DWORD *)a1 + 6),       // 是否删除线
    0 h: \2 U+ K* V  M8 x# z
  10.         *((_DWORD *)a1 + 7),       // 字符集(例如:ANSI_CHARSET、DEFAULT_CHARSET)$ n+ J. o9 r% E: i4 Q/ E
  11.         6u,                        // 输出精度(OUT_DEFAULT_PRECIS)
    ! F/ _: M' g) k% [
  12.         0,                         // 剪裁精度(默认剪裁精度:CLIP_DEFAULT_PRECIS)
    ( G( i, T+ \' E1 |% j6 K
  13.         4u,                        // 字体质量(DEFAULT_QUALITY)
    % r! c7 E! w7 P) H. @9 F2 J1 f# Y
  14.         2u,                        // 字体族和固定/可变宽标志(字符剪裁精度:CLIP_CHARACTER_PRECIS)
    4 H6 X4 ~/ U& Z  N
  15.         *(LPCSTR *)a1);            // 字体名称
复制代码

/ c; R1 p7 k! D用API monitor 跟踪了一下GetDrawnCharCount ,发现和画面都能对应上,比如一下2行的24和8,就是对应画面上2行字幕的字符数。& d' R- M7 h7 y1 G" F  O3 A8 I
+ E& a# \7 h8 t! g) t! R
  1. #        Time of Day        Thread        Module        API        Return Value        Error        Duration
      ^, a$ h8 {8 L" H& f7 D# r1 H! a
  2. 6353        2:44:57.277 PM        1        SL2.exe        xccFrameText::GetDrawnCharCount ( ... )        24                0.0000002
    $ f9 Y, `1 v! Q# u/ ]
  3. 6354        2:44:57.277 PM        1        SL2.exe        xccFrameText::GetDrawnCharCount ( ... )        8                0.0000001
    + q* l7 `3 L$ W) _1 S- p: p
复制代码

2 J' R, q# O0 x2 n8 h  b
0 n4 |$ P/ }) G* J! c" j5 x# y" S  C( K6 _% F8 U. Q5 i' g. h/ R2 k
. G- V3 m5 O8 w1 |' l
  ]- e3 d( _* p1 ?$ b
" n  \1 ~, C! ^7 |4 k. g1 h

+ P3 {' q+ T8 w9 e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好1 很差劲很差劲
回复

使用道具 举报

沙发
未注册网友  发表于 2023-10-22 04:09
等了十年了这游戏的汉化,还有望吗?
回复 支持 反对

使用道具

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表