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

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

[复制链接]
查看: 302|回复: 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 编辑 ' h7 v0 o* }3 }; k; c5 D& t8 G0 l( J

" {7 W/ Q/ Z8 D2 f- W5 VglCallLists的调用处,共有三处。
0 w2 I+ j9 ?: K% O此三处估计是对应游戏中三类不同的字幕。' p/ P3 [2 z* @9 N) j* b1 [
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
; ^3 k( f& C+ c' }1 b分析的文件名,748 KB (765,952 字节)
0 t" L# x: o/ p/ w# atoh.exe
7 R: X  A4 C! n0 B  I
* c1 Z. i& v- M6 y经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
: ]2 I6 G2 v6 z. g8 e等日后再仔细研究,看显示函数究竟在哪里。
3 P0 s6 C& H2 \$ m# e8 [7 z- ~6 w& K% ]8 l# S# P2 L
toh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]
  e$ I2 H' |6 V0 F! Z, t7 H# Q004316C8; a$ ]% }8 Y, W$ u4 E6 O) j) N# p! h( i+ i

5 B5 A9 G; b: _$ r! u  X第1处
! F- K2 q+ b7 v1 R% _
  1. void sub_4519B8(char *a1, ...)) J0 J7 C) h% n2 u8 L5 ^
  2. {; V7 ^9 ]# q2 i4 y0 l
  3.   GLsizei v1; // eax* k$ E9 j' K" Y7 P/ c  r5 p
  4.   char lists; // [esp+4h] [ebp-800h]
    7 z' D, B. r* t( ?0 V
  5.   va_list va; // [esp+810h] [ebp+Ch]  `- Z7 G" @+ O3 h; D
  6. ) a! |" f( Z& {
  7.   va_start(va, a1);$ g  \. }( z+ S0 L: s- _0 R
  8.   if ( a1 )- s* Y  d5 P4 }# e! B
  9.   {1 o: h# q2 Q7 I  `2 \) e
  10.     vsprintf(&lists, a1, va);+ V5 Q" u! z% V: M3 X; ~1 P
  11.     glPushAttrib(0x20000u);
    , |0 k; E* n. T, ]% \
  12.     glListBase(base);- O* I2 y. \3 b  y/ M: l3 G
  13.     v1 = strlen(&lists);" f0 v( }+ x; Y* }) O$ R% @! e
  14.     glCallLists(v1, 0x1401u, &lists);
    5 \  E% h- B2 ^  B0 C4 K/ J1 f. ^
  15.     glPopAttrib();
    & z# h; f6 p' N; E
  16.   }
    " y+ ?& E) z$ A4 I7 Q6 ?: \- V
  17. }
复制代码

" Q  Y, Y  X1 I" G第2处
/ J+ `. ?+ ]9 }
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
    1 x6 f: `) |7 o2 L1 [  w
  2. {: m7 N* m5 ^( a* o8 {$ r  B
  3.   int v4; // eax# P6 T  @, m; v
  4.   GLsizei v5; // eax
    ' s) s7 {+ W7 a) H/ @2 k# d# M9 k
  5.   char lists; // [esp+4h] [ebp-800h]
    # d, Q( y# R9 A( \0 O
  6.   va_list va; // [esp+81Ch] [ebp+18h]
    6 v, a0 i! A1 K% Q

  7. . k0 u0 \4 c2 o+ ]( \
  8.   va_start(va, a4);
    2 Y" m4 A3 C/ I/ n/ p; N
  9.   if ( a4 )* @5 i0 B3 T5 H/ c, E. {
  10.   {3 c! y1 {3 U: V% o. g1 I
  11.     sub_44FDD0(a3);
    % T6 {- [/ r1 }# u) f* W$ ]
  12.     v4 = sub_40BB44();
    , @. ~* ~4 D0 ~" Y* D5 w
  13.     glRasterPos2i(x, v4 - a2);9 p" _8 {! V, O/ E
  14.     vsprintf(&lists, a4, va);$ |' o+ T0 Q4 {+ m
  15.     glPushAttrib(0x20000u);$ k- Y  k3 ]5 s3 ~% Z% y
  16.     glListBase(base);, M6 Z# ~. T3 l$ ~
  17.     v5 = strlen(&lists);; I6 Z9 H0 x  {& ?3 H" ?1 Z, A
  18.     glCallLists(v5, 0x1401u, &lists);
    $ Y, g! |  m! g: [! W! s
  19.     glPopAttrib();
    8 N' k. q/ f3 H7 T1 W" ]: a
  20.   }
    1 m9 i& V( ?/ W1 Z% ~7 |
  21. }
复制代码
- D; w$ E: H+ H7 f, R. s
# Q) n9 K0 D, m
9 n9 j7 Q! [2 A9 r( Q& X" @( Z
第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...); v# O$ r0 m; c( ]
  2. {
    4 ^2 s6 v1 {% b. N) y0 Z
  3.   GLvoid *v7; // ST08_4- z! U8 M& O+ i4 z- j" z, m3 t
  4.   GLsizei v8; // eax! b" R, u8 W2 j/ r2 A3 b9 b" T
  5.   int v9; // [esp+0h] [ebp-1018h]! @: p6 @- u/ L. N
  6.   char v10; // [esp+8h] [ebp-1010h]+ O# h6 D$ W" E, [  y* y: F& p
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]
    , A7 j, J8 ]5 |! R+ U# d1 N
  8.   char v12[5]; // [esp+1013h] [ebp-5h]
    ; S$ U* J& D8 f% H7 D! ?/ f7 I( y% x  m
  9.   va_list va; // [esp+103Ch] [ebp+24h]! h& Q& o" U. o$ L5 A/ Z

  10. 4 E. Q, W( X2 q- c
  11.   va_start(va, a7);
    - a0 U. W9 t( f% Y
  12.   v9 = 1;, U& p* @1 I; @( T; p
  13.   if ( a7 )' N& D9 x9 ]+ j  d- c' q
  14.   {
    % J) n0 n% I! o
  15.     vsprintf(&v10, a7, va);  @! t6 u* q7 l" _
  16.     glPushAttrib(0x20000u);
    7 E# C" w% p# L. V
  17.     glListBase(base);4 k; z% t3 f) t6 S1 Z
  18.     lists = &v10;
    . @- q+ s* n9 E$ X+ ]( q  X
  19.     do2 d" M( p) T/ }& t5 A1 S. U1 M
  20.     {" e: Z- W" M& n" E. Y. O0 _* k# z
  21.       *(_DWORD *)&v12[1] = lists;4 ?" w  @8 ~+ @8 B
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )0 M+ X! P! b, t9 g
  23.         ++*(_DWORD *)&v12[1];2 `2 N; P  t6 @9 Z9 `* ]& n% m
  24.       v12[0] = **(_BYTE **)&v12[1];* h* O) b2 R1 H3 W
  25.       **(_BYTE **)&v12[1] = 0;' o7 H' a8 K8 g
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
    ; c- z; E& ~( U2 ^) U5 k9 u
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;  g$ @/ M* @& h4 M
  28.       y -= a5;
    ) O8 p" L' _3 ]
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);. Q% y: X% ?, [
  30.       v7 = lists;
    $ |. s+ H* t  u9 y# X- d
  31.       v8 = strlen((const char *)lists);
    * r  C, u" V! B% V5 _! ?
  32.       glCallLists(v8, 0x1401u, v7);
    2 E: \! F* @: @* C. D0 t% G" `
  33.       if ( v9 < a3 )0 y3 F# R% V' g2 O) A
  34.         a4 += 4;
    5 B' G! K& I( q9 x* l
  35.       ++v9;
    6 m( Q. C8 o" L1 C: [
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
    2 ^, C/ D0 U5 y% u/ N' C% P) {
  37.     }2 \/ e) v, R2 g" b) \- c* S
  38.     while ( v12[0] );
    - G. [$ J- Q' d5 F
  39.     glPopAttrib();
    4 F$ }3 ?" z. B* P. c3 s
  40.   }
    + J( W2 P; b) J8 C: `& b. b
  41. }
复制代码
8 z: Y' i" F& F: Y
  i) F2 K" e. V2 E/ J
$ B) u- o4 H7 @# p3 U" m: i
2 l: A" b7 h) K2 U3 ^( c( B0 ]
$ N  `& Z& i" v/ K8 u0 f8 k

, Z1 K  V* ]9 C5 q6 b6 j7 q* V. i# z& c
& K- @, u1 g+ `0 E7 }$ C: g" [2 i# ~/ ?
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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