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

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

[复制链接]
查看: 330|回复: 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 编辑 + C4 J0 W) a. G
4 P' J2 P- l: X: _/ ^6 I% Y! a0 g
glCallLists的调用处,共有三处。
  U- T9 f2 N( t+ E" j- J此三处估计是对应游戏中三类不同的字幕。0 o. a# P  M, M+ I  o- k7 R2 r
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
, e' Z* N1 `. B! ?9 u分析的文件名,748 KB (765,952 字节)( m: \- H. |* P  ^# \1 C$ G3 s
toh.exe
9 X, j1 w) N, G. v. L+ v6 Q' }3 m' d  Y) l5 y( c/ a
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
6 N8 n9 U% T  h+ p* I! E6 n等日后再仔细研究,看显示函数究竟在哪里。* _# K; }6 I8 D# S* z; D4 C
  {) {* d, }2 P+ O3 _% D
toh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]7 {0 b: Y7 p( W1 n7 L
004316C80 F* M; ?4 K) o2 e& H
4 _& ?0 Z5 {+ v9 f( z2 T- F  k9 v
第1处3 X% m2 M# h8 i7 }
  1. void sub_4519B8(char *a1, ...)6 z/ }$ }: Z: W& q  v) X
  2. {
    * O' D) R  r3 {! u$ U( V. E  m
  3.   GLsizei v1; // eax9 L, a1 [. i4 W
  4.   char lists; // [esp+4h] [ebp-800h]
    ) ?, ^& D, V( C
  5.   va_list va; // [esp+810h] [ebp+Ch]/ D* v$ L1 q' R8 R3 X. t+ x
  6. # V. A/ X: X9 B3 t9 L' p" g; [
  7.   va_start(va, a1);6 }! N) F" r/ D
  8.   if ( a1 )/ C( \$ J0 u; Q7 m  ]  h
  9.   {, b" K  W' x7 F5 x9 g
  10.     vsprintf(&lists, a1, va);) d, K6 ?3 p4 I0 j. S
  11.     glPushAttrib(0x20000u);
      t& {7 }. A* c5 p* `
  12.     glListBase(base);
    6 K' i8 k' ?6 z6 N4 l4 `
  13.     v1 = strlen(&lists);
    4 j( k- Y' W2 t7 y8 J
  14.     glCallLists(v1, 0x1401u, &lists);4 k+ j) x3 t* Y7 g  Z  g: c% v
  15.     glPopAttrib();
    * d, u6 Y3 w5 F: O9 B2 l
  16.   }8 D# f$ }0 u+ ]; ~4 z
  17. }
复制代码
9 d+ ^9 S/ ]1 C2 M( B) d; J
第2处
# P9 |6 e# c5 M) P% J6 R
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
    , n8 N: n/ C* D/ z) T% R
  2. {
    & Z8 c. u4 J$ Q. {4 F
  3.   int v4; // eax
    ! n3 m" L( G& \7 q/ F
  4.   GLsizei v5; // eax) i0 |: E5 j9 s9 A5 s
  5.   char lists; // [esp+4h] [ebp-800h]
    1 Q1 z* c% N8 h% u9 T% y
  6.   va_list va; // [esp+81Ch] [ebp+18h]7 B, h" |. r( L, p$ _( |
  7. # D! T* S; X* `0 X* j8 O
  8.   va_start(va, a4);
    ' C5 p. D; `0 F
  9.   if ( a4 )2 X1 P: t& G* O* e+ S0 V
  10.   {
    + T8 t1 E  @5 r, E) K
  11.     sub_44FDD0(a3);- s0 h6 S8 [. B, |, W
  12.     v4 = sub_40BB44();
    % @' h5 t7 N& G/ `) H$ O
  13.     glRasterPos2i(x, v4 - a2);) |3 @3 o! w& V* R' `0 n
  14.     vsprintf(&lists, a4, va);- p1 p2 U8 h8 Q# _- c, r3 V4 w
  15.     glPushAttrib(0x20000u);
    : m) }, b, ^- k. k! |
  16.     glListBase(base);& R; v- v+ i+ y7 F# H
  17.     v5 = strlen(&lists);
    0 p9 t! C; X% I6 i. r
  18.     glCallLists(v5, 0x1401u, &lists);, X3 t( @4 s8 Y6 N4 o. P& n) Z; Y( x
  19.     glPopAttrib();
    + R, u3 k5 r/ J
  20.   }8 C9 @; h7 y/ f6 X) h
  21. }
复制代码
7 `7 t" Z& h. x8 E) R. W4 Q" Z4 I
& l- ^  ]: n' j3 e
' m7 ~2 j0 _3 G% _. x
第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
    8 s- W  @: u. @, G! _/ i- b
  2. {
    2 X0 |2 |' m* \# i0 \5 G% I% d& `
  3.   GLvoid *v7; // ST08_4
    - Q7 R9 p" w: c
  4.   GLsizei v8; // eax
      m7 W% J0 ^4 o3 |& j2 @1 I0 J
  5.   int v9; // [esp+0h] [ebp-1018h]9 v4 M1 Y4 a( y  Y
  6.   char v10; // [esp+8h] [ebp-1010h]+ q  ~: U; a  N
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]
    - k5 \4 }1 W2 e" }1 R* M9 ]
  8.   char v12[5]; // [esp+1013h] [ebp-5h]
    4 U6 M$ `7 a) w2 p9 s+ Q- W4 ]' b& b
  9.   va_list va; // [esp+103Ch] [ebp+24h]
    2 z5 p& y* b7 Y

  10. ; W* e# N+ K, ~/ x% r: S: T, v
  11.   va_start(va, a7);0 ^- q1 N( r, y+ b) S
  12.   v9 = 1;% l; o, Z' E: A1 W: ]. a
  13.   if ( a7 )
    3 a( }% T; F" X1 t+ W- q( L/ h# [5 F
  14.   {8 t# }# N! v; D" B- G: v( A
  15.     vsprintf(&v10, a7, va);& c. R9 }  ]9 f. B- h2 R
  16.     glPushAttrib(0x20000u);
    4 s! R2 u( F* a; i) o/ R6 H; u- A
  17.     glListBase(base);, L* v, k4 l8 @3 c# X$ f
  18.     lists = &v10;- O) P& W& [2 W# h: ]
  19.     do
    7 N4 c" j) _5 c' O$ V2 f+ v9 t5 [
  20.     {
    - Y. r' x( d; \# Y+ o& E+ C
  21.       *(_DWORD *)&v12[1] = lists;
    ' Z% G% Z$ }8 j' @6 k
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )- ]# ]- t* j- J  U
  23.         ++*(_DWORD *)&v12[1];
    0 Z% I1 F. k; E% u9 D1 m' M6 b
  24.       v12[0] = **(_BYTE **)&v12[1];+ L9 k+ X7 R1 U4 [* {
  25.       **(_BYTE **)&v12[1] = 0;" _3 V7 \" X, [* _( N8 l3 a
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )+ @/ C% ^  t- m8 \5 h
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
    8 |( G6 J2 }/ H5 X( {2 H( H
  28.       y -= a5;# K4 a; Z* |; t2 {0 k$ ~
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);$ S0 u; ^' \7 l- N
  30.       v7 = lists;
    * h4 R" [3 b# v* |3 V0 V
  31.       v8 = strlen((const char *)lists);  @1 B3 D) x2 A
  32.       glCallLists(v8, 0x1401u, v7);
    " _% O8 B$ P1 c6 r4 T
  33.       if ( v9 < a3 )
    , H# g' a, c1 I! X% b5 i
  34.         a4 += 4;* i$ ^6 B. ]9 w3 q
  35.       ++v9;
    ' `! G6 N7 d: [' h0 p- {- W2 l  P
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);- d. g# {: U# u: K
  37.     }
    5 d# Y  p. X" l; @5 w
  38.     while ( v12[0] );* y" N6 j: }1 u) l  W
  39.     glPopAttrib();
    2 O( ~+ D7 W% Q. b" M/ e) m/ k
  40.   }7 x1 P* {- \+ L! T
  41. }
复制代码

  R$ s" c! H6 Y
" F5 @. N6 m- @: D9 @, ~5 j% i1 p' Y8 @/ m/ F
0 a9 a3 U) p1 D1 V5 _9 Y

6 q% Y9 Q$ `6 s- k% j: `
" }" w5 \8 k. G# u9 O9 X' D$ g3 z7 X. `/ w

0 L( B+ B" v" a
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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