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

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

[复制链接]
查看: 492|回复: 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 编辑 * X* T, `) R9 j# O

& y& O. `- g: S$ yglCallLists的调用处,共有三处。& O2 o1 n  C/ w7 q
此三处估计是对应游戏中三类不同的字幕。. X6 ]& _9 E7 L6 }
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。% z. m) f0 x, R9 H
分析的文件名,748 KB (765,952 字节)  ]5 p* ?8 F3 P$ ~$ ^4 v% G
toh.exe1 T) I6 t9 R1 g- o

% N0 R+ V9 M% w  d7 c$ E经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,  @4 g' G: Y; Z3 R' |7 z
等日后再仔细研究,看显示函数究竟在哪里。1 U1 m0 Q) _5 ]

2 ~) K' R8 `5 V0 _, D# ], l1 }$ Atoh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]& c3 w* S& U; C' O
004316C8
. s. k/ A. o( A% o0 G: [" V* R$ ~+ V
4 x) J7 w+ B0 k第1处
7 P- D5 {6 f  |
  1. void sub_4519B8(char *a1, ...). M# a& k4 V) v. C( [
  2. {2 [0 D1 G# m0 v/ v" x
  3.   GLsizei v1; // eax3 f9 }% L2 ^  l* ?. o+ d: }0 w
  4.   char lists; // [esp+4h] [ebp-800h]  M4 G# u! v: _1 x  c' T8 l/ q9 H
  5.   va_list va; // [esp+810h] [ebp+Ch]* T: a# u1 u2 }  L: j+ }) `3 T
  6. 7 Z; K. ^; V8 A* l
  7.   va_start(va, a1);
    3 K& y  J1 O: P5 ^0 ]" `: z, F7 ]' u
  8.   if ( a1 )6 A* c2 J) q2 p3 M2 g
  9.   {3 W  n) X2 r' ?5 p
  10.     vsprintf(&lists, a1, va);) t7 V* m) s9 D* z' _
  11.     glPushAttrib(0x20000u);
    / L8 I& n; ~; ]% c
  12.     glListBase(base);
    , y. ~% Z$ V/ z. _# J6 `  U6 d8 J
  13.     v1 = strlen(&lists);+ O6 s3 z: X+ Z: i8 [. {* ~
  14.     glCallLists(v1, 0x1401u, &lists);3 t3 n4 E5 w9 o- ]2 s" k0 |" e2 h, b' ~
  15.     glPopAttrib();! E1 c3 }" u/ C7 f7 y
  16.   }) ?) L' J$ S2 j# S  Q
  17. }
复制代码

' W- [" n+ m3 y8 j第2处
, m9 \. h3 s2 E# Q- b, k6 D
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
    , \8 {1 ?; [# E! b  V0 e: w
  2. {# A8 }% j- D! s' z
  3.   int v4; // eax
    : D2 z& I3 U& P: z# D# G
  4.   GLsizei v5; // eax' r) Y& s, f! s; E1 \
  5.   char lists; // [esp+4h] [ebp-800h], U( w) I& ^( }7 H; B
  6.   va_list va; // [esp+81Ch] [ebp+18h]
    7 o) }5 k5 W' `5 n, i1 \7 n6 q+ R
  7. ' o9 Z6 ^7 u9 A1 F) S
  8.   va_start(va, a4);
    3 t, _7 k- q* U7 K
  9.   if ( a4 )
    $ j; _1 y% Q4 E8 y8 D7 ~
  10.   {
    + r% E7 n5 P6 ~! q( W8 Q  x6 O- d
  11.     sub_44FDD0(a3);
    ) h8 F. p  {8 x) s2 v: `
  12.     v4 = sub_40BB44();
    8 x  |. d( `/ m
  13.     glRasterPos2i(x, v4 - a2);
    . f  D8 J( X% f$ Q  ^- V
  14.     vsprintf(&lists, a4, va);
    6 o* t8 e. U7 q7 B4 H; m
  15.     glPushAttrib(0x20000u);
    0 [3 w) g+ f+ g- q& v9 \! N
  16.     glListBase(base);
    . \& K0 J* y' k) }
  17.     v5 = strlen(&lists);
    * c1 }" H. k. C: e
  18.     glCallLists(v5, 0x1401u, &lists);; [4 S; f4 }3 B/ _9 ^6 l
  19.     glPopAttrib();
    " Q/ Z% \& c5 B5 |3 T2 t
  20.   }
    ' N8 P1 I- S; l5 `0 }" ]# Z  S/ n5 q
  21. }
复制代码

; _% n! z* w: s' [8 `" O9 n/ O+ O

# c4 W$ S5 d2 `7 R, Y* ?第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...); c: u; X# I- P8 ^0 ~- w
  2. {6 s$ M: T  J6 W" S' d
  3.   GLvoid *v7; // ST08_4
    + R2 q' D& @/ ~7 J- @8 r
  4.   GLsizei v8; // eax2 Y! h+ u1 z& |% J
  5.   int v9; // [esp+0h] [ebp-1018h]! X# i4 i/ |3 {7 E. B! w. ?
  6.   char v10; // [esp+8h] [ebp-1010h]
    9 q- g/ N7 I, y1 J! p* X4 T
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]+ i8 {3 Z6 |+ X- f3 z8 h+ ?
  8.   char v12[5]; // [esp+1013h] [ebp-5h], Y. V  O8 w: H* ~  ]
  9.   va_list va; // [esp+103Ch] [ebp+24h]9 j( l2 C5 {# D. y- M7 s
  10. 1 V) |9 n9 y$ r/ V" u  c
  11.   va_start(va, a7);2 W7 C; Y/ H! q6 q0 v& ?6 p
  12.   v9 = 1;* C, Y) I) q6 |( w' ?8 x
  13.   if ( a7 )
    3 e; c% t" Y7 q$ B5 q* ^
  14.   {6 k7 \3 J# l% a0 b- r
  15.     vsprintf(&v10, a7, va);
    & O. _0 z4 y3 p  t$ i& k* w* F
  16.     glPushAttrib(0x20000u);
    0 ^; l/ t4 O- Q! t8 r" i* B
  17.     glListBase(base);: v: m$ k. W) L
  18.     lists = &v10;9 \0 L2 s5 i0 W7 J8 n
  19.     do
    1 W5 _; S) o, M1 |: A! i) L  H
  20.     {
    + p, K. g7 K1 J8 V3 X4 J. ^
  21.       *(_DWORD *)&v12[1] = lists;" p+ M. F( x0 P# t& m  _3 j7 y
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )6 U& p4 [  Q" P  C- c/ x4 |
  23.         ++*(_DWORD *)&v12[1];. z/ F/ o; o: r2 x$ S$ {
  24.       v12[0] = **(_BYTE **)&v12[1];1 c) j2 P; r3 A$ }0 T# _
  25.       **(_BYTE **)&v12[1] = 0;6 `2 [7 t9 d9 K: T7 i# m( H
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 ). [. G  Q* F3 Q5 _! H9 G& S
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;6 e1 k( \0 i0 ]/ w& f
  28.       y -= a5;" y& y; l# L- ~9 G) I
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);
    - ~4 f+ k( V6 i5 M
  30.       v7 = lists;% m% F3 X& q) S% J9 E
  31.       v8 = strlen((const char *)lists);
    % U" A$ V7 ?. d1 G; z
  32.       glCallLists(v8, 0x1401u, v7);' R0 I# i) R# u% {
  33.       if ( v9 < a3 )" `7 b; p5 _. m/ g; y' v( e
  34.         a4 += 4;" c& j0 Z, X( Q" E1 B/ X  V& N. O
  35.       ++v9;
    9 M, b# y, [- H1 P, q: @1 j' }
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
    % p! \6 d' [  p1 d1 w# A4 r5 @
  37.     }
    % A9 U/ n% c0 I% Z
  38.     while ( v12[0] );3 r* u9 o' A. f, [
  39.     glPopAttrib();! q4 C% F- }7 X/ F+ B4 b- E1 u
  40.   }
    , ]: x9 o5 s" M, q
  41. }
复制代码

) h+ m7 G2 x$ q* {
3 m- X+ d* c. H+ j( n+ y- V5 ?8 C' ]! M
; l( l6 h: ]* F- E- V/ C8 ]

' C; {* j0 R4 e+ e: j
# m7 ]1 e- D4 a) w: c$ R( ]
  w* {. O6 O# E9 h
% q. Y4 c1 c. [; R; C
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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