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

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

[复制链接]
查看: 491|回复: 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# P4 n& x$ j+ U- J- \- a3 z
, V1 x; E  ~6 `glCallLists的调用处,共有三处。; h' \2 p! Z' H# X1 Q
此三处估计是对应游戏中三类不同的字幕。9 r+ h# x; K( m' p2 U# [$ O
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
+ M- [6 |; {6 u+ e分析的文件名,748 KB (765,952 字节)9 J. B1 ~( k' ?9 H
toh.exe
6 ~- w5 Q" o1 ~3 q
) y" W" o9 E2 p2 S经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,3 U$ f$ v& Y+ L* g
等日后再仔细研究,看显示函数究竟在哪里。9 P" _0 L% H0 ?; I" O

( S2 j  Y0 l4 C/ \5 k" {, htoh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]
' s( A1 r& f+ Y6 c  B7 r004316C8" K  i9 U' |  @0 P- D* h

2 A3 ?) m+ a' o( l- _- X第1处
3 S+ e/ w5 ?" N9 t6 _: z7 I( \
  1. void sub_4519B8(char *a1, ...)9 U* g4 |7 m, q3 A" h; z9 D
  2. {
    : M/ ~) q6 [2 P8 P+ B; R' x
  3.   GLsizei v1; // eax
    ) y/ \' J5 O. g' {" _
  4.   char lists; // [esp+4h] [ebp-800h]
    0 [9 |7 v  ?, y% z/ H" K9 A
  5.   va_list va; // [esp+810h] [ebp+Ch]
    3 B, G8 q: R8 W; t& v# q- i

  6. 2 Q# `7 D( ]) f: I% j1 F
  7.   va_start(va, a1);
      }2 h) a1 G+ H1 K" O
  8.   if ( a1 )
    # C* H- u1 ~4 W+ |/ G/ f
  9.   {, s2 ?$ z0 P" C6 r5 W& A* U
  10.     vsprintf(&lists, a1, va);& L0 D, p) ^! ]! I
  11.     glPushAttrib(0x20000u);3 L3 u+ C+ e6 ~
  12.     glListBase(base);
    8 B" N! e- ?% z) z9 z; o* Y7 H& ^
  13.     v1 = strlen(&lists);
    6 G1 @- X9 ^0 j. U! I
  14.     glCallLists(v1, 0x1401u, &lists);0 B$ J4 o7 o8 x+ T. v
  15.     glPopAttrib();+ N6 k- z% R6 G; B1 [7 E9 {2 c
  16.   }8 x* Z, u' t$ e9 t
  17. }
复制代码
/ V: }% O: p: P2 y7 {6 ]# K. K
第2处% W* }) [+ Y1 y$ u* h
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)% G# ~) o/ X5 U' [8 Z/ F- W/ f4 u
  2. {) y$ `% i. s* B! g  e# e
  3.   int v4; // eax9 W) P! o$ l5 ~( r- E
  4.   GLsizei v5; // eax
    ) `5 u& c$ Q8 Q% P$ T
  5.   char lists; // [esp+4h] [ebp-800h]5 }3 ?8 K8 G9 w5 l9 u& |
  6.   va_list va; // [esp+81Ch] [ebp+18h]
    3 l% o, q$ m. S% p

  7. 8 P- ]  i: a- B' ]5 A
  8.   va_start(va, a4);
    ! \* ~; a" S* M* z
  9.   if ( a4 )- t. A. J& m) F7 o( V2 r/ n# T
  10.   {
    % n0 F- K- X, q* t
  11.     sub_44FDD0(a3);4 y3 b5 y' C# o! x5 J7 z- y+ w1 z: ]
  12.     v4 = sub_40BB44();6 r* }/ q+ p( _
  13.     glRasterPos2i(x, v4 - a2);4 X9 r0 K  {. y; C7 A9 \
  14.     vsprintf(&lists, a4, va);; {2 s" x5 _+ y8 z
  15.     glPushAttrib(0x20000u);; @5 @; F" [2 f
  16.     glListBase(base);
    $ V0 \: H5 S3 Z5 H% v
  17.     v5 = strlen(&lists);; j% a! W' _4 x% L
  18.     glCallLists(v5, 0x1401u, &lists);8 [. d5 y, y9 c+ Y' U8 B' U
  19.     glPopAttrib();* y4 Z. U8 ]; x! _
  20.   }4 S6 s/ h; \- L7 y5 l$ F
  21. }
复制代码
" O4 W. u+ B/ W9 j; c6 L
: T( _- E( H. B

9 F5 C+ w, Y9 j: x1 y  l* u( H4 J第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)2 |6 @# G- A2 D, H8 F0 _* b
  2. {
    & ?2 ]4 R# s0 Y' {4 J) {
  3.   GLvoid *v7; // ST08_4
    0 K7 s2 ]# Q% ^: v/ i% b
  4.   GLsizei v8; // eax* B- J/ e3 l# x, y- ?/ Q0 N
  5.   int v9; // [esp+0h] [ebp-1018h]- |1 M4 n! L# i6 ~, c% U$ a
  6.   char v10; // [esp+8h] [ebp-1010h]+ H( e& F- _, m8 J% U+ e/ R
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]3 B) s+ o: h, i
  8.   char v12[5]; // [esp+1013h] [ebp-5h]
    5 y1 E% k& d- u9 C
  9.   va_list va; // [esp+103Ch] [ebp+24h], c' c/ n6 L9 A) I) ?* w

  10. 5 n$ [8 P' s, k# S) B- L4 {0 t/ w% j
  11.   va_start(va, a7);
    & E0 ~0 }& I  u( F
  12.   v9 = 1;
    ! G" U! y$ b- i- H
  13.   if ( a7 )9 G# n% `& n6 N1 N  c2 ?
  14.   {( t. h% X' C5 y8 u( [5 q# x
  15.     vsprintf(&v10, a7, va);
    ( C, u+ a4 M* Z: e3 V+ d
  16.     glPushAttrib(0x20000u);) n7 c* G: T- i; q
  17.     glListBase(base);
    2 I/ @% Y+ N' n$ N* q, R: e( K
  18.     lists = &v10;  H: T+ a! r- G" x' M
  19.     do' ~6 w8 n# `1 Q5 Q1 M8 y
  20.     {+ E  C) O8 {* \# C. V! X
  21.       *(_DWORD *)&v12[1] = lists;' O+ M3 T% J7 S* p9 n* v3 H9 B: g+ e
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )! ~4 q1 ]) p2 j4 Y. N$ N
  23.         ++*(_DWORD *)&v12[1];
    2 X% h$ y' z2 D3 J5 d
  24.       v12[0] = **(_BYTE **)&v12[1];# Q( k0 G/ J  I% h6 z" Q: u7 Y8 d
  25.       **(_BYTE **)&v12[1] = 0;
    & `9 v0 K. q3 `
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
      Z2 |( X% o% q; C4 n
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;, O, p. o8 s- _% @
  28.       y -= a5;
    - k$ y' o& L6 N
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);
    9 `9 P, D6 K2 d
  30.       v7 = lists;* e; \6 a3 x" N8 E9 R* e' O
  31.       v8 = strlen((const char *)lists);+ O) g6 K, \8 |4 D8 ~% s* Q; n
  32.       glCallLists(v8, 0x1401u, v7);# i) G: @% v$ ~; a
  33.       if ( v9 < a3 )
    6 O2 X4 {+ n; X7 N4 o7 c( o
  34.         a4 += 4;
    4 ~; j& v1 ]7 u5 a1 s
  35.       ++v9;% b8 u8 O( g0 q* K9 L
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);# F* ~% f$ {: s/ x8 |1 |) B' Q
  37.     }; B  E6 s9 A% s0 }/ I# \# Z
  38.     while ( v12[0] );. z% @- L% v  ?& w0 d
  39.     glPopAttrib();
    : U/ ?/ I) I& [* o$ @
  40.   }! i' s9 m5 Z* T4 l1 U7 t% b
  41. }
复制代码

0 F$ ]/ F* a& \; s" r* n9 b( W- b$ k; o: n+ p. {! o! o, b
8 Z; k0 V# W; O

# r+ d2 M) m% u) z9 o% [2 S$ u  V
5 h6 U. z3 I; V0 S! d
* a9 s) d8 k) r' Z0 W; X, [3 v4 Y  `2 M/ R: w( j" k0 k+ f1 l
, D7 w6 m3 Y/ s0 K
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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