本帖最后由 shane007 于 2023-9-4 18:28 编辑
0 K, i, `5 c% R) p& p/ W. v
; K& k1 M p* h% \5 h! r3 n3 F这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,
! K, w% P, Y3 s: ]. w, i* ]5 N但目前已经有了英文补丁,因此汉化又被提上日程。4 }5 Q" w1 r- M x# P* x
- m# \9 s) Y( O! J: X+ s- u对opengl的调用主要是在toh.exe完成的,2 h2 f4 s8 @& x! c2 S
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数1 g5 M% e* _) J, m; }
3 V8 i* i; [1 N7 W' a+ B
glGenLists的调用处共有6处,每处都类似,, N3 I' d9 a1 P# w3 x
可见游戏初始化了6种字体,每种有256个字符。9 F0 r1 F6 [) f, l V" l, ~: K
其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。
9 w$ v1 ?# I7 }5 e" g修改的时候,应该还要修改到上层调用的其他函数。
) N$ |) X0 o/ ]- BOOL __cdecl sub_4518C0(HDC hdc)* t9 h9 p4 F" y5 a' k/ H+ H
- {
! @( w. U. W7 W+ G( P - HFONT h; // [esp+4h] [ebp-8h]# Y* a2 t0 A2 I( D/ P
- DWORD iCharSet; // [esp+8h] [ebp-4h]
5 s+ C5 k2 C. {% m3 i: I
& ?1 ~) I, T6 O- if ( dword_4A4490 <= 1252 )9 M( z* }0 a5 ]0 {# ~
- {
0 B6 r( }6 V" } - if ( dword_4A4490 == 1252 )
4 i8 L9 V/ y2 K, X9 u( x: D T - { E$ V$ O7 q/ r) v5 \) L
- iCharSet = 1;. i0 K- A2 d' V2 h
- goto LABEL_11;
* o7 ~; e* S# K# K7 U1 w: G - }
, J# {( L+ U* Z" h) l" y9 e - if ( dword_4A4490 != 1250 )+ h( q. V3 i: ^# k- [ E
- {* R8 V) F$ S. h1 ~- f3 r# |
- if ( dword_4A4490 == 1251 )
0 y( {& r2 ~" g" k+ m - {) }$ y4 [* d6 |# X
- iCharSet = 204;
: p' R d; s, A - goto LABEL_11;# u& J% _* C; H x
- }2 H0 |" s) z- P1 j5 ]0 c
- goto LABEL_10;. b P1 H/ q: { w) d, G
- }% U7 G. K0 ?! t
- LABEL_7:- v2 ?+ T' a# s8 o) g/ Z
- iCharSet = 238;6 X. }% s2 X3 K# _) y
- goto LABEL_11;. `( L6 T' C+ r
- }
0 R. H3 W6 o) G - if ( dword_4A4490 == 11250 )1 f) M9 B4 i" f- Q" o- }5 G6 u
- goto LABEL_7;
; e1 P! B) ]# n) w - LABEL_10:
) Z: m' Z- U6 V; ]- }/ x - iCharSet = 1;; d4 ~. k; @1 k+ N* t
- LABEL_11:
9 A" ] ^, s+ b$ w - base = glGenLists(256);
3 r4 y* p0 c, ~9 p3 i - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);
$ A9 l$ T; g! c+ Z9 v: ^ - if ( !h )
% u% ~0 d; m. {. o; m - MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
B' N/ d) Z! {+ w" p) k2 s9 n( n - SelectObject(hdc, h);2 J0 h( h+ n: P/ z& z3 d9 x
- return wglUseFontBitmapsA(hdc, 0, 0x100u, base);6 l; J! {3 [8 c. d9 Z: G
- }
复制代码
3 J% s3 H3 C3 @7 h# e x
+ k# k' `( }% W; Q' ^ J0 oglCallLists调用的地方共有3处,, H. v0 G8 Z9 a: f9 h3 H
这个函数就是游戏的显示函数,共有3个参数,
7 p0 J. x9 Z4 _- void WINAPI glCallLists(
, r: N$ U: Z" j8 L - GLsizei n,
( h% v1 b4 u$ H& P - GLenum type,
/ K" n# u9 J+ T0 }* |0 V - const GLvoid *lists
& |5 o5 H, w4 q7 N) L+ F2 _ - );
复制代码 7 d% U# h/ E# ?* c
( O# t& @* d; v* @; R4 f
其中n为字符串长度,type为字符串类型,*lists为字符串指针,, A7 ~7 x4 Z Y- h C! u7 v
如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:; b5 D5 V4 ^, ^- B4 M; J
需要修改为GL_UNSIGNED_SHORT,即0x1403。4 T) _' g5 Y& t5 h1 {
8 ]) [9 P/ Q* P. O定义
! ?2 T7 B4 m' l/ j) E! p- #define GL_BYTE 0x1400
( @6 u. T; G( `$ @4 ]7 c* ? - #define GL_UNSIGNED_BYTE 0x14017 a! g0 G2 Y* X3 p- |
- #define GL_SHORT 0x1402
: Q' c: X) L" P5 l; Y3 D5 z( a- V - #define GL_UNSIGNED_SHORT 0x14032 m3 x5 _( \' Z+ C, I
- #define GL_INT 0x1404
& _5 z! d6 ^. V2 F% J - #define GL_UNSIGNED_INT 0x1405) ?1 I. o# t8 O9 V" F8 n; e
- #define GL_FLOAT 0x1406
8 v# z) V2 p0 ]) J - #define GL_2_BYTES 0x1407
' o( t* ]8 N& o1 y" d - #define GL_3_BYTES 0x1408$ ?9 q; e- Z ?2 t0 i/ |
- #define GL_4_BYTES 0x1409* ^: @* R8 W8 B+ `& H6 G1 A8 Z. ~
- #define GL_DOUBLE 0x140A
复制代码
4 O2 v, k# x" n! Y+ R, `- \
S" ~$ k# D2 N8 M: ^+ M. H# c |