冒险解谜游戏中文网 ChinaAVG
标题:
【Opengl游戏汉化 #3】 魔法英雄历险记(Tale of a Hero)字幕显示函数 glCallLists
[打印本页]
作者:
shane007
时间:
2023-8-27 10:39
标题:
【Opengl游戏汉化 #3】 魔法英雄历险记(Tale of a Hero)字幕显示函数 glCallLists
本帖最后由 shane007 于 2023-9-4 18:28 编辑
; _+ R7 p; E' I- O
9 W# b s* i- z. n8 F
这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,
# x2 B# n9 a' q2 V2 h$ k
但目前已经有了英文补丁,因此汉化又被提上日程。
, B' F" f \" g) J$ |
$ h7 L' \0 ?9 O
对opengl的调用主要是在toh.exe完成的,
5 H- e7 ^# _0 O% P: r' L
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
2 S" H& h( U4 l N+ q/ \
# p( T c+ P/ f: S" \9 h6 J
glGenLists的调用处共有6处,每处都类似,
6 f: A8 ~2 k' k( j z
可见游戏初始化了6种字体,每种有256个字符。
$ H8 \% g* @% Y7 J% n0 \
其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。
; B% k: O5 `0 P7 E8 }6 K% v* s
修改的时候,应该还要修改到上层调用的其他函数。
/ F2 E+ v0 @) S0 h; c7 I; n7 n
BOOL __cdecl sub_4518C0(HDC hdc)
3 g' {* ]7 n' W- c) Z E9 m5 @
{
2 r3 B* c4 m# m$ w
HFONT h; // [esp+4h] [ebp-8h]
$ S, {6 d9 }5 Q& M
DWORD iCharSet; // [esp+8h] [ebp-4h]
5 W. w1 F2 A# a: B6 }# l
# c4 y% [0 p3 s2 w" C; v3 Q
if ( dword_4A4490 <= 1252 )
; S7 S0 F: D, d3 I$ `
{
% O3 ~; C/ a5 k" ?
if ( dword_4A4490 == 1252 )
9 z: N% r& l# H8 R: x
{
( N8 p9 a. s' ~/ v# {7 Y$ E% r
iCharSet = 1;
( i/ h9 Z7 l+ y- b) w: {) O( O$ W
goto LABEL_11;
4 M# u2 Y5 j9 \- c8 Y+ J
}
8 y6 B- U% o ]7 L6 z4 `
if ( dword_4A4490 != 1250 )
% @0 ]. T! i/ `/ i
{
0 r% j" ^# \3 {3 K7 q+ G
if ( dword_4A4490 == 1251 )
2 L7 z" f5 ~; x* x% y9 p
{
3 r7 D9 E* J3 u
iCharSet = 204;
0 q& g* u, o) `7 I4 _
goto LABEL_11;
' W6 K2 L: \3 Z$ T
}
- F/ i8 ^8 |1 N" y1 _
goto LABEL_10;
4 f7 x0 }7 k+ `
}
9 t0 }( n5 ?0 g; |2 X& R
LABEL_7:
) C% m, P3 e% t! I# K
iCharSet = 238;
/ }7 K8 r W4 A0 M1 ~4 v
goto LABEL_11;
& }7 j9 P; }) B- R, A" ]7 x; d
}
/ a0 U- v6 K6 W1 [! ~7 [
if ( dword_4A4490 == 11250 )
; _* g. s) P4 D! c
goto LABEL_7;
4 Y1 g5 L% c* b$ U
LABEL_10:
( u6 d& @! U" [$ E
iCharSet = 1;
8 b' ?6 x2 a9 l% g1 F+ S
LABEL_11:
/ w1 G( V0 f+ ]# J% s
base = glGenLists(256);
A) g( r. q' g' Q5 k0 z
h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);
3 m2 x3 [& S3 a# c& `! d/ C
if ( !h )
! ]3 g( |, n9 E5 ?1 p2 j
MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
( ~. {- v' T2 n+ n6 Z8 g& w7 Q+ s
SelectObject(hdc, h);
+ P6 I0 u9 i0 D9 o+ M3 p5 r: c
return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
* S. r& u3 Q. z4 |7 I9 Z) o6 H
}
复制代码
1 X: z2 O1 h( y( F; O- D3 W; g
: E5 l% i" e3 K( _* u
glCallLists调用的地方共有3处,
. q/ V, p/ t' K! H" C1 N" M2 u
这个函数就是游戏的显示函数,共有3个参数,
- s' E& J# V1 F! V
void WINAPI glCallLists(
0 l0 A- `: {1 S$ h$ C1 w' V
GLsizei n,
4 ^* v6 Z; o# g& v5 o' C/ T* O
GLenum type,
" c; c8 j' [2 N7 s
const GLvoid *lists
( h7 b$ {& B N2 H
);
复制代码
4 x% G1 h9 o1 R' n" p9 r
* o4 \: ^; {* H' n C' V
其中n为字符串长度,type为字符串类型,*lists为字符串指针,
$ }4 M9 m7 L, b) b2 D
如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:
' R& H' Q0 s7 Z3 B! h" V
需要修改为GL_UNSIGNED_SHORT,即0x1403。
5 X x7 B! _. s5 r% h" i
% a5 g# l- v/ W4 k" k
定义
" f6 D; I- R. {! i6 l) o
#define GL_BYTE 0x1400
5 X/ v. k# d! z q
#define GL_UNSIGNED_BYTE 0x1401
) v/ o0 H. B: c6 N5 {( p
#define GL_SHORT 0x1402
+ X$ ?) A! P% f; y4 m1 a' `
#define GL_UNSIGNED_SHORT 0x1403
; h8 Y4 R9 K! B; _6 q! Y8 a
#define GL_INT 0x1404
' Y N1 A* i$ s6 d
#define GL_UNSIGNED_INT 0x1405
: l+ z1 i. m: J$ r ?
#define GL_FLOAT 0x1406
8 q+ V% `* a" ]* A
#define GL_2_BYTES 0x1407
. B" P% b. _6 \7 f: W# c
#define GL_3_BYTES 0x1408
( w/ ~3 q$ v8 b' h8 Q( `
#define GL_4_BYTES 0x1409
: F8 [3 X, Z) T6 J5 E
#define GL_DOUBLE 0x140A
复制代码
8 M1 D: e; o" X, P O S& [# t
' i& \! B/ i. A' M, H- U6 _
作者:
shane007
时间:
2023-9-4 18:28
顶上来,顶上来
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://www.chinaavg.com/)
Powered by Discuz! X3.2