本帖最后由 shane007 于 2023-9-4 18:28 编辑 / x$ \# u9 t/ i4 e
, a6 S! K9 x& \/ F4 |& F这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,; E' M$ p0 j6 N! l: r
但目前已经有了英文补丁,因此汉化又被提上日程。- \0 T4 B0 U4 H& I: }8 [
$ W1 P `# U0 X+ f O; {对opengl的调用主要是在toh.exe完成的,, @$ ]0 M8 z' l- t; |
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
7 C/ O+ O" _' H8 R$ ]9 _+ u2 Z7 v
0 U/ d$ e& j Q, dglGenLists的调用处共有6处,每处都类似,
/ q, p7 M# o) r" ?可见游戏初始化了6种字体,每种有256个字符。* ?+ C" A+ c, g1 u
其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。: i$ w& B: D0 x' K' m4 Z, N
修改的时候,应该还要修改到上层调用的其他函数。3 e6 I# P9 Z) @" B: ~: Q( V' z, q
- BOOL __cdecl sub_4518C0(HDC hdc)
* t6 _. K% u6 v% H/ O+ R, S F - {
; M2 U6 {& j& `) h3 N+ p - HFONT h; // [esp+4h] [ebp-8h]
& y+ ]+ S1 r; {/ Y; Q3 X - DWORD iCharSet; // [esp+8h] [ebp-4h]& f+ a5 U8 p! U' A2 Y
- 8 b. N$ l# }) V( l( \2 z* G: ]2 x
- if ( dword_4A4490 <= 1252 )
, i; R- S3 @' p0 K" M - {
/ u, ^$ c2 f9 }8 T/ k - if ( dword_4A4490 == 1252 )
" ?! s2 v- {" S - {( d# i1 I6 }! ~# C/ ]' x4 W
- iCharSet = 1;! g$ H9 y O5 E j! W& j
- goto LABEL_11;
' s$ V- P: b4 j0 _. ^ n4 `, L - }0 ]( F& h# [- D' c9 {% R. Z
- if ( dword_4A4490 != 1250 )$ n4 q Q& R( B6 E
- {
6 a+ s. Q$ z' R" C - if ( dword_4A4490 == 1251 )
/ k) {: u: C- ]2 c' J/ q3 W - {
; v5 {; M) H# o6 S& K/ g/ g - iCharSet = 204; g7 X9 u& p3 I% k& v: g
- goto LABEL_11;; r. p3 s9 ?) Y# e! L, Q' y; d
- }' M4 b5 Z9 |3 ]4 Z Z
- goto LABEL_10;
% y# s6 ]4 x# o' c - }% C s) h3 X- X6 Y# L$ K9 c* }$ S5 w# a
- LABEL_7:
1 ?5 m1 M" L) [0 v3 C3 H1 c - iCharSet = 238;
6 k" C: h$ X/ E - goto LABEL_11;
' X: |% |% e. ?' y* X - }
+ U- Y S6 a% ? - if ( dword_4A4490 == 11250 )
: |8 A2 I* D, v( r7 C - goto LABEL_7;% y( `; [! G4 a
- LABEL_10:& |# |7 g5 @- u2 _3 E6 q- k
- iCharSet = 1;
* `) P; C7 \2 }% V - LABEL_11:# `: t6 P1 l! m( M. l9 s" t
- base = glGenLists(256);. y/ B' C m3 i( t
- h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);
) e% w- c4 m% z( ?- R; Q: I" F - if ( !h )
7 c- N8 b) u9 C - MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);$ G' m9 a6 B+ r5 T
- SelectObject(hdc, h);8 a# l# H! ]; Z
- return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
U4 A0 }* j( ~ - }
复制代码
( {8 _/ f6 P/ M) w$ C4 k3 k/ a* ^& y, k2 p; A9 p: s1 x- g
glCallLists调用的地方共有3处,' P# q* z/ T6 Y/ k) e3 ^
这个函数就是游戏的显示函数,共有3个参数,
6 Q! u) q/ J7 ^4 E6 H- void WINAPI glCallLists(
$ C$ q- P* ^. \* [' p - GLsizei n,- a$ y) o3 C2 U6 ]0 S$ p+ [
- GLenum type,( i: F9 \. [, ~& _+ ]0 u2 ~
- const GLvoid *lists
0 c8 A! q8 d" N - );
复制代码 % d, x$ l4 o4 K. z1 J
0 ?0 C( y) K+ x# f6 s- z% _- w 其中n为字符串长度,type为字符串类型,*lists为字符串指针,
]/ W6 d5 z, X5 |9 v 如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:
' B9 S, ^: X3 M) U5 O2 L3 ] 需要修改为GL_UNSIGNED_SHORT,即0x1403。% E4 P) K$ h# a# T- F
! r8 a9 m* i- M/ k6 f) S定义
& c T/ c& z( W- _$ _8 S- #define GL_BYTE 0x14009 L' T5 f j v- Z( w. |4 r
- #define GL_UNSIGNED_BYTE 0x1401
2 |$ O A( T9 p: G- S - #define GL_SHORT 0x1402/ z. o1 D8 G; w$ Y/ D6 K# }
- #define GL_UNSIGNED_SHORT 0x14036 M( e. q7 l A% K# S3 q
- #define GL_INT 0x1404
# x; t0 j8 m# ^6 t - #define GL_UNSIGNED_INT 0x14059 Y' n: ?( q/ w( @7 o& @2 t
- #define GL_FLOAT 0x1406
4 X/ M8 b1 G5 U4 ]+ B( _0 h - #define GL_2_BYTES 0x1407
6 R7 f2 _; ^3 [% n: c( W# ], a - #define GL_3_BYTES 0x1408! @5 j; w8 _% `% Q5 Q2 Z3 \7 p1 |: m
- #define GL_4_BYTES 0x14096 A P( \( S2 o
- #define GL_DOUBLE 0x140A
复制代码
5 u# S2 @% s8 `# t
: G; L2 l4 d" p7 ^) n7 F' j- Q |