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

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

[复制链接]
查看: 482|回复: 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 w0 i5 Q3 b# u

3 M3 h; ]: @; v9 r/ oglCallLists的调用处,共有三处。
8 O+ Y, X( L+ Y& Q7 n* y4 i此三处估计是对应游戏中三类不同的字幕。
8 g$ w' [6 s1 c# R' t4 r3 u接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。! q1 O* B  x: J
分析的文件名,748 KB (765,952 字节)% L6 A. l  u7 q* o+ ]
toh.exe. E3 K. |( k0 y
6 T. f4 J. U# a- l: Z; z4 d1 T3 Q
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
0 _. S6 [( D2 w1 R等日后再仔细研究,看显示函数究竟在哪里。. _* {  T, q. H( v* M+ _$ m! D+ f
+ G* [5 O5 U, l" i4 u  Z; S. s6 P9 j
toh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]
: C- l9 [0 C% B9 ~004316C8
/ Z; p4 w9 h3 g  b( e( J; c( k+ ~' a+ T5 O. @. ?2 I
第1处: C: l! p% N7 K* `7 T
  1. void sub_4519B8(char *a1, ...)
    % N4 l0 w) v* [+ {( }7 C" s# W! g
  2. {0 i4 L+ m- Y/ H( M  w
  3.   GLsizei v1; // eax( ]% w2 U& U6 Y% i( ?5 ~
  4.   char lists; // [esp+4h] [ebp-800h]
    , ^% N7 J2 o% B% a
  5.   va_list va; // [esp+810h] [ebp+Ch]
    9 r# S1 `$ {# D$ p, X$ Y' |+ D
  6. 5 s: \; M# l6 G# X0 p% W
  7.   va_start(va, a1);
    $ T4 S) m2 U. K# C3 E7 p
  8.   if ( a1 ): b1 H( h) D+ y5 p' O" |! q
  9.   {5 ]1 ]# }$ F9 [4 e
  10.     vsprintf(&lists, a1, va);7 o( o+ v6 U7 I
  11.     glPushAttrib(0x20000u);) s$ }: d! u  b  |$ h- z+ K
  12.     glListBase(base);7 Q1 s9 ~, G' Q# S+ T% T6 P: a
  13.     v1 = strlen(&lists);
    ( P, A9 t+ q! V- M; N7 _9 j
  14.     glCallLists(v1, 0x1401u, &lists);9 `) q5 Q6 d; C# p8 |* }; l0 V& g
  15.     glPopAttrib();
    2 F9 M: V0 s1 F" s
  16.   }2 I. T: S$ s9 U& J; `& _
  17. }
复制代码

" R! r& C! C* p' X7 w5 h第2处( }+ T1 y: P& n1 |! P) Y. `
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
    * h9 V+ A7 C3 i( O1 T- d7 R
  2. {6 j  Z( U- P, Q: n4 Y
  3.   int v4; // eax2 @2 v& x  l  z
  4.   GLsizei v5; // eax/ o6 D; M( |6 ^% j
  5.   char lists; // [esp+4h] [ebp-800h]& n* D7 R/ s" |& d! o
  6.   va_list va; // [esp+81Ch] [ebp+18h]
    2 H( O' y9 [& Y4 _

  7. 6 b+ n+ e9 f- o$ Y
  8.   va_start(va, a4);
    " ^* @" J4 w4 x+ G& A  ~
  9.   if ( a4 )
    / v. X* j' I( i6 V
  10.   {9 W" q. G; l: q5 k% I& w$ }
  11.     sub_44FDD0(a3);
    ; v' r% v- H/ H! q2 N4 ]! N. J
  12.     v4 = sub_40BB44();1 Q* p2 T, _  n- O6 J1 y
  13.     glRasterPos2i(x, v4 - a2);
    2 V( L. q6 N3 K% a0 g
  14.     vsprintf(&lists, a4, va);
    : D* m# i6 U, ^2 E8 u. N
  15.     glPushAttrib(0x20000u);& V+ f6 ~+ f( R/ G; E# _; Q' E
  16.     glListBase(base);4 F; o8 [6 w$ W( P  p/ O3 N. p
  17.     v5 = strlen(&lists);
    / s- Q; J( j/ h! o3 J* ]7 f
  18.     glCallLists(v5, 0x1401u, &lists);4 O1 D' o, x- r0 i+ j
  19.     glPopAttrib();; U; J. a. |1 [  A+ N, m
  20.   }3 W- ^8 [  V% k8 `$ n% Y# j
  21. }
复制代码

) o2 j, h, S, y0 q. u) l, J
6 x5 [* I  g/ y9 ~, C9 @0 U1 A' ?" K6 f( s; _
第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
    7 b) q6 ?1 X  R1 E/ B" _* h2 h- [7 k' ~
  2. {  N& w! {+ Q7 `. w# l
  3.   GLvoid *v7; // ST08_47 M, m& K2 F* j' |4 @' w
  4.   GLsizei v8; // eax
    8 s( M7 ~! m8 m6 X: E$ J' D
  5.   int v9; // [esp+0h] [ebp-1018h]8 F. i4 z* J9 `7 @$ r
  6.   char v10; // [esp+8h] [ebp-1010h]8 {4 N8 u. Q/ `; U. ]
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]
    ; q0 R# Z6 a# D
  8.   char v12[5]; // [esp+1013h] [ebp-5h]+ z0 H. z5 ~2 p. V
  9.   va_list va; // [esp+103Ch] [ebp+24h]' w: X9 Z4 P7 [5 n0 j- I# Y# d

  10. 3 s5 s; B/ g5 P( V
  11.   va_start(va, a7);
    4 i4 n0 x$ y  M, s
  12.   v9 = 1;2 L: V3 f% ?! \$ q( u) K1 l5 v
  13.   if ( a7 )
    9 j& E  |2 F$ z& S# A8 m% A
  14.   {6 {9 c  q2 f4 k% B
  15.     vsprintf(&v10, a7, va);
      G' _: @, O( N! P: }
  16.     glPushAttrib(0x20000u);
    ' N$ r; l0 @1 c$ }
  17.     glListBase(base);# F. v) E) n; x( V/ O: S
  18.     lists = &v10;
    ( B2 _& U* s1 D4 s. f( @! A
  19.     do6 f  p% V- q4 O3 I
  20.     {) R9 A& M' g- J0 C
  21.       *(_DWORD *)&v12[1] = lists;  d1 j! |9 d. f1 a
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
    & f% _2 c" o  L$ }
  23.         ++*(_DWORD *)&v12[1];7 d0 W* m: b/ Z9 n4 M1 q  y
  24.       v12[0] = **(_BYTE **)&v12[1];' i/ e% v9 F' M5 y4 y4 z
  25.       **(_BYTE **)&v12[1] = 0;; r; e* I3 y+ _6 Q( n+ H3 V
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )$ w8 f# a% ^6 [
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
    % ~3 o. H" s; I/ N7 p$ O& Q1 f
  28.       y -= a5;, z! o* b6 ~3 c$ Q
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);1 O3 A% |0 R3 s+ Q  p* R
  30.       v7 = lists;
    3 ]1 y+ H( T4 x" {6 _
  31.       v8 = strlen((const char *)lists);
    " y' b0 X5 P+ i, c# I
  32.       glCallLists(v8, 0x1401u, v7);
    1 j- }8 |+ o; {; o
  33.       if ( v9 < a3 )
    # G* W  \) a* V9 b( Y# u
  34.         a4 += 4;
    * m/ N9 |: X( Z, Y4 r: q
  35.       ++v9;6 Q7 f5 \7 U# R6 u3 u6 V
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
    . W) m+ R  L9 t- f2 }1 Q
  37.     }  Z, g  a7 R4 g. K! U# h! v
  38.     while ( v12[0] );
    + z! N/ E% o0 H5 g+ e4 ]. b% [
  39.     glPopAttrib();* [1 t6 ?( T4 V$ ?% B3 Z' s7 m
  40.   }
    1 A+ _+ s7 y8 q5 ?
  41. }
复制代码

' [* t' j# o! z$ y$ U% H8 O
6 N8 Z8 n) H$ l4 q) O
3 L1 @7 e1 G, S# w/ W/ M# m3 J, c0 ~) o1 o" P. Y; e

2 S# B, W6 y) `5 }$ f: {( A$ v0 n- h" ^- t& P" ?3 B7 e
5 w: h$ u( o/ A. h
# f( u4 H: v& i/ ~: V$ @: }
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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