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

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

[复制链接]
查看: 489|回复: 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 编辑
* f+ C7 D/ v% y! F; c" d6 _, V
7 V7 G9 t! Q" `- rglCallLists的调用处,共有三处。
. I$ R( v2 }) i  x, p此三处估计是对应游戏中三类不同的字幕。# R! Q$ R2 R- p4 N, b/ D
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。! P9 J. q% a5 C" p$ l7 ?  L
分析的文件名,748 KB (765,952 字节)- J, ^+ \3 V% j  H" M% J
toh.exe
! o" e; C  a. V% h0 H" q3 Q
$ M, {" ~1 i7 v' ~, X经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
1 ]0 m5 h' J+ T, G- i. k5 x等日后再仔细研究,看显示函数究竟在哪里。: F- o% ]) \) i, x4 B( ?$ e

+ y# Z: D  q, ktoh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]
2 \2 A6 q' x) S) H004316C8, ]$ N" F0 |9 @/ I! N, M; p' z2 i
4 Q  A) M: u4 ^1 _9 b5 g) D! o
第1处; N; M8 M! d  z9 I9 ?* c- `& W3 g
  1. void sub_4519B8(char *a1, ...)
    $ R5 U  @2 O, @$ d* s
  2. {4 n4 S/ \5 x. A) K6 Y
  3.   GLsizei v1; // eax* N* ~& h( w4 ^2 _
  4.   char lists; // [esp+4h] [ebp-800h]! h8 K9 I: X5 x, l  l
  5.   va_list va; // [esp+810h] [ebp+Ch], E3 k/ o, ^" t& c
  6. 5 Z! T' w; P& q! k
  7.   va_start(va, a1);' A" |+ H' G( S0 E' L( z+ K
  8.   if ( a1 )
    ! r0 e$ u  O, S" J: W# ^7 \
  9.   {
    / I) c- v) v3 s
  10.     vsprintf(&lists, a1, va);
    0 O, g6 E8 S: i$ f! l/ x* K; f
  11.     glPushAttrib(0x20000u);; l# ^5 o+ y6 J
  12.     glListBase(base);
    9 ~3 P. e4 n2 Y6 Z& |% X6 _
  13.     v1 = strlen(&lists);
    # k* u+ p6 N2 v. I% O+ s9 p$ E
  14.     glCallLists(v1, 0x1401u, &lists);: [8 J+ k# |( n) `% q
  15.     glPopAttrib();
    & w5 z% |% N+ O
  16.   }% Z3 P. g  K5 ]' G$ t3 H5 h- P
  17. }
复制代码

. m7 ^  C. o7 @9 k8 j3 R第2处
. s2 t5 _* H8 \* K
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
    $ Q. @0 k' {) b
  2. {* }* ]3 f/ g' G, b# b
  3.   int v4; // eax
    1 [& }  W3 l9 L) R0 c
  4.   GLsizei v5; // eax) ]  ]$ q% r- z2 ]1 T3 B
  5.   char lists; // [esp+4h] [ebp-800h]
    - b# }; r& A4 C/ O8 H
  6.   va_list va; // [esp+81Ch] [ebp+18h]
    , C9 D9 U$ j. c8 e
  7. 2 e2 D0 q# `4 T% w+ d7 a+ s
  8.   va_start(va, a4);% x  T  v7 d3 M8 P3 j4 a- Y
  9.   if ( a4 )% N) X3 J* I( \
  10.   {
    $ G9 p2 b5 [5 T! N! {/ T8 w
  11.     sub_44FDD0(a3);
    2 c( [+ w) U+ z" O# ?
  12.     v4 = sub_40BB44();
    2 T: H) x! C; B# u% S
  13.     glRasterPos2i(x, v4 - a2);
    # b- e! Y% p" Z7 W1 i0 K8 H1 G
  14.     vsprintf(&lists, a4, va);
    , a( Z/ A/ b" Q, \
  15.     glPushAttrib(0x20000u);8 o/ n, \$ C$ Z9 N) B- z, c- X( O0 n6 q' x
  16.     glListBase(base);' h8 A. j9 w0 U0 w& b
  17.     v5 = strlen(&lists);% r0 w7 E; D0 t4 M
  18.     glCallLists(v5, 0x1401u, &lists);
    / t# B. @( e9 W, w9 \
  19.     glPopAttrib();
    5 G0 Y* n6 c$ a7 B7 [8 v% n, I; B
  20.   }
      H: H: y, ~+ }) P+ E
  21. }
复制代码
8 v/ L6 A/ p  I" o( {! P( G! A* m

; O' }8 [; V( V2 @- T1 v1 x/ x$ q4 F/ d, L: L
第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
    & {0 k, H$ F# \5 ^  U( F
  2. {
    , y  E' @1 w# D- j( [
  3.   GLvoid *v7; // ST08_4
    : G0 z: [$ n1 u) I/ G$ R5 X( T
  4.   GLsizei v8; // eax! q% r/ t8 w1 o9 j! a% ?( ~0 j
  5.   int v9; // [esp+0h] [ebp-1018h]% T7 E, H: ^" c# [+ K
  6.   char v10; // [esp+8h] [ebp-1010h]
    " E& W+ C9 h8 n8 x4 o
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]+ r% U; u. H9 o- g  t3 V( v1 F5 ~6 K
  8.   char v12[5]; // [esp+1013h] [ebp-5h]! K) G- b$ Q7 Y% M" S; ]& W
  9.   va_list va; // [esp+103Ch] [ebp+24h]% T6 z  |* T$ R& o( y' u" N

  10. , W5 f& K9 n0 b" G
  11.   va_start(va, a7);% q0 n7 R9 b; e" t3 s  k" ~
  12.   v9 = 1;. d/ K+ |# i" y  n. H; {$ w9 R5 u
  13.   if ( a7 )
    - ?/ A5 K, e& V2 S% a
  14.   {
    1 f6 j! Z& T/ M5 r# J
  15.     vsprintf(&v10, a7, va);) x; {! l+ D. v3 J* D# a; f! t
  16.     glPushAttrib(0x20000u);
    ( j  ?! r6 a9 V- |. t, o: [  }
  17.     glListBase(base);* M  d) _: b3 C- z; O, q
  18.     lists = &v10;  J/ R8 J9 ?* _
  19.     do, J, |% t" j2 o5 H$ k
  20.     {
    8 ?1 S3 u9 I, i# G! v. @( d4 t( {
  21.       *(_DWORD *)&v12[1] = lists;: W( y/ N/ r/ e+ ~) {5 E
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )) R3 C' m  _( b  I
  23.         ++*(_DWORD *)&v12[1];
    ' T- J" I8 k; d( G4 s% i) I
  24.       v12[0] = **(_BYTE **)&v12[1];  S0 v, u/ n# N. s) [
  25.       **(_BYTE **)&v12[1] = 0;
    7 |: Y. o  L$ t* B' C
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )/ r, u/ _0 w- P% C; j
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;: m  R3 k+ X; m: q; L( ^  j4 i5 T' i
  28.       y -= a5;0 J/ q4 c3 C( c; y8 T" ~
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);
    5 n& v, C  p) a2 M, [
  30.       v7 = lists;& ]' N  ?" }) L0 M, L2 h
  31.       v8 = strlen((const char *)lists);
    " c1 k. x( {% q6 f9 Z4 T+ ^* U
  32.       glCallLists(v8, 0x1401u, v7);
    ) M7 P  v3 x) u1 e$ S; T
  33.       if ( v9 < a3 )
    4 T' G" I8 r1 E  E; K, K3 f- H5 I
  34.         a4 += 4;
    6 x. M3 ^4 J( R$ c* s
  35.       ++v9;+ [) Y' k- |4 n; ^! s
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);; O6 \$ X* x" u; ^7 L
  37.     }5 G* L0 G) C. B% _3 v# @
  38.     while ( v12[0] );9 W# C9 c- ~, N0 F) B; d0 p1 U: }/ o
  39.     glPopAttrib();8 G8 r* t# e- J& v, y! ?& d
  40.   }
    6 J7 A8 i9 c, @2 |6 O3 F% Z
  41. }
复制代码

& `2 U7 I  g- c7 |% L9 Y4 `7 Z0 p3 E
2 f$ {" a  S7 v# S  O% D7 l$ U( }$ ?. p# Z

: T6 V4 z3 f2 b- R$ ~) [) x# f) @; C7 r" |! Z4 E+ ?& v; ~& E, g( Z

, b2 t! Q' S7 w* a/ S' b+ w0 l  F$ v+ O6 y/ f$ v

' c6 q6 p& J& y* S
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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