本帖最后由 shane007 于 2023-9-4 18:28 编辑
# h, p7 {2 T. V# d% I
5 E# [" v8 k1 v/ k这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,( I8 M$ s: [& g: o
但目前已经有了英文补丁,因此汉化又被提上日程。3 L8 L" t& ~. x% X* o
! \6 J' ]; W) L$ t; ]
对opengl的调用主要是在toh.exe完成的,
3 H, h( K6 v: `; ^6 k- L$ }4 R对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
9 O N/ a7 g6 K0 V/ Y/ g
3 T" E/ j/ H3 |1 X# t8 t; y- rglGenLists的调用处共有6处,每处都类似,+ L- k6 Q8 r9 u, f D
可见游戏初始化了6种字体,每种有256个字符。5 Q2 j) y! e- ~0 }6 Q+ Q3 V
其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。, P5 M2 _8 ?" K, ]1 P+ a
修改的时候,应该还要修改到上层调用的其他函数。
- }/ U$ F# X% E- BOOL __cdecl sub_4518C0(HDC hdc). m: [ W) a' ]/ _# j, H
- {
+ d0 j6 @# B" L& h4 Y6 z - HFONT h; // [esp+4h] [ebp-8h]
5 N7 A$ [& O- N* g1 M% E - DWORD iCharSet; // [esp+8h] [ebp-4h]
' v* m3 g% n5 X4 n* s
. v2 G2 L+ x; o, r( W$ ?- if ( dword_4A4490 <= 1252 )# J4 j4 g( _2 g0 n. D
- {$ M, G9 j; Q: l! M" p
- if ( dword_4A4490 == 1252 )
' B2 S+ O* b, H! w' a - {( W4 R1 S0 T% |3 G+ S
- iCharSet = 1;. n; J3 a7 o! R) v8 K
- goto LABEL_11; J5 e c3 ^7 D8 C+ M
- }
6 p) K* m! Q8 n3 U0 n, \ - if ( dword_4A4490 != 1250 )5 @2 l# z6 [: y4 b7 q' K2 U
- {
; R# Y, N: e1 f; ^ - if ( dword_4A4490 == 1251 )
0 s1 I; h/ l3 c. n( g# w! f; k; b: v - {
$ \) w; y0 a- A5 [; K( r$ f- Y8 `! S - iCharSet = 204;
5 s _4 P9 Q* e' H1 X3 L$ r- i" j - goto LABEL_11;5 p7 s( G1 \9 N! t1 E: k
- }+ K! N- Q8 O/ ?0 w
- goto LABEL_10;4 ]: ? q$ @) {
- }3 | K$ q) ?6 C2 c I+ c. F
- LABEL_7:, ^- A8 h. b- K1 }3 z
- iCharSet = 238;" k, r1 B& D1 I4 I( G1 J
- goto LABEL_11;
/ Q: b( S! [2 _: Z' n; a - }) m2 ^: F3 _! j4 {
- if ( dword_4A4490 == 11250 )
* v6 R! w5 m* K$ v3 G - goto LABEL_7;
1 a+ ^0 F. E, H. H - LABEL_10:$ h6 U! N1 [2 T b$ V B
- iCharSet = 1;
! g. _# z) j9 h# H7 r5 n! r - LABEL_11:' N1 {/ ~! W6 x* e4 o
- base = glGenLists(256);3 U- V) i9 d3 G0 J& E
- h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);( V8 t( w% \ i4 \/ u+ ` J! p
- if ( !h )* \; _0 a; @; P ]4 ^* g
- MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);$ p, V" R" c( d" i9 q( F. K9 o( F
- SelectObject(hdc, h);
3 _, d: h8 |+ V! {/ q1 z - return wglUseFontBitmapsA(hdc, 0, 0x100u, base);) v. j6 Z9 S8 A) r& q7 h' h+ X
- }
复制代码
, F# f' R: b$ Z& B0 Y. ^
( I9 y! ^. E" ^- a* CglCallLists调用的地方共有3处,: N7 |- t! w' K0 C6 O" x
这个函数就是游戏的显示函数,共有3个参数,/ T- z' q# m1 ~+ c) \7 y; U
- void WINAPI glCallLists(
2 Q: Z- R8 W& {6 _ - GLsizei n,1 Q2 g# v2 ^" Y3 y
- GLenum type,2 e6 F( ^) J0 N
- const GLvoid *lists
; G0 \5 p/ B$ s" M- U) \ - );
复制代码
* b7 c7 a" M, ~( m& E$ S6 `& `- a
2 `. o' v& Q$ [6 ~; ? 其中n为字符串长度,type为字符串类型,*lists为字符串指针,3 [( _+ o' ?6 G4 l* E5 | t2 D
如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:
0 Z- i+ i3 C! V7 B7 A 需要修改为GL_UNSIGNED_SHORT,即0x1403。* o5 [2 g; d6 H! K+ V! s
3 S1 t5 k0 Y! w3 B* F定义
! N' P( S) R* A' W- #define GL_BYTE 0x1400) ^8 L/ A1 p6 r8 V( U
- #define GL_UNSIGNED_BYTE 0x1401
8 A8 }& y0 H; |2 t) `) I - #define GL_SHORT 0x1402- a. U4 e( m$ H3 J. O) R: o
- #define GL_UNSIGNED_SHORT 0x1403
2 y s4 b3 Y$ j/ J4 W - #define GL_INT 0x14046 P! w$ q2 ]" H6 h, p; ]/ z( R4 C
- #define GL_UNSIGNED_INT 0x1405
3 z/ H. C& i! W% U7 c - #define GL_FLOAT 0x1406
F1 B# v4 U( G! `! B - #define GL_2_BYTES 0x1407
g7 g s b4 L - #define GL_3_BYTES 0x14083 `0 e, [% E8 d) {* s; d. i! L
- #define GL_4_BYTES 0x1409: i4 j+ {. A2 A; T5 A
- #define GL_DOUBLE 0x140A
复制代码 . S, \% C0 c2 K" z2 I
, ?6 r0 i% i! T/ L1 h, ^- U |