本帖最后由 shane007 于 2023-9-4 18:28 编辑 + h/ b% |1 K# K8 I
" R9 ^* O/ M5 @, D3 x+ Z这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,
{: u7 P1 z, M S b( p但目前已经有了英文补丁,因此汉化又被提上日程。# }( ]9 ]. E- \' w3 F: C' d
3 F- ]$ t, G+ n& P
对opengl的调用主要是在toh.exe完成的,
- r; n# E0 j5 s对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
/ W* ~2 Z; J5 c a: t' A
. C! B2 V# F& p3 [! N; \glGenLists的调用处共有6处,每处都类似,2 u2 q. ]; t/ }2 `2 R$ E
可见游戏初始化了6种字体,每种有256个字符。
& [& }0 \9 _0 c+ R5 R3 A2 z' u. N其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。
. w. D/ P0 M2 |5 o8 B/ y修改的时候,应该还要修改到上层调用的其他函数。) {/ K) R, }7 f/ _& J. y
- BOOL __cdecl sub_4518C0(HDC hdc)
9 a8 e6 @( E; J% o) f4 o9 O/ G7 q - {1 O9 E ?* t4 e. N# O$ d
- HFONT h; // [esp+4h] [ebp-8h]
# {5 O8 Y# Z/ ]; B1 v - DWORD iCharSet; // [esp+8h] [ebp-4h]0 @4 F, [3 [# h+ ?
: i% H: M+ x. ]' Q9 t7 b4 O- if ( dword_4A4490 <= 1252 )2 X$ l0 ~- r* N3 h& f
- {3 ~5 Y! C2 M3 g( x0 m3 O
- if ( dword_4A4490 == 1252 )3 x; P0 Y5 D! p0 t
- {
3 i" b) I5 @1 A/ c- w - iCharSet = 1;, h) |# Z( Z' e& |: T
- goto LABEL_11;6 ~+ P# e4 q& K3 o) D" c0 W
- }
- P' B7 F) I& | - if ( dword_4A4490 != 1250 )
* ]5 T4 L3 [- Z3 R2 X, M - { g2 {/ p1 y. Z4 @, i# D
- if ( dword_4A4490 == 1251 )
: Y% e4 }4 r2 ]6 w3 e$ A" p" M8 B; @ - {
5 u& s, f4 A! X7 ? - iCharSet = 204;- A, [3 }/ a6 V7 }
- goto LABEL_11;9 J0 y' f X% Z! ?4 X6 b
- }
# k3 `( X! b2 N& `3 u - goto LABEL_10;. ~$ Y! V4 z4 Z; F3 V
- }
3 T" T2 S" K0 [6 T7 \ - LABEL_7:$ Z8 V5 s+ Z5 S6 X' j
- iCharSet = 238;
Q: A( I# Z! C! i8 ?& S - goto LABEL_11;+ M7 J) C; w- s$ M9 Y5 S" o
- }
7 f2 ^$ n" \# e; u - if ( dword_4A4490 == 11250 )
- D+ m K6 S# j - goto LABEL_7; b$ `! U7 ~ D ^8 u# x8 m" p
- LABEL_10:- U2 E, \4 O$ \) A
- iCharSet = 1;$ G0 |2 |+ n4 \- u) d5 b- p5 x. W$ C
- LABEL_11:! ]8 w% s! x3 f7 i+ D: B
- base = glGenLists(256);
{( }3 }5 m% V0 f4 d/ z( p4 [ - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);( b6 T0 Q* m5 n
- if ( !h )' O% e7 e% o% l, H( L
- MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
- G# e- D/ e! l. }% B3 b/ ` - SelectObject(hdc, h);) }1 s% d$ s( r; \+ L
- return wglUseFontBitmapsA(hdc, 0, 0x100u, base); K: r; b& m& x( \1 r
- }
复制代码
+ a3 v' F( c7 b8 G2 k. x6 y
3 `. @) g* T& g6 VglCallLists调用的地方共有3处,, |/ P0 b# d+ j. a) l- q8 c6 t7 [, s
这个函数就是游戏的显示函数,共有3个参数,
& ]9 z8 L- v8 a4 K- ]- c7 Q% o- void WINAPI glCallLists(
) w( o& ?. N4 a6 p; y; t - GLsizei n,/ R& }& Q1 N) e" E. K7 v; G: g
- GLenum type,+ a! y; N. F' I
- const GLvoid *lists
$ y$ T2 {7 ^. i' a2 a, e% w- @ - );
复制代码
7 n" p$ C# q% X3 @2 l0 o
& i4 r1 j- w" _1 k* g G! Q9 p 其中n为字符串长度,type为字符串类型,*lists为字符串指针,
7 G- w/ o9 T% S8 G 如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:' ^# s. P6 B7 _ U @
需要修改为GL_UNSIGNED_SHORT,即0x1403。" Z! K4 E7 l: V: F8 p, T6 P# b
) J: b9 C. e6 L$ w3 x+ v定义
' v& \) ?" l* [4 h5 k- #define GL_BYTE 0x1400) I1 }" P( ]/ P/ p
- #define GL_UNSIGNED_BYTE 0x1401
9 y: p! n8 }1 K# G- }2 T5 B: t - #define GL_SHORT 0x1402
$ t a: }; B- x, Z A - #define GL_UNSIGNED_SHORT 0x1403+ |" Y. q8 f, ]4 z& F% @
- #define GL_INT 0x1404
! }/ j+ s0 ?& i9 C: C# o - #define GL_UNSIGNED_INT 0x1405
" M4 b3 n$ ?$ j5 E* o - #define GL_FLOAT 0x1406
X0 p; u) [" Z$ I, \ - #define GL_2_BYTES 0x1407) o% J) E2 R8 s, h% _$ Z+ e
- #define GL_3_BYTES 0x1408
) P7 r1 E( |$ _. C& @: } - #define GL_4_BYTES 0x1409
0 e/ V7 x0 l9 \4 ?: N - #define GL_DOUBLE 0x140A
复制代码 3 H0 M; S4 p- e, q& G8 l
5 x$ Y- _: @% e: I$ ^( {
|