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

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

[复制链接]
查看: 485|回复: 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 G$ Y0 W, ]; M- Z) T: @# G
, {- S, z! }/ e4 ~
glCallLists的调用处,共有三处。
& B# B) q% D. ~5 h% h; y, ~此三处估计是对应游戏中三类不同的字幕。
5 n  Y+ q9 d" a6 Y; Q5 X接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。/ g4 k' m5 Q% b
分析的文件名,748 KB (765,952 字节)
1 F* d5 i4 h6 Ytoh.exe7 J9 B! D9 P, ^0 F% B
, [+ c# G1 j+ x
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
% ~! B$ m7 R3 T6 p+ _/ N+ i等日后再仔细研究,看显示函数究竟在哪里。* L& I9 s) c) U& ]' A& q

. b; l& N4 |' D' k, x* o% J3 Ytoh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]
  g/ @! g2 N0 V* }' n004316C8
) W3 }& f5 M3 X, v- ~6 l* A. g/ }2 T3 U% g- ^6 H
第1处+ |  \4 Z6 z$ C$ e) @
  1. void sub_4519B8(char *a1, ...)# e8 b3 C9 A$ f0 U: ~# |) C
  2. {. r5 v  F3 ^- r4 i" c. X) F! Q
  3.   GLsizei v1; // eax
    : t+ ?" P) C" @2 F4 ^5 `) ^
  4.   char lists; // [esp+4h] [ebp-800h]
    0 W6 c9 l  T1 R. a6 ]( S; f
  5.   va_list va; // [esp+810h] [ebp+Ch]$ z7 a& ~% L: _% k2 n1 r7 c
  6. % }* d* c9 _7 n; k. k& k5 U
  7.   va_start(va, a1);2 w" n, t2 A, {8 I" G) j
  8.   if ( a1 )' ?5 @. t* x" x/ e2 j& s, R; m, U
  9.   {9 \/ _# |, }( H1 _
  10.     vsprintf(&lists, a1, va);
    " n! E- c8 o: l1 X% Y' `
  11.     glPushAttrib(0x20000u);
    ! q4 @4 D+ l5 v  L  {4 s
  12.     glListBase(base);% k! h8 h9 L- j; R
  13.     v1 = strlen(&lists);" b+ k, f# ~" ^
  14.     glCallLists(v1, 0x1401u, &lists);
    . y9 E5 I+ G" N2 d3 Y. P  Y
  15.     glPopAttrib();
    * B& u4 F# S& G# h
  16.   }
    8 P  w6 ]# b( \! T: H+ B+ a" b
  17. }
复制代码
+ k  v3 T" ^- n; ~# G5 ^
第2处
; W- N' Y; r( i2 b7 O2 A' V8 c
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)8 B4 S' t8 S% c- o* W2 y
  2. {/ Y% G' n& M  a4 G9 @% `
  3.   int v4; // eax/ i+ G5 `* V1 h" Y& l0 x6 }
  4.   GLsizei v5; // eax
    1 t+ z, M+ i. }* g
  5.   char lists; // [esp+4h] [ebp-800h]5 \' j2 J% K3 v! X" X
  6.   va_list va; // [esp+81Ch] [ebp+18h]
    0 l/ u( {, w  ^+ v" G5 {2 R
  7. + u" H$ H4 X! S/ G% q' k* a* ~
  8.   va_start(va, a4);
    # K1 {) y+ V, h
  9.   if ( a4 )
    9 q+ p9 [2 I5 X/ R9 N; j& r
  10.   {% O1 S% k5 I  ?: j& N* c
  11.     sub_44FDD0(a3);! w6 P6 c  |: L1 J2 \
  12.     v4 = sub_40BB44();
    1 w' ~8 B  A" }5 Y4 P; ]; Y
  13.     glRasterPos2i(x, v4 - a2);* w' H" @1 m2 u% _% ^
  14.     vsprintf(&lists, a4, va);: w2 F# Y0 s( Z- l
  15.     glPushAttrib(0x20000u);
    ; A* P6 z( i0 S( T1 T. |/ x& Y
  16.     glListBase(base);
    1 F- P4 d5 c" ?
  17.     v5 = strlen(&lists);/ T! U8 C% B8 L: [* t) b; z* l
  18.     glCallLists(v5, 0x1401u, &lists);3 A! N  q- \5 f  @) k2 D6 I
  19.     glPopAttrib();3 L- b( D" {: a/ R4 d( X8 {
  20.   }
    . _3 Z" w% z% D$ p' }* ]' w% M
  21. }
复制代码
7 ?$ w1 l% L3 P: z) c: j

3 b0 h- [' k8 D0 ]
" H& n( z6 y/ Y% q# }# t6 s! z第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)' U$ ~9 h% a' L9 ?4 _% J
  2. {
    * p, k* n, v: ~/ K5 h( ]
  3.   GLvoid *v7; // ST08_4, W3 i! u3 z+ C* ?
  4.   GLsizei v8; // eax: l9 I9 Y2 P' j
  5.   int v9; // [esp+0h] [ebp-1018h]
    & V; P; K; k& O# c4 ]- ]5 `% n% q/ _0 Z
  6.   char v10; // [esp+8h] [ebp-1010h]
    8 O9 _' U, O0 l# X4 o
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]
    ( R, a- l3 R/ I4 N
  8.   char v12[5]; // [esp+1013h] [ebp-5h]: h& E4 u( z: c: r: J, y" t5 t
  9.   va_list va; // [esp+103Ch] [ebp+24h]
      }  k) {" S6 j

  10. 8 O, Y; M. J2 u& P# [
  11.   va_start(va, a7);
      S: G9 C& z! b' Q: G
  12.   v9 = 1;" U. a. V; m2 j4 h0 x
  13.   if ( a7 )
    % l% h/ B; p& u( T
  14.   {( E7 x. X: b2 [
  15.     vsprintf(&v10, a7, va);" G; X# ?+ D" |+ D8 f0 _) N* H
  16.     glPushAttrib(0x20000u);- q) M' ~0 `- _
  17.     glListBase(base);! ~$ w+ z0 D' Q2 n  @2 z: C
  18.     lists = &v10;' M1 W& {# u  n( D" M2 c( Y1 o
  19.     do
    , y  f8 J; O1 O: q2 s  m, r) J3 G4 F
  20.     {. s2 A4 X7 |! F& B3 k; z# H3 ?  J
  21.       *(_DWORD *)&v12[1] = lists;
    / Q  F9 V4 V1 J! Z- t
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )4 c4 {9 Y. a, `; m' Y0 o
  23.         ++*(_DWORD *)&v12[1];1 `9 d0 O$ P- p4 m6 u
  24.       v12[0] = **(_BYTE **)&v12[1];
    5 q  y9 O# V. B  v* G- J: U
  25.       **(_BYTE **)&v12[1] = 0;3 l1 h5 j- f1 s2 D  M! s6 D/ U
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
    3 Z' ^/ n: E) |0 z
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
    & n* b% O2 b: D1 p/ H8 R5 l# {
  28.       y -= a5;
    - Y: Y0 k% h( Y% H; Z
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);
    / o8 Y  D' }+ h5 e" U$ I0 [7 d
  30.       v7 = lists;$ a; }. x. F2 o0 e/ C
  31.       v8 = strlen((const char *)lists);$ r- _+ o* V9 O& c* z
  32.       glCallLists(v8, 0x1401u, v7);& g* W; p$ }) e$ r" w, T* T
  33.       if ( v9 < a3 )# r4 Q( d* i' H' s7 l5 C8 F
  34.         a4 += 4;
    * n1 F% L( F- w9 `- ^$ o) {5 g
  35.       ++v9;: m; a8 F1 @8 H8 j: P6 p
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);, x' F7 d& D" r/ x5 c5 ^. S" W
  37.     }# A9 a* |* w& r1 T3 X1 X
  38.     while ( v12[0] );2 i/ U+ a" a# l, [1 M7 m( m
  39.     glPopAttrib();
    5 O% i, c. ?' B
  40.   }
    $ F) ?1 B, Y+ N3 F& p4 X
  41. }
复制代码

5 N# ^8 b# F  E5 H# W. p& ^
& K% L1 ~  Q2 g- b" a& v9 k- y7 [( j" e0 f- A
9 z) T/ ~' r+ |- \" a# u5 r5 M: f9 k
  h, o% `: a/ R0 k

6 r0 H( ?+ o$ G9 m! b2 }# g" e  T0 }3 d1 m

& f' l4 i: Q; X$ ]9 m
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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