本帖最后由 shane007 于 2023-9-4 18:28 编辑 7 F2 H$ f& h" t7 H" }' c2 t6 I
3 g9 b% m7 Y% c- v0 _这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,
7 M: n8 J! ` ]. V# f: t. ]- |& M但目前已经有了英文补丁,因此汉化又被提上日程。
. l, z. B8 {; O3 ^# [) U3 A5 Q0 J2 |- t
对opengl的调用主要是在toh.exe完成的,7 |4 U. U/ X& H V! F/ e" h
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
3 r; C4 }/ P/ o" v+ t- f* B& Z/ R# A) n. r1 n
glGenLists的调用处共有6处,每处都类似,4 X" m# n: |( U0 {: m; Y
可见游戏初始化了6种字体,每种有256个字符。
; [/ v$ i: z ~' [& K, H: l% i其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。
3 w+ F% i2 O( Z" Q3 J9 x7 c+ W* d! O修改的时候,应该还要修改到上层调用的其他函数。
1 _, Y; x6 ]9 V! Y- BOOL __cdecl sub_4518C0(HDC hdc)! L( W' Z8 n9 I8 a- ~
- {1 Z8 L. K9 ?* h G
- HFONT h; // [esp+4h] [ebp-8h] t: M! C; Q' ^9 B" r( c+ U) I
- DWORD iCharSet; // [esp+8h] [ebp-4h]
) M8 L; @3 J. K
t, ], \/ B( d% y {! C# s- if ( dword_4A4490 <= 1252 )
/ S; v: g" g' `, S) V) j - {% U; N& S9 C0 |6 ]& V; q( r
- if ( dword_4A4490 == 1252 ), ^2 A" P, ^. h l3 V
- {- k8 D- \2 K- F+ e
- iCharSet = 1;) K( _0 s$ e, d4 N3 P
- goto LABEL_11;
5 J" d; c$ G( ?8 o* t - }
: U3 ^- H: Z4 V$ H6 h% a - if ( dword_4A4490 != 1250 )
- P! G) a3 z6 e: N! Q - {
# ^* M1 x+ P) k1 ?5 w - if ( dword_4A4490 == 1251 )) v- g4 }" u8 u6 F/ U7 F3 M
- {) p& Y3 j" Q, r) ?
- iCharSet = 204;2 f8 p- u6 K7 ] V$ T+ X( @
- goto LABEL_11;. M6 _5 w9 {# Y" _6 y
- }1 C. m0 C7 |: }. @! g
- goto LABEL_10;
# D5 F5 w; u+ T+ I# k5 [/ A - }
7 m" |# _8 d2 d! ]% i( Z - LABEL_7:
" P# Q" }2 n+ b2 b$ f4 w, }' o - iCharSet = 238;" `$ d8 ^; W7 P1 y1 B0 D' L$ p
- goto LABEL_11;
: r& j/ X) l# P% q" B' m - }
- \# b! J* o+ V - if ( dword_4A4490 == 11250 )
: ~+ ~, }4 b+ h! i$ _2 x5 { - goto LABEL_7;
( I* T( H- A) F: \ - LABEL_10:( g N( t% C1 h. @; t2 Z- x- q0 ^2 c
- iCharSet = 1;
6 Y+ V7 l0 [2 }8 G8 F - LABEL_11:6 Z k' U/ H) [0 L. B
- base = glGenLists(256);
# r, E3 z) A! U/ X; m' N/ w6 A - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);7 j+ y2 ~$ N/ ^- ~# A
- if ( !h )
7 e; d9 i6 p! Z+ p/ P1 @: ^ - MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);* k, F8 _- ?7 S' C6 V' O, _: d& ^
- SelectObject(hdc, h);
- Y8 M% a1 N! P1 F3 V) ` - return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
! [2 C' K5 B1 r( [ - }
复制代码
' A p k: ~1 I
, L% c# W- J# d4 S- yglCallLists调用的地方共有3处,
0 u4 W* {* L; v' q2 ]$ }5 Q" q4 Z这个函数就是游戏的显示函数,共有3个参数,
0 q1 n! a* f) F- void WINAPI glCallLists(
, {" A' B7 r! u- f0 O, P - GLsizei n,
& Y8 a, u' q1 j - GLenum type,8 z7 Y1 A: C; L5 @5 e
- const GLvoid *lists* F7 j8 s' \# L
- );
复制代码 # D' z% q) v6 }9 K x) C9 o' t/ d
/ Q! P0 E9 h; b8 x; O$ w
其中n为字符串长度,type为字符串类型,*lists为字符串指针,
; X6 j) c2 S6 V 如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:, P5 v3 e8 x7 g3 ^) P
需要修改为GL_UNSIGNED_SHORT,即0x1403。% y4 p) _3 ?7 E3 V& D
# \" i) J, f$ G( k$ M U
定义
, O( [ d6 j0 K: }# Z- #define GL_BYTE 0x1400* z: ?9 F' j q8 [2 \1 O \
- #define GL_UNSIGNED_BYTE 0x1401
/ K. D" ?3 |+ A* g - #define GL_SHORT 0x1402
, ^% S# O7 \& l! x! R0 U' Y - #define GL_UNSIGNED_SHORT 0x14037 ~8 O: z# I f6 F7 V8 [( ?
- #define GL_INT 0x14041 j8 t* U- S1 v q* F
- #define GL_UNSIGNED_INT 0x1405
4 @1 m8 i" c1 W- W - #define GL_FLOAT 0x14067 a* g5 l; E8 h! w
- #define GL_2_BYTES 0x1407: q, p: N, V! t: ~0 \7 W
- #define GL_3_BYTES 0x14083 t" K4 Y; _6 i$ {
- #define GL_4_BYTES 0x1409% a; Y9 ]/ c0 w$ x
- #define GL_DOUBLE 0x140A
复制代码
& n9 X. h4 o* t) A
% X4 e3 D% a9 y A |