本帖最后由 shane007 于 2023-9-5 15:50 编辑 $ H7 m7 ~+ N8 g4 `* s8 ]/ |, v* C
: M/ \2 t: d2 }4 k% Q
glCallLists的调用处,共有三处。
+ X/ j( {# s& d( k* n0 g2 m# m此三处估计是对应游戏中三类不同的字幕。
, _' O1 F. F% w0 I5 o8 m接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。/ t. u$ C2 w0 ^! b f- B3 }
分析的文件名,748 KB (765,952 字节)2 h; b& D) N3 ?6 ^7 w2 n
toh.exe
: B; p" m. [6 i0 P' o; o% S6 J- K9 | ~$ ]/ \6 j" {
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,- \6 n- U3 O6 j; z/ M
等日后再仔细研究,看显示函数究竟在哪里。/ l% h) C& \& W9 D% Z1 T
5 h1 s6 d! P$ I# G1 K1 e) P) {
toh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]/ N* }# f' T( H: x( u
004316C8
: \. w. H1 C5 R, G9 F
1 d f; _3 T L! x% I第1处' |, i; M( s$ t: t/ C) U" K
- void sub_4519B8(char *a1, ...)) V3 U. A9 V' q
- {1 j$ o! c0 l6 m2 Q
- GLsizei v1; // eax" ~$ O) l; a `1 a: J" B
- char lists; // [esp+4h] [ebp-800h]
- O+ V3 t7 f' s j2 M7 g - va_list va; // [esp+810h] [ebp+Ch]& R6 J' q- O! Q
- # N2 B" D$ \! I G* `8 l" e
- va_start(va, a1);) z" S; D/ ^4 a! b$ f3 s
- if ( a1 )
# r- N* d9 F& _5 ]5 R6 f5 {9 c - {& m" t" m$ m) m, R
- vsprintf(&lists, a1, va);
+ W$ X% A7 I6 a6 q7 P - glPushAttrib(0x20000u);5 \2 _( x. u: s* g* Y$ U* U, \
- glListBase(base);2 d2 I) _; B5 o* U! `0 @! ]8 G
- v1 = strlen(&lists);7 p& P: e' ]) d& @3 ?/ X- |. J
- glCallLists(v1, 0x1401u, &lists);
" Q1 Q0 [5 a( e* n5 ?# z - glPopAttrib();3 v/ v6 X1 o1 _( u d5 H
- }& O) I& [6 ]7 N. y5 ]; ]
- }
复制代码 4 m' x, A$ r+ x7 A+ A" N! t3 [+ B
第2处$ ~7 t/ V% L1 O: J2 q: n8 F0 M
- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
! ]' N1 u' W" |! t( x9 M - {
1 P4 h4 r; Z$ m1 ~& ~ H! B) A! A - int v4; // eax7 t0 _/ _, m( |4 E4 `9 C# N! K
- GLsizei v5; // eax' z: o8 \& S% K+ b a
- char lists; // [esp+4h] [ebp-800h]$ S; Z: U) T) }* f7 v9 S
- va_list va; // [esp+81Ch] [ebp+18h]3 `$ C- X% |' x
- 7 ^. N9 _$ `8 P, x6 s+ s* ]
- va_start(va, a4);% c- A; O0 \2 g7 M2 i; V5 ^7 e7 F
- if ( a4 )
, x5 _# _$ B6 } - {
9 {0 ~- }6 ^$ O# O% L, \4 B$ i% O* S - sub_44FDD0(a3);# h- t' k: B Q8 z% }- K1 d
- v4 = sub_40BB44();
( G/ k6 u- b5 X" Q8 A - glRasterPos2i(x, v4 - a2);
1 V# T3 `( H4 x: @/ V1 ? - vsprintf(&lists, a4, va);! |: S# d! s1 H2 N. w( H
- glPushAttrib(0x20000u);
. [! s: Q e2 }, I- c$ x8 G - glListBase(base);+ r; n4 [& E9 Y- g; \3 F3 h/ S8 P
- v5 = strlen(&lists);
* A9 B9 [2 e7 e* ^, e* A& w! I - glCallLists(v5, 0x1401u, &lists);& |9 D) P' R% @
- glPopAttrib();
$ [1 z& g/ U4 ] - }
, I; Y; \% W& L7 u% T" X - }
复制代码
) h% d" K/ u1 q, @/ O# b% \+ p; z. Z, ]( P3 {+ U
; M9 n1 D; A r
第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
, u* o6 I% ^5 t4 M; O' J - {
$ ~) P) z. U( W - GLvoid *v7; // ST08_4! G/ m; n2 l8 g/ h2 W) P& |
- GLsizei v8; // eax( r* |8 |1 X3 B7 x+ C
- int v9; // [esp+0h] [ebp-1018h]
3 S5 p, z( z2 N% E3 f" S& g - char v10; // [esp+8h] [ebp-1010h]
% n+ z0 V' v- V% k. B. B1 G - GLvoid *lists; // [esp+100Ch] [ebp-Ch]- w, l U( W* H: }
- char v12[5]; // [esp+1013h] [ebp-5h]" Q9 S, z5 d6 P. P% z2 Q) D/ q3 L5 Z2 s
- va_list va; // [esp+103Ch] [ebp+24h]2 b7 N7 F, J) t. ?: N6 T/ p* C
- 8 v9 M8 }& V" A2 y- ]
- va_start(va, a7);
9 ?3 w- r" p* j: W - v9 = 1;. ? U7 n) W( T
- if ( a7 )
, O% e F9 {/ B2 V; t0 j1 Q - {, \+ x( z$ S4 K* n1 Y
- vsprintf(&v10, a7, va);
3 o8 Q: r& t4 X2 r+ M - glPushAttrib(0x20000u);
8 K7 d3 R, `: R9 E# R, ^9 b - glListBase(base);
$ m9 Y1 ]. o9 b5 V R( B8 C - lists = &v10;
+ R. f& q$ }; x. \: }8 T - do
5 A0 ?0 h I$ ]; t3 @) \ - {* T% Z% u" }: |" |1 f
- *(_DWORD *)&v12[1] = lists;# q/ }3 M/ U0 {. F2 I5 c: D
- while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
; M/ @; Y5 |! O8 [ @* e" u - ++*(_DWORD *)&v12[1];8 S1 O2 ^6 |2 O
- v12[0] = **(_BYTE **)&v12[1];
# {! k- J( G( P" Y4 l - **(_BYTE **)&v12[1] = 0;5 ?/ b" D% \" u4 \
- if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
+ A+ w. T/ \& h! a6 L - *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;7 ^5 c, @3 `" L+ F0 }. w
- y -= a5;& _+ {, n( _; T5 s2 F. d" d
- glRasterPos2i(*(_DWORD *)a4 + a1, y);, B, o v1 @( e9 r5 z R& b
- v7 = lists;( d5 {4 g' j8 |% y
- v8 = strlen((const char *)lists);
, S. f: j7 q4 e A ] - glCallLists(v8, 0x1401u, v7);9 f/ \( w4 K/ E% p+ ~, j" R
- if ( v9 < a3 )0 O& h0 ]. ^' P: K$ _! Z2 ?: o+ M; L
- a4 += 4;
, W. y2 d2 M7 ]& L9 S& U# ` - ++v9;
! F: }2 g. D6 B6 W, D - lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
1 P7 G, |8 U8 g - }
6 T1 k; `* E, U" W - while ( v12[0] );' y9 P. f5 ^: V3 x
- glPopAttrib();7 ^* q! @6 n% G( ?
- }
/ Z! s7 o6 X; k8 d/ ~9 V" ]" N - }
复制代码 " i& M( N! ^+ E6 X4 n' k2 P) k
- n4 h8 @& Z# g' I6 w# K
l5 \1 Y- N% M4 }7 n! w, N
0 y3 k9 K" d7 _* T8 K" v- n9 Y& e& q5 e3 ]9 i% Z
# z$ d$ Y8 c. l% C
* X7 {2 w: W. R# i: N* x( M! b
|