冒险解谜游戏中文网 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 编辑 ) {% _$ z; ?6 U# _: Q6 m: f

1 ?0 Q& n' A% yglCallLists的调用处,共有三处。
2 R7 T; B, a7 s. F% H& Q此三处估计是对应游戏中三类不同的字幕。/ ^2 q8 m* p3 I# Z" b7 e( a: ]3 S
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。$ M+ L) O3 k/ f/ C
分析的文件名,748 KB (765,952 字节)9 @+ F$ m5 V7 U8 ]) Y0 |
toh.exe
6 M) U) l1 U) A% `. E7 L7 b# G& m& }
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
9 O) E% C& C7 e8 |3 M& P等日后再仔细研究,看显示函数究竟在哪里。5 _9 J. h2 C. W. ^# u

# B! y0 J0 ?* y. I' Ntoh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]
$ Y% B/ I% n7 X# \9 E: @5 `004316C8
, n2 d, ~% q; U9 C1 m1 Q) L. M
' `& E: b0 L, |8 T$ V5 n$ W- F第1处9 ]. d% |* s* t5 a0 V' y3 O, ?
  1. void sub_4519B8(char *a1, ...)+ {( Y5 f0 S3 n6 @) l1 X
  2. {
    7 l; t1 w+ I  y, |# o; N
  3.   GLsizei v1; // eax
    * f. ~- s: h" i
  4.   char lists; // [esp+4h] [ebp-800h]. o0 T' D0 e# Y" m$ P( |. A
  5.   va_list va; // [esp+810h] [ebp+Ch]
    ' L) i0 ?- n3 g: y( f

  6. 4 w* Q  P3 ]; o3 Y; f2 a, [& t; \! K
  7.   va_start(va, a1);
    4 J( |( d5 u( E9 N
  8.   if ( a1 )
    # J' W- S, [# E
  9.   {6 O$ K/ q& r5 M; i5 |3 `& [
  10.     vsprintf(&lists, a1, va);
      Q) n- a" o4 g9 x) V
  11.     glPushAttrib(0x20000u);
    0 q3 C" o5 J# ?! ]; r0 s- L8 A. s( W0 l
  12.     glListBase(base);
    4 \  T. ~/ T) a; V
  13.     v1 = strlen(&lists);
    5 ^2 I6 ^+ h" Q5 Y5 d. k3 C+ D
  14.     glCallLists(v1, 0x1401u, &lists);% M& [/ F# T7 {/ @% f
  15.     glPopAttrib();
    8 M, t! {4 P( g+ f; Q- A
  16.   }
    1 K. g& I! k$ N+ U& x7 G, l3 w
  17. }
复制代码

' m1 M4 U7 Q: o" L$ W9 c第2处* g, l' C* T/ p1 M" G
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...). E$ H# }+ O7 X% I% V2 y1 H  C+ A( k# |$ ^
  2. {
    $ D' q- Q6 C/ E4 i6 H
  3.   int v4; // eax
    0 S: U" K3 H; ?2 w# j4 |
  4.   GLsizei v5; // eax2 D% @- T& s7 `: E' B) y, j* D
  5.   char lists; // [esp+4h] [ebp-800h]' ?+ z, }  n% _- F
  6.   va_list va; // [esp+81Ch] [ebp+18h]; {7 o' B. w2 [) z9 d/ d4 F" @
  7. 0 v: b5 \7 o% t. x) e
  8.   va_start(va, a4);
    8 G. H/ y. z: ^! K" @. R# Q
  9.   if ( a4 )  t) g! \4 i4 |" t, V9 j, |2 d' }
  10.   {
    , u1 p, G$ O' t/ m0 \; q* W
  11.     sub_44FDD0(a3);, V1 y! b5 k$ D4 w
  12.     v4 = sub_40BB44();
    9 K/ ^# S( M/ b2 Z
  13.     glRasterPos2i(x, v4 - a2);1 h) y8 [5 g/ {) g0 V$ _
  14.     vsprintf(&lists, a4, va);* P" n: k1 M* o3 C7 c
  15.     glPushAttrib(0x20000u);
    ( i; }! X( J& Z; K: ~- H, g
  16.     glListBase(base);7 Q/ @1 ~' N; z  h; k
  17.     v5 = strlen(&lists);; i( ^! m; K! U
  18.     glCallLists(v5, 0x1401u, &lists);
    3 [- R- c3 W- u
  19.     glPopAttrib();
    3 Q( {1 l+ u8 \. h( D
  20.   }
    # l; @) x% \5 \5 z6 k! H
  21. }
复制代码

! W% f# k' y% x, Q% U
/ Y% g8 f# |4 |- B; z7 ?, P
! Q& C* I5 z" p" u: s% ^1 g第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)* B& f4 F& l. _
  2. {; b* D3 J7 j( v  j! K9 q$ `" ^
  3.   GLvoid *v7; // ST08_4
    " [" p  c$ Z0 `; [) h# Q& ~
  4.   GLsizei v8; // eax
    $ A5 r  C* t+ t" h' T; ?
  5.   int v9; // [esp+0h] [ebp-1018h]
    $ G0 V- c; w2 Z3 Z
  6.   char v10; // [esp+8h] [ebp-1010h]
    + u. K7 Z- T4 E6 f# v
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]1 f3 Z% M( N, g2 ]6 V4 d$ z$ s3 E
  8.   char v12[5]; // [esp+1013h] [ebp-5h]9 B: Y; ~  l8 A1 n0 b, J0 a
  9.   va_list va; // [esp+103Ch] [ebp+24h]
    6 K  ?6 ~' T1 ]7 L$ Q2 s
  10. 4 m0 l& v" \) ~. `" e
  11.   va_start(va, a7);) i, ^/ a  u. I4 L6 n, y+ o: m( ]
  12.   v9 = 1;% |/ k4 g& G' W8 n! h' ]( S
  13.   if ( a7 )
    ' ~% W0 {$ Z3 U0 g, P! u2 Q
  14.   {) }6 B% s. j$ T5 m1 P5 a6 h6 ]9 V
  15.     vsprintf(&v10, a7, va);8 l, F4 D* ^. }  P3 ~1 x& |% k6 T
  16.     glPushAttrib(0x20000u);" F% o7 \6 f, ?" q* A/ Q# w
  17.     glListBase(base);% A! A5 s+ w: t, I" d+ \
  18.     lists = &v10;
    ) V; L# h. {; `  m! I6 K, U
  19.     do8 D( P; }/ C+ ?. Y3 U
  20.     {
    8 x+ C' Y& F* Z/ @  m% {6 e4 z
  21.       *(_DWORD *)&v12[1] = lists;- W' c* L$ y7 }
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
    ! [* m3 U) d: g( a
  23.         ++*(_DWORD *)&v12[1];
    ; ^, O3 ~% a# k4 Y
  24.       v12[0] = **(_BYTE **)&v12[1];8 x% {% y* M3 k' H2 F* m
  25.       **(_BYTE **)&v12[1] = 0;+ `- k) ~; n) |1 D! m3 ~
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )) N# x' `% s$ d3 g, ~
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
    6 o$ \( |+ L2 d/ \! r
  28.       y -= a5;: R/ }1 Z+ F+ P  R9 M% h
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);. u  K) b( v: V) _% d, A. C# S1 |
  30.       v7 = lists;! E+ D9 K- I! C8 A+ c; A: N
  31.       v8 = strlen((const char *)lists);1 O" }+ y/ Y' g" @& Q- W5 k
  32.       glCallLists(v8, 0x1401u, v7);
    7 F! A# N! W2 b5 y: l
  33.       if ( v9 < a3 )
    / o8 a# Y* i: z, Y
  34.         a4 += 4;5 S/ |" K8 c! r2 r7 L. `% T
  35.       ++v9;2 S, e9 Z7 r% s* g6 f5 x2 C
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
    + P' s3 h; j* c
  37.     }8 Y' t+ t8 y9 }5 z' v5 c: U
  38.     while ( v12[0] );
    , M+ E4 g4 c0 P* ~
  39.     glPopAttrib();' u( V* Y5 X3 T
  40.   }
    , I6 h) [- ?: x: h, @
  41. }
复制代码
7 B  C1 C4 @& c, y3 ]: ^. ?1 x+ [" V
5 p7 p  f+ Q* Q! x% K  X
  P% `6 A' J7 L8 r
, z1 p5 }7 b# w( [1 Q+ G

$ T; p0 K+ v$ R$ x/ Q1 Q: o8 b( ^! p4 y+ V- s
5 F- U% o9 k; o7 z
8 W! C2 j+ m/ Y6 Y& {7 k





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