本帖最后由 shane007 于 2023-9-4 18:28 编辑 5 Y' c$ i. T+ [5 u! U A( [
4 R5 Q" H% k8 Y! _
这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,& U0 c2 W/ w K6 S
但目前已经有了英文补丁,因此汉化又被提上日程。
3 ?. `! B6 _1 }
7 ? {8 l% e* s6 W& W& N3 e对opengl的调用主要是在toh.exe完成的,
$ `8 M2 x( b' w" s; y7 y对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数7 z( Q7 M4 X) t, z5 m+ y
% Z$ b3 S) x/ s9 \3 d1 ]- _glGenLists的调用处共有6处,每处都类似,
_" ]8 _" b# ?! x可见游戏初始化了6种字体,每种有256个字符。) c) k# F, z: g* c0 K2 x# M/ a
其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。
/ L, a! A: L4 b0 ^) O5 D修改的时候,应该还要修改到上层调用的其他函数。) L4 K/ V8 @% S0 S, G U
- BOOL __cdecl sub_4518C0(HDC hdc)4 {+ T7 C* x! t# _/ V- n5 ~' I8 b
- {
5 O2 g2 l5 P6 l, S3 H# K) W% |( E - HFONT h; // [esp+4h] [ebp-8h]
& s7 V7 c2 L/ [( [ - DWORD iCharSet; // [esp+8h] [ebp-4h]
* Z: P" Y2 r. f& y6 y, B0 p0 Q2 ?5 x0 u
; F: l2 a: ~/ h: o3 U0 Y' \* @- m- if ( dword_4A4490 <= 1252 )
- r; H! I/ t1 b/ _- |' H! c% u- G - {) N8 E# [' O8 Y+ J. U
- if ( dword_4A4490 == 1252 )# p* z$ M0 k. @9 n4 H
- {) A. {3 ]6 d3 V- x5 z; q( m- G( O
- iCharSet = 1;( g. a* v9 W" _( B! N9 J Y
- goto LABEL_11;: z" s; C9 X) x1 b6 V
- }6 Q5 Y* I/ L2 t( {! e2 o
- if ( dword_4A4490 != 1250 )
' C: f: E9 H9 i. n3 t3 J# G - {
3 H m! f9 c1 b* z- K4 e- X - if ( dword_4A4490 == 1251 )
: ?9 H0 L3 e% v2 q6 Z/ V4 D3 e - {
; W" G0 B+ B9 w - iCharSet = 204;
: O% }( M3 L9 w/ d9 Y - goto LABEL_11;
& @. y5 L- u7 U( z: L; v, f - }
! ^, b' u4 N t% P9 Y - goto LABEL_10;3 H# [) o. K, y2 l; O
- }
; R) j" s9 |5 B- U- Y2 g. i - LABEL_7:1 m7 G& h: U* d, W; {2 F! V7 P
- iCharSet = 238;
- t8 c9 S' O! ~/ J+ \ ~( { - goto LABEL_11;, S3 Z- a. V) Q2 V/ ?& j6 R% f
- }
4 f' A, o6 I" h! b* L - if ( dword_4A4490 == 11250 )7 v0 U( P1 A k0 A" e
- goto LABEL_7;
+ L! ]( c4 S: L - LABEL_10:
( z) e0 ^/ I7 e8 w a - iCharSet = 1;0 C& n6 }1 b# E1 E9 H8 t0 J, z3 |
- LABEL_11:
! |# J, I1 o; y3 B - base = glGenLists(256);
6 S7 E0 y1 ]3 r5 h - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);
0 m* S3 R) f6 ]4 D4 J - if ( !h ): K: x5 ^# S, v2 C7 Y
- MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
/ [5 ~3 K- c! T5 g3 S+ f+ B$ }& S9 j - SelectObject(hdc, h);" z2 E, _7 k& A$ J+ F
- return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
) ^8 e, x! f w0 U7 ~+ @3 { - }
复制代码
* w- s. p! L% @, V! I# v* A7 P- j; T! _6 ~ v% l! O
glCallLists调用的地方共有3处,; ?* |2 y7 i3 ^) |1 Z- Z$ D; J
这个函数就是游戏的显示函数,共有3个参数,! F7 o5 P; X+ R( X2 l
- void WINAPI glCallLists(! Q) Z! a, R4 G0 q8 c+ w& s
- GLsizei n,5 q; A8 p3 a5 c' k
- GLenum type,4 @, H0 N) R9 ~# H. `/ R9 l8 z
- const GLvoid *lists/ Z& ?7 E, E7 D: a/ o' J
- );
复制代码
9 h+ o& j( H% D% g) [: {6 U- @5 Q4 s: z
其中n为字符串长度,type为字符串类型,*lists为字符串指针," |6 x: b1 d2 i( T7 c7 D" D
如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:
" o: M: l. K7 \6 } 需要修改为GL_UNSIGNED_SHORT,即0x1403。 R3 e& i2 |8 D8 r% }
7 E& w, J" m( P5 ^" W4 m定义. M9 a# l# @9 ]( i: g9 q
- #define GL_BYTE 0x1400- S. o/ o! T2 s$ P6 ^3 k2 U( m1 O
- #define GL_UNSIGNED_BYTE 0x1401
0 t% s: `% Q* y& f0 ~. { - #define GL_SHORT 0x1402
$ w( \! ?7 ^2 t& v* \ - #define GL_UNSIGNED_SHORT 0x1403
" k3 O, F/ P, z4 V7 T/ R' ` - #define GL_INT 0x14047 g [/ }% |3 }/ v r/ O
- #define GL_UNSIGNED_INT 0x14053 ~% l8 j `; e# L
- #define GL_FLOAT 0x1406" T+ z# w8 X9 d- G( }
- #define GL_2_BYTES 0x1407
& b+ F" R# E- S8 P2 C5 V- U W - #define GL_3_BYTES 0x1408
) r' b, Z* B; D7 r7 J, \ - #define GL_4_BYTES 0x1409, o* j5 o) @/ E6 ~+ z% Y D
- #define GL_DOUBLE 0x140A
复制代码 3 ]! w/ I i* C F% i$ W2 g% |
G! J4 A9 |6 s( m* ~2 E
|