本帖最后由 shane007 于 2023-9-4 18:28 编辑 9 P' g7 u, D% I1 j
3 r4 ^5 R: E( p
这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,
0 S" R7 e, Q n! m4 [但目前已经有了英文补丁,因此汉化又被提上日程。. V H P1 }; v5 D5 A. i
7 M/ \1 {8 X" M& Q. R! m( u. P
对opengl的调用主要是在toh.exe完成的,
, l1 O2 s1 d+ d3 ?9 K对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数$ u+ `2 {3 u: V
7 }# m( U _' |' HglGenLists的调用处共有6处,每处都类似,) |( T" c$ M* D
可见游戏初始化了6种字体,每种有256个字符。1 K; E0 n' Q: M, ^& p! M! O( U
其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。( H/ i; p8 S$ Y, S$ r9 {3 N- X6 l
修改的时候,应该还要修改到上层调用的其他函数。
$ t8 c [, Q2 Y* A7 J' r# B7 V- BOOL __cdecl sub_4518C0(HDC hdc)
0 v4 F3 ~/ I, ? - {. _- F; M, U4 f0 f Q% I4 A# {
- HFONT h; // [esp+4h] [ebp-8h]
; g7 k, G/ N$ C" i/ | - DWORD iCharSet; // [esp+8h] [ebp-4h]% j- v. r# m. j# J
- ' Y4 @) a) o& x, X
- if ( dword_4A4490 <= 1252 )
6 R( [: Z" l1 F5 f9 J& r. } - {
- f# V' G; g' w1 v3 o5 N - if ( dword_4A4490 == 1252 )
1 e! S" ^, m9 X7 R* h" E - {3 p# I8 K* G+ ^$ c8 H
- iCharSet = 1;
. [7 ]. @7 ~& D S: M, w' V - goto LABEL_11;
1 O! k4 c, y0 p8 h% U+ I: M - }
/ ^% Z: O7 D3 b+ c/ M& n _7 A - if ( dword_4A4490 != 1250 )
& E: }; p/ u) [" \ - {
! u8 M8 {- `9 m8 M1 \5 {( o" o5 X - if ( dword_4A4490 == 1251 )0 a, q7 p( C4 S) M0 I1 h
- {
! W$ Y, G: H1 ~" \; L. W+ Y - iCharSet = 204;7 R" H+ t: U6 d1 B% J
- goto LABEL_11;: U: l7 _2 }/ \8 j6 E1 \+ f, @
- }3 {4 E% _4 R9 ~9 ]5 s% [
- goto LABEL_10;6 }, g2 p# E5 p
- }
# J; b8 `" o- X; X - LABEL_7:; p- W+ e9 U0 C0 o
- iCharSet = 238;
% d- X9 C! b/ |5 d; @ - goto LABEL_11;2 ` J0 g5 }/ h3 w% {1 |* r1 e
- }0 |( ^- \1 Q: z/ k( G
- if ( dword_4A4490 == 11250 )
6 F3 W7 L. o5 ]& E+ u! o% ` - goto LABEL_7;: U: e0 ^; A$ U
- LABEL_10:
2 |5 y8 Z8 b h# t+ C - iCharSet = 1;
m, {4 P* b5 L6 i9 i$ W2 g% ]* { - LABEL_11:
" z4 [/ O( [- o( C - base = glGenLists(256);
: m% S# \3 t& r. z) C, Y8 q$ [ - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);2 K# {4 I# d' L2 e1 g f% T& F( j
- if ( !h )
# q% n- D( ^3 [. L - MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);3 U* S: X3 n8 `4 ]$ O
- SelectObject(hdc, h);
2 z/ j' c" A4 q, j - return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
/ Q. |/ }" _1 Q# |$ O - }
复制代码 : y; ^; \, O! `5 l1 A9 @4 Y
% j3 U P% i! \( u; a
glCallLists调用的地方共有3处,# b) m! q# q) B6 {, g
这个函数就是游戏的显示函数,共有3个参数,% [2 d% t$ N8 S; L2 G. I$ i
- void WINAPI glCallLists(
$ o+ H- U% a) \6 q6 G - GLsizei n,
4 M% O0 e8 p, @ - GLenum type,6 K4 L$ ?8 F/ t1 }" E9 n3 U) O
- const GLvoid *lists: p; h" Q, ?0 G5 D
- );
复制代码 ! L& S9 B# \4 r- y& g
3 t; X. b# I, [ 其中n为字符串长度,type为字符串类型,*lists为字符串指针,; |2 T" y! w$ ?" Y" L
如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:
9 B. i+ \9 f0 c% e' }# ] 需要修改为GL_UNSIGNED_SHORT,即0x1403。
5 K1 [9 f$ X6 c% n& O. G; v
+ V2 `: E# Z2 E( k3 z( Z: N定义
- P' \ q. D5 N. j- r- #define GL_BYTE 0x1400
: h5 g6 A" O: B2 k2 Q - #define GL_UNSIGNED_BYTE 0x14010 b, d& }9 Q' N% b- O4 |
- #define GL_SHORT 0x1402, m# h: R, `- ?
- #define GL_UNSIGNED_SHORT 0x1403
& q% N. z7 s& r- n0 l4 ? - #define GL_INT 0x14046 w9 ?7 i) }$ F P+ U4 r, l# ?
- #define GL_UNSIGNED_INT 0x1405
! a A3 Q/ M `$ ] - #define GL_FLOAT 0x14062 |/ ~% D; g% G0 |8 H& t) W% c
- #define GL_2_BYTES 0x1407# u" w' o0 `4 E) p3 `2 S
- #define GL_3_BYTES 0x1408
$ m" z, S9 Y/ N) d6 G - #define GL_4_BYTES 0x1409
) e+ G7 ~: w: I% F - #define GL_DOUBLE 0x140A
复制代码
6 H( Q! ^- |7 F; Q6 _% z( u' a9 f' y. ~7 q! J% e" L
|