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

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

[复制链接]
查看: 433|回复: 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 编辑 $ H7 m7 ~+ N8 g4 `* s8 ]/ |, v* C
: M/ \2 t: d2 }4 k% Q
glCallLists的调用处,共有三处。
+ X/ j( {# s& d( k* n0 g2 m# m此三处估计是对应游戏中三类不同的字幕。
, _' O1 F. F% w0 I5 o8 m接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。/ t. u$ C2 w0 ^! b  f- B3 }
分析的文件名,748 KB (765,952 字节)2 h; b& D) N3 ?6 ^7 w2 n
toh.exe
: B; p" m. [6 i0 P' o; o% S6 J- K9 |  ~$ ]/ \6 j" {
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,- \6 n- U3 O6 j; z/ M
等日后再仔细研究,看显示函数究竟在哪里。/ l% h) C& \& W9 D% Z1 T
5 h1 s6 d! P$ I# G1 K1 e) P) {
toh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]/ N* }# f' T( H: x( u
004316C8
: \. w. H1 C5 R, G9 F
1 d  f; _3 T  L! x% I第1处' |, i; M( s$ t: t/ C) U" K
  1. void sub_4519B8(char *a1, ...)) V3 U. A9 V' q
  2. {1 j$ o! c0 l6 m2 Q
  3.   GLsizei v1; // eax" ~$ O) l; a  `1 a: J" B
  4.   char lists; // [esp+4h] [ebp-800h]
    - O+ V3 t7 f' s  j2 M7 g
  5.   va_list va; // [esp+810h] [ebp+Ch]& R6 J' q- O! Q
  6. # N2 B" D$ \! I  G* `8 l" e
  7.   va_start(va, a1);) z" S; D/ ^4 a! b$ f3 s
  8.   if ( a1 )
    # r- N* d9 F& _5 ]5 R6 f5 {9 c
  9.   {& m" t" m$ m) m, R
  10.     vsprintf(&lists, a1, va);
    + W$ X% A7 I6 a6 q7 P
  11.     glPushAttrib(0x20000u);5 \2 _( x. u: s* g* Y$ U* U, \
  12.     glListBase(base);2 d2 I) _; B5 o* U! `0 @! ]8 G
  13.     v1 = strlen(&lists);7 p& P: e' ]) d& @3 ?/ X- |. J
  14.     glCallLists(v1, 0x1401u, &lists);
    " Q1 Q0 [5 a( e* n5 ?# z
  15.     glPopAttrib();3 v/ v6 X1 o1 _( u  d5 H
  16.   }& O) I& [6 ]7 N. y5 ]; ]
  17. }
复制代码
4 m' x, A$ r+ x7 A+ A" N! t3 [+ B
第2处$ ~7 t/ V% L1 O: J2 q: n8 F0 M
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
    ! ]' N1 u' W" |! t( x9 M
  2. {
    1 P4 h4 r; Z$ m1 ~& ~  H! B) A! A
  3.   int v4; // eax7 t0 _/ _, m( |4 E4 `9 C# N! K
  4.   GLsizei v5; // eax' z: o8 \& S% K+ b  a
  5.   char lists; // [esp+4h] [ebp-800h]$ S; Z: U) T) }* f7 v9 S
  6.   va_list va; // [esp+81Ch] [ebp+18h]3 `$ C- X% |' x
  7. 7 ^. N9 _$ `8 P, x6 s+ s* ]
  8.   va_start(va, a4);% c- A; O0 \2 g7 M2 i; V5 ^7 e7 F
  9.   if ( a4 )
    , x5 _# _$ B6 }
  10.   {
    9 {0 ~- }6 ^$ O# O% L, \4 B$ i% O* S
  11.     sub_44FDD0(a3);# h- t' k: B  Q8 z% }- K1 d
  12.     v4 = sub_40BB44();
    ( G/ k6 u- b5 X" Q8 A
  13.     glRasterPos2i(x, v4 - a2);
    1 V# T3 `( H4 x: @/ V1 ?
  14.     vsprintf(&lists, a4, va);! |: S# d! s1 H2 N. w( H
  15.     glPushAttrib(0x20000u);
    . [! s: Q  e2 }, I- c$ x8 G
  16.     glListBase(base);+ r; n4 [& E9 Y- g; \3 F3 h/ S8 P
  17.     v5 = strlen(&lists);
    * A9 B9 [2 e7 e* ^, e* A& w! I
  18.     glCallLists(v5, 0x1401u, &lists);& |9 D) P' R% @
  19.     glPopAttrib();
    $ [1 z& g/ U4 ]
  20.   }
    , I; Y; \% W& L7 u% T" X
  21. }
复制代码

) h% d" K/ u1 q, @/ O# b% \+ p; z. Z, ]( P3 {+ U
; M9 n1 D; A  r
第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
    , u* o6 I% ^5 t4 M; O' J
  2. {
    $ ~) P) z. U( W
  3.   GLvoid *v7; // ST08_4! G/ m; n2 l8 g/ h2 W) P& |
  4.   GLsizei v8; // eax( r* |8 |1 X3 B7 x+ C
  5.   int v9; // [esp+0h] [ebp-1018h]
    3 S5 p, z( z2 N% E3 f" S& g
  6.   char v10; // [esp+8h] [ebp-1010h]
    % n+ z0 V' v- V% k. B. B1 G
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]- w, l  U( W* H: }
  8.   char v12[5]; // [esp+1013h] [ebp-5h]" Q9 S, z5 d6 P. P% z2 Q) D/ q3 L5 Z2 s
  9.   va_list va; // [esp+103Ch] [ebp+24h]2 b7 N7 F, J) t. ?: N6 T/ p* C
  10. 8 v9 M8 }& V" A2 y- ]
  11.   va_start(va, a7);
    9 ?3 w- r" p* j: W
  12.   v9 = 1;. ?  U7 n) W( T
  13.   if ( a7 )
    , O% e  F9 {/ B2 V; t0 j1 Q
  14.   {, \+ x( z$ S4 K* n1 Y
  15.     vsprintf(&v10, a7, va);
    3 o8 Q: r& t4 X2 r+ M
  16.     glPushAttrib(0x20000u);
    8 K7 d3 R, `: R9 E# R, ^9 b
  17.     glListBase(base);
    $ m9 Y1 ]. o9 b5 V  R( B8 C
  18.     lists = &v10;
    + R. f& q$ }; x. \: }8 T
  19.     do
    5 A0 ?0 h  I$ ]; t3 @) \
  20.     {* T% Z% u" }: |" |1 f
  21.       *(_DWORD *)&v12[1] = lists;# q/ }3 M/ U0 {. F2 I5 c: D
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
    ; M/ @; Y5 |! O8 [  @* e" u
  23.         ++*(_DWORD *)&v12[1];8 S1 O2 ^6 |2 O
  24.       v12[0] = **(_BYTE **)&v12[1];
    # {! k- J( G( P" Y4 l
  25.       **(_BYTE **)&v12[1] = 0;5 ?/ b" D% \" u4 \
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
    + A+ w. T/ \& h! a6 L
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;7 ^5 c, @3 `" L+ F0 }. w
  28.       y -= a5;& _+ {, n( _; T5 s2 F. d" d
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);, B, o  v1 @( e9 r5 z  R& b
  30.       v7 = lists;( d5 {4 g' j8 |% y
  31.       v8 = strlen((const char *)lists);
    , S. f: j7 q4 e  A  ]
  32.       glCallLists(v8, 0x1401u, v7);9 f/ \( w4 K/ E% p+ ~, j" R
  33.       if ( v9 < a3 )0 O& h0 ]. ^' P: K$ _! Z2 ?: o+ M; L
  34.         a4 += 4;
    , W. y2 d2 M7 ]& L9 S& U# `
  35.       ++v9;
    ! F: }2 g. D6 B6 W, D
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
    1 P7 G, |8 U8 g
  37.     }
    6 T1 k; `* E, U" W
  38.     while ( v12[0] );' y9 P. f5 ^: V3 x
  39.     glPopAttrib();7 ^* q! @6 n% G( ?
  40.   }
    / Z! s7 o6 X; k8 d/ ~9 V" ]" N
  41. }
复制代码
" i& M( N! ^+ E6 X4 n' k2 P) k

- n4 h8 @& Z# g' I6 w# K
  l5 \1 Y- N% M4 }7 n! w, N
0 y3 k9 K" d7 _* T8 K" v- n9 Y& e& q5 e3 ]9 i% Z

# z$ d$ Y8 c. l% C
* X7 {2 w: W. R# i: N* x( M! b
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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