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

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

[复制链接]
查看: 429|回复: 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 编辑
2 J1 m6 Z: M* V& E& R) g6 d: P& E$ ^
/ u9 X; S4 m% c0 |/ w! R' p9 U! sglCallLists的调用处,共有三处。
' L* T' |# l* g" J. K此三处估计是对应游戏中三类不同的字幕。
* Q2 h9 B2 u1 f接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。8 Y( ]# ^  d. W+ Z  ]& [
分析的文件名,748 KB (765,952 字节)
4 o% |5 M" \! U) L- c# Z; C7 U0 p+ utoh.exe: b! Q" ]+ G+ r2 T0 c  k6 Z( h

/ X! Z2 K# M: z0 I) \$ m经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,2 J: t' G* G5 K
等日后再仔细研究,看显示函数究竟在哪里。
$ Y' g3 u) p' i" K% ^5 Z' j
- }4 G% j6 _: E4 S. ^toh.exe+316C8 - 8B 45 F8              - mov eax,[ebp-08]9 W9 f$ R( e+ J: Q2 t/ M6 n8 z
004316C8
( Q! n' C( e0 Q/ s
; Y4 {2 O% E; P2 z$ \' c第1处
0 u/ a; u$ g- v% N7 P! z' U: t
  1. void sub_4519B8(char *a1, ...)
    ! s8 y9 u+ w) Y6 b8 n
  2. {6 u/ X, J3 P  {9 M1 X( f4 u! t/ o
  3.   GLsizei v1; // eax. G4 z" a- e, G3 V2 M
  4.   char lists; // [esp+4h] [ebp-800h]/ G: [% @1 u) F1 J' H' r$ g6 f5 i3 |
  5.   va_list va; // [esp+810h] [ebp+Ch]9 m1 v8 _  S4 v- i' J6 E: D
  6. 8 Q- D9 }+ K' O8 v$ F6 M: ~
  7.   va_start(va, a1);
    * b6 R) ]% K# @# R# x# r
  8.   if ( a1 )
    * F7 r! D8 {9 H8 ]) i; |
  9.   {
    0 i& D9 |$ ?, {- y7 d
  10.     vsprintf(&lists, a1, va);
    * V6 y2 D, H9 E. s' Q
  11.     glPushAttrib(0x20000u);
    2 b9 V7 _5 Y3 ?$ B7 n+ C- H
  12.     glListBase(base);6 L; a( ^, q3 F/ D+ @" g& n
  13.     v1 = strlen(&lists);
    6 A. u6 _4 i3 P, w5 s
  14.     glCallLists(v1, 0x1401u, &lists);: e2 P  Y# S& Q, s. [7 T0 T
  15.     glPopAttrib();
    1 A# N' ~/ T' J
  16.   }4 J/ R" B! d: U' }7 b' P& k* j" A
  17. }
复制代码

9 r9 J. B* c  X1 N7 p& Q第2处; ~1 F* b7 n( r
  1. void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)8 q0 z$ ?0 T0 B$ ?5 z# @
  2. {/ F5 V* }; \. D0 V" `8 L5 a4 T
  3.   int v4; // eax. M8 A4 z. r  v3 L  V
  4.   GLsizei v5; // eax/ p, U3 o' x, E, ^5 B
  5.   char lists; // [esp+4h] [ebp-800h]  @  H) B# J% H/ z6 F" o1 i8 k  e
  6.   va_list va; // [esp+81Ch] [ebp+18h]
    + m9 I- {# u/ u3 i

  7. 1 q9 Z7 @2 i. Q. s
  8.   va_start(va, a4);
    $ d4 G1 ~$ x/ I1 a& n/ {8 H/ s
  9.   if ( a4 )
    8 i- Z; x1 T0 M$ }. h
  10.   {
    $ W8 j$ W; A& U% t: h4 @
  11.     sub_44FDD0(a3);! k7 w$ L2 F! l: q7 A
  12.     v4 = sub_40BB44();: E9 g! ^) O. a9 S- r5 U; q  j
  13.     glRasterPos2i(x, v4 - a2);
    % b+ D4 k# @' T+ b6 A3 Y4 j
  14.     vsprintf(&lists, a4, va);
    - g: {4 z+ E2 v) V# A( w
  15.     glPushAttrib(0x20000u);
    " V; l6 |6 x5 s: ?: P/ g$ M( u" d1 V
  16.     glListBase(base);
    : E# w* B# @) I
  17.     v5 = strlen(&lists);
    1 H0 r* s/ J" {7 X8 C0 _4 ?
  18.     glCallLists(v5, 0x1401u, &lists);. y* W$ I7 t" c
  19.     glPopAttrib();
    ; K* k+ D# y: d4 M
  20.   }
    2 C6 d6 \+ c: A$ @( p( y4 i8 `
  21. }
复制代码
+ _. i! k2 W1 L, c0 s

4 @' s3 y& z2 x: v4 P0 B) K3 d( [- J3 j3 M% h) S7 t7 p
第3处
  1. void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)( G" R) d) y6 t. F  N
  2. {
    ) I( w  g& f  j
  3.   GLvoid *v7; // ST08_40 m! y7 |0 n: [& Y
  4.   GLsizei v8; // eax4 p; s% C5 G  R! g+ V- a$ A
  5.   int v9; // [esp+0h] [ebp-1018h]7 O% x4 p9 E5 Q* q5 M* r
  6.   char v10; // [esp+8h] [ebp-1010h]% r5 c1 V# j: V, V; e) o5 r4 C
  7.   GLvoid *lists; // [esp+100Ch] [ebp-Ch]
    " S* v1 z2 v& d  t+ h! a9 C& o0 a
  8.   char v12[5]; // [esp+1013h] [ebp-5h]
    + Y( M( p  B' x
  9.   va_list va; // [esp+103Ch] [ebp+24h]0 q# y, i/ |* f9 G+ v7 K
  10. ! o1 [% [3 @3 m: \% c3 k
  11.   va_start(va, a7);/ {0 E* T' r. K' F$ O1 f, D% D# |
  12.   v9 = 1;
    9 G( g9 M! u2 K: x' K- @. h7 M
  13.   if ( a7 )
    2 `3 V, Y8 V$ L8 F) o" N
  14.   {
    8 d4 @' T! T( d! y# r* k
  15.     vsprintf(&v10, a7, va);! u+ y, N$ L8 ]* p% I
  16.     glPushAttrib(0x20000u);/ _, B* D7 p& ~0 R6 E" S
  17.     glListBase(base);3 S" T; j8 j3 |7 X, K4 @3 M: H! Y
  18.     lists = &v10;8 V. A, J3 G6 O$ R+ l: \; T
  19.     do% N5 Q5 g, P/ w! ?% S; e$ B
  20.     {; @% s/ d9 W( l
  21.       *(_DWORD *)&v12[1] = lists;
    ' M5 {( w2 _, t; `" D  I
  22.       while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )( e1 A8 H' A/ I) i" x. k0 S
  23.         ++*(_DWORD *)&v12[1];
    ; e/ x& m4 h& ^4 J
  24.       v12[0] = **(_BYTE **)&v12[1];
    1 y2 y/ Q+ b8 d$ G7 _: e0 l% i
  25.       **(_BYTE **)&v12[1] = 0;
    8 \% @9 m% i2 \  `6 I# x- |# @
  26.       if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
    6 U& d' U3 O) c* X! t3 g
  27.         *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
    0 z& O( D5 n* }; }0 L( ]& G  a8 G
  28.       y -= a5;
    0 s" m- [. x! z( e7 U
  29.       glRasterPos2i(*(_DWORD *)a4 + a1, y);0 `: C" G: ?- @: S2 D, ~$ C# a+ i
  30.       v7 = lists;
    7 z$ h* i3 t0 d. k. ^! K0 }
  31.       v8 = strlen((const char *)lists);
    $ L( v  y  s  F6 Y
  32.       glCallLists(v8, 0x1401u, v7);- u# A' {% o! J4 g9 j
  33.       if ( v9 < a3 )
    1 }2 T; b0 ?3 ~+ G2 m
  34.         a4 += 4;
    9 k9 [' P" |5 t( s1 A. \! c3 t# s7 ~
  35.       ++v9;
    8 d! V% r' Q& I( c
  36.       lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
    ' B( S+ [- ?2 j7 O5 J
  37.     }
    ( g* k% A5 v0 z
  38.     while ( v12[0] );
    5 ?6 q0 d3 v) x, Q* }& u
  39.     glPopAttrib();; W! B0 H% U6 r% d! |" K% J
  40.   }+ [8 L5 q7 F( {& F% [7 J
  41. }
复制代码

  l0 [$ j* Z% M0 C
1 P$ b: \( x" g. {6 r5 N0 K( o  q  e2 R) i# d9 P( ]$ V

, y+ q/ C/ t2 z, U: n3 N4 N1 B! Q, j3 j7 s* G& }& ?

3 j5 H9 r. i  q: c
$ N: W2 s; @0 O: g2 ?7 j# _/ I9 z1 R/ T2 P+ J/ 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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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