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

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

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

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

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

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

本帖最后由 shane007 于 2023-8-26 14:47 编辑 1 G: ]' E% H& A. p' y
/ r0 d" u8 T0 n' m/ O
这个有的在上一波(第4波)中进行了比较深入的分析。) i+ Q+ X4 |" J' W5 v
本次在以前分析的基础上,排除无关内容,只抓和汉化有关的要点。
! V1 T/ l$ D+ f( i  C
6 p6 E6 Y( h, A《1》这个游戏的初始化Directx9共有2处,一处是xcDxShader.dll,还有一处是xcDxOldschool.dll& P# K9 B0 |1 Z+ J7 ]& E* h4 s
     具体要抓取哪个CreateDevice用于往屏幕上写字,需要写代码测试一下。$ H4 T/ m) G# v  q/ g
2 d/ n. `% Y; E# T
《2》这个函数,以ida pro的静态分析为主,暂时认为字幕显示函数是xcEngine.dll中的SetTextString方法。+ ]4 T$ p/ _- U' L/ U, I
/ w' @4 p& w1 y5 ^" t
关键是这2句,Str是完整的字幕,char_unicode是其中一个字符。
. d9 C! s: G. G' z* `  }" {从代码上看,这个游戏是支持双字节的。但是由于采用的是图片字库,搞清楚结构不容易,因此暂定用hook方法自己写一个显示函数。" G/ y+ X0 I0 z0 O& [, N
这函数传入一个text_object,里边也许会有颜色和坐标。
' o) g, j$ ]2 `( z
  1. char_unicode = (unsigned __int16 *)(*str + 2 * counter);
    7 G0 y# d4 l$ M
  2. *char_unicode = xccTextureFont::GetCharacterIndex((xccTextureFont *)text_object[20], *char_unicode);
复制代码
1 X' a$ \! a7 F6 M
此外,该游戏在字体文件Sl2fnt.dat不存在的时候调用系统字库,3 i! C+ T( W$ o' f0 c
因此,也许在调用createfont的时候,能用修改参数的方法让该游戏支持中文。
: d9 O/ x) i; s7 |7 E7 g. g# M7 G+ y3 W) y% h3 W# h# S1 b& }

% n5 j$ a$ @: o; J" k) F7 m以下是修改过变量名的代码。2 W" i: V* c$ M
  1. int __thiscall xccFrameText::SetTextString(_DWORD *this, int length, _DWORD *a3, int show_subtitle_flag)- h. @" s+ M: I; P
  2. {6 F, v& h/ \+ w$ `/ e2 h
  3.   _DWORD *text_object; // esi: b& W: b$ J1 n, y- X8 |) S
  4.   int offset; // ebx8 n. q: w2 D# M
  5.   int counter; // edi* }! Z. n3 R2 t, l1 M/ K
  6.   _DWORD *str; // eax
    ( P) z% j1 @9 Y; b: y+ v( |
  7.   unsigned __int16 *char_unicode; // ebp. `+ H) b8 V( m6 `% m
  8.   int v9; // edx
    ! h* l9 U6 X, y; ?

  9. : Y1 m; }1 c; H; Y# k
  10.   text_object = this;3 X" R4 w& U5 H2 y; M! u4 c! c
  11.   offset = 32 * length;0 I% Y4 ~) F" c
  12.   counter = 0;
    , |' N2 y9 `! e' ^3 ^; G
  13.   *(_DWORD *)(32 * length + this[21] + 8) = 0;
    4 a/ ?, h) `: E  i# B
  14.   xctArray<unsigned short>::add(*a3, a3[2]);& c7 B# C: g: l8 ?$ q; _
  15.   if ( !show_subtitle_flag )
    ! ~' U" u' N4 p# }
  16.   {
    ' @) U- @2 `& e0 q0 y/ b2 M0 Z
  17.     str = (_DWORD *)(offset + text_object[21]);: c, a7 _1 O5 v5 h* j; ~# L
  18.     if ( str[2] > 0 )/ s2 d+ j4 Y+ H, @- {
  19.     {5 D5 b6 u& T2 r' g% V1 l; Z& H
  20.       do
    / |! K" b/ C- e; X' y
  21.       {
    4 c0 Q3 Z/ p- r% r
  22.         char_unicode = (unsigned __int16 *)(*str + 2 * counter);
    4 E0 H& K* N& r4 ?* Y: w
  23.         *char_unicode = xccTextureFont::GetCharacterIndex((xccTextureFont *)text_object[20], *char_unicode);( R3 M$ Z  H6 Z3 I5 ]+ L, @# Q, l+ `4 i9 a
  24.         ++counter;8 t" h: o) @! K, [) G, `$ v( p9 j
  25.         str = (_DWORD *)(offset + text_object[21]);# l! O" I: U& K; u, N5 ~! o; j
  26.       }* E7 w, {, S/ s& P! t1 V
  27.       while ( counter < str[2] );& {0 n4 Z! v: d% a
  28.     }' t$ `% J" q8 n* i& D# ~
  29.   }& O& s( N) p: Z# E! J/ a2 ~
  30.   v9 = text_object[21];
    / }" X- G" o7 @4 |, g' w5 r3 t# c0 R
  31.   *(_DWORD *)(offset + v9 + 28) |= 4u;8 f$ y6 s6 @) }3 u5 S
  32.   return offset + v9 + 28;
    8 U: w# i9 p+ P8 M4 M
  33. }
复制代码

4 b4 e7 @  `* @xcEngine.dll 中的CreateFontA代码,可以尝试修改字符集和字符名称,看看是否能显示出中文。
& u8 B+ }. H+ N* F9 g6 e
  1. h = CreateFontA(
    " U' [3 B1 U" C9 ]; l1 W7 {$ t/ I
  2.         -*((_DWORD *)a1 + 1),      // 字体高度(负值用于可变尺寸字体)! y. n& ?6 |& g9 q* U4 P  J
  3.         0,                         // 字体宽度(0 表示由系统选择合适的宽度)
    / @4 P" L8 l# }
  4.         0,                         // 文本输出方向角度$ T5 u' S* ]& k4 p
  5.         0,                         // 字体基线方向角度+ S5 }/ K5 p+ R0 i
  6.         *((_DWORD *)a1 + 3),       // 字体重量(例如:FW_NORMAL、FW_BOLD)% l7 |9 F9 @1 O- ?+ J- Q1 u0 _% e
  7.         *((_DWORD *)a1 + 4),       // 是否斜体! ~7 S9 {$ ~. N( ]+ G  f& P( A
  8.         *((_DWORD *)a1 + 5),       // 是否下划线% u' ^2 P' f! T4 @0 T% L2 ?
  9.         *((_DWORD *)a1 + 6),       // 是否删除线" X9 v( r( m+ q
  10.         *((_DWORD *)a1 + 7),       // 字符集(例如:ANSI_CHARSET、DEFAULT_CHARSET), P" ^# M) D8 ~9 Q
  11.         6u,                        // 输出精度(OUT_DEFAULT_PRECIS)
    * K$ N, o* [: v
  12.         0,                         // 剪裁精度(默认剪裁精度:CLIP_DEFAULT_PRECIS)( y' S$ f2 W1 {3 L
  13.         4u,                        // 字体质量(DEFAULT_QUALITY)( E/ e9 e7 h) C( ?$ c0 b" C
  14.         2u,                        // 字体族和固定/可变宽标志(字符剪裁精度:CLIP_CHARACTER_PRECIS)
    6 w4 |, H6 x" N- w
  15.         *(LPCSTR *)a1);            // 字体名称
复制代码

# K; p3 N1 |' h用API monitor 跟踪了一下GetDrawnCharCount ,发现和画面都能对应上,比如一下2行的24和8,就是对应画面上2行字幕的字符数。# \; e; P  e, B

1 O5 F! s2 k$ y5 |+ w8 B
  1. #        Time of Day        Thread        Module        API        Return Value        Error        Duration$ }6 U: G6 L' p) v
  2. 6353        2:44:57.277 PM        1        SL2.exe        xccFrameText::GetDrawnCharCount ( ... )        24                0.0000002
    ( n3 P, x- X$ }# B+ w- D
  3. 6354        2:44:57.277 PM        1        SL2.exe        xccFrameText::GetDrawnCharCount ( ... )        8                0.0000001
    ; D7 Y, n3 b- ?# [, ^( R4 s
复制代码

) ?% d3 c9 m! M/ b' g: h% q8 B7 I3 j$ d# q+ |8 N
! K5 D3 r5 n0 i2 |8 V( T
& l: v+ N( G4 m6 p
/ ~$ q, \: g% J2 h7 H0 [: l
5 K9 q7 M  R& t+ Y, y8 D

  R0 r5 T; V- Q# A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

沙发
未注册网友  发表于 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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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