本帖最后由 shane007 于 2023-9-5 15:50 编辑 . k* `' T, I! D1 U2 `& h L. ?; M
* F N p2 l3 r9 o. Q" r' A: f0 MglCallLists的调用处,共有三处。+ p7 N; T7 ]% g3 m. Y8 a
此三处估计是对应游戏中三类不同的字幕。: j% u4 i9 B7 X! d% a
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
4 {/ ]+ I ?1 I* o分析的文件名,748 KB (765,952 字节)) l% R$ _0 w p: L/ v
toh.exe4 y7 p* M$ a% B5 p+ {
/ \. r( |, f; Y2 D" h经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,+ f) u Q; v: ~9 J
等日后再仔细研究,看显示函数究竟在哪里。
) [5 [& n, o7 o7 F1 T- M$ E" f- O: z5 R* } V* F4 v: \/ z' l9 ]. ~
toh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]( A# r! K$ ?' w7 K6 R3 v5 Q
004316C8
s" s! X+ t# Q4 {5 [5 }1 o8 x0 Q# d! a; u( D
第1处
9 C' a2 f5 U: t) [7 H- void sub_4519B8(char *a1, ...)
. w, y& w8 n( A7 H* \: G - {2 Q% @* M1 q' I0 R* T6 j
- GLsizei v1; // eax* ~8 O5 e, M! {! f9 {1 i
- char lists; // [esp+4h] [ebp-800h]( C+ V# [1 l- z* {! ~( Q
- va_list va; // [esp+810h] [ebp+Ch]- w; j! x! W- e2 F3 D
- , [7 l9 m! P6 a0 m/ e7 D* g# P5 F) {
- va_start(va, a1);
: X; K. a2 @3 |/ j, g - if ( a1 )
Q" w9 h# t; u( z0 J" Y - {
! @/ ]$ c0 X" ?1 e* b - vsprintf(&lists, a1, va);) k( N4 x' s- J N2 S
- glPushAttrib(0x20000u);
2 Q4 C1 ^' _* j) S7 v7 b# e - glListBase(base);7 f: [( ~' }5 `3 Q( U/ z
- v1 = strlen(&lists);8 z' p+ e2 a3 {1 }, C: E9 k
- glCallLists(v1, 0x1401u, &lists);( Y3 { I- k$ ?8 h, J( Q, |" w: r0 [
- glPopAttrib();
8 O1 K* \3 Y; S( s7 T6 v1 Z - }
+ x% z6 S0 x1 a2 G - }
复制代码 + [# ~6 p) p8 A
第2处
8 p, V, i) R. [1 W! U% j+ {7 b- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
) G. N9 H' e/ J - {! p" I% Y* J6 ^! q0 x0 r9 }& q
- int v4; // eax
+ Z& r9 g& ^3 N$ t, g' u5 V - GLsizei v5; // eax# N+ I: J* m8 q6 [0 H
- char lists; // [esp+4h] [ebp-800h]
1 X4 d0 \9 x6 h6 Y - va_list va; // [esp+81Ch] [ebp+18h]
1 d4 A, ?& N6 q. s$ H - Z E; A2 J1 S
- va_start(va, a4);
+ [1 V8 c3 z& Z. a - if ( a4 )& g& `9 \2 I& I( N. d0 Z; l
- {
5 n7 g$ I F- J& {: _3 p - sub_44FDD0(a3);
6 F0 J: ]/ z3 w+ N" `; M - v4 = sub_40BB44();0 _+ [0 \2 y, F) _
- glRasterPos2i(x, v4 - a2);8 Q$ g8 s) }4 I$ m
- vsprintf(&lists, a4, va);6 d, l5 }4 E. j6 Q6 }2 A" ~2 v
- glPushAttrib(0x20000u);( F) d& E7 B8 W
- glListBase(base);4 I6 D7 p) W1 r* n
- v5 = strlen(&lists);
) ?& d6 v* \0 Q. D/ M. L$ d0 N - glCallLists(v5, 0x1401u, &lists);
0 x) j2 q0 K8 w# r - glPopAttrib();
1 f+ D' H3 P0 M7 F. Y - }
. d8 q$ W# {7 U8 f+ d - }
复制代码 3 O; @% t* q9 I6 M! o1 I' t2 N
' ]# ^" L3 l+ T
1 v# g/ P0 e' o第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
. ~% W& l4 g5 c8 `8 x - {0 N2 N* Q+ c# s5 u0 Y F
- GLvoid *v7; // ST08_4
( n7 O2 o& P3 A$ W6 m6 i - GLsizei v8; // eax
0 }# Q5 F/ K# Q - int v9; // [esp+0h] [ebp-1018h]5 L+ r5 K8 l# P6 d* b9 w- v
- char v10; // [esp+8h] [ebp-1010h] `; o) {5 ?) t! g B, {9 s
- GLvoid *lists; // [esp+100Ch] [ebp-Ch]2 r+ O4 n( _ g
- char v12[5]; // [esp+1013h] [ebp-5h]
4 Y3 H6 x& q0 w! v+ H; R! [ - va_list va; // [esp+103Ch] [ebp+24h]6 L0 \. ^. Q* C; i: Y
, k( n( q# \4 C" W' o9 t5 p- va_start(va, a7);# Z7 q. k0 E) v/ J# N
- v9 = 1;
# k# e) J2 m3 s' ?. b9 S - if ( a7 )
" R. g L9 y& l' ]1 a* C$ z. v6 z$ d - {6 R D. S2 H4 n/ q2 q% b1 ~
- vsprintf(&v10, a7, va);9 o1 N* }" B! j- r; J
- glPushAttrib(0x20000u);4 x9 [4 a7 L: Q* b7 i' K
- glListBase(base);
' t* E& g+ N% W' S; O - lists = &v10;$ p9 `' o) v& w5 k0 s
- do
9 f' a( M | p" J& t/ m - {
3 z7 R2 g# v% c- e - *(_DWORD *)&v12[1] = lists;
, F4 g% q( D- k# x0 F( b2 f- | - while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
: [8 p3 G: B7 i1 o - ++*(_DWORD *)&v12[1];* b3 D3 N) u' J. w$ e; A! }$ \% Q# H
- v12[0] = **(_BYTE **)&v12[1];/ C+ B. K7 C0 \
- **(_BYTE **)&v12[1] = 0;- m( w; ]) c& _" z8 _
- if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 ). G, @8 U2 A8 l$ v% K s/ h6 x
- *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;. `4 ? ~) a8 o% V* M3 ?% p3 _2 c
- y -= a5;
4 \2 Z- V( d0 {, a" N" y% X - glRasterPos2i(*(_DWORD *)a4 + a1, y);
/ B- S" ]4 D) B7 D - v7 = lists;
/ P/ B% u S. `: e: Y. {" \* g - v8 = strlen((const char *)lists);
0 O7 M5 d; g& E d* z( Y0 q - glCallLists(v8, 0x1401u, v7);
- V4 r+ v1 h2 q, }) i - if ( v9 < a3 )8 q9 {8 M7 |% K' _; _! M, k2 p. O
- a4 += 4;
" ~& N& S) q C - ++v9;$ G% |# ~+ K, S) W+ q
- lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
, z4 I6 z. y, J - }
0 O3 m% i. o. z) W - while ( v12[0] );
' N6 v8 p0 |: o - glPopAttrib();: p; a0 j- x. O: q- ~; o" f
- }" i o5 ^2 B4 c
- }
复制代码 3 N) G3 t; |7 g: ~+ b
/ U* U& o; |9 Y4 h7 w0 O0 n. T: m ^+ X
; z' h2 Z ?% n+ k% m1 {6 Q9 Y |" Z: A- [
' Q; H; n" E& T* K! W" ^7 z- n
t8 u) m, V4 S: P6 {) J, L0 A
" ~) S2 f' m6 N- y3 L2 f3 X# I8 v
% V% {8 G, |: [ q8 H |