本帖最后由 shane007 于 2023-9-4 18:28 编辑
6 W. l, G& i; m' q% b7 n1 r2 k, i
这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,
$ }8 C5 ^* Q; f/ w1 u3 r7 Y7 q4 t7 ?但目前已经有了英文补丁,因此汉化又被提上日程。
& S1 T1 p- C1 \5 G1 g7 U+ c% h, t& a% [
对opengl的调用主要是在toh.exe完成的,
3 h0 b3 g) O( f' B+ l对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数3 F) i8 ^: n: u
+ K& ?7 y( |5 n9 G* d
glGenLists的调用处共有6处,每处都类似,
6 P6 [: h! |3 q" \% }0 F可见游戏初始化了6种字体,每种有256个字符。
9 e( \- P* E4 q% F5 h7 W其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。" {) o0 r0 Q& z7 ]
修改的时候,应该还要修改到上层调用的其他函数。( y: Q. X {- h4 m" c( z
- BOOL __cdecl sub_4518C0(HDC hdc)
0 O" R p# {1 u - {8 g) E3 O. A/ }* V& I* ]: _
- HFONT h; // [esp+4h] [ebp-8h]
: _! G$ N W( J" r9 R! r - DWORD iCharSet; // [esp+8h] [ebp-4h]5 W# \: K5 ~& T; E
- # o3 y% r% a r: L' _
- if ( dword_4A4490 <= 1252 )8 r5 S- N6 G8 x; y3 H, U
- {( Q0 Q; _ N) G0 d2 b) X7 t
- if ( dword_4A4490 == 1252 )3 p+ f7 b0 f2 e' a7 B
- {% B" M; u( b+ v% M6 J6 [/ L0 j
- iCharSet = 1;$ e" M" W+ |$ K0 O# s/ J# ~0 S
- goto LABEL_11;
6 }+ u: K' Z" v/ @) }" z - }
3 y4 L- o* J R+ ? - if ( dword_4A4490 != 1250 )
* X9 u0 k( h1 W: ]/ w" a# e$ ^. r% t - {! U6 a7 @$ T5 w
- if ( dword_4A4490 == 1251 ) V8 b, e, k7 ?# t1 W
- {. k" c7 v! C3 D+ o
- iCharSet = 204;* n8 ^) c5 x* u! K
- goto LABEL_11;
9 ^3 Q5 o+ d& B/ y) X - }
8 ]# a9 z1 q' g {$ H - goto LABEL_10;
6 q% \3 V& R8 m- N- N( N3 G/ h - }8 L% R9 \( B! t* M2 j- B1 J
- LABEL_7:$ K" w% S# r7 G$ M x6 l4 z
- iCharSet = 238;1 `! x# N6 V( r
- goto LABEL_11;
5 @5 S0 R6 O2 U& Q) D) x - }* l6 k( y7 @- D% \7 W" b% u
- if ( dword_4A4490 == 11250 )
% [. w5 v7 Z8 f( A% \/ `& b - goto LABEL_7;; K1 T7 | q6 |2 g6 H# \6 Y$ N
- LABEL_10:
! e1 i8 r7 R0 }! y l5 D1 b - iCharSet = 1;: c, B" X5 M* M1 A P" n
- LABEL_11:
! A9 M" X' v) f+ ^7 C' ] - base = glGenLists(256);
6 ]$ h7 w3 L! c, _6 Q - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);1 J) |7 n. ~# K! W! o4 b. c
- if ( !h )# e6 l! j" h# y. m$ o
- MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
8 H0 u, T" D2 @% `3 Z9 p. S7 Q# V - SelectObject(hdc, h);; o2 k1 B! L U
- return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
, T$ [' S5 u( z - }
复制代码 4 S3 ]1 Q4 x S
- w! k) I3 D1 J8 ~glCallLists调用的地方共有3处,% s' e% s9 ~+ Q8 p. t
这个函数就是游戏的显示函数,共有3个参数,
. ~2 c5 \) t2 b+ D- void WINAPI glCallLists(4 ^+ J/ u1 i$ S" l
- GLsizei n,
6 t/ O. |9 T# H% L$ @" I - GLenum type,) T& ^2 t* c, M
- const GLvoid *lists: W( ~' t3 f% h% K$ g: Z5 i
- );
复制代码 i' t2 ~% u/ S) G
: H3 F- |1 u7 B: M% X5 ]
其中n为字符串长度,type为字符串类型,*lists为字符串指针,6 ?9 ]7 L; X! c5 q0 o3 t
如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:+ |' P( p% _! E, Q
需要修改为GL_UNSIGNED_SHORT,即0x1403。/ ~- P7 w) G$ b& c
! k+ D$ v! z- l$ o
定义! Z- y3 d* u1 w& z8 |2 e
- #define GL_BYTE 0x1400
* d+ Q: a- \. l - #define GL_UNSIGNED_BYTE 0x1401# x) W9 a% y1 V0 E9 r$ j5 p
- #define GL_SHORT 0x1402# Z1 ?" p0 j" {( Q3 N0 j7 A8 |
- #define GL_UNSIGNED_SHORT 0x1403
; b4 C5 b, e0 W - #define GL_INT 0x1404
' z* X+ {. k c - #define GL_UNSIGNED_INT 0x1405
' n% y# k ^- ]( e9 v) r - #define GL_FLOAT 0x1406
, f" o9 T, L. ?2 [$ w h2 o - #define GL_2_BYTES 0x1407
- k7 ` z p" @! A$ H K - #define GL_3_BYTES 0x1408
6 Y( k7 f' F2 T - #define GL_4_BYTES 0x1409
+ y% r) J, I3 d - #define GL_DOUBLE 0x140A
复制代码
; ]) ^$ w+ H) s- ~
& u4 P3 V p Y" A7 D; c+ R |