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

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

[复制链接]
查看: 490|回复: 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 编辑 0 N& _# q6 q; ^( Z/ Z2 i

" I% f2 E. f$ [8 [2 |glCallLists的调用处,共有三处。4 X" d7 i" }( `& w4 N, ^3 e
此三处估计是对应游戏中三类不同的字幕。
7 i  F: h  o/ \" Q4 {" ]接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
+ A: X/ ]2 X% K分析的文件名,748 KB (765,952 字节)
9 ~8 R& Z$ @; W) S: Qtoh.exe) |( n( D( ]/ u9 k4 E

+ P$ ~8 R5 M2 q+ \' p经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
: J8 K1 a/ M3 d* D0 f等日后再仔细研究,看显示函数究竟在哪里。
# x& i* Z% [5 C4 H- H* }- S4 l7 k7 _. {3 V
toh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]
3 v5 d" g* l( k! _, z  R6 Q* V004316C86 x* ]: e. Y) `9 \: n/ j+ ~
& G2 p8 U, d5 p3 u2 e% p
第1处
' s% _' Y; _- t1 D
  1. void sub_4519B8(char *a1, ...)1 ^( R) }$ r" e
  2. {8 f/ ]- m1 D" J/ S6 [0 T
  3.   GLsizei v1; // eax" U3 R5 w& x# l% Y# n
  4.   char lists; // [esp+4h] [ebp-800h]
    % W* g3 [! ~/ Y! ?
  5.   va_list va; // [esp+810h] [ebp+Ch]
    0 d' I& K9 O$ b7 j5 w
  6. " c- M. A$ B) m) J
  7.   va_start(va, a1);
    5 `3 {: f% A$ Q( T
  8.   if ( a1 )' O1 M: t/ T$ F' d9 E
  9.   {* |2 G8 M$ r  g
  10.     vsprintf(&lists, a1, va);
    8 j) X( i# C' v3 N; }9 @1 }
  11.     glPushAttrib(0x20000u);) i0 o8 H, v  Y7 ~( J
  12.     glListBase(base);
    5 ~; v  W. T; v; W6 F( G0 T; `
  13.     v1 = strlen(&lists);- ]- l  x" ~% H2 e
  14.     glCallLists(v1, 0x1401u, &lists);
    ; Y: ~& p; T' p/ _
  15.     glPopAttrib();
    8 Q& n: s$ }* t1 Q) t+ \% w- w2 t
  16.   }3 A% `. v  }; T8 e& h0 B) s# Z
  17. }
复制代码

( a8 y6 @9 v  v# X5 s第2处2 Z+ d) A5 m3 O# B* _
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)5 ^  L* S, V. G. B% Y
  2. {
    + K2 X2 g4 B2 S" ]
  3.   int v4; // eax
    5 X, C/ b6 c1 Z7 F# j
  4.   GLsizei v5; // eax  q, ]( D/ ^! S: g8 p
  5.   char lists; // [esp+4h] [ebp-800h]
    $ M! D* I$ [; w# `, }
  6.   va_list va; // [esp+81Ch] [ebp+18h]
    2 J0 ?( N* @# q7 O
  7. ! o- H$ J; R; |4 {
  8.   va_start(va, a4);
    ) p) l! X" z7 [: ?
  9.   if ( a4 )* m. b. m; H% _  b9 x  s
  10.   {: Z% p6 {) R% M1 P- m
  11.     sub_44FDD0(a3);
    + n3 b2 S6 Y- y# b
  12.     v4 = sub_40BB44();- ^7 ~7 W/ g6 B
  13.     glRasterPos2i(x, v4 - a2);4 \" _' r5 n8 z) z
  14.     vsprintf(&lists, a4, va);
    ' M5 ~( W; F* H3 O: b. y
  15.     glPushAttrib(0x20000u);
    4 _! d- Q) d: B4 ^6 r1 M0 ]! m
  16.     glListBase(base);
    $ b+ L; @' e7 P
  17.     v5 = strlen(&lists);
    & z$ v: Z1 V8 b# P# C- w; K1 P
  18.     glCallLists(v5, 0x1401u, &lists);
    % y2 C  k- \7 v. m8 j
  19.     glPopAttrib();4 R8 S4 ~5 z! u) T& J* }
  20.   }
    0 Z3 T. S( L$ b/ Z; K, S( W
  21. }
复制代码

8 {; a0 J9 J; C4 {$ C2 @5 Z/ W1 p, h7 A

5 {3 H2 {) ?- S& ?第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
    + _7 r0 P; e; N. @6 S
  2. {
    - E8 W* e6 [+ B" M% _4 O
  3.   GLvoid *v7; // ST08_4" Z& J3 e' C1 ]& n! t
  4.   GLsizei v8; // eax
    6 R+ f: @) p* W" M# {* U
  5.   int v9; // [esp+0h] [ebp-1018h]
    8 ?* M- ~* O. U" V/ J2 V6 {# q( t
  6.   char v10; // [esp+8h] [ebp-1010h]: L' R( n8 K) G, U! O2 C, N
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]
    3 k! x+ b4 r- w) i2 g
  8.   char v12[5]; // [esp+1013h] [ebp-5h]4 y7 b/ e" o( |2 E5 p8 U( ]' U
  9.   va_list va; // [esp+103Ch] [ebp+24h]
    $ W0 p9 W4 Q! X- n9 X6 F6 j
  10. ( K& K- m/ x; a$ t9 z
  11.   va_start(va, a7);0 |2 B8 b( {7 }7 j! _: b
  12.   v9 = 1;5 S( B; k) X8 [: m7 o- a- \
  13.   if ( a7 )0 R& c3 P6 R9 d# b7 _
  14.   {+ s/ d- l4 e4 w7 L' L3 x9 i" [
  15.     vsprintf(&v10, a7, va);
    9 V' ?  w$ G+ P+ f$ K
  16.     glPushAttrib(0x20000u);- [, j$ V# f  H3 h* f0 i
  17.     glListBase(base);# S- w. W( J2 D
  18.     lists = &v10;
    - w) r& x5 V9 L- |' E# e9 n4 w
  19.     do3 T' w, j# R( J4 y: _7 X8 a
  20.     {
    + x) ?- W' Q) s9 g) @8 I
  21.       *(_DWORD *)&v12[1] = lists;$ j- D: |0 Z/ n3 g7 O
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )# e9 d5 B1 `1 C
  23.         ++*(_DWORD *)&v12[1];
    : D, H0 d3 N9 n, Q; B9 }/ H0 ^
  24.       v12[0] = **(_BYTE **)&v12[1];/ O! ^( d3 ^, L
  25.       **(_BYTE **)&v12[1] = 0;. O/ G1 P* Y4 J/ g3 p4 q
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )% I* D/ Z) k- E% [
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;. J0 C& I: ?0 s6 S( l. @% w0 H0 E. x
  28.       y -= a5;
    + C! U  l; A& `# _" c+ U
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);! o% x' p1 y! N5 I" R- ]
  30.       v7 = lists;
    ! s- U7 W4 E& ^. K
  31.       v8 = strlen((const char *)lists);# e" {2 \% L2 b( R( B
  32.       glCallLists(v8, 0x1401u, v7);" l8 h* B6 J+ y
  33.       if ( v9 < a3 )
    9 u1 J% H/ P- G6 d$ i8 o
  34.         a4 += 4;$ f  w1 Y5 |- p  ~7 X- K! y
  35.       ++v9;9 a% ?7 E5 W( m& z; x/ @
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);( I4 \6 s# g: h! }0 K! P
  37.     }& G! M2 }* B6 t/ o6 A# Y
  38.     while ( v12[0] );- J; J' y; e4 H& A  c
  39.     glPopAttrib();
    & M7 ?% Y& i2 o" ^
  40.   }
    ' g3 b$ Q! x* s: S
  41. }
复制代码

! l5 H4 @' @) m+ {1 n9 L
- Y- e8 A, s! B8 }: M$ S$ O9 U! ~
3 ]0 X6 J2 J7 `1 Y
( |4 H! B! I# D  y4 ]
+ o4 M( K6 D3 d; x! {0 c( e8 l0 n* f3 U  T0 _
' ^* d5 s' h4 ~3 p1 E7 e0 o" d

1 Z0 l. L) z% e( P5 W' 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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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