冒险解谜游戏中文网 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 编辑 ' g* \: x* g4 c

4 U& r2 p8 {6 O; O. AglCallLists的调用处,共有三处。  Y: v7 F- @& d! {: e
此三处估计是对应游戏中三类不同的字幕。  t1 d% B: l* h9 l9 Z' Z* P2 T
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
3 o4 I4 `5 Q; y% o( W4 O4 t7 e分析的文件名,748 KB (765,952 字节)
+ m+ w  Z, _, k8 ^9 c5 N1 Ctoh.exe
+ T# R# D& |7 {' X
0 ?/ B6 C0 L8 h1 L5 B6 N经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
: S5 w9 r4 ]' }+ g等日后再仔细研究,看显示函数究竟在哪里。: U7 B( g" H9 h' ~

  x! I1 K2 h- Y$ l; xtoh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]
2 o4 l  U  e8 V) K5 V004316C8. ^  ?. Q1 z" o, A$ J
/ ]6 A' ?' |0 C( R2 ?: |
第1处
+ Y. u: u; g+ _7 M% z& g
  1. void sub_4519B8(char *a1, ...): T) [0 b9 y" }( z! B9 @& `( p: V" V
  2. {
    1 B" B7 e; O# F) \3 f1 E# z8 G% d  P/ O
  3.   GLsizei v1; // eax% d; S' Q( b  {3 Z( P/ H
  4.   char lists; // [esp+4h] [ebp-800h]
      H* o! m9 Y2 _! O; x3 W6 t# g
  5.   va_list va; // [esp+810h] [ebp+Ch]% ]/ p# }9 `1 t

  6. ; K! h. h; V7 O% h& ~
  7.   va_start(va, a1);
    , ^# c1 c' i, o! \
  8.   if ( a1 )" \2 c+ `) q/ X8 @+ V
  9.   {
    " l5 n7 A. o! ]& V: T: A
  10.     vsprintf(&lists, a1, va);- |' j1 c/ T& d0 X8 [* l9 }; O0 x
  11.     glPushAttrib(0x20000u);
    # ~7 h" K' l% H  J8 g/ J. Q- J
  12.     glListBase(base);
    " f% x" o+ ^8 M+ Z* E: ?
  13.     v1 = strlen(&lists);
    7 N6 X2 X, D: ?1 B$ k: h) N
  14.     glCallLists(v1, 0x1401u, &lists);
    # C9 g3 w8 w. ]  P5 V6 M+ H
  15.     glPopAttrib();
    ; ^: Z/ r- p. K9 J
  16.   }
    ; ]! v" ]( Y9 }, o7 b
  17. }
复制代码

, G* {$ C" I& B6 a+ c: T6 G( g第2处! J% l+ z6 o- ^  U$ Z& k( n
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)5 C) V/ f: S/ g# M- H5 G. p
  2. {* ^) n/ \$ d5 X2 v0 U: K
  3.   int v4; // eax* z# d) ?' h7 n8 ]2 {
  4.   GLsizei v5; // eax
    0 i1 |5 v3 P8 \& g5 A, L- S( F/ Y
  5.   char lists; // [esp+4h] [ebp-800h]
      Z! I. S- ^% M3 N- ]
  6.   va_list va; // [esp+81Ch] [ebp+18h]
    7 W" Q4 ^  ^& f5 o/ j' w
  7. 8 C2 c: H" D7 @/ y9 s
  8.   va_start(va, a4);
    . m5 A6 T: `/ o. c- i3 Z0 y  Y% n# Z  x
  9.   if ( a4 )! z+ T/ p5 Y0 }( A  i) G$ m/ n
  10.   {
      d: o* v+ `0 X: `
  11.     sub_44FDD0(a3);" g3 A" F1 A4 w( l
  12.     v4 = sub_40BB44();2 M  L! a; y8 B3 t& ~' Y4 ~
  13.     glRasterPos2i(x, v4 - a2);! ]- r, h$ s0 p( @! q& I( ^# C  C6 T
  14.     vsprintf(&lists, a4, va);
    , t/ y4 K2 R+ |2 o& Y  N+ q' I
  15.     glPushAttrib(0x20000u);
    ! u1 I: V' M" l  L
  16.     glListBase(base);) e5 x- a" o; \1 F
  17.     v5 = strlen(&lists);
    * }* e& ^: m! R3 d
  18.     glCallLists(v5, 0x1401u, &lists);
    5 F: U8 v2 m0 a. b2 G, p  K
  19.     glPopAttrib();  [% z( l; a2 l& a
  20.   }7 O9 C: z& {& ~2 J4 [4 [, G* ?% @
  21. }
复制代码
$ U5 @) z* X. S8 w) A' d+ v
4 n: V3 w* H+ B% H* z

$ e. [/ z) X# E9 O& s7 O第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
    8 k' V6 A( ^. z' y3 Q% g
  2. {
    " _' u3 N+ D7 r$ w1 V
  3.   GLvoid *v7; // ST08_4
    3 k; Z$ `' G: O9 ]5 q, C* g
  4.   GLsizei v8; // eax
    ) B* y8 f; o: x6 J6 U8 g/ v) Z7 `
  5.   int v9; // [esp+0h] [ebp-1018h]
    $ @* V# \$ z5 H6 f$ u5 V% g: [
  6.   char v10; // [esp+8h] [ebp-1010h]' h. U# Q) h! }" p) o; d3 i' @
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch], l: O3 ~7 v& Y3 v4 u
  8.   char v12[5]; // [esp+1013h] [ebp-5h]
    4 H% F, N( i% J
  9.   va_list va; // [esp+103Ch] [ebp+24h]+ }$ F* g/ P+ q0 ^% ?% e, v

  10. - k8 W4 W9 o  T. h
  11.   va_start(va, a7);; e; V. N, S8 X
  12.   v9 = 1;
    + m! n2 y' r: u" Z5 Y, D6 V8 x
  13.   if ( a7 )+ M% Z% M8 C) l+ E  D- L
  14.   {
    * F/ u" }+ J" U8 W5 c6 t
  15.     vsprintf(&v10, a7, va);
    3 ^; D) U) l( Q' y
  16.     glPushAttrib(0x20000u);- E  ^: X$ m' x8 `2 Q4 T
  17.     glListBase(base);
    , [1 O) \3 a# C& n! n; w
  18.     lists = &v10;* }7 D. v/ Y0 R& W
  19.     do6 x$ j1 g. M+ r$ A# h6 t
  20.     {' b( e. i' n, G. g) X5 b' J
  21.       *(_DWORD *)&v12[1] = lists;
    + f1 F. ]( G! l! ^0 y! s" q3 ^1 W
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
    * ?% E' q1 k+ D1 U; s
  23.         ++*(_DWORD *)&v12[1];/ @# D$ w7 ]! e
  24.       v12[0] = **(_BYTE **)&v12[1];4 p0 ?( ?+ x& Q. E+ A5 K' w
  25.       **(_BYTE **)&v12[1] = 0;
      P! V: v! |# Q" K
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
    0 i- Q2 L& S, K! x- o8 M& l; X2 A
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;% Q) }, {5 X% t: z. V
  28.       y -= a5;( p. B/ e$ c# `0 Z
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);
    - [6 [, J# z1 ~
  30.       v7 = lists;
    ! ]( ~6 o8 \3 b8 X; h' B1 V4 \
  31.       v8 = strlen((const char *)lists);: ^1 Z& f) d5 G* a& ?
  32.       glCallLists(v8, 0x1401u, v7);- g1 E1 S& |4 p+ v( o' C# F
  33.       if ( v9 < a3 )
    ) g7 r$ \: ~6 x" [' f
  34.         a4 += 4;
    - [+ y9 ]5 r8 D' S! ]$ M
  35.       ++v9;) D2 n" j; q2 A. P7 L7 _$ [
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
    : j/ i% j; h/ [* F
  37.     }
    % X9 r. G  `4 g+ R9 b. u8 \
  38.     while ( v12[0] );4 r9 W" |" r4 W7 Y) `8 @% A
  39.     glPopAttrib();: H) y7 E& o9 ^  @6 n3 r8 V
  40.   }3 w" c" U# Z1 ?) i6 l5 e0 X
  41. }
复制代码
# m$ x9 N/ _2 p8 G( q- r+ o8 p+ }

; j! H) d( o/ A6 @! m/ ]8 i* ^$ s/ K! o

! n9 T6 I! z; O' q
( s1 s6 ^0 K9 v, B1 ]% @2 s$ h. H6 j/ T9 Y, l. ]% i  X

" T* _; s7 Z3 ?
3 L$ u, W+ c5 X+ L: v2 c




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