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

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

[复制链接]
查看: 486|回复: 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 i6 J* h) [4 I  e+ p; x
& v! x. w$ I0 k+ VglCallLists的调用处,共有三处。
9 M4 s0 m7 ]! y此三处估计是对应游戏中三类不同的字幕。
& l8 y" U2 g3 {& [接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。3 O9 c0 u3 W, C* f% S
分析的文件名,748 KB (765,952 字节)0 r4 j, A& Y+ ?4 A& \& }
toh.exe' L9 [3 V1 c& {) c( `% u
5 g- ^8 Z/ ]8 k8 i' L
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
( [* B: b, E% Y0 M1 x4 ^等日后再仔细研究,看显示函数究竟在哪里。7 Z" [+ K# M2 U9 F' g, G. t
4 J: P/ }# X( X5 z5 Y0 e/ {
toh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]
  ?3 m$ B  z' \7 g+ B( s004316C8
3 H/ N! E/ R. r/ m+ }# X- T
: O: M* I& S2 c/ e  R3 R+ o9 m# b第1处
. k3 z  M% N% m' h% s4 ?
  1. void sub_4519B8(char *a1, ...)  j5 Y+ g0 h1 f' j1 M
  2. {
    % w0 ~# G% K9 f  H. I" w0 t6 w
  3.   GLsizei v1; // eax. L2 G! U3 ?* _9 S
  4.   char lists; // [esp+4h] [ebp-800h]
    ' W# {: ^9 n* G1 s/ Q) E2 ^
  5.   va_list va; // [esp+810h] [ebp+Ch]4 w" B8 k6 ?7 u! i, b
  6. $ _( @/ l0 J% r) m# b8 ^+ [
  7.   va_start(va, a1);
    7 E9 t0 X( H5 O. m5 ?
  8.   if ( a1 )( z6 V% w) D- C9 _5 u9 T& c" a  p7 w
  9.   {
    6 v6 ?' J, n* f; z7 M5 ~
  10.     vsprintf(&lists, a1, va);
      t- }! q( X( p, k
  11.     glPushAttrib(0x20000u);
    : H9 Y! G' q& A7 J; L
  12.     glListBase(base);1 K  A* C0 V7 T: p
  13.     v1 = strlen(&lists);
    + h5 J+ Q" g: k9 ~+ @& p( ~
  14.     glCallLists(v1, 0x1401u, &lists);
    9 ^3 \5 q$ M$ \- E7 f
  15.     glPopAttrib();
    + f) g% H+ m4 K1 M# R7 L; r
  16.   }  E" z* s7 v3 [
  17. }
复制代码

8 x0 ]8 G4 @, u4 U) |$ l; j第2处* J' Y) B: N+ s; r' ]* v# p' Y
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)8 K/ ]0 C) b6 n: M# ^, t
  2. {
    . ?7 G# {2 ~2 c+ x6 [/ `& Y
  3.   int v4; // eax) o6 J: x" a+ Q* o6 k5 e
  4.   GLsizei v5; // eax
    + n& H' p3 ?9 e& M# g- y5 m4 W
  5.   char lists; // [esp+4h] [ebp-800h]
    % V; U; {6 ]* D! n, F, R! p6 y
  6.   va_list va; // [esp+81Ch] [ebp+18h]
    9 H- f; M0 `1 j9 X( a) q9 X( R0 f3 F1 X
  7. * G% q" k4 v4 @# U$ Z) V7 {1 O
  8.   va_start(va, a4);1 L, p! o% Y: c! b
  9.   if ( a4 )
    ! |1 X6 g" y- _( ?& q* p
  10.   {, ?2 B" ^! ?& Q4 M6 O9 [9 _& C
  11.     sub_44FDD0(a3);
    / u/ Z* ?" a6 M  N
  12.     v4 = sub_40BB44();
    6 t2 `- i9 b4 O; W& n
  13.     glRasterPos2i(x, v4 - a2);( y& l0 n' \' _
  14.     vsprintf(&lists, a4, va);
    8 T5 L- x4 L/ X. a/ ^
  15.     glPushAttrib(0x20000u);+ E, P3 ^! m" I3 b
  16.     glListBase(base);) `' D! B" F* G. K
  17.     v5 = strlen(&lists);
    8 z3 O+ q: C+ M; v$ v
  18.     glCallLists(v5, 0x1401u, &lists);/ T! L. q  B8 u) A) i8 j" ], f1 M6 Q
  19.     glPopAttrib();4 V1 Z2 a% p7 ^* Q( ]) S5 D* u. `+ K
  20.   }- A4 z: F* H0 p1 N0 O
  21. }
复制代码
6 b* Z  l7 Z  @; j1 O5 p8 ^) S8 w% K

7 U. Y0 a2 Q6 P3 z$ i( y7 t2 C4 A. V  g6 C4 R; p
第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)9 g) u0 Q/ e7 u% {, N1 r
  2. {1 {$ w7 f7 y/ Z& I3 [! T& q
  3.   GLvoid *v7; // ST08_4! D2 V  X4 O, K
  4.   GLsizei v8; // eax
    5 K0 y' C% H" G9 k0 I  l' C# F
  5.   int v9; // [esp+0h] [ebp-1018h]* ?; I/ ^( ]" Y+ ~. o) T
  6.   char v10; // [esp+8h] [ebp-1010h]/ L% X3 h5 h1 ~: ]' M. V3 Q+ B
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]% z4 ]  U7 D! v5 r2 ^6 Y
  8.   char v12[5]; // [esp+1013h] [ebp-5h]
    ! l9 N2 a- _4 n
  9.   va_list va; // [esp+103Ch] [ebp+24h]
    ' f+ V. E' m0 _. B

  10. ) \# g) T8 Y- r( j. l& u# G
  11.   va_start(va, a7);
    ' f# ]# M' v8 j  i" P
  12.   v9 = 1;
    ; [! E" a7 u7 A, M! J! u5 P) t6 ^
  13.   if ( a7 )
    * f- \7 y5 `5 y' ^# R  R
  14.   {
    ' ]0 Y& Q9 X+ L$ l
  15.     vsprintf(&v10, a7, va);
    $ T3 u8 E* V7 B. T; y
  16.     glPushAttrib(0x20000u);. ]  J7 s  ~- {
  17.     glListBase(base);3 P: s/ A. X. ?! C0 P$ b
  18.     lists = &v10;
    0 n& H, p/ ?6 h$ G3 ~# L
  19.     do
    7 z" i" @; b0 R) ~# G
  20.     {
    & `; u2 [) r7 c+ x3 U& Y
  21.       *(_DWORD *)&v12[1] = lists;
    3 [4 q: _  m6 y, E% `# ?
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )4 D1 y$ A: C5 A; J7 M
  23.         ++*(_DWORD *)&v12[1];
    ' k( R5 C9 ~6 H6 C
  24.       v12[0] = **(_BYTE **)&v12[1];
    7 Y% u  \$ H( N; i! i
  25.       **(_BYTE **)&v12[1] = 0;
    8 r( B2 P3 X8 j% }9 Z
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
    $ @1 p. R* b+ A5 r. |5 @
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
    ; [- X4 x( p# c/ `4 N3 ^  ]: W
  28.       y -= a5;
    2 N! ^% Y' C5 X! g9 e4 m
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);7 ]) C5 H$ U+ ~5 |
  30.       v7 = lists;
    . }/ S% y3 ?5 N  s" k
  31.       v8 = strlen((const char *)lists);/ M8 Q7 W% o8 u7 D/ |
  32.       glCallLists(v8, 0x1401u, v7);
    5 C2 L5 _, b# f% G4 F
  33.       if ( v9 < a3 )
    . ?1 B1 _* A$ t+ r( H( d
  34.         a4 += 4;$ B2 e/ F1 Z' s$ g  K! r. [" Z
  35.       ++v9;
    3 W- w: }+ j) n1 K, O
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
    8 j7 H# d( I6 a7 A
  37.     }( \; G, L" t( N: D$ l; ^- o  t) Q
  38.     while ( v12[0] );/ t5 ~( I1 a3 @3 N. W& z
  39.     glPopAttrib();
    9 j4 _, j. b/ D2 d  B! p* s! W
  40.   }
    $ x$ h$ X! h% e5 P8 u
  41. }
复制代码

  b: P/ x/ C' e+ \6 @
/ |! @0 I5 L1 q% `7 ^  _3 R; f+ J! ?  S. a* X
+ Q4 c: [+ c6 ^8 @: D7 @
; X0 w6 m+ s6 w7 }# _% [/ O6 t4 P
: \' C! [, e6 F: x5 J
9 U0 I$ K: J/ c3 C2 a" C

3 D$ H7 Z0 q$ t, c; |4 o
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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