冒险解谜游戏中文网 ChinaAVG

标题: 【Opengl游戏汉化 #3】 魔法英雄历险记(Tale of a Hero) glCallLists 调用处分析 [打印本页]

作者: shane007    时间: 2023-9-4 18:42
标题: 【Opengl游戏汉化 #3】 魔法英雄历险记(Tale of a Hero) glCallLists 调用处分析
本帖最后由 shane007 于 2023-9-5 15:50 编辑
. K- k8 n- D3 N# M9 H) r# Z$ l) \3 V8 s
glCallLists的调用处,共有三处。
$ ~1 d( B; X4 K- _, z- Z此三处估计是对应游戏中三类不同的字幕。& Y* O/ j; M( J+ G
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。( O, w1 M) \0 U) X$ {
分析的文件名,748 KB (765,952 字节), C8 f3 r0 [) j3 _5 r
toh.exe  h3 r# K4 r8 j9 h  m

9 u- u) s  O; i5 P( R7 t经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
+ ?  h7 Y3 s6 b; E等日后再仔细研究,看显示函数究竟在哪里。3 X4 l, Q- I3 h$ a

' C/ C+ F" v) f" }+ \0 I. Q: Gtoh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]
0 T: K0 h" K9 I2 W: x  }004316C89 ^- ], H6 {; k. {
: \0 x( ~$ |! P+ _9 z
第1处3 @7 r; k" Q# F9 ?) g$ u" n
  1. void sub_4519B8(char *a1, ...)' v% i7 K9 w6 c# }! f) I
  2. {( \3 C! Y! d% G. r2 b
  3.   GLsizei v1; // eax5 B$ D+ S& D* n
  4.   char lists; // [esp+4h] [ebp-800h]
    $ j' p; I: V& ^4 ?5 _8 e
  5.   va_list va; // [esp+810h] [ebp+Ch]% Z6 i) o* G. b4 ?+ }
  6. 3 {) y7 X% t) s9 A; _
  7.   va_start(va, a1);8 V( \% ~! i5 |" G
  8.   if ( a1 )/ n# h$ W* n4 z1 M- _
  9.   {
    ; Q0 k" m) D8 N# \* b5 O
  10.     vsprintf(&lists, a1, va);; D- ]& U+ a) [0 Z. K/ q& u
  11.     glPushAttrib(0x20000u);& Z8 P2 U) Y5 o9 D% V
  12.     glListBase(base);* n: ]% \- M% j' o* h# h
  13.     v1 = strlen(&lists);
    * j! {: [7 B3 c6 n$ q
  14.     glCallLists(v1, 0x1401u, &lists);
    # i. ^# W5 T9 T! ~- X- d1 |2 t! ^
  15.     glPopAttrib();( D% L( s- b, @) `( j( X! C
  16.   }) L0 \' F3 Z0 y! m2 N( Z$ \
  17. }
复制代码
6 D- x, B9 h7 n' B
第2处
7 o) O( }" P7 p' F" |4 A4 O! j
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)* O! t/ W1 I9 r, t
  2. {5 R  Q$ A, v9 q- p3 P+ v* J
  3.   int v4; // eax
    4 k6 i! Q' t; ^5 p
  4.   GLsizei v5; // eax5 x4 p2 ^: m: w+ b8 n
  5.   char lists; // [esp+4h] [ebp-800h]$ t/ F- g4 r, t5 {
  6.   va_list va; // [esp+81Ch] [ebp+18h]
    " i" ~+ e: I6 ^7 _: Y. @" a' E

  7. ! n4 O, v5 c1 T
  8.   va_start(va, a4);
    3 i5 ~5 L2 [) W' G& }
  9.   if ( a4 )
    $ A) O! \+ G. d$ [+ e. B& h
  10.   {
    $ }3 |& c1 k" I
  11.     sub_44FDD0(a3);
    1 Z/ q. F1 |* \' d- G, \4 ]" }
  12.     v4 = sub_40BB44();* o5 `% f: E8 ?- k
  13.     glRasterPos2i(x, v4 - a2);
    4 m9 g4 i1 o. ?/ X9 P
  14.     vsprintf(&lists, a4, va);$ x. H. a9 v. r2 t* J( H
  15.     glPushAttrib(0x20000u);; A. E- V% _$ s' m* V9 k7 L
  16.     glListBase(base);' M3 b0 E4 i% @5 t+ p( q
  17.     v5 = strlen(&lists);
    5 N8 P& ]4 O0 X( |
  18.     glCallLists(v5, 0x1401u, &lists);
    " \. W; d6 r* V+ r6 U2 y
  19.     glPopAttrib();
    / x! c& |+ ?1 n: l5 p6 @; N( C
  20.   }
    , v: D; m" T( F* t
  21. }
复制代码
/ f( C$ F3 u: @' d3 U2 r
9 v7 M% M, ^+ r' k# M

. b) w- D, U) _- j3 Y第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)9 B" U, k6 z& g7 s8 L
  2. {
    1 R1 t) f) q: W  z/ F
  3.   GLvoid *v7; // ST08_4* w$ L) ~4 C# {/ t: V0 K" j3 y
  4.   GLsizei v8; // eax; L+ V. P4 c: }2 H5 f# E  m5 L5 @
  5.   int v9; // [esp+0h] [ebp-1018h]
    ) V; m) k# D/ _9 K
  6.   char v10; // [esp+8h] [ebp-1010h]
    - k( {9 }5 q5 r/ l2 |& _
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]
    0 f) i3 A; c4 w' @( d4 f* I  ?% I
  8.   char v12[5]; // [esp+1013h] [ebp-5h]
    ( m! [: I8 X/ m: U
  9.   va_list va; // [esp+103Ch] [ebp+24h]
    6 X- ]7 R( c0 b

  10. : z/ N5 u/ L1 V6 @, N- u
  11.   va_start(va, a7);
    ) d' @6 w9 J% O0 w
  12.   v9 = 1;- i& Q+ _- T6 g
  13.   if ( a7 )
    - V" G5 f. H2 O: s4 u
  14.   {
    ; ~0 `% v2 t0 `
  15.     vsprintf(&v10, a7, va);4 ^6 ?0 b6 {* M0 m4 X" i: m! p% U
  16.     glPushAttrib(0x20000u);- i0 X1 z% K% w9 ~4 j
  17.     glListBase(base);& l8 ^  {. p  L9 p8 _( B
  18.     lists = &v10;
    0 D: d, H4 P; r1 x8 Y7 B! O
  19.     do; i& n+ T3 f0 c3 N2 M2 Q$ q6 S
  20.     {
    $ W1 _1 _' r$ H6 g
  21.       *(_DWORD *)&v12[1] = lists;
    + |& G4 ~# ~% l4 |! J! q/ E
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 ), L+ q! q) _$ {; \1 t8 \
  23.         ++*(_DWORD *)&v12[1];* M( ^- Z+ P' X" O
  24.       v12[0] = **(_BYTE **)&v12[1];3 N! W/ o, G0 H7 Q- y+ Z
  25.       **(_BYTE **)&v12[1] = 0;7 C. E7 j! D$ \, Z% s" R) Z
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
    $ Y% b" W3 o9 y
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
    ; x* o9 r5 B$ c! M2 n' r
  28.       y -= a5;
    1 Y. H/ G) E1 Q4 D* D2 f  k
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);
    3 W+ B1 b' Q7 t: r4 Q/ R
  30.       v7 = lists;
    $ A0 B! D# l4 `. B5 b
  31.       v8 = strlen((const char *)lists);
    $ r$ l1 R7 r7 p
  32.       glCallLists(v8, 0x1401u, v7);) A% ?. f) |# p0 T/ p% a
  33.       if ( v9 < a3 ), C) p' U' w" w5 _
  34.         a4 += 4;
    : ]* F; m& k5 I  `4 a
  35.       ++v9;% v8 U8 x6 s/ a) @# k$ m( H* ~% U
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);' |& p! Z" k, p1 V
  37.     }7 S( Q8 b; p9 }/ t- L, v" P
  38.     while ( v12[0] );) k' p9 H1 J# U8 Z9 \8 y4 D; d$ P* _2 O' g
  39.     glPopAttrib();
    4 u/ g5 _! F% L3 V- g$ `6 c/ F
  40.   }6 N2 o( i5 L3 o4 @6 j* s! [
  41. }
复制代码
: U6 F; J1 H% t6 }3 Q9 x

/ J/ S$ y/ n3 e/ U' h
% s2 f* s  Q. I  a$ `, N+ i9 f' A  G1 v( M( k
( [! X" \/ x9 z! g1 e. c

7 O- ~. O1 {7 {6 @* K4 ^: Y, J1 C+ b. c$ O' G- o, _0 D  ^
5 N7 J3 Q. z  a





欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2