本帖最后由 shane007 于 2023-9-4 18:28 编辑
. v4 o3 T. X$ h0 |( z" B; I P# t9 F& {; S0 P3 M. B" c+ {0 B* c; Q( i
这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,# t% A+ Y5 _' t Q& x u, E2 x, i* q5 {
但目前已经有了英文补丁,因此汉化又被提上日程。
' D+ w3 U, g+ g
0 q9 g- b# m, a8 N: h: W* J# ]对opengl的调用主要是在toh.exe完成的,! X& d: D! C. Q6 m {3 ]
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
1 E! T s p% n- w
6 t' i6 L. h* Q0 p |$ D- ]8 iglGenLists的调用处共有6处,每处都类似,
4 K# {" q3 G( Z4 v( c3 [可见游戏初始化了6种字体,每种有256个字符。
; B3 e3 a( B' u. Q) f其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。7 |- M: U8 A' d3 \) P- T# K' ~
修改的时候,应该还要修改到上层调用的其他函数。
0 d( }6 ?( p& [7 D/ }2 W$ E3 r) L- BOOL __cdecl sub_4518C0(HDC hdc)( I- A7 Q) ] Y- Y9 v
- {
/ q! a* {* v! {" D - HFONT h; // [esp+4h] [ebp-8h]2 X5 u" x# e# u W( h1 `. }
- DWORD iCharSet; // [esp+8h] [ebp-4h]
4 T2 t m7 b& f
- t& _( J8 Z7 \. t% v& s! F- if ( dword_4A4490 <= 1252 )
2 {4 G9 i8 `2 j8 V) c - {
% i4 j3 t9 w! V+ O4 y - if ( dword_4A4490 == 1252 )5 ~. U1 r! E4 ?3 }% E. b
- {
0 S8 U8 e0 T, ~" H3 _/ W" a. @ - iCharSet = 1;8 S/ Z# S b4 R, e8 k
- goto LABEL_11;
( I C1 k4 {9 R7 C, S" L* p7 Q - }3 s6 D' g! i! f( l( ]
- if ( dword_4A4490 != 1250 )
: P* i' U) D+ H& q# r - {
; l; [2 L/ v, q, X: Q, G - if ( dword_4A4490 == 1251 ); l( s* G9 _! N4 ]9 `' t: L
- {2 G7 E5 `; U+ s! {; E5 }/ Y* C
- iCharSet = 204;
5 ?% G1 t4 `4 ^% {& n2 D% H# z - goto LABEL_11;
# ?# X$ v r' X( M - }' S8 w3 [* _) @2 _" |5 \
- goto LABEL_10;
2 I) X3 r( D- q f - }
. h- n) ]+ y( a% Q9 ]# i - LABEL_7:# @) Y; N3 p0 T7 m1 L' ^
- iCharSet = 238;
6 U% w- a, m$ K - goto LABEL_11;
e# D) O3 r0 Q- H% f9 x - }
1 P2 V/ K5 F# ]8 O- F - if ( dword_4A4490 == 11250 )! P% x0 n* J- R j; ^
- goto LABEL_7;
9 \. a$ [6 Y' O2 M) y: Q& r2 I: J - LABEL_10:
* n( m, U8 j" B" u- D* k0 T - iCharSet = 1;% ~! _$ z: }/ |
- LABEL_11:
' {2 w) X; W9 Q# u - base = glGenLists(256);% o! I( @/ P, _/ ^
- h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);$ q. B' ~- M! H; L" p" j6 y
- if ( !h )
% e' Q6 @& N$ }+ q) w" s - MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
! Y% b8 _7 C% J! S - SelectObject(hdc, h); x( k3 n& j& w0 x8 ^6 u* o
- return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
" K, q+ `, S5 K/ v$ z - }
复制代码
6 Z; `* j) q: m) i" N# P, n
/ P4 W3 C0 }/ T& ~# R4 s- M& uglCallLists调用的地方共有3处,
7 B+ p+ h4 w! O8 d5 {9 A这个函数就是游戏的显示函数,共有3个参数,
9 I8 M) k( o- t2 f( p3 v- void WINAPI glCallLists(
! ^5 [% y- }3 ? - GLsizei n,
+ h6 q1 V2 r2 a% L' U p - GLenum type,
3 a( Z% p$ M _4 e; H1 D6 b - const GLvoid *lists0 U" l! T2 p* n' _
- );
复制代码 ! M( ]6 q) m8 q
/ G1 J( x9 l2 ^& n, r 其中n为字符串长度,type为字符串类型,*lists为字符串指针,* ^' w+ g4 N1 x; r
如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:$ n, M" }, K5 g6 M. I4 p% A
需要修改为GL_UNSIGNED_SHORT,即0x1403。% g3 o) @# I& A- H$ u; `
7 H$ w7 w4 y% d
定义' M" v) G) l( W% k' ?/ D. S
- #define GL_BYTE 0x1400& x1 u( X1 A+ z4 R# t1 f& O e
- #define GL_UNSIGNED_BYTE 0x1401* N8 D) U0 o/ A6 `9 Z
- #define GL_SHORT 0x1402
' ?; B& U7 {. a3 e6 X$ b - #define GL_UNSIGNED_SHORT 0x1403+ g4 @; o3 Y: V$ ]+ t; O; _0 U
- #define GL_INT 0x1404& f, K& K$ z( Z0 \, ~. B
- #define GL_UNSIGNED_INT 0x14053 ~" m2 j8 \! T% V3 N
- #define GL_FLOAT 0x1406& t3 b" o8 V9 f) N" G
- #define GL_2_BYTES 0x1407
" g9 X( ?6 D) }, ~! L - #define GL_3_BYTES 0x1408+ E0 N( O, p3 \- ? R
- #define GL_4_BYTES 0x1409
; v! P( q5 H) Z' Y/ y* t# c - #define GL_DOUBLE 0x140A
复制代码
% l1 m# a% W7 `& K5 L- t- p. m4 U. |1 y
|