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

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

[复制链接]
查看: 301|回复: 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 编辑 - y5 j% ~9 `' h8 U0 T' {
7 ^% u' N3 [+ S0 v" i% f
glCallLists的调用处,共有三处。. F( d2 a; A2 R0 t+ h; K) a
此三处估计是对应游戏中三类不同的字幕。
0 G; X4 k" j! P: c( Q$ M5 X接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
0 }8 E& V2 L' z+ D* U0 L7 D2 S2 K2 R分析的文件名,748 KB (765,952 字节)! P- f7 B! k5 Q5 j" }; ]1 j3 U6 k
toh.exe
! m: \6 Y  ~# i. c2 f3 s
1 u# @. S2 N9 B( g- w! j5 g8 m经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,3 L; }. e  W  i3 {
等日后再仔细研究,看显示函数究竟在哪里。
0 p' t9 ^7 b( C3 H" `% u1 R- K% \; @! V2 F& g' L" T
toh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]" V+ u- M: v3 j6 b0 \3 b3 [
004316C86 `( e' e5 `' P5 }8 g

+ W$ [: O( a  _2 T1 ]第1处
. S4 j# c( t! b; l- ~
  1. void sub_4519B8(char *a1, ...)8 s  y" q6 N, B9 a( L
  2. {
    0 ?) O! N, I, m- P/ b! e7 Q& M/ L
  3.   GLsizei v1; // eax. ~4 T  R4 y. x# q
  4.   char lists; // [esp+4h] [ebp-800h]  N, C; I1 ]/ X* f/ U  W
  5.   va_list va; // [esp+810h] [ebp+Ch]
    % I9 s" j9 Y6 I! C4 H& C! R

  6. ; n" p7 t) p; i3 O7 s
  7.   va_start(va, a1);$ d2 X8 F) ]  W6 L
  8.   if ( a1 )' m" h; R* W4 A/ ~9 B" c
  9.   {) }2 Y3 n0 C- ~) o4 {" r2 Z$ a9 r7 t
  10.     vsprintf(&lists, a1, va);
    ) s, I- h7 f8 F% K6 n  V
  11.     glPushAttrib(0x20000u);; g7 R: M! h/ g6 j; h) h: ~; o
  12.     glListBase(base);9 b+ p, d! e" w+ F+ a
  13.     v1 = strlen(&lists);
    1 z: m  f1 s7 a) Z- H( P( N* u
  14.     glCallLists(v1, 0x1401u, &lists);
    ) p7 n' L( a* \" A7 M
  15.     glPopAttrib();" G( K3 u$ p6 K$ _- N  Q4 u
  16.   }! R4 q; [( ^$ |: I- _
  17. }
复制代码
) _, F9 V! M3 ]
第2处
- K4 Q! Q% r) h0 ]) o! c
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)# t$ V9 l) v+ l. w7 F; n3 c" c
  2. {7 Y& p, c, \) }+ A+ r- c
  3.   int v4; // eax
    * l. z0 A) y9 `* W
  4.   GLsizei v5; // eax' H2 |8 C4 J5 h/ y/ J
  5.   char lists; // [esp+4h] [ebp-800h]$ s- U( T8 @7 M' X
  6.   va_list va; // [esp+81Ch] [ebp+18h]. A! Y* P) ]3 u: C0 Q, k

  7. , s& J1 Z. W5 N8 H2 r0 _. I
  8.   va_start(va, a4);
    0 r# O2 m, d2 Z! N5 X! F( N7 a
  9.   if ( a4 )% C' D! G2 @7 i4 Z
  10.   {+ }5 \: Q/ u3 Y5 F4 u8 ^
  11.     sub_44FDD0(a3);
    9 W5 [: M! m6 c& }
  12.     v4 = sub_40BB44();
    7 _! l# }' u7 d: k
  13.     glRasterPos2i(x, v4 - a2);" y$ x9 n1 q% d6 W6 d  v; P* `
  14.     vsprintf(&lists, a4, va);( @! ?( N* n& Q& q" w$ h) q
  15.     glPushAttrib(0x20000u);
    " j. B( B  ^6 q" n- ]( {
  16.     glListBase(base);6 u+ X, K# V2 `; c$ k+ N7 e5 g
  17.     v5 = strlen(&lists);
    : L* _6 w: L' z( z- [
  18.     glCallLists(v5, 0x1401u, &lists);+ l  \% a" L0 {0 O2 \* ~
  19.     glPopAttrib();  C. w3 Q5 h9 }& [( z
  20.   }7 m8 W, q5 x! ?; D
  21. }
复制代码
" @2 z+ }: T" X9 e6 m9 l% T0 O5 N
$ ]  y! t1 p  p2 B

- L3 B( n0 s4 N0 d8 t; C) D, }第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
    ! n/ v/ Y8 Z) Y" g
  2. {
    + L3 W, R: D- K4 ~, B" i6 N$ Y
  3.   GLvoid *v7; // ST08_4
    $ b! ^  e+ H2 R/ q) W0 r$ e
  4.   GLsizei v8; // eax
    0 A5 C( I( @, n0 ]) I1 P
  5.   int v9; // [esp+0h] [ebp-1018h]
    - S& W9 Y' e+ C; Z
  6.   char v10; // [esp+8h] [ebp-1010h]  C2 q5 d5 h0 g
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]
    & `0 M: m/ N7 j) H6 i3 v# W& f0 K5 I
  8.   char v12[5]; // [esp+1013h] [ebp-5h]+ m# e: K, `4 l
  9.   va_list va; // [esp+103Ch] [ebp+24h]  [& |# v; l9 l7 w
  10. 4 ^/ B1 r" k  t! p
  11.   va_start(va, a7);$ P4 x1 B0 F; U( z0 A* m8 _
  12.   v9 = 1;- a  U$ d( c- |! I, E+ z! d! N
  13.   if ( a7 )
    & B4 E  \+ l$ N$ N5 _6 ~; p; Q6 Q4 I
  14.   {
    1 ]% }1 B- R8 Q+ D
  15.     vsprintf(&v10, a7, va);- ^7 M# B- _, q5 v3 m
  16.     glPushAttrib(0x20000u);. p0 C, y0 W' e; p" {4 Q) {0 \
  17.     glListBase(base);% N2 v/ k( }( N# Y- S) [
  18.     lists = &v10;
    ! ]3 ^. s7 y* W, c' o
  19.     do4 B. z. r' @, c0 ?# a& C
  20.     {3 g) x6 J# f9 A& J2 F
  21.       *(_DWORD *)&v12[1] = lists;
    ' o% Y1 V8 g9 S: H+ z
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )' T- @% M# ^: d
  23.         ++*(_DWORD *)&v12[1];& N, D3 ^. w% x: K% Z8 ]
  24.       v12[0] = **(_BYTE **)&v12[1];
    6 H" g% N+ a0 f! _" G
  25.       **(_BYTE **)&v12[1] = 0;
    ( L6 I7 y' s& Y2 K6 C: o
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
    9 I5 c& q  N3 g& e+ P* {# j
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
    1 y# A: W4 C' U; G2 i$ Q
  28.       y -= a5;6 |0 e% ~! |" j/ L# E
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);
    - g4 y" M+ y9 ]9 Y) @
  30.       v7 = lists;
    & w' N7 U$ b  S. Q. e/ I- a* N3 ~
  31.       v8 = strlen((const char *)lists);! e: y1 z1 L- w: n$ {) w+ m6 _
  32.       glCallLists(v8, 0x1401u, v7);3 D& t; a) U/ l/ \
  33.       if ( v9 < a3 )# x# ~8 N# J: B! J3 p) o3 p1 {& E
  34.         a4 += 4;8 r/ _4 ?) J* [) Z! y) \' R  _6 \
  35.       ++v9;) g: h: \4 F! ]+ N" A7 e
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);9 d( |5 M  H- r
  37.     }
      A5 D+ F1 s1 [/ t9 [0 Y  v
  38.     while ( v12[0] );. B% ?1 r5 E' Q1 x8 K
  39.     glPopAttrib();( m8 k2 ?! h4 G( `0 I5 z! C
  40.   }- U% T# q3 c' S5 e8 K
  41. }
复制代码

8 @$ D) }- M  ~+ c. d3 R4 p" }( P. z1 Y4 T& x# W

) s% }4 [; t  ]9 B* q8 \& |
$ J6 N! U0 D' m! Z. Z' X
6 g5 h+ ^7 m! k! L! P, I6 S7 l
) |- L& s1 ^" ~0 m# f& z5 Z; s" A! l' G4 s3 ]5 M4 @
5 a9 H- G) p' n; \, I  F9 w/ 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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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