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

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

[复制链接]
查看: 427|回复: 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 编辑 ) W1 t6 `8 E" k

- h% e7 b8 j( p8 E7 u6 cglCallLists的调用处,共有三处。% N7 ~' N5 N7 q# \4 ]8 @
此三处估计是对应游戏中三类不同的字幕。
- B) \2 |2 v5 y1 m接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
; p- L1 C7 w6 k$ }8 C. f; L) [分析的文件名,748 KB (765,952 字节)
, ]2 j$ W! G/ o% C1 gtoh.exe- `) F: F, G% a  ^# n

% A' ?2 X( g5 V. I& \经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,- |8 @# x4 r8 q- U- d' y
等日后再仔细研究,看显示函数究竟在哪里。. k7 G: j9 q$ N) V: y& g
6 h4 w+ x0 S$ V
toh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]
. U, R1 X! d! Z7 Y% L; C004316C8
9 P% _/ W8 `# s  b- r0 g9 j2 |% q
! b5 U. d- d  C第1处0 L$ S, I# k. ?9 }
  1. void sub_4519B8(char *a1, ...); d1 L; x9 S9 A  Y1 d8 _* ]
  2. {! g& l7 g0 y# E* c2 g. b/ J2 i
  3.   GLsizei v1; // eax
    & f- ?) E1 l9 A; a0 m1 K0 n. {
  4.   char lists; // [esp+4h] [ebp-800h]( f$ g. Q5 ]; S: w+ J
  5.   va_list va; // [esp+810h] [ebp+Ch]
    % e3 r: h' `, `/ o' v
  6. / |2 W2 R( c% u+ P$ k3 o
  7.   va_start(va, a1);
    7 q  S8 X9 V* y/ q
  8.   if ( a1 )5 n3 r; o' u$ _6 M, p% I3 S' B
  9.   {/ T# h9 R0 c( h
  10.     vsprintf(&lists, a1, va);" B) K- K2 {5 j7 w" A, W' t  e! O
  11.     glPushAttrib(0x20000u);& C6 U' L, j' V: q8 n3 F+ t) {
  12.     glListBase(base);9 l' f: M3 ^5 O: F2 D" P
  13.     v1 = strlen(&lists);
    7 ^. @, z$ P% H3 X
  14.     glCallLists(v1, 0x1401u, &lists);
    ( q. {$ t0 C3 m  [: O; ^3 \
  15.     glPopAttrib();
    ' A6 m7 ?/ E4 u0 s, K4 Y. y/ u& f
  16.   }4 J( v! d; I6 Z1 H8 k% C
  17. }
复制代码
% Y; `3 J8 J7 c6 F6 g  D
第2处) X! @: M: S: D' C/ T
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
    . ^0 T# q5 r1 p$ A4 _4 l
  2. {; T1 D: A) Y8 U2 Z: u
  3.   int v4; // eax" o0 P3 J7 B  x! Q3 D
  4.   GLsizei v5; // eax+ x$ y& F0 q$ \' @) }" e
  5.   char lists; // [esp+4h] [ebp-800h]6 @  H$ q# e! t' n
  6.   va_list va; // [esp+81Ch] [ebp+18h]
    5 a. m0 @+ K" v; e3 o! N2 E0 y; i

  7. ) ~+ p3 Q# O# f: Q
  8.   va_start(va, a4);/ D! m3 R8 i5 T1 a1 n$ n+ L9 p
  9.   if ( a4 )- e( n, o% w9 p( `
  10.   {: n6 F0 Y( l+ W1 k: I4 J
  11.     sub_44FDD0(a3);
    % j  b# T5 H& h9 A! s- a0 e& ~
  12.     v4 = sub_40BB44();
    5 b# q6 Z3 U- _8 p& A2 k
  13.     glRasterPos2i(x, v4 - a2);
    ) v, L. Q6 S0 I- W
  14.     vsprintf(&lists, a4, va);
    3 @+ V' S/ v; R4 `- y& Y3 B4 g
  15.     glPushAttrib(0x20000u);
      Q2 o- f+ }7 Z7 {% _- \
  16.     glListBase(base);  x: w* x4 }' B5 Q
  17.     v5 = strlen(&lists);
      h0 N# y; ~+ D+ W
  18.     glCallLists(v5, 0x1401u, &lists);
    1 @. N2 ?8 i+ a) m1 ]
  19.     glPopAttrib();
    : L9 l2 d! \+ S4 A# R8 `: s
  20.   }, I1 M3 m0 ?6 Q: W3 T6 [
  21. }
复制代码
! C0 [2 F3 k% i. t6 I7 T

: Z, w& c% ^( M3 p% l3 Y  C1 W
! g5 f/ T* ?  W7 [9 y第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
    8 e0 E7 s% a+ P9 e" {- d% ]
  2. {+ W! A7 N4 D7 K
  3.   GLvoid *v7; // ST08_4+ ]' `' F8 q$ L- f  r. m
  4.   GLsizei v8; // eax" ?) v3 p) W5 \9 {5 x9 A; H
  5.   int v9; // [esp+0h] [ebp-1018h], s6 }; g" d- W3 `
  6.   char v10; // [esp+8h] [ebp-1010h]
    2 d& P0 w3 B) c( a" Y% V
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]
    " s: W* c8 [+ S1 e4 F  }3 `0 D
  8.   char v12[5]; // [esp+1013h] [ebp-5h]% E' C3 Z6 l1 z
  9.   va_list va; // [esp+103Ch] [ebp+24h]
    ! j2 S: q. h7 D8 `) w6 A2 p
  10. , k. f1 t) a: S, |/ i& ~
  11.   va_start(va, a7);3 S- Y2 z7 `  [3 F! p4 E2 \
  12.   v9 = 1;
    / P- [+ Q! K2 R9 \1 j: M0 p
  13.   if ( a7 )% q0 I) Y- Q4 A, x/ v: Z* H/ ^' I
  14.   {: |& |$ v2 P9 N+ V4 s$ A
  15.     vsprintf(&v10, a7, va);
    ; A2 z' `* Q- d5 y! Z. u
  16.     glPushAttrib(0x20000u);
    - B1 q8 r' ~3 V
  17.     glListBase(base);
    5 y) r+ |2 u6 f$ N, W# B
  18.     lists = &v10;
    2 C; z" t( y$ x9 e, T% d6 {
  19.     do8 R$ G) Q. V# X# f" o/ O) l
  20.     {0 F5 d7 e) Y8 F4 ^
  21.       *(_DWORD *)&v12[1] = lists;" w% E% R& _; G1 O
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 ), j2 j3 t0 O+ X; ^2 N
  23.         ++*(_DWORD *)&v12[1];3 I/ d' _" D) N# g/ a4 t
  24.       v12[0] = **(_BYTE **)&v12[1];. \: W; R$ S0 F9 K% `; ~
  25.       **(_BYTE **)&v12[1] = 0;
    1 m- z. A# `( q% q, K/ z# w( ]5 w
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )5 W+ R) l! g8 G% w- m" z+ s
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;4 u1 e, u  n1 W, n5 T
  28.       y -= a5;
    " Q  Q8 N8 c2 k% ?$ G2 T
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);
    / m' l) c1 g7 y/ j7 L
  30.       v7 = lists;
    ' A% T" R- Y% j/ i5 V3 L( _
  31.       v8 = strlen((const char *)lists);# S# d* S" T8 q- ]0 \$ i  \
  32.       glCallLists(v8, 0x1401u, v7);
    ; Y5 b* v$ }. j2 H: d! t8 F. W
  33.       if ( v9 < a3 )( {) F, F( K2 x# J. w6 [" @# h
  34.         a4 += 4;
    3 w$ [3 k; Y% x8 K, g
  35.       ++v9;
    * A& {! A0 e' U6 S  k
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
    2 M! S; e# |8 c$ W! d+ M
  37.     }9 y% s/ ^- h$ L. j( r( `5 Z  j
  38.     while ( v12[0] );
    6 A+ A. P7 G: l5 G% f# ]9 m$ d
  39.     glPopAttrib();
    1 g0 C- c, U' y( D" L7 o
  40.   }; k0 ^6 T  @% D- C- _! y8 x7 f8 x
  41. }
复制代码
" s0 U. H: ?% ]

2 z0 e/ p, I0 k9 r
. J8 ?8 E! e* r0 `0 J8 p6 {  c, f2 }# v1 f. n

+ ~. ]! u" y+ R" f6 J. W
  F0 V& ^! t  }. @9 ]) z
( ]" b/ ^1 P+ N# i
/ H( P8 ^5 }; T1 M* {
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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