冒险解谜游戏中文网 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
  1. BOOL __cdecl sub_4518C0(HDC hdc)3 g' {* ]7 n' W- c) Z  E9 m5 @
  2. {2 r3 B* c4 m# m$ w
  3.   HFONT h; // [esp+4h] [ebp-8h]
    $ S, {6 d9 }5 Q& M
  4.   DWORD iCharSet; // [esp+8h] [ebp-4h]
    5 W. w1 F2 A# a: B6 }# l

  5. # c4 y% [0 p3 s2 w" C; v3 Q
  6.   if ( dword_4A4490 <= 1252 )
    ; S7 S0 F: D, d3 I$ `
  7.   {% O3 ~; C/ a5 k" ?
  8.     if ( dword_4A4490 == 1252 )
    9 z: N% r& l# H8 R: x
  9.     {
    ( N8 p9 a. s' ~/ v# {7 Y$ E% r
  10.       iCharSet = 1;( i/ h9 Z7 l+ y- b) w: {) O( O$ W
  11.       goto LABEL_11;4 M# u2 Y5 j9 \- c8 Y+ J
  12.     }8 y6 B- U% o  ]7 L6 z4 `
  13.     if ( dword_4A4490 != 1250 )% @0 ]. T! i/ `/ i
  14.     {0 r% j" ^# \3 {3 K7 q+ G
  15.       if ( dword_4A4490 == 1251 )2 L7 z" f5 ~; x* x% y9 p
  16.       {
    3 r7 D9 E* J3 u
  17.         iCharSet = 204;0 q& g* u, o) `7 I4 _
  18.         goto LABEL_11;
    ' W6 K2 L: \3 Z$ T
  19.       }- F/ i8 ^8 |1 N" y1 _
  20.       goto LABEL_10;
    4 f7 x0 }7 k+ `
  21.     }
    9 t0 }( n5 ?0 g; |2 X& R
  22. LABEL_7:
    ) C% m, P3 e% t! I# K
  23.     iCharSet = 238;
    / }7 K8 r  W4 A0 M1 ~4 v
  24.     goto LABEL_11;& }7 j9 P; }) B- R, A" ]7 x; d
  25.   }/ a0 U- v6 K6 W1 [! ~7 [
  26.   if ( dword_4A4490 == 11250 ); _* g. s) P4 D! c
  27.     goto LABEL_7;4 Y1 g5 L% c* b$ U
  28. LABEL_10:
    ( u6 d& @! U" [$ E
  29.   iCharSet = 1;
    8 b' ?6 x2 a9 l% g1 F+ S
  30. LABEL_11:
    / w1 G( V0 f+ ]# J% s
  31.   base = glGenLists(256);  A) g( r. q' g' Q5 k0 z
  32.   h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);
    3 m2 x3 [& S3 a# c& `! d/ C
  33.   if ( !h )
    ! ]3 g( |, n9 E5 ?1 p2 j
  34.     MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);( ~. {- v' T2 n+ n6 Z8 g& w7 Q+ s
  35.   SelectObject(hdc, h);
    + P6 I0 u9 i0 D9 o+ M3 p5 r: c
  36.   return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
    * S. r& u3 Q. z4 |7 I9 Z) o6 H
  37. }
复制代码

1 X: z2 O1 h( y( F; O- D3 W; g
: E5 l% i" e3 K( _* uglCallLists调用的地方共有3处,
. q/ V, p/ t' K! H" C1 N" M2 u这个函数就是游戏的显示函数,共有3个参数,
- s' E& J# V1 F! V
  1. void WINAPI glCallLists(
    0 l0 A- `: {1 S$ h$ C1 w' V
  2.     GLsizei n,
    4 ^* v6 Z; o# g& v5 o' C/ T* O
  3.     GLenum type,
    " c; c8 j' [2 N7 s
  4.     const GLvoid *lists
    ( h7 b$ {& B  N2 H
  5. );
复制代码
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
  1. #define GL_BYTE                           0x1400
    5 X/ v. k# d! z  q
  2. #define GL_UNSIGNED_BYTE                  0x1401
    ) v/ o0 H. B: c6 N5 {( p
  3. #define GL_SHORT                          0x1402+ X$ ?) A! P% f; y4 m1 a' `
  4. #define GL_UNSIGNED_SHORT                 0x1403; h8 Y4 R9 K! B; _6 q! Y8 a
  5. #define GL_INT                            0x1404
    ' Y  N1 A* i$ s6 d
  6. #define GL_UNSIGNED_INT                   0x1405
    : l+ z1 i. m: J$ r  ?
  7. #define GL_FLOAT                          0x14068 q+ V% `* a" ]* A
  8. #define GL_2_BYTES                        0x1407. B" P% b. _6 \7 f: W# c
  9. #define GL_3_BYTES                        0x1408( w/ ~3 q$ v8 b' h8 Q( `
  10. #define GL_4_BYTES                        0x1409: F8 [3 X, Z) T6 J5 E
  11. #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