本帖最后由 shane007 于 2023-9-4 18:28 编辑 8 x1 R4 N$ u1 d/ I$ }* ]7 }" _
7 B. L6 E: P# ~- e这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,
& b. O# v+ N V4 ]0 V$ j h s% s3 m但目前已经有了英文补丁,因此汉化又被提上日程。5 N2 R4 S& {5 y% Y) j
" f, \+ y W" t5 W& s/ i' G# C
对opengl的调用主要是在toh.exe完成的,
+ F ?& L6 P6 O5 ]1 Z6 D" _对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数, k2 o$ \3 `9 Q* m. `
9 z8 }+ V; ~1 j8 |! y
glGenLists的调用处共有6处,每处都类似,6 N8 d" m ?7 K* J- r" A
可见游戏初始化了6种字体,每种有256个字符。
X' [7 C* I: _# I* c0 C: G1 I其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。
* M: z7 @% V* I2 Y修改的时候,应该还要修改到上层调用的其他函数。
/ |9 \' l9 E* {& Y9 i0 X t! N2 V( E8 a5 u- BOOL __cdecl sub_4518C0(HDC hdc)
# F8 D! O& }' z, Z( f( C - {3 X9 A7 Z; s9 w9 X! a
- HFONT h; // [esp+4h] [ebp-8h]' X) R" p+ d: y4 M* @3 K( A
- DWORD iCharSet; // [esp+8h] [ebp-4h]+ ~ ^. V ~' H, L, x
' O5 I6 K( m5 U. w- if ( dword_4A4490 <= 1252 )
! S' j- E3 B/ ^! T: a9 n3 J6 j - {
$ u3 ?* t+ e+ |( u0 Z* l1 `: ` - if ( dword_4A4490 == 1252 )
' t$ F& s0 j6 p% d% }( h - {% A0 }* g A! B( B, q2 @9 W3 C
- iCharSet = 1;3 z, B s! }8 B8 w: U
- goto LABEL_11;) m+ Z+ _ d, F# u: |5 h
- }
! S, L4 I( p: t& w/ R% |, | - if ( dword_4A4490 != 1250 )
8 M$ P2 Y& r: h& [9 P - {: `* f" {& y, R e; ^1 s: \! _
- if ( dword_4A4490 == 1251 ). g! J$ q& s7 i4 `: u
- {6 M: R& Q9 y7 r' \5 {4 p
- iCharSet = 204;) ]3 W; i+ e" m! }$ {4 n# b% j5 F+ M9 M
- goto LABEL_11;7 q" \ `6 Y( Q
- }
5 G( `4 e) f6 y - goto LABEL_10;/ `5 a/ {+ B0 {; w9 ?$ T) D! \
- }
& V) }1 |. L9 s: ~+ ~' @0 Z - LABEL_7:
j/ a3 Z+ R; Q& G& G; D - iCharSet = 238;
3 f( [2 U# y/ j - goto LABEL_11;, G8 M6 I) S- n f9 ?
- }6 U6 S `# `6 o- l
- if ( dword_4A4490 == 11250 )( a: ~: F% ^1 k& k
- goto LABEL_7;8 y( G9 v+ h& H8 M0 [4 B1 X
- LABEL_10:
! X0 s7 s6 M" E. q3 h - iCharSet = 1;* ]! S& v7 G2 v/ r2 D
- LABEL_11:- F' g0 t3 J: E. E a
- base = glGenLists(256);
9 S5 L7 c) v2 v u( v% K8 X! m - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);
& x9 a) |8 z! j9 M7 s - if ( !h )' S% h8 f1 r5 S5 q- n
- MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);# _7 [# c' m6 H" H& c1 C4 v' B
- SelectObject(hdc, h);" V S8 @3 M. [" V, f0 Z
- return wglUseFontBitmapsA(hdc, 0, 0x100u, base);( Z; j( G0 F( P8 E0 t, V
- }
复制代码
; P9 ]- |4 I Y) y+ V7 T, {, g; }2 ^" ~
glCallLists调用的地方共有3处,
# t3 m2 B- P" U+ I- O4 I- X这个函数就是游戏的显示函数,共有3个参数,4 Y1 w# j' i* e+ w! V
- void WINAPI glCallLists(1 i8 f6 c0 m' l* ]* {& l
- GLsizei n,# P- B* ]: Q& G
- GLenum type,
- p1 J: j2 p1 ^. W U - const GLvoid *lists6 f- Z. q) X8 I- m4 R
- );
复制代码 ! I/ F+ g) w' B$ |; b: t
6 o |3 P% b; Y# K: ~ G 其中n为字符串长度,type为字符串类型,*lists为字符串指针,2 i( J0 I5 ]6 G! O
如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:1 ^8 m4 I8 a" F* O( o
需要修改为GL_UNSIGNED_SHORT,即0x1403。) }% L* A; U: P& X O/ Y5 D5 f1 Z l9 \
2 t" o7 ]8 A) D$ f" o( d+ ?7 E# Z定义3 W0 D% s9 k$ X. |" P- n
- #define GL_BYTE 0x1400
$ n4 z3 k6 C1 c, d; ?& L7 F - #define GL_UNSIGNED_BYTE 0x14019 ?6 V. ?1 t, p8 b$ ?1 o' }6 c
- #define GL_SHORT 0x1402
' c% ]4 y, e( y$ ^, _5 V: }; Y - #define GL_UNSIGNED_SHORT 0x1403
0 h. P) I. E: e5 m# h" `& u - #define GL_INT 0x1404
0 F" z; n1 X; ]) h: m8 h - #define GL_UNSIGNED_INT 0x1405- c. p0 H( P6 z: J1 {$ v: M; I# L
- #define GL_FLOAT 0x1406# ^6 n7 R) t1 B1 r+ k
- #define GL_2_BYTES 0x1407& u8 u, p$ L/ O3 K" l
- #define GL_3_BYTES 0x1408
! C" H! S, J3 Y9 W0 H - #define GL_4_BYTES 0x1409# q, H5 K2 K. ?" }* |6 |
- #define GL_DOUBLE 0x140A
复制代码 & Q* |# I w' {. O' I; A6 G
! I* C* @' h8 [+ @( U" I |