冒险解谜游戏中文网 ChinaAVG
标题:
【Opengl游戏汉化 #3】 魔法英雄历险记(Tale of a Hero) glCallLists 调用处分析
[打印本页]
作者:
shane007
时间:
2023-9-4 18:42
标题:
【Opengl游戏汉化 #3】 魔法英雄历险记(Tale of a Hero) glCallLists 调用处分析
本帖最后由 shane007 于 2023-9-5 15:50 编辑
' g* \: x* g4 c
4 U& r2 p8 {6 O; O. A
glCallLists的调用处,共有三处。
Y: v7 F- @& d! {: e
此三处估计是对应游戏中三类不同的字幕。
t1 d% B: l* h9 l9 Z' Z* P2 T
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
3 o4 I4 `5 Q; y% o( W4 O4 t7 e
分析的文件名,748 KB (765,952 字节)
+ m+ w Z, _, k8 ^9 c5 N1 C
toh.exe
+ T# R# D& |7 {' X
0 ?/ B6 C0 L8 h1 L5 B6 N
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
: S5 w9 r4 ]' }+ g
等日后再仔细研究,看显示函数究竟在哪里。
: U7 B( g" H9 h' ~
x! I1 K2 h- Y$ l; x
toh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]
2 o4 l U e8 V) K5 V
004316C8
. ^ ?. Q1 z" o, A$ J
/ ]6 A' ?' |0 C( R2 ?: |
第1处
+ Y. u: u; g+ _7 M% z& g
void sub_4519B8(char *a1, ...)
: T) [0 b9 y" }( z! B9 @& `( p: V" V
{
1 B" B7 e; O# F) \3 f1 E# z8 G% d P/ O
GLsizei v1; // eax
% d; S' Q( b {3 Z( P/ H
char lists; // [esp+4h] [ebp-800h]
H* o! m9 Y2 _! O; x3 W6 t# g
va_list va; // [esp+810h] [ebp+Ch]
% ]/ p# }9 `1 t
; K! h. h; V7 O% h& ~
va_start(va, a1);
, ^# c1 c' i, o! \
if ( a1 )
" \2 c+ `) q/ X8 @+ V
{
" l5 n7 A. o! ]& V: T: A
vsprintf(&lists, a1, va);
- |' j1 c/ T& d0 X8 [* l9 }; O0 x
glPushAttrib(0x20000u);
# ~7 h" K' l% H J8 g/ J. Q- J
glListBase(base);
" f% x" o+ ^8 M+ Z* E: ?
v1 = strlen(&lists);
7 N6 X2 X, D: ?1 B$ k: h) N
glCallLists(v1, 0x1401u, &lists);
# C9 g3 w8 w. ] P5 V6 M+ H
glPopAttrib();
; ^: Z/ r- p. K9 J
}
; ]! v" ]( Y9 }, o7 b
}
复制代码
, G* {$ C" I& B6 a+ c: T6 G( g
第2处
! J% l+ z6 o- ^ U$ Z& k( n
void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
5 C) V/ f: S/ g# M- H5 G. p
{
* ^) n/ \$ d5 X2 v0 U: K
int v4; // eax
* z# d) ?' h7 n8 ]2 {
GLsizei v5; // eax
0 i1 |5 v3 P8 \& g5 A, L- S( F/ Y
char lists; // [esp+4h] [ebp-800h]
Z! I. S- ^% M3 N- ]
va_list va; // [esp+81Ch] [ebp+18h]
7 W" Q4 ^ ^& f5 o/ j' w
8 C2 c: H" D7 @/ y9 s
va_start(va, a4);
. m5 A6 T: `/ o. c- i3 Z0 y Y% n# Z x
if ( a4 )
! z+ T/ p5 Y0 }( A i) G$ m/ n
{
d: o* v+ `0 X: `
sub_44FDD0(a3);
" g3 A" F1 A4 w( l
v4 = sub_40BB44();
2 M L! a; y8 B3 t& ~' Y4 ~
glRasterPos2i(x, v4 - a2);
! ]- r, h$ s0 p( @! q& I( ^# C C6 T
vsprintf(&lists, a4, va);
, t/ y4 K2 R+ |2 o& Y N+ q' I
glPushAttrib(0x20000u);
! u1 I: V' M" l L
glListBase(base);
) e5 x- a" o; \1 F
v5 = strlen(&lists);
* }* e& ^: m! R3 d
glCallLists(v5, 0x1401u, &lists);
5 F: U8 v2 m0 a. b2 G, p K
glPopAttrib();
[% z( l; a2 l& a
}
7 O9 C: z& {& ~2 J4 [4 [, G* ?% @
}
复制代码
$ U5 @) z* X. S8 w) A' d+ v
4 n: V3 w* H+ B% H* z
$ e. [/ z) X# E9 O& s7 O
第3处
void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
8 k' V6 A( ^. z' y3 Q% g
{
" _' u3 N+ D7 r$ w1 V
GLvoid *v7; // ST08_4
3 k; Z$ `' G: O9 ]5 q, C* g
GLsizei v8; // eax
) B* y8 f; o: x6 J6 U8 g/ v) Z7 `
int v9; // [esp+0h] [ebp-1018h]
$ @* V# \$ z5 H6 f$ u5 V% g: [
char v10; // [esp+8h] [ebp-1010h]
' h. U# Q) h! }" p) o; d3 i' @
GLvoid *lists; // [esp+100Ch] [ebp-Ch]
, l: O3 ~7 v& Y3 v4 u
char v12[5]; // [esp+1013h] [ebp-5h]
4 H% F, N( i% J
va_list va; // [esp+103Ch] [ebp+24h]
+ }$ F* g/ P+ q0 ^% ?% e, v
- k8 W4 W9 o T. h
va_start(va, a7);
; e; V. N, S8 X
v9 = 1;
+ m! n2 y' r: u" Z5 Y, D6 V8 x
if ( a7 )
+ M% Z% M8 C) l+ E D- L
{
* F/ u" }+ J" U8 W5 c6 t
vsprintf(&v10, a7, va);
3 ^; D) U) l( Q' y
glPushAttrib(0x20000u);
- E ^: X$ m' x8 `2 Q4 T
glListBase(base);
, [1 O) \3 a# C& n! n; w
lists = &v10;
* }7 D. v/ Y0 R& W
do
6 x$ j1 g. M+ r$ A# h6 t
{
' b( e. i' n, G. g) X5 b' J
*(_DWORD *)&v12[1] = lists;
+ f1 F. ]( G! l! ^0 y! s" q3 ^1 W
while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
* ?% E' q1 k+ D1 U; s
++*(_DWORD *)&v12[1];
/ @# D$ w7 ]! e
v12[0] = **(_BYTE **)&v12[1];
4 p0 ?( ?+ x& Q. E+ A5 K' w
**(_BYTE **)&v12[1] = 0;
P! V: v! |# Q" K
if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
0 i- Q2 L& S, K! x- o8 M& l; X2 A
*(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
% Q) }, {5 X% t: z. V
y -= a5;
( p. B/ e$ c# `0 Z
glRasterPos2i(*(_DWORD *)a4 + a1, y);
- [6 [, J# z1 ~
v7 = lists;
! ]( ~6 o8 \3 b8 X; h' B1 V4 \
v8 = strlen((const char *)lists);
: ^1 Z& f) d5 G* a& ?
glCallLists(v8, 0x1401u, v7);
- g1 E1 S& |4 p+ v( o' C# F
if ( v9 < a3 )
) g7 r$ \: ~6 x" [' f
a4 += 4;
- [+ y9 ]5 r8 D' S! ]$ M
++v9;
) D2 n" j; q2 A. P7 L7 _$ [
lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
: j/ i% j; h/ [* F
}
% X9 r. G `4 g+ R9 b. u8 \
while ( v12[0] );
4 r9 W" |" r4 W7 Y) `8 @% A
glPopAttrib();
: H) y7 E& o9 ^ @6 n3 r8 V
}
3 w" c" U# Z1 ?) i6 l5 e0 X
}
复制代码
# m$ x9 N/ _2 p8 G( q- r+ o8 p+ }
; j! H) d( o/ A6 @
! m/ ]8 i* ^$ s/ K! o
! n9 T6 I! z; O' q
( s1 s6 ^0 K9 v, B1 ]% @2 s
$ h. H6 j/ T9 Y, l. ]% i X
" T* _; s7 Z3 ?
3 L$ u, W+ c5 X+ L: v2 c
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2