本帖最后由 shane007 于 2023-9-4 18:28 编辑
/ f$ A$ C) x* s$ Q$ p
6 d0 c9 w9 s8 T! X' \' r& a2 V, d这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,4 E i- W# Q' Z9 I- p
但目前已经有了英文补丁,因此汉化又被提上日程。' R- `2 N3 w( V2 g R
2 S! C. j3 q; r% p对opengl的调用主要是在toh.exe完成的,7 I5 S/ E- E" c, d' g9 B, U
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
. S8 R4 R/ K' J2 l, t
1 l' u" Z) d5 Z: p# A0 V' VglGenLists的调用处共有6处,每处都类似,# x$ r# I6 l: n2 J5 Z6 R- k
可见游戏初始化了6种字体,每种有256个字符。1 F. E/ S9 _* e; Z1 G
其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。: B) R! [4 W% p* _+ q
修改的时候,应该还要修改到上层调用的其他函数。" f$ R% M4 K+ ?$ e3 Q
- BOOL __cdecl sub_4518C0(HDC hdc)
( q7 x$ J: X2 {2 I$ W) g - {) S$ a+ D/ T& ^; c; j' @
- HFONT h; // [esp+4h] [ebp-8h]8 t. N9 Q) O* l. g2 u
- DWORD iCharSet; // [esp+8h] [ebp-4h]
5 ^* K% a8 ~* g# ^* q P - $ J% o: _5 U9 u: @, z* p' r
- if ( dword_4A4490 <= 1252 )) ]7 }7 w2 L4 ?. p% T: C9 o2 i* n& ]
- {
: A6 r- T' P1 g" a+ m - if ( dword_4A4490 == 1252 )% F% ?3 J. ^9 D# a) l
- {0 G: l3 W) |9 x
- iCharSet = 1;( D; G! E* X; s3 H- k
- goto LABEL_11;2 O) P+ W" I/ S0 t
- }( K$ @- g8 h6 z# H
- if ( dword_4A4490 != 1250 ); X8 j3 L. B& @
- {+ ^* p- B( }8 ~1 T
- if ( dword_4A4490 == 1251 )
2 b0 n# u& q1 k% M" H& h, W5 e7 v - {
0 |9 b5 N" `. x5 \5 i$ B7 @ - iCharSet = 204;
! l) z4 Z# c0 L8 @: o6 V6 G - goto LABEL_11;
; K t e5 Y) J. e2 s - }
6 Q1 ^: J- {" a: J4 i& _ - goto LABEL_10;0 h6 n% g1 c: Z
- }. z$ d6 B, @+ i5 Q e$ c) x
- LABEL_7:/ H0 y% ~- v* b: _$ L, z8 A; Z4 V
- iCharSet = 238;
4 z4 T a+ Z8 V. {( O, ~ - goto LABEL_11;
' Y$ X7 |' m! w% x# [ - }- n& m5 X# u* F3 p0 v3 R4 m9 h$ c
- if ( dword_4A4490 == 11250 )
2 ~& Y% i* Y I" w! J9 v+ f - goto LABEL_7;( f6 ^0 z- k `! w" q
- LABEL_10:! L# ?- c% j. Z' h2 [: p) n' o
- iCharSet = 1;
8 g9 p) l! {/ |) P) s, x - LABEL_11:
! @( Z$ l& C' v. x3 _5 o - base = glGenLists(256);' A9 V: h! ]$ i9 }. {5 u
- h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);" E$ s r4 u6 F' L
- if ( !h )
! ], d4 C# S& n - MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
6 `2 C$ Y i: k# Q( R) C! w - SelectObject(hdc, h);& L e b2 L7 T/ l% D' @# y( @
- return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
! D$ d% q6 ~* ^* R7 } C2 u; b6 t - }
复制代码
' R9 z- O; W5 g& \- l, t1 X# o, t* ^& S4 R; _6 o
glCallLists调用的地方共有3处,
1 {! j# b' ~. ?+ ^这个函数就是游戏的显示函数,共有3个参数,
8 f: W0 r4 a2 d* }; i- void WINAPI glCallLists(- x B; I3 K/ y0 t
- GLsizei n,+ d2 \. B$ l# D8 O! I4 {# j; P! l
- GLenum type,
3 {0 i- `4 y" X- a - const GLvoid *lists
1 i w9 o$ l# I) M" a6 Q/ K) K - );
复制代码 6 M. ~7 e, ]6 ?4 ~
# j1 l& Q7 E; z4 n4 Q 其中n为字符串长度,type为字符串类型,*lists为字符串指针,
: `0 a$ F$ _9 b \$ |0 W* j) w 如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:% D7 I- v; w) {
需要修改为GL_UNSIGNED_SHORT,即0x1403。$ I7 J$ Z6 `( J
2 W- b9 C& ], Z( t- i: s7 `2 y定义4 q! d7 U8 Q1 ^7 T" Z
- #define GL_BYTE 0x1400
, Z, G) u2 C+ H4 F* z - #define GL_UNSIGNED_BYTE 0x14018 c# t" V, ^9 O/ g: k5 d
- #define GL_SHORT 0x1402
9 E; u) g1 b2 A( ?3 B - #define GL_UNSIGNED_SHORT 0x14036 N& e2 r) v" T* c
- #define GL_INT 0x1404' a* S' ^8 o2 E
- #define GL_UNSIGNED_INT 0x1405
2 _' d: a1 P8 k' u7 L( m - #define GL_FLOAT 0x1406
9 [9 ^! P' h- I3 P - #define GL_2_BYTES 0x1407
f* G1 T4 }0 Y" o& @) ^ - #define GL_3_BYTES 0x14082 ]! j3 A+ C, \( A0 w
- #define GL_4_BYTES 0x1409 J7 _' b( |, [: _ K! a& r7 q
- #define GL_DOUBLE 0x140A
复制代码
c& W6 Y9 h+ f F8 x
1 N9 a( }2 B+ o% _2 V/ P# M& s |