本帖最后由 shane007 于 2023-9-4 18:28 编辑 ) `/ z# K4 m/ `. s: i
" c% o$ a3 s: M( J: O这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,1 |3 b8 z, o: X4 h) h. z* a, y
但目前已经有了英文补丁,因此汉化又被提上日程。* C A9 }4 f; L3 V, F( t+ J
8 i, D9 Y2 H9 q( |3 ]" B9 W' A D7 j
对opengl的调用主要是在toh.exe完成的,
' j7 N! E2 z t( O' n对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
& P9 ^! J% q2 A2 L* a) O6 h2 Q, Z
/ X- p. `3 f2 ?/ \glGenLists的调用处共有6处,每处都类似,1 N: c+ W: i! u1 B) j" t
可见游戏初始化了6种字体,每种有256个字符。
" R6 B6 J9 [# y1 b, {" l& L% k5 i其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。
" o0 f8 j" k% i" {/ c% [修改的时候,应该还要修改到上层调用的其他函数。
( I; F6 l/ |* x9 m0 d- BOOL __cdecl sub_4518C0(HDC hdc)
/ f+ }2 }8 A. L* A. S - {
3 Q5 O. }2 i6 P4 s: j* c3 d - HFONT h; // [esp+4h] [ebp-8h]
: v' c: K# B6 Q& v& W; F. i - DWORD iCharSet; // [esp+8h] [ebp-4h]5 i/ O. N5 L- I: Q1 j1 J
$ X+ d6 W) U7 J- if ( dword_4A4490 <= 1252 )
1 v* J: n, p& q l4 t9 v3 r' p6 b - {* _. p/ n, ]& l1 ^2 Q( M
- if ( dword_4A4490 == 1252 )+ t- B' E9 K6 y& J
- {
2 Y1 }, k) f4 w, O3 { - iCharSet = 1;& U# m( J2 a Q. W. Z6 M, J. w% y
- goto LABEL_11;( C, w" M, E8 Y. a
- }$ w% L/ e8 k5 O ~8 r* Z3 A4 `* ~
- if ( dword_4A4490 != 1250 )" d' e+ \; r! Z
- {
4 V. F, t8 n* C, A0 D( q9 o! X* y - if ( dword_4A4490 == 1251 )
) H9 @1 L k: H& m4 m - {0 ?+ i: B R/ [
- iCharSet = 204;
; _* S) Z* Y( Y- Z! Q! h - goto LABEL_11;; T: _, t' u5 U, ]
- }
2 I3 Y9 q F7 q% A0 H# c - goto LABEL_10;0 Q3 Z( t4 Q# s- X. y; K2 v) `
- }$ }6 D: k9 u. m# `1 |3 c* _# n
- LABEL_7:
: Y7 r% C) M9 H- D" M! ]! u - iCharSet = 238;
& A( d7 ~2 L p- ^* P2 t. I' i - goto LABEL_11;2 ?2 a0 d: s) z- s/ N8 n
- }! Q) d/ j: [ R+ I& L$ |
- if ( dword_4A4490 == 11250 )
6 B, S5 G2 K; ^1 c8 y% B% O ? - goto LABEL_7;
2 o- w3 X( h, [3 e - LABEL_10:
0 z: a" D2 O j. c8 ~4 A - iCharSet = 1;
4 Y, `: `# p3 [ - LABEL_11:
% r8 F* s0 q: b7 P! {; m! N/ _ - base = glGenLists(256);0 b0 {. J9 K2 o0 N2 h
- h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);
' S+ f$ ~* n9 N - if ( !h )
' B8 s/ C9 I L9 D! C - MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);! O. e7 @' w( o& e2 w
- SelectObject(hdc, h);
8 f% }0 x5 N/ v$ h - return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
5 g! B) y6 y8 R7 Z% a - }
复制代码
2 y0 z, b* _- w' o5 R3 Z( t" [6 P6 s3 w4 ~
glCallLists调用的地方共有3处,
! u: T, l Y, W7 r3 y' A这个函数就是游戏的显示函数,共有3个参数,0 m, U' {3 l% ]6 n- J
- void WINAPI glCallLists(; x7 b$ G' X+ i. w
- GLsizei n,
0 l H$ N6 ?3 W8 p0 y' o' d9 V, S - GLenum type,
$ @$ G" @, _, ]+ j$ Y3 S5 a - const GLvoid *lists* P+ t! ?! Z' e9 @% X
- );
复制代码 : r. @ z' _% d- L
" }( j- N& k; C3 Z 其中n为字符串长度,type为字符串类型,*lists为字符串指针,
" w5 b" O, I$ t$ i6 s 如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:7 R! i( [# D5 c7 J8 C1 d
需要修改为GL_UNSIGNED_SHORT,即0x1403。. f' I |1 Y" Q8 @5 d' R
0 K( k$ Z' r) c$ T9 C+ _6 Z# H
定义4 N2 D$ k* _, f) O
- #define GL_BYTE 0x1400
/ H9 ?0 j. _- c V9 g3 `' H - #define GL_UNSIGNED_BYTE 0x1401) Q3 n& Z- V9 r/ b
- #define GL_SHORT 0x1402
% x7 x5 r0 ]& h' p4 X" c7 Z* G - #define GL_UNSIGNED_SHORT 0x1403
" w( s" m1 ]6 c - #define GL_INT 0x14048 a# z* G5 S3 ^
- #define GL_UNSIGNED_INT 0x1405
+ E% U$ E( p' h% x) P - #define GL_FLOAT 0x14069 g3 S. m3 |' Z% C% k2 z! D1 J+ R
- #define GL_2_BYTES 0x14079 Z w7 h# c; R8 m
- #define GL_3_BYTES 0x1408" ^9 {0 W q4 W& ^+ r: K
- #define GL_4_BYTES 0x1409. X+ v8 K+ A2 q9 X# Y6 p3 G. g/ Q
- #define GL_DOUBLE 0x140A
复制代码 % B, M# N! f3 _1 c" w
& U# a0 d/ A( J! m0 P" ~
|