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

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

[复制链接]
查看: 428|回复: 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 编辑 2 Z" H$ H  q6 j% ^7 [1 P
' _) T* Q4 V9 m! o' [$ c
glCallLists的调用处,共有三处。1 j; j( X1 s  B" M
此三处估计是对应游戏中三类不同的字幕。
/ T6 T5 v& S- ]& }接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
/ Y, G6 {! X. K4 i8 k分析的文件名,748 KB (765,952 字节)5 m6 s# x8 m* U3 Q# ~8 w
toh.exe+ y  q) U( r, k, B3 h2 c
  I& R: y/ p* Q- d4 t0 O
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
. Y! _# e9 l' [: A1 ^等日后再仔细研究,看显示函数究竟在哪里。
# p# a4 W/ I7 v5 L" k4 a
, O3 D; ]5 \& v1 Ftoh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]0 s) a" N$ \+ x0 Y/ F; E1 n! t0 K% y
004316C8
5 h5 n6 g2 k6 x' X6 {! E/ S$ D* `
第1处# r* z& Z7 A' p
  1. void sub_4519B8(char *a1, ...)
    1 j8 P. v9 A' J1 H, @
  2. {, `# g1 m, P* p% |9 [6 a; b
  3.   GLsizei v1; // eax6 [+ B$ B) U9 l/ Q/ w
  4.   char lists; // [esp+4h] [ebp-800h]
    % C+ H1 A* n+ J
  5.   va_list va; // [esp+810h] [ebp+Ch]8 [& h* q" N9 t) Q+ V7 |( r( q! M

  6. ! E  {3 J+ Y/ m% B( ~* s% X
  7.   va_start(va, a1);4 B5 }6 u5 u3 o
  8.   if ( a1 )
    " t8 ~: R+ p$ d
  9.   {; g/ X: R) @- e. Q: y( Y  s
  10.     vsprintf(&lists, a1, va);2 f! t2 J, D2 P+ {2 V1 p* ?' [
  11.     glPushAttrib(0x20000u);4 a: v4 K7 C- {! i; H) b
  12.     glListBase(base);& P3 m6 ^, L0 d
  13.     v1 = strlen(&lists);. F9 }0 G" ^7 p" u
  14.     glCallLists(v1, 0x1401u, &lists);
    0 t/ u* d1 _; G% l
  15.     glPopAttrib();7 @3 @* \/ z$ i7 R2 i8 p
  16.   }
    - R* v, R2 |0 s- n6 x6 n0 i3 I
  17. }
复制代码

; t* h8 D7 V2 u4 ^5 g4 C: o+ m第2处
- Q$ u2 e0 r3 `  Y. ?2 K
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)* W# t, O5 I8 d( p! s  L" v1 [
  2. {
    7 S: ?* ^+ M+ x
  3.   int v4; // eax
    2 O8 P# T* R+ j5 {! n
  4.   GLsizei v5; // eax" D) C: w4 b7 |9 h* s, W
  5.   char lists; // [esp+4h] [ebp-800h]4 y' i; y, ~# t( I$ h) \. S
  6.   va_list va; // [esp+81Ch] [ebp+18h]9 _6 x1 X: O& C3 n6 }, r
  7. 9 E3 E1 P/ o. x1 M4 c* F# C  y$ N4 b2 x
  8.   va_start(va, a4);
    9 m1 ]! e( s$ z3 T+ H9 H
  9.   if ( a4 )
    3 o) j9 ~% ]  a' X
  10.   {
    + M/ o$ D; j# q5 n2 k$ P
  11.     sub_44FDD0(a3);4 }4 a3 [# a4 j; J2 c: M( p
  12.     v4 = sub_40BB44();' Q" |6 ?/ }% d8 s
  13.     glRasterPos2i(x, v4 - a2);
    ; F% j6 U0 w7 x6 R# B6 |' \- \
  14.     vsprintf(&lists, a4, va);- t! ~$ B- V4 `+ b5 t$ z
  15.     glPushAttrib(0x20000u);
    ; J/ h8 K$ |/ {3 f& T
  16.     glListBase(base);1 [+ C! p5 L! {3 o/ J" ?4 C5 m$ q) ^
  17.     v5 = strlen(&lists);7 a4 T# o% Q& \+ z1 Q- a% E
  18.     glCallLists(v5, 0x1401u, &lists);  p' O1 J. r8 t  e
  19.     glPopAttrib();; P9 y9 q4 K/ n* E
  20.   }# K; W5 }7 x( K! N, I# @
  21. }
复制代码
4 l8 G. T# f2 K0 x

* ^1 D& W4 k" a% v+ O. `$ M
- |1 t- B9 ?# o- [第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)5 h+ F" a) {' ^/ [  v
  2. {
    4 \7 k6 p4 q5 L2 P
  3.   GLvoid *v7; // ST08_4$ {: T" F1 B; Y6 A% W
  4.   GLsizei v8; // eax% d  h9 G% z: d. M& C
  5.   int v9; // [esp+0h] [ebp-1018h]
    - k- m% U0 x. e$ V- x
  6.   char v10; // [esp+8h] [ebp-1010h]
    - x& A( o0 O0 v" g& b
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]8 E+ o2 ?6 q0 I4 y( o
  8.   char v12[5]; // [esp+1013h] [ebp-5h]7 `4 g) \0 }- v0 N
  9.   va_list va; // [esp+103Ch] [ebp+24h]
    ' z6 J; V: v; r, k. l& O

  10. ) G- }4 S5 C/ Q
  11.   va_start(va, a7);! B: y) k: {7 y# M: M( b) o
  12.   v9 = 1;
    7 K3 E; }: R% J
  13.   if ( a7 )' S; P( o, ?* s2 p& y( q( C4 S
  14.   {0 c8 y, h9 Q5 Q" K
  15.     vsprintf(&v10, a7, va);( ^) I+ w. O- {8 o
  16.     glPushAttrib(0x20000u);
    # h1 H1 V# s  o
  17.     glListBase(base);
    ( E' p, F( ~' O7 M, h
  18.     lists = &v10;
    3 e2 R) m! i4 D' K4 y" I
  19.     do
    * |1 r, d# e9 [: t: k
  20.     {0 A% g7 H$ d( c
  21.       *(_DWORD *)&v12[1] = lists;, P3 y" e3 V% P4 r
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )8 i5 g" X2 q/ ~" ?" _* O
  23.         ++*(_DWORD *)&v12[1];* C7 G- J1 K# \# y$ Q% @; v6 \# D
  24.       v12[0] = **(_BYTE **)&v12[1];1 z! A* C) ?0 \& ]0 g
  25.       **(_BYTE **)&v12[1] = 0;& S' d+ J  U  {
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
    ' R% i3 K2 ~+ D
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
    0 k7 w3 H% t6 D# F1 k5 j8 D
  28.       y -= a5;  }( G, U, Y" a* K9 {+ ?3 B
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);# d0 s- g6 S: M: i$ K
  30.       v7 = lists;
    " R2 m0 G7 X4 G+ T. i. y2 ^
  31.       v8 = strlen((const char *)lists);7 {7 }) F( Z' ?
  32.       glCallLists(v8, 0x1401u, v7);
    # U9 y# m9 F$ v; r
  33.       if ( v9 < a3 )
    " C% w# o4 ?) A+ n+ I/ d5 x' Y3 H0 S
  34.         a4 += 4;- v5 E& m/ g  N. R' @
  35.       ++v9;
    * g1 |. |5 E7 D7 J9 ?0 K& c7 ?9 _
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
    0 @# A1 N& P1 k9 a
  37.     }+ J8 y, X, W1 C  L- I
  38.     while ( v12[0] );
      _. n$ C; s4 T- G
  39.     glPopAttrib();
    * k, }4 A9 B. {+ h: ^- W- Z* ?* ~
  40.   }
    9 m8 N. a+ U2 C7 p
  41. }
复制代码
9 S# N& k3 h7 A+ H* V

# s& }7 `* b5 p
) M4 t" B; }$ W: y/ C: v6 t
% V8 n6 u0 ^! o0 A) G. p
3 Z7 C5 I1 a! k& j
& m; K( E' F) y  N  U
2 O: |. k% S. ?) {% U" N: h: S  S2 A
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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