本帖最后由 shane007 于 2023-9-4 18:28 编辑 : r/ ]% V8 Y8 x3 e) n$ U
2 h! C [' h) v1 E) q这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了," {: `2 D) \8 Y; E+ r$ n
但目前已经有了英文补丁,因此汉化又被提上日程。
( A2 f. D: e! B2 G) G
$ r) o$ R% Q: j3 P( a* s8 w对opengl的调用主要是在toh.exe完成的,
; [" u! _4 ^' r! g$ w& s对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数5 W( {- M g# I
* S- j- [. w& [: _6 vglGenLists的调用处共有6处,每处都类似,
/ w1 t8 P3 d- v F可见游戏初始化了6种字体,每种有256个字符。) |: q W1 o2 m1 |
其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。. o+ I) i& B. F& Q
修改的时候,应该还要修改到上层调用的其他函数。6 u/ H% L e( G) |; a
- BOOL __cdecl sub_4518C0(HDC hdc)
: r, w7 \3 e7 H* g2 _! O+ | - {, o9 O% w9 ~' ~& A, M, R1 q5 [! X
- HFONT h; // [esp+4h] [ebp-8h]
0 x% Y8 Y( y `( o& m) R( V4 ^! ~ - DWORD iCharSet; // [esp+8h] [ebp-4h]
& o( T8 c2 y( a. @! B% b - 0 C! W+ Z6 B' D
- if ( dword_4A4490 <= 1252 )
7 _- O* x+ L* X8 S - {. J, } h1 B* _( m/ v
- if ( dword_4A4490 == 1252 )
; ]8 L# O4 C. s5 P0 X) K - {
2 w! T& i% o5 F" p. \" f - iCharSet = 1;
0 y4 B5 a3 m* e- ?0 s$ ` - goto LABEL_11;3 I% x& w* q/ A+ h
- }
# R Q" f. {7 G: ~/ m6 I - if ( dword_4A4490 != 1250 )
6 H; F$ w4 X8 h7 r9 m - {+ @- K" M! W- b& U) B1 a Y
- if ( dword_4A4490 == 1251 )4 [8 m) G ?* h7 _! _8 V, `. v
- {
6 ^4 c _' L$ `" Z/ U: E2 [ - iCharSet = 204;1 d$ g3 I, b% ~
- goto LABEL_11;
( a) V; Z- I7 {+ t7 O - }% [# n3 V5 ?5 Y0 @3 Z& X* u
- goto LABEL_10;
( k! J. s& |; a* t3 ?3 _6 C/ i) f2 R - }$ B( w% v, M+ H$ ~
- LABEL_7:
& p8 J5 S2 p2 c7 w - iCharSet = 238;- o% ]2 ~ f0 a$ n) H% g0 z
- goto LABEL_11;$ `1 ? C4 K6 o) u
- }$ W4 T) Q q9 F% @: @, O
- if ( dword_4A4490 == 11250 )0 K% t! W, U+ Z) w) Y/ [
- goto LABEL_7;
+ i+ M& T) l. o - LABEL_10:
8 ^ P: n( M9 f. x# N2 S& {1 K - iCharSet = 1; A x8 y8 `& X( J/ Z: q0 ]$ l n
- LABEL_11:
1 V/ x) |1 v- c( y) @ - base = glGenLists(256);
2 m0 ?3 l& F6 s: Y$ l0 } - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);2 M; W5 h- K8 I% W
- if ( !h )
) o8 X) M# h% ]+ O" t - MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
" H5 D. h* }! G' p9 U( U - SelectObject(hdc, h);, d3 f4 ?; W! W
- return wglUseFontBitmapsA(hdc, 0, 0x100u, base); R5 Z. m) e5 Y2 T
- }
复制代码 & W2 B0 q, b8 e; D3 P# ?
7 Q8 t; I' C) _! M
glCallLists调用的地方共有3处,
# i8 Q) L5 s1 ]% C) z% M这个函数就是游戏的显示函数,共有3个参数,/ P/ G8 x; @1 V4 e% W
- void WINAPI glCallLists($ y- ^9 R: @% H- _
- GLsizei n,3 F! `! a) h5 {' S* n# L& ?
- GLenum type,; c4 d5 ~' @3 |. a
- const GLvoid *lists( D+ }8 r% z4 C+ ^8 F# _
- );
复制代码 & [; ` Q# ^! d2 Z6 w; }7 b
% z) X8 g6 |6 i: x% Q* e
其中n为字符串长度,type为字符串类型,*lists为字符串指针,
/ v2 B. q& e% c5 s6 O: ]9 C 如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:
; v5 B5 g* b. z7 {6 y 需要修改为GL_UNSIGNED_SHORT,即0x1403。9 z `6 o& x1 u' f( w
6 G# O0 j& r7 o6 R; B* E
定义$ D- l2 Z8 D- _
- #define GL_BYTE 0x1400
. u+ a, d3 O& e% A - #define GL_UNSIGNED_BYTE 0x1401
# K) J8 _8 N; ~0 c - #define GL_SHORT 0x1402
% C( M$ D3 w, C+ X5 [5 E - #define GL_UNSIGNED_SHORT 0x14031 s0 U+ F) k& E2 M# t7 r
- #define GL_INT 0x1404# T A/ X$ ]0 j) F# p
- #define GL_UNSIGNED_INT 0x1405) ~1 s. D" R1 L# U% p
- #define GL_FLOAT 0x1406
7 p t5 z; Q. q5 ^! w0 U& g. L" K) H - #define GL_2_BYTES 0x1407# f# b( K% v2 i s4 u$ `
- #define GL_3_BYTES 0x1408
+ Q0 _4 i% G0 X7 E& u, A, I2 E - #define GL_4_BYTES 0x1409
8 v( B/ A9 n1 s* i* X$ m, ^ - #define GL_DOUBLE 0x140A
复制代码 + m5 j. [* {/ P' Z' k9 L
; O# M* p( I. W- h" G2 x; [3 {
|