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

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

[复制链接]
查看: 296|回复: 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 编辑 . k* `' T, I! D1 U2 `& h  L. ?; M

* F  N  p2 l3 r9 o. Q" r' A: f0 MglCallLists的调用处,共有三处。+ p7 N; T7 ]% g3 m. Y8 a
此三处估计是对应游戏中三类不同的字幕。: j% u4 i9 B7 X! d% a
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
4 {/ ]+ I  ?1 I* o分析的文件名,748 KB (765,952 字节)) l% R$ _0 w  p: L/ v
toh.exe4 y7 p* M$ a% B5 p+ {

/ \. r( |, f; Y2 D" h经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,+ f) u  Q; v: ~9 J
等日后再仔细研究,看显示函数究竟在哪里。
) [5 [& n, o7 o7 F1 T- M$ E" f- O: z5 R* }  V* F4 v: \/ z' l9 ]. ~
toh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]( A# r! K$ ?' w7 K6 R3 v5 Q
004316C8
  s" s! X+ t# Q4 {5 [5 }1 o8 x0 Q# d! a; u( D
第1处
9 C' a2 f5 U: t) [7 H
  1. void sub_4519B8(char *a1, ...)
    . w, y& w8 n( A7 H* \: G
  2. {2 Q% @* M1 q' I0 R* T6 j
  3.   GLsizei v1; // eax* ~8 O5 e, M! {! f9 {1 i
  4.   char lists; // [esp+4h] [ebp-800h]( C+ V# [1 l- z* {! ~( Q
  5.   va_list va; // [esp+810h] [ebp+Ch]- w; j! x! W- e2 F3 D
  6. , [7 l9 m! P6 a0 m/ e7 D* g# P5 F) {
  7.   va_start(va, a1);
    : X; K. a2 @3 |/ j, g
  8.   if ( a1 )
      Q" w9 h# t; u( z0 J" Y
  9.   {
    ! @/ ]$ c0 X" ?1 e* b
  10.     vsprintf(&lists, a1, va);) k( N4 x' s- J  N2 S
  11.     glPushAttrib(0x20000u);
    2 Q4 C1 ^' _* j) S7 v7 b# e
  12.     glListBase(base);7 f: [( ~' }5 `3 Q( U/ z
  13.     v1 = strlen(&lists);8 z' p+ e2 a3 {1 }, C: E9 k
  14.     glCallLists(v1, 0x1401u, &lists);( Y3 {  I- k$ ?8 h, J( Q, |" w: r0 [
  15.     glPopAttrib();
    8 O1 K* \3 Y; S( s7 T6 v1 Z
  16.   }
    + x% z6 S0 x1 a2 G
  17. }
复制代码
+ [# ~6 p) p8 A
第2处
8 p, V, i) R. [1 W! U% j+ {7 b
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
    ) G. N9 H' e/ J
  2. {! p" I% Y* J6 ^! q0 x0 r9 }& q
  3.   int v4; // eax
    + Z& r9 g& ^3 N$ t, g' u5 V
  4.   GLsizei v5; // eax# N+ I: J* m8 q6 [0 H
  5.   char lists; // [esp+4h] [ebp-800h]
    1 X4 d0 \9 x6 h6 Y
  6.   va_list va; // [esp+81Ch] [ebp+18h]
    1 d4 A, ?& N6 q. s$ H
  7.   Z  E; A2 J1 S
  8.   va_start(va, a4);
    + [1 V8 c3 z& Z. a
  9.   if ( a4 )& g& `9 \2 I& I( N. d0 Z; l
  10.   {
    5 n7 g$ I  F- J& {: _3 p
  11.     sub_44FDD0(a3);
    6 F0 J: ]/ z3 w+ N" `; M
  12.     v4 = sub_40BB44();0 _+ [0 \2 y, F) _
  13.     glRasterPos2i(x, v4 - a2);8 Q$ g8 s) }4 I$ m
  14.     vsprintf(&lists, a4, va);6 d, l5 }4 E. j6 Q6 }2 A" ~2 v
  15.     glPushAttrib(0x20000u);( F) d& E7 B8 W
  16.     glListBase(base);4 I6 D7 p) W1 r* n
  17.     v5 = strlen(&lists);
    ) ?& d6 v* \0 Q. D/ M. L$ d0 N
  18.     glCallLists(v5, 0x1401u, &lists);
    0 x) j2 q0 K8 w# r
  19.     glPopAttrib();
    1 f+ D' H3 P0 M7 F. Y
  20.   }
    . d8 q$ W# {7 U8 f+ d
  21. }
复制代码
3 O; @% t* q9 I6 M! o1 I' t2 N

' ]# ^" L3 l+ T
1 v# g/ P0 e' o第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
    . ~% W& l4 g5 c8 `8 x
  2. {0 N2 N* Q+ c# s5 u0 Y  F
  3.   GLvoid *v7; // ST08_4
    ( n7 O2 o& P3 A$ W6 m6 i
  4.   GLsizei v8; // eax
    0 }# Q5 F/ K# Q
  5.   int v9; // [esp+0h] [ebp-1018h]5 L+ r5 K8 l# P6 d* b9 w- v
  6.   char v10; // [esp+8h] [ebp-1010h]  `; o) {5 ?) t! g  B, {9 s
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]2 r+ O4 n( _  g
  8.   char v12[5]; // [esp+1013h] [ebp-5h]
    4 Y3 H6 x& q0 w! v+ H; R! [
  9.   va_list va; // [esp+103Ch] [ebp+24h]6 L0 \. ^. Q* C; i: Y

  10. , k( n( q# \4 C" W' o9 t5 p
  11.   va_start(va, a7);# Z7 q. k0 E) v/ J# N
  12.   v9 = 1;
    # k# e) J2 m3 s' ?. b9 S
  13.   if ( a7 )
    " R. g  L9 y& l' ]1 a* C$ z. v6 z$ d
  14.   {6 R  D. S2 H4 n/ q2 q% b1 ~
  15.     vsprintf(&v10, a7, va);9 o1 N* }" B! j- r; J
  16.     glPushAttrib(0x20000u);4 x9 [4 a7 L: Q* b7 i' K
  17.     glListBase(base);
    ' t* E& g+ N% W' S; O
  18.     lists = &v10;$ p9 `' o) v& w5 k0 s
  19.     do
    9 f' a( M  |  p" J& t/ m
  20.     {
    3 z7 R2 g# v% c- e
  21.       *(_DWORD *)&v12[1] = lists;
    , F4 g% q( D- k# x0 F( b2 f- |
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
    : [8 p3 G: B7 i1 o
  23.         ++*(_DWORD *)&v12[1];* b3 D3 N) u' J. w$ e; A! }$ \% Q# H
  24.       v12[0] = **(_BYTE **)&v12[1];/ C+ B. K7 C0 \
  25.       **(_BYTE **)&v12[1] = 0;- m( w; ]) c& _" z8 _
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 ). G, @8 U2 A8 l$ v% K  s/ h6 x
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;. `4 ?  ~) a8 o% V* M3 ?% p3 _2 c
  28.       y -= a5;
    4 \2 Z- V( d0 {, a" N" y% X
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);
    / B- S" ]4 D) B7 D
  30.       v7 = lists;
    / P/ B% u  S. `: e: Y. {" \* g
  31.       v8 = strlen((const char *)lists);
    0 O7 M5 d; g& E  d* z( Y0 q
  32.       glCallLists(v8, 0x1401u, v7);
    - V4 r+ v1 h2 q, }) i
  33.       if ( v9 < a3 )8 q9 {8 M7 |% K' _; _! M, k2 p. O
  34.         a4 += 4;
    " ~& N& S) q  C
  35.       ++v9;$ G% |# ~+ K, S) W+ q
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
    , z4 I6 z. y, J
  37.     }
    0 O3 m% i. o. z) W
  38.     while ( v12[0] );
    ' N6 v8 p0 |: o
  39.     glPopAttrib();: p; a0 j- x. O: q- ~; o" f
  40.   }" i  o5 ^2 B4 c
  41. }
复制代码
3 N) G3 t; |7 g: ~+ b

/ U* U& o; |9 Y4 h7 w0 O0 n. T: m  ^+ X
; z' h2 Z  ?% n+ k% m1 {6 Q9 Y  |" Z: A- [
' Q; H; n" E& T* K! W" ^7 z- n
  t8 u) m, V4 S: P6 {) J, L0 A
" ~) S2 f' m6 N- y3 L2 f3 X# I8 v

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

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