本帖最后由 shane007 于 2023-9-4 18:28 编辑 ) V0 l$ k9 ^9 O& D: M% s
0 P1 E* E$ n( O9 U
这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,
6 C: K; ] o* p但目前已经有了英文补丁,因此汉化又被提上日程。
, o* s5 Y; a. b5 J; p' u4 i4 ?
5 z' Z5 p/ u% \0 H对opengl的调用主要是在toh.exe完成的,& x& M: i3 ?8 D! X% J: I
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
& U; s3 `. s& D! r) d
G/ h5 w3 n- V0 G$ H- R% h! c' _& |glGenLists的调用处共有6处,每处都类似,
) W/ u: u8 F8 ~( }7 K8 B8 O可见游戏初始化了6种字体,每种有256个字符。; k2 W& e y; p& N( x0 ^; N6 e
其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。
2 k- O. O8 ]$ x修改的时候,应该还要修改到上层调用的其他函数。
1 A0 h* k' v5 C ^- BOOL __cdecl sub_4518C0(HDC hdc)( Z6 i B3 I; j/ o P) E7 l+ o; V
- {
3 X2 ~& d3 a1 {7 ]/ b4 J - HFONT h; // [esp+4h] [ebp-8h]. P( c- t/ B3 @( ~) D
- DWORD iCharSet; // [esp+8h] [ebp-4h]
; H( ~( B' `# S1 G% R - : A& }/ p0 i, ]4 d; d b
- if ( dword_4A4490 <= 1252 )+ `9 [ m. [, }$ W0 w
- {: ]+ k; B5 Y3 v2 K
- if ( dword_4A4490 == 1252 )
% u9 {( D. B ~0 l - {5 ^6 E# c; M6 r1 |" ], E
- iCharSet = 1;
, {" R1 Y+ P1 e9 C! t8 Z% v - goto LABEL_11;
1 y7 j+ D4 S* V& ^. x - }9 N1 W" D) B( E N. w
- if ( dword_4A4490 != 1250 )
2 E8 R# f! A2 B( Z0 P0 c( T - {0 c7 s# {8 G7 c" r5 K6 [8 U2 ]
- if ( dword_4A4490 == 1251 )( ?! @/ V- H4 D3 g
- {
( O/ C) P8 f- y6 S: F - iCharSet = 204;3 g: h! w' B5 J9 ~4 d$ v
- goto LABEL_11;, E" H) Z9 H5 [( Z$ u- f
- }4 G1 \' ]1 N6 Z2 X& D
- goto LABEL_10;+ S1 b$ k: n2 Z
- }9 D0 M5 K& ~! r( M* T! P
- LABEL_7:
8 D; s2 l; G' u) H5 t* G+ ^ - iCharSet = 238;
! \( i" r* M5 U4 r - goto LABEL_11;
$ _! f" W& ?' S6 R$ S3 @ - }* r& O) w. M e
- if ( dword_4A4490 == 11250 )
. V3 P) R1 p" h' O - goto LABEL_7;
" M8 Y1 s* o) [ - LABEL_10:8 s P4 @% m0 ^, e x7 i
- iCharSet = 1;
, u5 J- `" Y# _9 ] - LABEL_11:
# M. \3 p: R. a! N9 g2 N - base = glGenLists(256);1 `& |; i, m; h* h% q8 [
- h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);5 _! j- G' `7 V
- if ( !h )
6 ^# Q% @2 v+ K9 b/ T6 ?6 O6 T - MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
. ?, U" ^! L( Z0 o7 L - SelectObject(hdc, h);
/ L: ]+ }* w+ A - return wglUseFontBitmapsA(hdc, 0, 0x100u, base);$ ^' o0 h# y$ j+ H
- }
复制代码
4 k k. P0 h+ R3 r5 y# g- S- I- N) p( ?" r) |2 L
glCallLists调用的地方共有3处,6 y, U2 M( j! ?
这个函数就是游戏的显示函数,共有3个参数,
% }1 w% O7 \6 p+ ~& Y4 R- void WINAPI glCallLists(
. V1 H5 @+ m5 D, S - GLsizei n,
. H" v) _ g( |* Q; A - GLenum type,
7 m4 I* D t1 z- \4 M( `% |5 s - const GLvoid *lists
- ^5 C, Z7 Y5 F- T4 x - );
复制代码 0 `. @. L* `. Q% N8 w" L" S2 K" z3 g
$ |/ S9 U) W W& J- s
其中n为字符串长度,type为字符串类型,*lists为字符串指针,
7 l4 Q' T5 F/ o! u 如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:
4 K) d0 M B' r! y8 H6 i 需要修改为GL_UNSIGNED_SHORT,即0x1403。 r3 i0 P i, a# l" ]& j
$ e5 g6 E, [# ]0 _8 h
定义& T# v O- j- M$ K: u/ b" [
- #define GL_BYTE 0x1400% \4 Y, q- w4 B1 }( D
- #define GL_UNSIGNED_BYTE 0x1401
- ~ h' G8 o& E/ f; o! A* y - #define GL_SHORT 0x1402
0 ]& ?6 S8 P, e6 F- \5 F - #define GL_UNSIGNED_SHORT 0x14034 s; a; T2 f1 J6 S% E
- #define GL_INT 0x1404
1 }; M6 a; W6 N- e! Z/ F7 e% {* Z$ J$ p - #define GL_UNSIGNED_INT 0x1405 b3 j0 R# a# y6 G9 w% C5 t
- #define GL_FLOAT 0x1406
6 _0 w# h1 F! @) D! r2 H% O( K3 T5 O - #define GL_2_BYTES 0x1407
' t; U# g, |9 O4 ? - #define GL_3_BYTES 0x14086 O. E: e9 k% c/ z
- #define GL_4_BYTES 0x1409
7 M2 `, B1 d; c: J, C! t - #define GL_DOUBLE 0x140A
复制代码
X5 Z8 o+ p2 c: L/ v2 T7 V# {6 U4 x
|