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

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

[复制链接]
查看: 488|回复: 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 编辑
# L: h) v4 z$ o. B! R
: ?6 ^  n+ R4 |/ H- ~" R3 mglCallLists的调用处,共有三处。- Z2 `' t2 {; _0 W& Z6 ~  o
此三处估计是对应游戏中三类不同的字幕。$ U7 Y- Z# o* B4 ?
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
/ S# L% ^. N9 b, F* [- @  C0 z分析的文件名,748 KB (765,952 字节)
. |, K5 D$ T& a$ ]. otoh.exe
# X( x  ?* Y: T" m1 e$ \" U. t: w- w9 e6 c2 H5 f- h: w/ \; S
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,: h! X6 V) r( w
等日后再仔细研究,看显示函数究竟在哪里。" i0 [2 J) r& r& _7 `
) }4 O+ m3 }1 a2 N  x5 d+ c# A; x
toh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]
! D5 [- }4 Z) ?% c+ ~, J) R/ ]) J004316C8
  m% P/ v# Z, f0 ^4 N; i1 u2 |/ j- o' M. q3 r9 D0 Z+ s9 v
第1处' _8 I9 S% t9 O$ s
  1. void sub_4519B8(char *a1, ...)$ E, C( Y& G+ U+ x( {" v7 k( ~
  2. {8 I3 b) H( V- W7 }1 `$ B9 m
  3.   GLsizei v1; // eax
    ' e. y% o6 F: A( ]8 [2 I- ?
  4.   char lists; // [esp+4h] [ebp-800h]& ~* b! R7 }* |1 c, h+ U( j
  5.   va_list va; // [esp+810h] [ebp+Ch]2 o0 S1 Y. H% c

  6. ( C9 e/ ]5 T! j, |9 }& ]" u
  7.   va_start(va, a1);1 W7 v( m! {. F: F' T+ y, k
  8.   if ( a1 )
    , E$ I6 O! i- n8 z
  9.   {/ l. H6 L3 ]9 ?: Y. ~
  10.     vsprintf(&lists, a1, va);# d  c# F  x5 A' C
  11.     glPushAttrib(0x20000u);" {" x* v: W3 p' w" {
  12.     glListBase(base);8 U# ^2 c' W' A! p; {1 h) C
  13.     v1 = strlen(&lists);
    5 V! h$ z4 j! @5 Z/ J3 Y
  14.     glCallLists(v1, 0x1401u, &lists);
    " p0 B& G$ W6 ], I, N
  15.     glPopAttrib();
    3 O; P9 p/ |; \
  16.   }/ {) p8 R# u1 ]% K5 d: W
  17. }
复制代码
, V& \4 r& x& I- a( a" E" G
第2处, [+ @. q7 f- e, r" g
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)4 @. ^3 a6 C; M- a4 x
  2. {  ]% ~2 [$ c, X  v1 |
  3.   int v4; // eax
    * m- ?' F7 ~1 W& `
  4.   GLsizei v5; // eax' T; {; O5 A0 A2 |. V- I
  5.   char lists; // [esp+4h] [ebp-800h]+ g7 C! b  J, L6 X4 e7 w
  6.   va_list va; // [esp+81Ch] [ebp+18h]
    5 n' V( ^8 A2 X5 I

  7. : p+ V7 ]. X- e$ U
  8.   va_start(va, a4);; P& b: f/ F2 {' |/ W# j5 c5 C
  9.   if ( a4 )+ c5 U9 V9 f% m+ b+ z  n4 F: n
  10.   {
    8 w6 c' s$ I; U) N. B  ]2 x
  11.     sub_44FDD0(a3);
    ( R5 S0 }+ n1 m. t: Y
  12.     v4 = sub_40BB44();
    5 u3 j8 `3 g; w6 d: V+ C8 t4 w! C
  13.     glRasterPos2i(x, v4 - a2);
    8 R$ @  f4 U: H3 k/ ?1 X
  14.     vsprintf(&lists, a4, va);
    ( K* i: e7 T3 n8 I
  15.     glPushAttrib(0x20000u);& J4 a( v" J% l' z4 C
  16.     glListBase(base);
    ( e/ ?$ ?( }" x
  17.     v5 = strlen(&lists);
      e. F  Z4 _7 O2 [3 `* n
  18.     glCallLists(v5, 0x1401u, &lists);5 ?$ O6 C% L% ?8 U: R! F7 h" A/ F
  19.     glPopAttrib();, Q& |& p+ U5 r
  20.   }
    $ M4 `7 L' m' `) k, G5 e
  21. }
复制代码
8 K# |9 e4 e9 \9 ]! _, z! f
' |8 s4 J4 I2 u
& B* W! F7 j' w& B+ x6 F& a
第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
    , J4 Y5 N1 A4 W5 h: b: \6 ?7 {
  2. {
    + u* H. P' q6 f& s4 q6 F, d$ ^% ]; b
  3.   GLvoid *v7; // ST08_4
    - x2 a3 p% `% P: J7 ?% J
  4.   GLsizei v8; // eax
    ) A* A# B4 R- ^
  5.   int v9; // [esp+0h] [ebp-1018h]
    ' V! ?# [8 s5 H( i2 X& n4 Q" ?) @
  6.   char v10; // [esp+8h] [ebp-1010h]
    " s8 Z7 N- Q4 ~% E7 k$ C% _& x
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]1 T- M% [4 {  B8 H
  8.   char v12[5]; // [esp+1013h] [ebp-5h]
    # `' _9 \: j$ x! f
  9.   va_list va; // [esp+103Ch] [ebp+24h]1 u* l2 g" Y. m+ u9 Q
  10. 5 ~1 ~8 J, _1 h! l
  11.   va_start(va, a7);$ v2 F! J. w% G% l: I; Q* L
  12.   v9 = 1;
    4 h/ t/ p! B7 ~6 Y3 Z* c" O
  13.   if ( a7 )
    4 h9 m; O" G: g! Z! g' O3 P- t: x
  14.   {
    5 u* R5 D; ]3 Y) x
  15.     vsprintf(&v10, a7, va);* E/ @7 ^2 J$ A2 }
  16.     glPushAttrib(0x20000u);; t* h1 D& s7 @; Y% E
  17.     glListBase(base);2 X2 B- N% D0 @$ T# Z; Z
  18.     lists = &v10;
      _0 }* q5 N: I. T/ o1 U
  19.     do
    + R$ ^9 X9 \2 d7 J0 B/ u
  20.     {5 a; y. p9 Y- A- j& M
  21.       *(_DWORD *)&v12[1] = lists;
    / P( ?* T+ ?) p9 e
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
    / G2 ~& i9 h4 ^2 o' ~6 d6 S
  23.         ++*(_DWORD *)&v12[1];* Q: ~# z; j: A" E3 {$ \" [  l' W
  24.       v12[0] = **(_BYTE **)&v12[1];
    * e0 M( W8 O! k
  25.       **(_BYTE **)&v12[1] = 0;$ X& g6 `/ G  u1 @& y& F
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
    1 N' a4 t* l* I  O& X+ y" H4 T' U& {
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
    - M$ j; u. c# j& T2 B0 {6 Y
  28.       y -= a5;
    2 u* h: L! f( j2 P) j# @
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);
    - e' _" W6 o& A# ^- T' I/ t
  30.       v7 = lists;
    , V; D# D# J) r
  31.       v8 = strlen((const char *)lists);( G6 B. H& G) p) q8 E/ C. h
  32.       glCallLists(v8, 0x1401u, v7);5 }; H) M) z8 i, B. y7 y
  33.       if ( v9 < a3 )6 i; |8 p3 Z7 k' {0 C6 ~3 V6 k
  34.         a4 += 4;) T0 K1 F3 B' c" U" W. Z
  35.       ++v9;
    9 m7 E0 k: ~; B# r* g! i
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
    2 f( T1 F0 r2 J+ M
  37.     }* J7 ]# L- l, G2 X4 z. R2 ~0 A" L
  38.     while ( v12[0] );# A: O6 L8 D3 Y1 z7 r; n
  39.     glPopAttrib();9 P" U: ?& m  w6 U- f, t! L& ^2 y/ K
  40.   }4 }/ @! S# E8 C/ v5 c
  41. }
复制代码
) E: B1 @: C2 U" Q# m0 k
9 K' |3 A( {. [/ b% O
4 E+ F6 K- r& ?7 l) n% C$ O

) V$ h; ], K6 B3 T9 _# O" Z+ ^- U1 |# A' ^

8 U0 t6 ^0 R8 R1 F: p3 K+ {' ]2 i+ g+ r
% P, X( X( J$ a8 H; n
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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