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

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

[复制链接]
查看: 306|回复: 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 编辑 / Y$ n: A& i- }5 \5 v# p/ @

: S. i1 }) }# l! pglCallLists的调用处,共有三处。
7 B( F# J& O( r. r0 V" Y! u7 d此三处估计是对应游戏中三类不同的字幕。6 Z8 t. B8 q: r' f/ _8 T; m$ u
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。) k* ?/ [: k: c9 f9 y) n% d! Q
分析的文件名,748 KB (765,952 字节)
! u% l' C2 F( K) wtoh.exe) I- q9 n* O- V* |  w9 A7 }
7 v/ I# s4 ?5 ?! b& B8 b
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
( e( k. m' u. f' p- N3 r等日后再仔细研究,看显示函数究竟在哪里。
1 @0 A* h. N- m* C
2 ~8 o- R" m: B+ Stoh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]& p5 r3 I% o6 b
004316C8
: T% A1 I) k( m4 ]5 A) T' Y5 C; e( |- y5 ]# A" f, a
第1处: U9 N0 E9 N2 j) H' i
  1. void sub_4519B8(char *a1, ...)
    8 S& g/ i8 Z8 b
  2. {
    0 ~" c2 e" h5 n4 M7 B; L
  3.   GLsizei v1; // eax
    8 ~/ a2 ?' k0 G" k1 E3 C5 c% p
  4.   char lists; // [esp+4h] [ebp-800h]
    4 E6 H4 R& D- l( m$ i! K# }
  5.   va_list va; // [esp+810h] [ebp+Ch]
    , ^2 K* _" i9 p) x5 D  D7 T1 x0 P% G
  6. / X$ J% H. ~# q4 y& V
  7.   va_start(va, a1);* j9 @- D4 J1 h- {& V- D
  8.   if ( a1 )! E8 C5 p' ]; i: x" {
  9.   {! f! \4 N* `0 h
  10.     vsprintf(&lists, a1, va);
    0 \0 ]3 s+ ]& P0 y& J' D% }
  11.     glPushAttrib(0x20000u);
    - B- P4 w7 Y8 [0 Q; m% j
  12.     glListBase(base);
    + V# J. Z) Z% _6 E
  13.     v1 = strlen(&lists);
    % g/ |  ?5 o4 p2 y0 I$ \' T
  14.     glCallLists(v1, 0x1401u, &lists);
    6 _  [7 J! s! V, H
  15.     glPopAttrib();
    ; q+ U( O! z9 `, o) `4 m
  16.   }. Z) C* R6 E9 `4 m, g! V
  17. }
复制代码
; E, Q" d' M- ?9 F9 r" h, W  Z* \
第2处
; W+ ~/ i* v$ j- y
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
    % ~# V, N  k; Z% ]
  2. {1 Q4 i( f# A( e* z& G" X- L# r: ~
  3.   int v4; // eax
      h3 z: i7 M4 {0 u* `$ _* y7 N
  4.   GLsizei v5; // eax
    * f. ~5 }5 `! A
  5.   char lists; // [esp+4h] [ebp-800h]
    : m) R; e( E: T5 T
  6.   va_list va; // [esp+81Ch] [ebp+18h], l0 C' J$ q1 x8 K
  7. $ l9 D6 h( j/ {# `7 y3 \
  8.   va_start(va, a4);
    ( b! V$ d( V! ^
  9.   if ( a4 )
    2 H, u! y! E7 _0 M3 T2 g
  10.   {
    - \- Y1 S( a0 X9 T
  11.     sub_44FDD0(a3);( I7 ^! e7 h0 F& n( K
  12.     v4 = sub_40BB44();
    : e7 }% X( K4 ~! T6 d2 l( a% O
  13.     glRasterPos2i(x, v4 - a2);7 T5 t/ N& ^, h2 O7 ~
  14.     vsprintf(&lists, a4, va);
    ) Q! q+ C1 H& u/ y" {  V6 ]/ ^  o
  15.     glPushAttrib(0x20000u);
    8 o/ M( x$ K/ ~
  16.     glListBase(base);5 s- A, V" F/ g* n9 R0 u3 v6 c" F' u1 K
  17.     v5 = strlen(&lists);6 U7 C. s! g4 p; C% y. e
  18.     glCallLists(v5, 0x1401u, &lists);: {# a" Z8 A1 j2 b# ?) L; @
  19.     glPopAttrib();' D# c; [0 @* f3 E
  20.   }
    8 T" j7 X, V$ L" @2 `
  21. }
复制代码
% V6 h' K/ g+ y- R
: f- e- A1 [8 g# Z, B+ Q+ U

$ m% u3 s0 q/ g& o4 J+ c9 G  S第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
    ! h, \% ]3 V& D0 s" P
  2. {
    * Q1 \" i+ E& u, K, Y) P: O
  3.   GLvoid *v7; // ST08_4/ i; X/ i: Y: M! g6 h* r6 ~
  4.   GLsizei v8; // eax0 ~9 j8 g; g9 p& c  G; o" {' x
  5.   int v9; // [esp+0h] [ebp-1018h]
      U9 U, {8 Q" O2 c
  6.   char v10; // [esp+8h] [ebp-1010h], [  r. D0 t1 B5 O: Y
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]
    " P% e  \  |6 r" e
  8.   char v12[5]; // [esp+1013h] [ebp-5h]! W! d7 Y* {' N: D: }% }1 j
  9.   va_list va; // [esp+103Ch] [ebp+24h]
    ) y4 c5 }/ O8 ]5 N/ `+ E: q
  10. & }5 G! k8 L  E) W- \- J
  11.   va_start(va, a7);( _6 u  x1 {$ q4 N3 t4 O. ^. t# s. n
  12.   v9 = 1;4 M+ {1 h* X* |' s* p  [$ A1 Q
  13.   if ( a7 )
    9 k  ], `- O" c/ ~' v- w$ h- ^
  14.   {5 k& a  @2 ^: J# {. G
  15.     vsprintf(&v10, a7, va);! Y4 B6 q  t7 N# W
  16.     glPushAttrib(0x20000u);
    0 N; g6 R8 ^5 M9 i, K2 n
  17.     glListBase(base);5 O4 E# T0 d! J/ J8 y) b( K5 i9 N2 O
  18.     lists = &v10;
      b6 I7 [" C. W$ j
  19.     do: E7 Y; u& ^8 y  E7 A
  20.     {% \9 z6 Q* ], t( k" z
  21.       *(_DWORD *)&v12[1] = lists;. e$ n( i5 n& B4 k) @  L$ S
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
    . c/ V$ R9 e% m
  23.         ++*(_DWORD *)&v12[1];
    4 I" @) c/ C% \: |+ Q7 f4 G. v: J
  24.       v12[0] = **(_BYTE **)&v12[1];
    7 N  i! `& V7 b* I! v6 H
  25.       **(_BYTE **)&v12[1] = 0;
    * G7 L" u# |& w, H) W
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )+ f# ~5 {3 D4 x* |9 R2 Y4 ?
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;* C+ U  u. l% _' s/ ~" l% b, k
  28.       y -= a5;
    5 q3 Y* M1 ~7 b4 b  w+ @* x/ j3 T/ B
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);  w1 t  v8 j6 p
  30.       v7 = lists;2 t$ t6 A4 Z! }$ ?
  31.       v8 = strlen((const char *)lists);& s1 X; A; W! w& a' c
  32.       glCallLists(v8, 0x1401u, v7);
    0 b4 v6 b' o* ^, Y
  33.       if ( v9 < a3 )
    ) `. u4 r' k4 R; A# K% {
  34.         a4 += 4;# z8 B% t- a" j" d3 H6 `( t
  35.       ++v9;
    5 O& U$ X! E( M
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);$ D! s5 T- V) s3 l. A  r. m' e
  37.     }
    9 G7 i( t3 \5 y  f
  38.     while ( v12[0] );0 E7 o1 N* h2 A2 I7 I9 l. ?
  39.     glPopAttrib();
    # n) K6 `: n: V2 S+ F3 ~. U5 e( f
  40.   }
    3 a$ N& e5 V$ _0 O) z
  41. }
复制代码
3 e7 [5 H& [* d' r( U8 K8 R
  S+ r! u( j; q0 g5 \7 M7 j
! ~% d+ L. x4 P9 ]* a4 L" {8 c
! P2 \; T+ I1 ?

! o0 p; {  L- A  p7 c. v/ n/ B' C% S+ |9 s7 o

# d# v: k  z4 l9 e( Z
- s) b  i) k4 R
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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