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

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

[复制链接]
查看: 299|回复: 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 P1 i# ^/ k- B1 ]) H, c4 j8 \
2 r( H* a) v- ~# h
glCallLists的调用处,共有三处。
1 A4 K! y7 h5 E8 N$ E+ G5 ]" |) d# K此三处估计是对应游戏中三类不同的字幕。
" m" p8 _9 p) m. Q1 k# S0 L+ L接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。8 U1 P+ o- D% D2 a
分析的文件名,748 KB (765,952 字节)
% n0 z5 ?: a0 P0 I" }. z( v9 Q9 [toh.exe
9 E! @6 z& L6 C' g2 ]$ ~5 }4 K- K! ?! e1 t  N
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
) a3 V  W4 w) v5 I) c& r7 D等日后再仔细研究,看显示函数究竟在哪里。& O4 V0 `) H& {3 W! z5 ?

0 T+ ^' q( O: U9 p9 ztoh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]
6 v. r# w( [. x5 z004316C8
4 Z% A. C0 b9 D$ t: h* T) P) l# {% O, \
第1处1 X0 F$ S/ d( h8 Q2 K- U6 I
  1. void sub_4519B8(char *a1, ...)
    8 l- G- X8 o- c. b% c: z5 i
  2. {
    8 |! L, X4 v8 E1 V) Q
  3.   GLsizei v1; // eax
    $ E6 v9 J) j/ z9 j- G4 M
  4.   char lists; // [esp+4h] [ebp-800h]1 R9 C7 x+ q+ N2 n
  5.   va_list va; // [esp+810h] [ebp+Ch]
    ! ?1 D% J. V* W5 A1 e  Q/ G# m" u3 r

  6. " s" Z/ T+ i' N& l" F* K6 d7 \8 s
  7.   va_start(va, a1);
      [3 q0 ]: k4 b8 @( Q! k) d9 B; P
  8.   if ( a1 )% Q2 w$ _3 b# e9 I7 K  A5 w
  9.   {
    : L2 W. n+ r2 L4 q6 w2 L
  10.     vsprintf(&lists, a1, va);5 J3 Y1 l0 j$ g0 E3 a6 H
  11.     glPushAttrib(0x20000u);
    ; j) \) |0 A# ^
  12.     glListBase(base);
    - h1 Z8 d& j6 [) q
  13.     v1 = strlen(&lists);
    0 _5 |! f1 z6 A
  14.     glCallLists(v1, 0x1401u, &lists);
    5 t: y# c. @$ S
  15.     glPopAttrib();
    1 Q0 Y0 e; L; W
  16.   }2 m5 P; ?. A& c5 ~
  17. }
复制代码
1 K! \- x6 }* f! j# h( e% C: R
第2处" S5 c8 ^& r( z; U& a: o8 r
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
    3 m' `1 w6 A0 u
  2. {
    7 b/ `& U% F3 Y9 o/ |$ f- p
  3.   int v4; // eax
    ; }" _: C3 y4 f7 B' @
  4.   GLsizei v5; // eax
    4 N7 b! Q1 o: a3 E/ t2 K
  5.   char lists; // [esp+4h] [ebp-800h]# ]/ M: u$ D7 _) C
  6.   va_list va; // [esp+81Ch] [ebp+18h]5 G! i, m6 g. D3 R! Z% U5 Q
  7. $ P8 O5 W1 |- |; v9 I
  8.   va_start(va, a4);
    : U* Q  @4 c# G6 e1 K* h
  9.   if ( a4 )
    9 Z0 m" |  y0 c5 N3 U! ^. v
  10.   {
    1 B& \% z8 A# A4 b. `$ c
  11.     sub_44FDD0(a3);
    : c/ P1 C4 o, B2 O" M5 {; F
  12.     v4 = sub_40BB44();$ S. l3 W2 \# |9 D
  13.     glRasterPos2i(x, v4 - a2);& w# Q4 r2 X- a9 c' t2 P
  14.     vsprintf(&lists, a4, va);
    # g. F$ z4 Y3 I6 B
  15.     glPushAttrib(0x20000u);4 z7 C. u( D3 H: c. X! z
  16.     glListBase(base);' Q9 a7 F8 e& L  z
  17.     v5 = strlen(&lists);
    . U" _5 U3 W9 k2 N% o. ^1 R9 P& G
  18.     glCallLists(v5, 0x1401u, &lists);
    " E7 P' Z7 u7 Y9 u; D8 `& E8 S
  19.     glPopAttrib();
    5 z. f. b9 s  W- q
  20.   }3 }+ n' s$ L/ C) P" y. Y
  21. }
复制代码
# ?( t7 ^8 [/ ~; a) m2 s* w  W
2 `# p. c, _8 m: c. G8 C

+ w* y7 I" f6 }! F4 A3 v; j第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)$ E/ P& i3 d# A5 u& k: J5 t# h4 V
  2. {2 X3 P& K/ w8 s: R* B1 V) w2 c* i) A
  3.   GLvoid *v7; // ST08_4
    ( y2 a' G; l2 e6 V4 T) q/ }& v
  4.   GLsizei v8; // eax
    0 ~$ P# g6 A: v/ ^, s5 z
  5.   int v9; // [esp+0h] [ebp-1018h], _  l: d( P" C6 h8 B$ a
  6.   char v10; // [esp+8h] [ebp-1010h]
    9 m4 e% {+ F) R7 c( L
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]* _8 J- f% |$ Y& b! _0 E6 s
  8.   char v12[5]; // [esp+1013h] [ebp-5h]
    3 m4 W1 E4 [8 @+ E" q
  9.   va_list va; // [esp+103Ch] [ebp+24h]
    ) z) ]* D; m4 {

  10. 8 e" c! |5 r. \# b/ s4 X) C0 h
  11.   va_start(va, a7);# V: H5 W8 c! ]) Y7 \
  12.   v9 = 1;7 N, }6 `% U$ s* S* p6 w7 D' J2 e
  13.   if ( a7 )6 [* ^7 g7 O; \( k- A# e' O) Q/ Y, i
  14.   {
    ' [7 g! J* h; k* `) [
  15.     vsprintf(&v10, a7, va);
    ' p3 l7 n) m  N7 p
  16.     glPushAttrib(0x20000u);; D% s% \# \- c6 g
  17.     glListBase(base);
    # N1 }% O) Q: }
  18.     lists = &v10;
    7 J9 o, Y0 _: T/ c! `
  19.     do3 K; K8 ~: M7 L9 B. |% U% H& z
  20.     {) \2 n  I5 h  Z$ n8 Y9 \+ N2 X
  21.       *(_DWORD *)&v12[1] = lists;% j+ @' j$ b+ K. ~/ {: r
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
    3 A" s5 `: `; x  B9 X* d2 J+ w
  23.         ++*(_DWORD *)&v12[1];) r; ]6 ^- y4 Y& ]" G2 g* C
  24.       v12[0] = **(_BYTE **)&v12[1];
    6 n: u: E1 P$ i2 S! I/ f' n
  25.       **(_BYTE **)&v12[1] = 0;
    ( z0 q4 n( R2 ]
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
    2 g- U; q: ?3 p# c6 @* o
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
    3 N3 n# _' f. M) {9 [' B7 Q
  28.       y -= a5;
    : I" r- [( ]9 |1 X
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);
    ; |0 O9 b  {- t( ^; v( R: D6 M
  30.       v7 = lists;
    ' ]: ]1 w9 N$ A6 U
  31.       v8 = strlen((const char *)lists);" Y7 X* Y/ ~5 Q5 l
  32.       glCallLists(v8, 0x1401u, v7);9 m, n* O& t+ @* z) m. f
  33.       if ( v9 < a3 )0 w- K8 S; E* k% `8 l
  34.         a4 += 4;+ _6 T1 [4 u+ T6 K' ?
  35.       ++v9;
    " \% f1 U' O& }3 D3 ?3 W  Y( p
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
    ! o% }2 F! R7 S- I) y
  37.     }5 _# S" o7 n5 _3 t1 \# R
  38.     while ( v12[0] );9 S' F' C$ I5 q5 b7 P+ T: X
  39.     glPopAttrib();
    5 b; Z8 D' x- q% S* f+ k8 s/ T# E
  40.   }
    + p% [3 m/ i4 p8 O
  41. }
复制代码
  R8 {  G8 G1 d" @* I

  u2 b5 x7 R/ G2 ?: N' c
5 X: _5 l( q5 Y1 ?+ O: p
$ E2 B( W3 m) N( x
: j' D# O. |. o4 \, q
4 [7 n, O1 O( I6 Y8 Z5 ]4 G3 c& W" x3 A7 C3 p% h; h' N

1 o' j% [9 V/ Y
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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