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

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

[复制链接]
查看: 312|回复: 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 编辑
1 p5 t0 P7 ?4 i. Q. h# R1 Z- {( W+ `
glCallLists的调用处,共有三处。
# v& g7 P6 |; h) C此三处估计是对应游戏中三类不同的字幕。
! \; d/ w  Q/ _+ a6 {8 k接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
0 h, ]" b- l3 j" @- Q- F分析的文件名,748 KB (765,952 字节); j" I2 d2 F8 J* v
toh.exe
: O) i: l0 X0 W+ d0 Q
# D% r6 N. P4 D0 U3 a0 I经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,' g! y# m1 X5 h
等日后再仔细研究,看显示函数究竟在哪里。. T2 a8 Y8 \% ~- Y. |

+ |% F( \) D" e5 xtoh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]  t# b/ h1 \7 I: S. g
004316C8
0 A3 q  W* L% B  q& x) f; g  ]& ^( E* {4 A
第1处
2 K% z' a7 @: F, F$ ~/ o; k
  1. void sub_4519B8(char *a1, ...)2 v% a$ j: L& @9 Q+ O* Z, h
  2. {
    ' c  _* s; }4 R/ P5 u& Q5 A- m0 A
  3.   GLsizei v1; // eax
    3 `& F# u8 }! Y7 C+ ^/ `: G
  4.   char lists; // [esp+4h] [ebp-800h]
    4 p' G' N) ?+ {1 ?
  5.   va_list va; // [esp+810h] [ebp+Ch]8 Q+ v" f& P4 R5 A" j6 J) x

  6. ' A! @" s0 W) O
  7.   va_start(va, a1);
    7 @6 z! Z3 ~2 Z$ G
  8.   if ( a1 )' [0 e* U) v7 d1 f7 U2 J5 e3 x( F
  9.   {
    * D: @2 L; F1 m7 |9 d; [3 K
  10.     vsprintf(&lists, a1, va);
    6 p+ H, Z1 A3 u  g: f' R0 F, p
  11.     glPushAttrib(0x20000u);
    . U- L5 y8 ~2 n9 v8 |* t  e, Y
  12.     glListBase(base);
    4 }3 |0 D' j0 u* f
  13.     v1 = strlen(&lists);
    " D7 I$ y2 {; E1 ?/ o6 E5 m' J
  14.     glCallLists(v1, 0x1401u, &lists);
    ! d! n& Y* g& N0 V) e, O" a7 L# Y. D
  15.     glPopAttrib();
    : [3 T( @9 B5 R1 n/ t
  16.   }
    & V6 V% C1 n2 n
  17. }
复制代码
) u0 u: {& y# S: S5 G
第2处1 o: Y2 ~9 P, b
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)! v8 N$ P4 v$ i5 F$ x) o
  2. {! O  W7 H( S9 A# d8 Q  C
  3.   int v4; // eax" }! R- e1 Q8 B8 w' V
  4.   GLsizei v5; // eax
    / u7 B1 N5 D( n" w2 V) t: M  r* A
  5.   char lists; // [esp+4h] [ebp-800h]$ I7 a3 S2 w# X) T# \; I' l; Q' ~, P
  6.   va_list va; // [esp+81Ch] [ebp+18h]
    ( B$ W5 @* k. _$ p! T# X+ f9 }

  7. # ?1 j* T. U" H! Z
  8.   va_start(va, a4);
    * c  f9 U" r( m# z
  9.   if ( a4 )# n+ v4 [, c( i# L
  10.   {
    & ~) q7 u5 o1 p9 q7 d( {
  11.     sub_44FDD0(a3);
    ) ~4 u! h5 A& B9 ?* {
  12.     v4 = sub_40BB44();
    % `6 ?; c" B( D& J+ b8 ]% q
  13.     glRasterPos2i(x, v4 - a2);
    8 i3 ^; D8 @/ X  p
  14.     vsprintf(&lists, a4, va);
    % a7 w# y& ^" h9 B6 s4 ^& W! [% O
  15.     glPushAttrib(0x20000u);
    / ^, D% Z$ i/ x
  16.     glListBase(base);# D" H" b2 d) f9 T/ T) F
  17.     v5 = strlen(&lists);" j. w% ^# L" `/ e2 f$ y& |
  18.     glCallLists(v5, 0x1401u, &lists);/ M5 B' _$ {4 q
  19.     glPopAttrib();9 P' J3 {' b/ K" e) A
  20.   }
    9 F* t! g, X0 ^- C: i" z, [
  21. }
复制代码

) c/ l4 T2 [* f  n' n9 W& y7 Q! [+ c( W. x
  F; @. d0 T; r1 ^7 C0 |2 R7 X3 T
第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)( L3 |: P, N/ W: P/ _  s
  2. {' c! a* H4 P( n* _! `1 Z0 v$ i9 }6 t
  3.   GLvoid *v7; // ST08_4
    & q2 ]2 t* H' C; x' X
  4.   GLsizei v8; // eax$ T/ t5 u. c) O9 o- \
  5.   int v9; // [esp+0h] [ebp-1018h]
    3 P; K; j. G; @
  6.   char v10; // [esp+8h] [ebp-1010h]
    $ t) R5 l0 {- C
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]& O8 K' u- W* \
  8.   char v12[5]; // [esp+1013h] [ebp-5h]
    7 x9 ^1 `, x9 \5 a
  9.   va_list va; // [esp+103Ch] [ebp+24h]
    0 R  e* r' Y$ [& s0 j% U3 i2 }/ @9 I

  10. 8 u$ M  B* ?' y+ A
  11.   va_start(va, a7);
    ! [7 w! g' K' Q9 Y! l
  12.   v9 = 1;% x$ h. F- T2 W' s
  13.   if ( a7 )! J9 a2 h4 u( l' P
  14.   {
    % Y; d4 y$ w# }) ^# C0 ~
  15.     vsprintf(&v10, a7, va);. u8 u" _, _' u9 Y% c9 j
  16.     glPushAttrib(0x20000u);/ V5 d5 P) S$ R" C9 k
  17.     glListBase(base);6 x8 ^. X* x; C/ g/ M
  18.     lists = &v10;; f2 A2 j5 r" v' s
  19.     do# @( Z: T9 \+ G! _3 \' |
  20.     {! \, k! O% X; J2 Y. Q2 o, p: r
  21.       *(_DWORD *)&v12[1] = lists;
    $ e8 M* ?9 X  f
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )( l, ~8 Z( I( H' h$ R+ y. F
  23.         ++*(_DWORD *)&v12[1];
    - p. l7 K2 P8 _% U* y5 ]& X
  24.       v12[0] = **(_BYTE **)&v12[1];
    # u$ t& Q8 l/ ^7 l- g; t- E
  25.       **(_BYTE **)&v12[1] = 0;% v5 n7 j6 C5 }* ~% A# W
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
    2 A( z2 S. J$ ~, R
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
    ; `; p! s3 ?4 j9 Y6 x
  28.       y -= a5;9 ?" H% G1 G( j
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);
    9 n) N1 T9 M9 ^# B
  30.       v7 = lists;
    . y( G, E& j+ _  B* [2 a$ U
  31.       v8 = strlen((const char *)lists);
    5 b/ `' t7 T4 Q' o9 M5 b6 A
  32.       glCallLists(v8, 0x1401u, v7);; a6 |) T* l0 Q8 |) J. `) M! f
  33.       if ( v9 < a3 )! G  n- `* p5 W
  34.         a4 += 4;
    : a% c- H; D# }5 n9 T
  35.       ++v9;4 h4 I! v3 \4 @2 U  ^
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);4 Z; }6 e) A& W) V4 A5 Y6 H
  37.     }
    ' u7 Q& l! _: j2 m* L6 Q9 C
  38.     while ( v12[0] );& u5 c8 |: p" g% O2 m% ^
  39.     glPopAttrib();
    7 b& N. ?1 J- c9 c! m! `2 L
  40.   }
    - T9 ~* G4 v7 Q
  41. }
复制代码

1 X) f8 q. Y+ q3 [3 c  I$ |5 d9 T+ }8 }' I
. \4 ?/ x8 w0 [* C& ^2 D

, G  U/ H) d# A* i4 I
, W  r$ B2 @$ w/ ~+ l( l4 A1 f( M/ @

/ A1 n& O- g' w( C, c- X# R* M( d) k- X8 ^' [! t( |
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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