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

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

[复制链接]
查看: 303|回复: 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 编辑 : [4 w3 A, T6 f& p7 y1 x

, ^8 B- N! K9 Q) r! {9 B& NglCallLists的调用处,共有三处。
) Q# ^. o4 H' Z4 i此三处估计是对应游戏中三类不同的字幕。
( ~% m8 X; U% l2 o4 @接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。/ Q$ U0 A( O: P  G* x- x5 f. I
分析的文件名,748 KB (765,952 字节)% {1 |1 d2 ~  N2 ?: o+ O
toh.exe4 Q" g) {) c9 `2 s
- `9 T7 r- l) L) m1 S
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
1 |( c/ T; v( V: @等日后再仔细研究,看显示函数究竟在哪里。
0 X" e; U8 [) R. g# ~# U: K) D9 z  i
toh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]
( _! U+ |: A' k. s004316C8
2 N: Z' k* c$ b  {# l! K
, ~8 J+ B: k: _) o% e+ z5 B第1处  {$ J# c8 [( X# L
  1. void sub_4519B8(char *a1, ...)
      M5 W$ D4 d* E' z9 h, {5 a
  2. {. G' H( T! b( d
  3.   GLsizei v1; // eax9 R' g0 Q+ J( t/ S! [  y
  4.   char lists; // [esp+4h] [ebp-800h]
    " b+ ^- c7 B4 b1 w! i7 ?5 ]
  5.   va_list va; // [esp+810h] [ebp+Ch]
    * M# x& A  M% l7 B

  6. : o6 S6 u2 `1 }5 g) n- H. V! y$ `
  7.   va_start(va, a1);
    * m5 W' _: x  K6 D( q1 W
  8.   if ( a1 )
    & I* F) h) E1 l+ Q
  9.   {
      R; m9 w& L& N/ n1 t
  10.     vsprintf(&lists, a1, va);  c' K' ~9 \7 l% s/ d! Y0 \$ f
  11.     glPushAttrib(0x20000u);; q3 i  `1 a5 ~7 l
  12.     glListBase(base);! ^3 K$ Z5 ?2 a' e  u. c
  13.     v1 = strlen(&lists);
    * \7 K( \+ Q  r# s- u8 v
  14.     glCallLists(v1, 0x1401u, &lists);! S8 y! d& I) z) r5 J
  15.     glPopAttrib();
    * k, u4 E8 t  R2 ~) f
  16.   }( \$ P5 V3 i7 p1 F( {) m
  17. }
复制代码
% R/ B6 ~8 `% M5 I1 I5 F6 h! B
第2处
, \( [; Y4 d& d9 _
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
    $ s( k, p3 z0 ?2 x! y) D5 n
  2. {7 a3 L& U% D8 p! `1 N2 q
  3.   int v4; // eax
    , N# J" p: ~* M6 _7 o
  4.   GLsizei v5; // eax7 n* K4 j& O) T0 U: s
  5.   char lists; // [esp+4h] [ebp-800h]
    ' O: E# E( Z' D% z
  6.   va_list va; // [esp+81Ch] [ebp+18h]
    1 `2 X  u0 O8 n
  7. , K: L+ n% i& Q, L6 i+ x; j. {7 g. ^* t
  8.   va_start(va, a4);
    9 C" i& v" {7 K% N
  9.   if ( a4 ), B7 @& W7 t8 n6 m
  10.   {7 Y8 {7 o* O2 ?2 k9 `
  11.     sub_44FDD0(a3);0 t8 J5 v1 L, z& v; E7 y( ]; R
  12.     v4 = sub_40BB44();
    - |; M7 C# t4 a
  13.     glRasterPos2i(x, v4 - a2);
      D1 ?# |. m- P* G
  14.     vsprintf(&lists, a4, va);' t' o- a9 X9 e, Y5 v. j. M
  15.     glPushAttrib(0x20000u);5 [! I0 ?1 n2 }1 G
  16.     glListBase(base);+ q* V, a2 N0 @/ T' w6 u
  17.     v5 = strlen(&lists);
    3 c! y! [# I0 z5 C$ S
  18.     glCallLists(v5, 0x1401u, &lists);
    7 ]4 S* h+ J+ k9 j  r- {/ T
  19.     glPopAttrib();+ S  x# x: }8 ~7 j) Y3 ?5 N. K
  20.   }
    . S8 N. N$ I- F) R; r
  21. }
复制代码
/ ]. m  j( E& E  l; d
; ?8 y: N% j0 p; P2 `5 s9 R
: I! h4 _. k4 L$ d% b, w
第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)1 p  w3 ]" s7 F% g- p' r
  2. {
    " e1 o' a4 ]4 m# c
  3.   GLvoid *v7; // ST08_40 Y1 B$ W0 k8 k6 }; a$ m, D
  4.   GLsizei v8; // eax
    8 ]$ v  t0 ]" E: m0 u
  5.   int v9; // [esp+0h] [ebp-1018h]
    - H: z, ^+ i+ N6 j2 B) b
  6.   char v10; // [esp+8h] [ebp-1010h]
    4 o) ?5 s5 ~! c8 m8 g; x" ~
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]
    $ U( z, Z; k' U( y3 G8 {
  8.   char v12[5]; // [esp+1013h] [ebp-5h]4 P% ]7 n' Z0 ~; i. M
  9.   va_list va; // [esp+103Ch] [ebp+24h]- e* R% q# I, b/ k
  10. " h" m2 k" h# \3 H9 g/ Q; F! G
  11.   va_start(va, a7);
    4 Y* A1 F! g) |5 l; n1 ]
  12.   v9 = 1;
    % z  n; Z4 e4 e: N5 i" _
  13.   if ( a7 )" I! c& S. L  a
  14.   {
    2 c5 n  P& G% N! N
  15.     vsprintf(&v10, a7, va);
    ; _+ p+ k, I; E% D
  16.     glPushAttrib(0x20000u);, Q. Q! k; A' i' ]" W7 c
  17.     glListBase(base);
    2 P, ]% e1 L7 P
  18.     lists = &v10;
    % i7 V, x0 H+ e4 t+ R/ ~
  19.     do
    9 D8 E% ]7 y8 V  [; X/ n
  20.     {( E# C6 t* k% K
  21.       *(_DWORD *)&v12[1] = lists;+ e: f* @& Y# G" K/ q  f
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )4 L' [5 f% q/ I3 d1 n4 ?2 u
  23.         ++*(_DWORD *)&v12[1];
    6 n7 |; }' ~  }9 b  ~& N' p
  24.       v12[0] = **(_BYTE **)&v12[1];: v# R3 z/ E1 E9 P$ C4 R
  25.       **(_BYTE **)&v12[1] = 0;6 q$ I  a0 `& _- Y1 _) z6 u
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
    & k* y0 {. M4 p5 N0 h0 S* u0 ^+ p
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;. r7 x3 w1 ?' r6 W
  28.       y -= a5;7 L) Z) R" f, ], k) V
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);
    ) L( [# X2 k% d
  30.       v7 = lists;
      a0 j- K: {- R+ N# D
  31.       v8 = strlen((const char *)lists);
    # U) `) `; f- ?8 W
  32.       glCallLists(v8, 0x1401u, v7);8 @$ m# J- U) _: T2 N
  33.       if ( v9 < a3 )$ p% x, l& i, E1 A0 I
  34.         a4 += 4;1 _: r$ }9 r& L6 e& X  ]
  35.       ++v9;
    : E5 W; M' d1 f' _" v
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);$ U( }8 x& R1 G9 m9 }/ i& k
  37.     }$ v& O& q2 i3 m( J# x
  38.     while ( v12[0] );
    5 K( I, R' G1 }/ W7 V3 |, S
  39.     glPopAttrib();  `. _& f1 j# J& T% F
  40.   }
    ; k5 V6 `: t/ f3 b1 i
  41. }
复制代码

  N3 O  W0 ^/ u* v. A6 V6 a/ s6 z6 k* V8 M

) v9 S! D6 f8 k. X( Q" M9 c  l# z% D3 {

0 t6 a* y0 {: v! o$ p- J! a& {3 G5 e& N8 B8 }

  u% n: P) H( f$ x' r: g
% f! Z& g6 a* T. v0 K' q. f
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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