本帖最后由 shane007 于 2023-9-4 18:28 编辑
1 A* T4 X( n0 N$ G& m, b
* @/ G) O2 R" v+ O8 w8 k; N7 X0 `这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,
7 K1 v7 x3 c. J& y/ I# R但目前已经有了英文补丁,因此汉化又被提上日程。
+ R1 z j* B& g; n- t
6 k/ e! E4 [! j对opengl的调用主要是在toh.exe完成的,
% A9 }0 J+ o, X4 ]$ \6 u. a8 z对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数( J$ M2 Y; T9 P# Q
6 ?9 G- ]* E8 ^) o K& yglGenLists的调用处共有6处,每处都类似,
% x6 W2 }9 g0 F可见游戏初始化了6种字体,每种有256个字符。
4 Z" b3 a" v) ]4 ^其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。
3 \- W3 W) e) `2 ~: N5 B+ {修改的时候,应该还要修改到上层调用的其他函数。
. C) u( }: h1 I* k" w- BOOL __cdecl sub_4518C0(HDC hdc)
6 y/ F2 M5 {, w. u& E7 A - {& p6 M% k, I3 B& Z: `* q
- HFONT h; // [esp+4h] [ebp-8h]
( K* e3 X- v% R4 V9 W% C- F2 U! X+ y - DWORD iCharSet; // [esp+8h] [ebp-4h]: |. u; E0 Z" r
" f4 [9 D' m8 `+ R! D- if ( dword_4A4490 <= 1252 )
& _# g4 N; W: I - {# w! n$ s( I: R" m) F
- if ( dword_4A4490 == 1252 )( O! M3 V7 f, l- b$ d2 U4 l
- {
" {' A) z# [+ q3 T f. x - iCharSet = 1;( X2 {* J# l& d" a6 B* P3 o
- goto LABEL_11;
8 a7 d) ~# p+ |4 _8 W% W- Y - }
% L0 _; `! d2 G - if ( dword_4A4490 != 1250 )) y: O. l7 I+ p+ {
- {
9 D) a/ P+ V8 R9 q - if ( dword_4A4490 == 1251 )/ f8 C0 k1 R2 G5 @ q8 {
- {
" v, @! Q5 y3 k8 j4 u6 z - iCharSet = 204;, `+ ]4 _8 O/ I% G% C. Q m% a
- goto LABEL_11;
* _3 f- z6 p* E8 d2 H - }
/ ]- f& o& U4 S- t7 V; K - goto LABEL_10;
. L0 Q+ `; ]7 I7 M - }
# j; o6 b$ F3 Z& e - LABEL_7:
% b' T" p- ^5 o" R9 S$ g - iCharSet = 238;
' a' K; C, c: ^! O; ? - goto LABEL_11;9 V4 L8 U1 s; v# H+ r) }( I
- }
# o9 z, k# d" }, F: j9 p+ j0 W% T - if ( dword_4A4490 == 11250 )
! t7 h! L+ C t, |2 S - goto LABEL_7;" ] w7 R5 ?" J. K
- LABEL_10:
+ q$ T; s9 P5 y# R1 n4 u* J2 D - iCharSet = 1;
- h& l' \4 n1 c* F3 S* }) ]3 [% j - LABEL_11:* z5 t) ^* f1 ~
- base = glGenLists(256);8 \& T* r c3 D r/ t
- h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);0 Z% n# {: ]) N
- if ( !h )
# _, u0 W. M" Q% m; t6 J) F' I8 h - MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);2 n4 Z# `" D5 R$ c" g1 A
- SelectObject(hdc, h);5 Z6 I( @" v$ }1 n! Z
- return wglUseFontBitmapsA(hdc, 0, 0x100u, base);# H% p8 g4 }: s8 l! z3 d6 {& f
- }
复制代码 $ L5 p' O( F9 \9 A% V, h; o3 c" d
5 P9 t/ k- g! W$ BglCallLists调用的地方共有3处,8 Q/ |5 T# _3 c( x
这个函数就是游戏的显示函数,共有3个参数, J# O6 z9 F8 }1 i- V
- void WINAPI glCallLists(- f W7 Q: h. I! y) c& K
- GLsizei n,
( ~ V& p7 `! g2 l6 x E6 Z# p - GLenum type,2 j9 n( N$ u$ \1 O+ c# Y4 n4 a, t
- const GLvoid *lists
2 l% ]# r0 S( M) g% r - );
复制代码
" T& l5 ]! N! j. ~+ Y: _# }
8 q2 t# P' o" n( ` 其中n为字符串长度,type为字符串类型,*lists为字符串指针,
3 e- \% f/ C3 [ 如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:
6 |7 E1 @# O, A( G& T4 G 需要修改为GL_UNSIGNED_SHORT,即0x1403。$ a+ }$ X! Q4 A
" e. K7 o# V* z3 v定义
( V5 b# v( a! J' q: t- #define GL_BYTE 0x1400
% o8 z: W# d( B* N1 G1 } - #define GL_UNSIGNED_BYTE 0x1401
6 K1 ?" j' ]+ L - #define GL_SHORT 0x1402& u! g; }+ ?4 a* o1 h
- #define GL_UNSIGNED_SHORT 0x1403
$ b' O$ F7 t; u, w3 o# X - #define GL_INT 0x1404- W8 k& l/ H7 A- _7 l* u+ |" Y
- #define GL_UNSIGNED_INT 0x14051 `; d+ g" ?9 ?4 h4 }; \: G: ~1 q
- #define GL_FLOAT 0x1406
+ ?8 e2 F) d5 i) r& B - #define GL_2_BYTES 0x1407
/ f8 u1 V& k8 B4 o8 E - #define GL_3_BYTES 0x1408! R% ^0 {7 B9 y) z. m2 M& m
- #define GL_4_BYTES 0x14094 X8 j7 R% {3 C1 u1 C: \6 n- {1 v
- #define GL_DOUBLE 0x140A
复制代码 {7 v% D2 h% q: X) J! n2 k
0 z' n7 f! q0 Z0 C6 C5 B |