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

建议 【Opengl游戏汉化 #3】 魔法英雄历险记(Tale of a Hero) glCallLists 调用处分析

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

[建议] 【Opengl游戏汉化 #3】 魔法英雄历险记(Tale of a Hero) glCallLists 调用处分析

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

【Opengl游戏汉化 #3】 魔法英雄历险记(Tale of a Hero) glCallLists 调用处分析

本帖最后由 shane007 于 2023-9-5 15:50 编辑
6 @6 R8 H2 o2 `1 x" m3 F: ^5 F9 r4 J
glCallLists的调用处,共有三处。4 h8 |1 q. x! Y
此三处估计是对应游戏中三类不同的字幕。, v9 g" g0 n  J" }& m
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。5 A1 M6 R& r# B; R- K8 O$ _
分析的文件名,748 KB (765,952 字节)
* i8 W3 y5 _) d$ ?+ J. X$ D4 B$ dtoh.exe$ u% ?' x4 ?: r' z, c( h% W
/ `7 s/ A: t& z" R
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
# Q. `  V- K! Q& X5 n; N等日后再仔细研究,看显示函数究竟在哪里。  I- R: i/ {. D+ y% T7 E& G

) {* V* n) f- O& c6 e5 A6 Vtoh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]
; b4 X6 k4 _* {8 k004316C84 V  m. s; H1 x) n
7 P# w( b9 r5 R& D
第1处4 i+ X& r( a0 d1 ]- K" h5 b- I
  1. void sub_4519B8(char *a1, ...)
    8 E5 M) n: O9 Z0 m+ v
  2. {
      \7 ?+ ^& Q$ d% x* Y
  3.   GLsizei v1; // eax
    8 Z9 Q) l% h- W0 w
  4.   char lists; // [esp+4h] [ebp-800h]
    9 A' q) m3 M7 k" E
  5.   va_list va; // [esp+810h] [ebp+Ch]6 G) B3 u4 T# G* o: D2 T! j

  6. & L" z$ L1 C9 \0 i! \! r. Q! l
  7.   va_start(va, a1);
    8 O+ [4 f. N/ o/ C
  8.   if ( a1 )' n$ D8 _; L  j7 \
  9.   {" Z. [9 M+ i  ~
  10.     vsprintf(&lists, a1, va);
    ' n- Y  h0 h  e
  11.     glPushAttrib(0x20000u);" U9 J4 u$ d- H. ~: e5 d
  12.     glListBase(base);
    ) |  ^7 u+ s2 Z1 W+ C0 [
  13.     v1 = strlen(&lists);8 f7 A0 e1 O1 i2 V3 ^9 w
  14.     glCallLists(v1, 0x1401u, &lists);# ]7 R' T  T! |2 v' a
  15.     glPopAttrib();1 F  Z) }5 ]* r; L) v6 C# ]; g  M
  16.   }
      h- F9 w' G& i1 n5 V
  17. }
复制代码
& a5 k3 K6 y5 a8 _. b
第2处
8 Q, U- Q: F& k; C! B% E% ^5 C: C. }' s
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
    - _8 }2 K* ^7 B+ Q  p% O
  2. {' s8 w& t* I; J7 V7 f, X
  3.   int v4; // eax
    7 J* x. ?6 j" ^9 _: b$ B+ I* x
  4.   GLsizei v5; // eax
    4 p( q# C. i/ H! h# |8 a7 w' Q
  5.   char lists; // [esp+4h] [ebp-800h]
    1 {. \3 m# Q7 J7 ^
  6.   va_list va; // [esp+81Ch] [ebp+18h]) v! p5 F& j3 b3 |7 x

  7. ) e& r# g& c, b; g8 G
  8.   va_start(va, a4);0 W+ O+ `# b8 `$ q) X2 _4 u4 v
  9.   if ( a4 )5 S7 L0 H& [5 W0 P1 J3 S' n; a
  10.   {$ g, E. _; }# t& p( _2 T
  11.     sub_44FDD0(a3);
    0 b3 @) D' d( E! O
  12.     v4 = sub_40BB44();: l% s( a, Y. o; M' d. l  i
  13.     glRasterPos2i(x, v4 - a2);' l& n1 r+ a$ ]9 J  v" Q
  14.     vsprintf(&lists, a4, va);) K/ \0 y: E5 O5 h* I
  15.     glPushAttrib(0x20000u);
    * v; K& B6 C7 N0 f9 ~
  16.     glListBase(base);- k1 q. I) n9 N/ W
  17.     v5 = strlen(&lists);/ \+ Q9 r7 u  n) V8 C& H- o. E3 j& B
  18.     glCallLists(v5, 0x1401u, &lists);
    - y) l5 l6 v! T+ T
  19.     glPopAttrib();5 B7 _0 j6 ~: n  x, M3 u
  20.   }
    3 n) a# ?7 n! s0 ]5 J" N
  21. }
复制代码
3 z$ }) U& c' y$ t  K' ~3 {

  f; O3 x! }3 g% J7 m
5 J5 O  s( d* d7 `3 e6 L% c5 {- O第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
    : O+ Z: V1 _' V. G% ]3 W
  2. {
    ; C/ Z* C$ g3 W
  3.   GLvoid *v7; // ST08_4
    . q3 a* B8 @6 Z5 H8 W% _
  4.   GLsizei v8; // eax
    5 Y2 q, Z3 w3 n: @. D) ~9 g
  5.   int v9; // [esp+0h] [ebp-1018h]
      m# Z$ ?( C6 e9 G+ V$ d
  6.   char v10; // [esp+8h] [ebp-1010h]& T' @; W* r5 L
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]% Y0 d: u' U9 d  d' b, x0 u! {
  8.   char v12[5]; // [esp+1013h] [ebp-5h]3 S! \$ ~. _2 ]6 }8 e! [; I$ u
  9.   va_list va; // [esp+103Ch] [ebp+24h]' O" ?5 Q! L, S4 O$ H

  10. * P$ P5 b9 Z+ r( C+ @, a4 `0 V
  11.   va_start(va, a7);' ?  C8 N6 n8 d7 ^2 S5 a
  12.   v9 = 1;
    5 O# a/ j5 v5 Y7 T% b
  13.   if ( a7 )
      H$ I- W: @- s  B) ]/ R- u
  14.   {" I2 G3 @1 G0 E+ B5 k
  15.     vsprintf(&v10, a7, va);
    3 d6 {$ }* r  B6 a' V* {
  16.     glPushAttrib(0x20000u);
    % D" R7 \3 L0 p. Y
  17.     glListBase(base);
    8 M  Y7 `2 m3 W$ N- Y9 L  ?; \" P
  18.     lists = &v10;( Q# x3 {. z0 p: f5 Q
  19.     do
    " _. D! z4 `  m
  20.     {/ w- [9 t* \; I6 K
  21.       *(_DWORD *)&v12[1] = lists;
    : V9 p. [5 |2 O+ l- p) a! t  x
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
    * f+ a" n& G5 ]- G
  23.         ++*(_DWORD *)&v12[1];7 x9 ^. v9 Z5 D* g
  24.       v12[0] = **(_BYTE **)&v12[1];2 W8 w3 }2 t7 i% u. W% R
  25.       **(_BYTE **)&v12[1] = 0;
      g& p: C  W7 ]  T
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )3 p: e/ z2 N. P- U( u6 e
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;% `/ P! B. e1 ?' U
  28.       y -= a5;
    6 O3 R9 |( Y1 l" u
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);  V- [' I1 N3 h- U
  30.       v7 = lists;7 |6 W4 L2 Z. t% g$ ^
  31.       v8 = strlen((const char *)lists);$ `( j1 F6 W& ^+ g: K* s
  32.       glCallLists(v8, 0x1401u, v7);
    , x) d' z; r; H: {4 {, T+ q2 D
  33.       if ( v9 < a3 )
    5 x8 j2 e. d: u
  34.         a4 += 4;) Q* T9 v" |* g3 _2 `" ]7 B
  35.       ++v9;
    / V- H: i' q6 F1 Y
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
    $ `  M9 J5 x/ J. U1 s, H
  37.     }
    5 R( J, y$ L. ~$ l0 b  G
  38.     while ( v12[0] );/ x: p5 Y  w+ ?# {
  39.     glPopAttrib();3 k9 }% Q1 w( r8 B1 W
  40.   }
    : y+ d  O* s# V+ I
  41. }
复制代码
' d! D- {3 i! g+ _& c5 Z/ _

; r4 X2 d: y1 w. X  |7 J, p
/ m7 ^# n; e3 n  w. I2 l1 k3 \6 q" I# [- |6 A) j0 f/ k/ i

. R: X) s) a' i( ?4 ?; k/ C. ?, A9 n& `1 F4 t5 o! H: w
  N0 w8 D4 ?0 A, Q6 `7 ~$ @
+ ?  t" |3 P- o, N# a% y; d, N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

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