冒险解谜游戏中文网 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 编辑
* M, G) @/ T! Z$ V' ]
! |+ Y! b7 z" Q' [2 j7 }2 `
这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,
" }3 f: f1 g' ]3 R, x
但目前已经有了英文补丁,因此汉化又被提上日程。
6 j" S! N* F7 u
+ `$ t1 X( J% p2 v2 Z* G
对opengl的调用主要是在toh.exe完成的,
4 ~ q) o4 z( U! f% N. J
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
$ a, R6 X' w T( M
8 W* R9 {; D& \
glGenLists的调用处共有6处,每处都类似,
4 o$ d/ Q! p! k3 {0 ^
可见游戏初始化了6种字体,每种有256个字符。
) V+ Q* \6 k- ]
其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。
6 \) t1 j C0 [) Z4 `/ S
修改的时候,应该还要修改到上层调用的其他函数。
" |4 q+ _. \. E, F) @7 B
BOOL __cdecl sub_4518C0(HDC hdc)
8 }8 w% C# K& S) O4 H' Y
{
. N# {6 G, k9 w+ S
HFONT h; // [esp+4h] [ebp-8h]
Z8 s8 `7 S: t/ Z: r7 u7 E
DWORD iCharSet; // [esp+8h] [ebp-4h]
; s2 L% x" G+ o. \6 ]9 r
) y( ?. o4 m, v5 u( f) z
if ( dword_4A4490 <= 1252 )
' u6 b5 ~! A( Z% f. X/ `0 z
{
- A4 n, {& Z7 ], J
if ( dword_4A4490 == 1252 )
! d3 r p3 F6 k; _& w! y! f
{
0 a8 k, E5 Y2 e8 E
iCharSet = 1;
- b+ G0 _8 f) Z* y! E! G
goto LABEL_11;
. V( u# r6 X. H: U% f* ~
}
`: b Y# m9 T# e% f
if ( dword_4A4490 != 1250 )
. f Y1 V+ K6 O8 U( j( p a
{
; ]! c1 @9 R- L1 u
if ( dword_4A4490 == 1251 )
/ e' [9 w! G2 w3 m
{
5 M6 x; ^- B6 }
iCharSet = 204;
5 O! J3 ]- I3 |7 H
goto LABEL_11;
5 s# W G& x' e+ L% ?: Z, E
}
* t- @; S2 n5 a
goto LABEL_10;
# t% o/ W' O( Z* [0 s) r+ S
}
3 u9 {8 P9 Y2 t$ B2 i9 W( S; f
LABEL_7:
6 d3 X: v% p) u, g
iCharSet = 238;
, x1 i2 U3 h% c. E
goto LABEL_11;
& b% O+ c! a- f5 f% t/ T
}
+ U7 d1 B" e! @' Z; J
if ( dword_4A4490 == 11250 )
4 i4 E) r; C. b
goto LABEL_7;
5 Y/ V( x, c. E
LABEL_10:
8 i5 B3 s! T/ L+ d; D, x
iCharSet = 1;
. p5 R) b. {( t9 i1 j" Y* `
LABEL_11:
0 T) J" o2 Z* A. B0 N$ [. n$ _
base = glGenLists(256);
4 L& g$ g& T' O/ H8 K* P
h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);
# U. g2 O9 S0 C( O3 s! Z! Y
if ( !h )
# `$ d) Z6 S$ s
MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
6 X# [. Y% T( {# f t: B- G
SelectObject(hdc, h);
8 ], W9 l- S( p/ ]) S% r
return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
# f) a& I. |0 R/ z7 p8 c1 |: [4 Z
}
复制代码
8 B, O1 O: i# g0 a& n! T, @- a0 F
2 H E9 f/ O* Z2 U+ u; G
glCallLists调用的地方共有3处,
% G) s: d6 A& O4 s* s* Y$ ]
这个函数就是游戏的显示函数,共有3个参数,
3 v5 B7 D8 V. T% y
void WINAPI glCallLists(
0 S9 C, a/ g* g8 b% e3 z
GLsizei n,
; s; T# k I0 N% ? N
GLenum type,
1 b. t7 M, O v8 G$ j# G
const GLvoid *lists
9 R3 d, ?7 ]0 J' V9 u
);
复制代码
3 D8 f' h2 a" _
& L/ P- h; k; ~+ r; }7 w
其中n为字符串长度,type为字符串类型,*lists为字符串指针,
& C/ f! w }. F, ^0 d ^! Q, i @+ x
如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:
5 l( [( V2 c# w# s
需要修改为GL_UNSIGNED_SHORT,即0x1403。
, Y) v( e8 z: h; Y+ Q# ?) Q$ x0 N- q
8 F; o# `2 T! c1 f6 h
定义
- I! O/ u; A, N/ K; J% A
#define GL_BYTE 0x1400
4 z. o; ^7 A4 C% X2 q* B; u
#define GL_UNSIGNED_BYTE 0x1401
' f( U; s5 G3 o8 ~' u
#define GL_SHORT 0x1402
2 }" _! W: [ f/ b6 D" C, J
#define GL_UNSIGNED_SHORT 0x1403
/ Y8 l2 r% M% k q" a# f7 e
#define GL_INT 0x1404
/ f o0 d1 q( L7 y8 ?. n9 g
#define GL_UNSIGNED_INT 0x1405
# }7 c& W( d' \. g- \1 l
#define GL_FLOAT 0x1406
8 ~* A2 `. k* V `0 V. M
#define GL_2_BYTES 0x1407
& g [6 n! _9 h$ ~+ k3 K+ _( D
#define GL_3_BYTES 0x1408
4 O s- ^! ?0 ]' y4 I) {$ E
#define GL_4_BYTES 0x1409
9 e1 l- q2 ?9 _& q5 }$ L+ u
#define GL_DOUBLE 0x140A
复制代码
2 R% N9 J, C+ h+ @1 V0 S3 k0 _
/ x3 _6 Y d8 I
作者:
shane007
时间:
2023-9-4 18:28
顶上来,顶上来
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2