本帖最后由 shane007 于 2023-9-4 18:28 编辑
G8 W. E# X0 b& C, ~4 T; y0 e# s3 ^0 \ F2 K. d* Y9 d1 d
这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,; [' a* \5 p8 h) d2 H$ j7 m- t
但目前已经有了英文补丁,因此汉化又被提上日程。0 L7 y: Y2 R/ f/ r* f4 Q: H6 o
7 V% U( _! N/ |% N5 M) F对opengl的调用主要是在toh.exe完成的,# {. b& [0 D$ ^8 ?7 x) L6 u
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
- V5 a; ?& l8 Z/ d }, k7 v. J! m$ @
glGenLists的调用处共有6处,每处都类似,( m2 s9 O7 B' b0 w
可见游戏初始化了6种字体,每种有256个字符。
4 P: J: Q8 Q0 v+ R其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。4 K$ j3 F( q- D& X9 y: j
修改的时候,应该还要修改到上层调用的其他函数。
8 ?* T, s+ N6 H/ }6 E- BOOL __cdecl sub_4518C0(HDC hdc)4 Y+ a0 U! d- |6 g$ t) L# T
- {
- l3 p2 Y3 x7 X - HFONT h; // [esp+4h] [ebp-8h]
9 q7 r5 y' J3 b: s; w - DWORD iCharSet; // [esp+8h] [ebp-4h]( {2 `! e0 j4 d9 y' p7 A9 s
- 5 S4 L2 W5 q( i; n& @( U9 t
- if ( dword_4A4490 <= 1252 )% W w( B# f+ {
- {, D# L' h1 l; G ~' \
- if ( dword_4A4490 == 1252 )
1 a% K8 g- r6 x- H - {
$ s$ o3 j1 J. G2 i3 F' ` - iCharSet = 1;: c5 |4 _; q) p, y1 J
- goto LABEL_11;
) H( S* `; B6 g- m - }
4 \2 O |0 y4 W# q% V$ ] - if ( dword_4A4490 != 1250 )
2 a2 o+ n3 U5 f: u# y' Y - {1 S! c8 Q' b* r+ s0 g/ ~9 z6 t
- if ( dword_4A4490 == 1251 )7 w# C- C# @* S5 d8 P
- {
1 `6 e3 x5 U2 d7 \+ I" o - iCharSet = 204;- |* U9 h* d7 X; e7 Y: T
- goto LABEL_11;# }* ^6 q8 f' u7 q/ S
- }
, J- P+ y2 s4 a$ ?' c/ \ e - goto LABEL_10;
: k. P1 h; I4 a# `1 w( ~ - }8 n$ L. ^3 _7 b
- LABEL_7:
l; {1 R* I$ H - iCharSet = 238;7 a9 F5 V3 U5 d k& M
- goto LABEL_11;
5 p$ [+ r- f1 e1 Y - }' ]/ N# G: n( R" q' j# N1 u
- if ( dword_4A4490 == 11250 )' w5 j0 z% `! [: J' ?
- goto LABEL_7;
8 j( g7 s/ j* d. j& _: C - LABEL_10:/ v& c. h, ^# `$ J
- iCharSet = 1;1 B4 d& C& S) F) g
- LABEL_11:( Q6 b* A' B8 w* [$ b
- base = glGenLists(256);
6 i( S( o( J# e9 x - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);
/ v; Z1 K8 Q a1 z( C - if ( !h )- l7 I7 J8 E1 e$ a' V, |) R
- MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
- ^9 P6 M9 y0 X2 ~ - SelectObject(hdc, h);" j- C4 P2 Q% y+ N
- return wglUseFontBitmapsA(hdc, 0, 0x100u, base);" j- S, J; A: K- `5 |$ Y/ ~. @
- }
复制代码 / F$ E' d1 T% \ z2 g
+ d* R9 q2 G- |; ?! \( A( eglCallLists调用的地方共有3处,4 r; N. B& B! ^8 ]7 T
这个函数就是游戏的显示函数,共有3个参数,; }' `0 L% i$ Q; h0 E
- void WINAPI glCallLists(
0 W4 g7 @9 B5 d5 ` - GLsizei n, y, \. | R: h
- GLenum type,
; d$ M1 ]$ d0 f1 u# @5 d - const GLvoid *lists
1 v/ L% @. \+ h8 { - );
复制代码
/ I9 I m. J b9 T
, [4 r( u! k+ T/ D( S 其中n为字符串长度,type为字符串类型,*lists为字符串指针,4 {9 P, h+ e! F/ A) \
如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:8 v9 b, w: o) U" Y6 l( ^) s
需要修改为GL_UNSIGNED_SHORT,即0x1403。
' D8 q7 J, j1 r8 F. N8 R
/ v2 y6 r" w& v% H: ~% d定义: ^3 M4 ~# F4 [8 ?8 ?8 S$ S7 `
- #define GL_BYTE 0x1400" a! q: X$ {' ?
- #define GL_UNSIGNED_BYTE 0x1401: y. p' L x& O0 y# o8 X* u
- #define GL_SHORT 0x1402! W/ P0 w" T# j8 O6 I& R: V
- #define GL_UNSIGNED_SHORT 0x1403
( d" ^0 g- |$ \+ `% [: K5 t - #define GL_INT 0x1404* Q( B4 g1 E4 V* }
- #define GL_UNSIGNED_INT 0x1405% b3 e0 K2 d8 u; G+ e, A _
- #define GL_FLOAT 0x1406. W) ^' h7 E6 ~+ V& Q8 Q+ Z
- #define GL_2_BYTES 0x1407& P# b. J/ ]: U3 X2 M- N( n+ e
- #define GL_3_BYTES 0x1408
' M% O! H! v& g! t; F/ D1 i - #define GL_4_BYTES 0x1409" j1 G4 `4 A+ ]5 f# W- K( K
- #define GL_DOUBLE 0x140A
复制代码 ; m0 R1 H8 @; k; r
1 h5 o! y& F: Q |