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

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

[复制链接]
查看: 307|回复: 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 编辑
1 i) b+ K+ U2 C1 O5 F
3 J! X, S% i3 t+ U9 n7 N+ f, RglCallLists的调用处,共有三处。7 j8 I$ I. R& X' W
此三处估计是对应游戏中三类不同的字幕。) A9 j% f1 _) t* _: ^' b: |1 {/ g
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。# M- N# k% y* F4 C1 u
分析的文件名,748 KB (765,952 字节)/ Y* w% t; D3 E+ a+ Z4 i6 W- P
toh.exe7 z. ?5 o4 e% [0 K

+ s9 `3 Z: v$ p  \* l; @$ E, T' P' z经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,& f9 y. i/ x. F8 f; z8 U. n
等日后再仔细研究,看显示函数究竟在哪里。( G8 j- Z% [8 N: x- \
, [& F% r  X) J7 I) q+ P
toh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]
- ]& R% M7 ^; w2 V004316C84 J& B+ q+ B5 y

# t& T) E4 [4 ^, o+ F+ _+ G第1处
& l6 p. C9 }& l5 z2 [" i
  1. void sub_4519B8(char *a1, ...)
    6 R5 |3 l5 G2 v& p
  2. {0 _" D0 l/ L1 D' B
  3.   GLsizei v1; // eax
    2 E1 e1 U6 n7 ^0 ]% ]( f
  4.   char lists; // [esp+4h] [ebp-800h]
    & f! x) n2 T' E6 b, |
  5.   va_list va; // [esp+810h] [ebp+Ch]
    $ @2 N# t. O  W2 r
  6. ; `8 z; k" l3 |% A$ {1 ?% N
  7.   va_start(va, a1);
    2 [, k/ S2 o# A/ ]- r9 C3 c
  8.   if ( a1 )
    - T5 @9 }% a. B6 G
  9.   {. {7 y% [: m3 v2 G7 c; @3 f9 b4 r5 f6 c
  10.     vsprintf(&lists, a1, va);
    , k* h! m% H6 n' }! m( ^
  11.     glPushAttrib(0x20000u);
    , D5 A" p) {( H2 q
  12.     glListBase(base);1 M* p4 \. K' g2 }# e, k& _2 d! w
  13.     v1 = strlen(&lists);
    2 q3 `% B  O0 k/ @
  14.     glCallLists(v1, 0x1401u, &lists);
    ! \2 O- V1 o* n: R
  15.     glPopAttrib();$ _- \3 e. q! h( x- v' f. |
  16.   }
    $ E+ b2 f. o1 o) W
  17. }
复制代码
6 [. x3 Y8 r" ?& \6 W! o
第2处5 b) z' Z* G- J" t6 e( k) C
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)- y  A$ |" ~. e; U
  2. {) d, }  H9 W: ^- M
  3.   int v4; // eax# v( F7 o' L& U+ Z- C, f* {
  4.   GLsizei v5; // eax# G% \+ m; U" W% R4 {& ]
  5.   char lists; // [esp+4h] [ebp-800h]
    0 p6 o, S/ o, B- K
  6.   va_list va; // [esp+81Ch] [ebp+18h]+ j( F7 E+ o0 q7 T: \
  7. , f" ]3 m  X5 f
  8.   va_start(va, a4);7 p% E! \$ [5 |! I3 z
  9.   if ( a4 )
    & r" l% |, R. \6 \& H
  10.   {
    ; l7 s6 g. q2 x7 J/ h- o" |0 |
  11.     sub_44FDD0(a3);" m- ~0 ~; B( r- b" ~- d: v7 Y
  12.     v4 = sub_40BB44();
    7 S( h1 T6 J8 f7 \
  13.     glRasterPos2i(x, v4 - a2);
    " a- k# A0 `/ C2 X# J
  14.     vsprintf(&lists, a4, va);
    $ D' ?+ |; Q$ a; w/ d
  15.     glPushAttrib(0x20000u);) V8 K) c6 a/ |& y" O& M3 h
  16.     glListBase(base);
    : l8 g; V: a, G: ?5 C2 v* h, N. i
  17.     v5 = strlen(&lists);
    ; Q6 K3 \6 h: y" S& \
  18.     glCallLists(v5, 0x1401u, &lists);
    7 {6 m3 H# f0 B% }- S
  19.     glPopAttrib();
    ! m' {  W0 Y; D7 N6 }
  20.   }$ E, R3 w* ?! z/ y4 X5 V
  21. }
复制代码

) J) ^* p7 r1 T3 a
, r9 l0 n, e7 c) l1 d* h$ S' W1 m
  W8 X/ w' ^( L$ j7 l第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
    ' Z. j5 m1 ^% i" h! g8 V! u5 ^
  2. {  ]4 _4 L, w. L/ A4 v. H
  3.   GLvoid *v7; // ST08_4
    ) _; z) ^1 M, |" [
  4.   GLsizei v8; // eax
    , R9 X9 B4 s$ Q1 j3 D
  5.   int v9; // [esp+0h] [ebp-1018h]* L* k; n, n, U
  6.   char v10; // [esp+8h] [ebp-1010h]  d' H4 T' C8 a5 m- r
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]1 D6 w3 z; q3 N% ?: k- }& c
  8.   char v12[5]; // [esp+1013h] [ebp-5h]* Z& Q  S' r- w: ?. s6 u
  9.   va_list va; // [esp+103Ch] [ebp+24h]
    : h* z: r1 o. z& ?& r1 m" s

  10. + {" D: s% `+ a; R" ?6 U) w
  11.   va_start(va, a7);8 s' m( r1 I7 ]
  12.   v9 = 1;2 B1 R" W6 R; w5 F# ]
  13.   if ( a7 )! B% U$ L- r) r, S9 v3 K5 Q4 X
  14.   {
    + M; U& |4 u! [5 m; b% c( @
  15.     vsprintf(&v10, a7, va);
    0 T/ i  k9 ?" B7 x( F/ O) ~; V5 F
  16.     glPushAttrib(0x20000u);
    5 k+ g4 [& r; P; X' {+ }( G9 U% x
  17.     glListBase(base);
    8 K4 g5 {) X( f: c, J, W
  18.     lists = &v10;
    / a! \! W6 P1 W; I' w% `! z# j  ?
  19.     do
    9 E; m+ R! H4 r6 o" V
  20.     {1 V+ N0 C! i; M+ O9 T( O8 U
  21.       *(_DWORD *)&v12[1] = lists;6 _$ u# S  e% ?' o+ A4 \; \* A, \0 |7 ~
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
    3 ]8 C6 `: \/ j
  23.         ++*(_DWORD *)&v12[1];
    ) j& H# D; n9 M% C
  24.       v12[0] = **(_BYTE **)&v12[1];) v- W+ @* D. U& O/ j; I
  25.       **(_BYTE **)&v12[1] = 0;8 s3 Q! x3 g, B. ?
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
    3 Y, G! p. S% j& g
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;: M- x9 _; F9 t. d
  28.       y -= a5;
    ! v* c+ J  G* v% N7 }/ @; W! M
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);! K0 ?" G1 [& m. p1 Q: \8 ]
  30.       v7 = lists;3 ]( r' k( s0 z% |, C
  31.       v8 = strlen((const char *)lists);6 o8 v& n' d% d
  32.       glCallLists(v8, 0x1401u, v7);
    - C9 O9 H4 l1 l
  33.       if ( v9 < a3 )
    4 O$ L  X- J3 Q, e" Y& _  w. x* y
  34.         a4 += 4;/ n2 G9 B( ?2 W/ b' @* Y$ S6 x
  35.       ++v9;3 W2 k, D1 j" U! _1 x
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
    7 l9 m8 X; B: c" [
  37.     }- B! d' g9 S5 H: M3 ~: H6 \$ o1 H
  38.     while ( v12[0] );$ F7 ^& w% j; n& ~
  39.     glPopAttrib();8 j- g  R& f4 U( Y( v; a
  40.   }
    1 w9 K6 A% `4 i6 d. t$ w3 I3 Y
  41. }
复制代码

2 B& m. G! C4 }4 n, C1 A' T) l( A" \7 z& k) g8 Q8 ?5 U
1 D& D& h+ }( K; F; y' b$ g* C) q

. [3 z  j8 j# Q
2 W# Y2 [( c) C) e! g% L3 P
. x0 }0 m4 a( j# l1 _
6 `' b+ a- |6 K/ |* x- D' b3 @
* f8 L1 G* S9 k9 P6 O% L
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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