设为首页收藏本站官方微博

建议 【Opengl游戏汉化 #3】 魔法英雄历险记(Tale of a Hero)字幕显示函数 glCallLists

[复制链接]
查看: 365|回复: 1
打印 上一主题 下一主题

[建议] 【Opengl游戏汉化 #3】 魔法英雄历险记(Tale of a Hero)字幕显示函数 glCallLists

跳转到指定楼层
楼主
发表于 2023-8-27 10:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

【Opengl游戏汉化 #3】 魔法英雄历险记(Tale of a Hero)字幕显示函数 glCallLists

本帖最后由 shane007 于 2023-9-4 18:28 编辑 ) V0 l$ k9 ^9 O& D: M% s
0 P1 E* E$ n( O9 U
这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,
6 C: K; ]  o* p但目前已经有了英文补丁,因此汉化又被提上日程。
, o* s5 Y; a. b5 J; p' u4 i4 ?
5 z' Z5 p/ u% \0 H对opengl的调用主要是在toh.exe完成的,& x& M: i3 ?8 D! X% J: I
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
& U; s3 `. s& D! r) d
  G/ h5 w3 n- V0 G$ H- R% h! c' _& |glGenLists的调用处共有6处,每处都类似,
) W/ u: u8 F8 ~( }7 K8 B8 O可见游戏初始化了6种字体,每种有256个字符。; k2 W& e  y; p& N( x0 ^; N6 e
其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。
2 k- O. O8 ]$ x修改的时候,应该还要修改到上层调用的其他函数。
1 A0 h* k' v5 C  ^
  1. BOOL __cdecl sub_4518C0(HDC hdc)( Z6 i  B3 I; j/ o  P) E7 l+ o; V
  2. {
    3 X2 ~& d3 a1 {7 ]/ b4 J
  3.   HFONT h; // [esp+4h] [ebp-8h]. P( c- t/ B3 @( ~) D
  4.   DWORD iCharSet; // [esp+8h] [ebp-4h]
    ; H( ~( B' `# S1 G% R
  5. : A& }/ p0 i, ]4 d; d  b
  6.   if ( dword_4A4490 <= 1252 )+ `9 [  m. [, }$ W0 w
  7.   {: ]+ k; B5 Y3 v2 K
  8.     if ( dword_4A4490 == 1252 )
    % u9 {( D. B  ~0 l
  9.     {5 ^6 E# c; M6 r1 |" ], E
  10.       iCharSet = 1;
    , {" R1 Y+ P1 e9 C! t8 Z% v
  11.       goto LABEL_11;
    1 y7 j+ D4 S* V& ^. x
  12.     }9 N1 W" D) B( E  N. w
  13.     if ( dword_4A4490 != 1250 )
    2 E8 R# f! A2 B( Z0 P0 c( T
  14.     {0 c7 s# {8 G7 c" r5 K6 [8 U2 ]
  15.       if ( dword_4A4490 == 1251 )( ?! @/ V- H4 D3 g
  16.       {
    ( O/ C) P8 f- y6 S: F
  17.         iCharSet = 204;3 g: h! w' B5 J9 ~4 d$ v
  18.         goto LABEL_11;, E" H) Z9 H5 [( Z$ u- f
  19.       }4 G1 \' ]1 N6 Z2 X& D
  20.       goto LABEL_10;+ S1 b$ k: n2 Z
  21.     }9 D0 M5 K& ~! r( M* T! P
  22. LABEL_7:
    8 D; s2 l; G' u) H5 t* G+ ^
  23.     iCharSet = 238;
    ! \( i" r* M5 U4 r
  24.     goto LABEL_11;
    $ _! f" W& ?' S6 R$ S3 @
  25.   }* r& O) w. M  e
  26.   if ( dword_4A4490 == 11250 )
    . V3 P) R1 p" h' O
  27.     goto LABEL_7;
    " M8 Y1 s* o) [
  28. LABEL_10:8 s  P4 @% m0 ^, e  x7 i
  29.   iCharSet = 1;
    , u5 J- `" Y# _9 ]
  30. LABEL_11:
    # M. \3 p: R. a! N9 g2 N
  31.   base = glGenLists(256);1 `& |; i, m; h* h% q8 [
  32.   h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);5 _! j- G' `7 V
  33.   if ( !h )
    6 ^# Q% @2 v+ K9 b/ T6 ?6 O6 T
  34.     MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
    . ?, U" ^! L( Z0 o7 L
  35.   SelectObject(hdc, h);
    / L: ]+ }* w+ A
  36.   return wglUseFontBitmapsA(hdc, 0, 0x100u, base);$ ^' o0 h# y$ j+ H
  37. }
复制代码

4 k  k. P0 h+ R3 r5 y# g- S- I- N) p( ?" r) |2 L
glCallLists调用的地方共有3处,6 y, U2 M( j! ?
这个函数就是游戏的显示函数,共有3个参数,
% }1 w% O7 \6 p+ ~& Y4 R
  1. void WINAPI glCallLists(
    . V1 H5 @+ m5 D, S
  2.     GLsizei n,
    . H" v) _  g( |* Q; A
  3.     GLenum type,
    7 m4 I* D  t1 z- \4 M( `% |5 s
  4.     const GLvoid *lists
    - ^5 C, Z7 Y5 F- T4 x
  5. );
复制代码
0 `. @. L* `. Q% N8 w" L" S2 K" z3 g
$ |/ S9 U) W  W& J- s
  其中n为字符串长度,type为字符串类型,*lists为字符串指针,
7 l4 Q' T5 F/ o! u  如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:
4 K) d0 M  B' r! y8 H6 i  需要修改为GL_UNSIGNED_SHORT,即0x1403。  r3 i0 P  i, a# l" ]& j
$ e5 g6 E, [# ]0 _8 h
定义& T# v  O- j- M$ K: u/ b" [
  1. #define GL_BYTE                           0x1400% \4 Y, q- w4 B1 }( D
  2. #define GL_UNSIGNED_BYTE                  0x1401
    - ~  h' G8 o& E/ f; o! A* y
  3. #define GL_SHORT                          0x1402
    0 ]& ?6 S8 P, e6 F- \5 F
  4. #define GL_UNSIGNED_SHORT                 0x14034 s; a; T2 f1 J6 S% E
  5. #define GL_INT                            0x1404
    1 }; M6 a; W6 N- e! Z/ F7 e% {* Z$ J$ p
  6. #define GL_UNSIGNED_INT                   0x1405  b3 j0 R# a# y6 G9 w% C5 t
  7. #define GL_FLOAT                          0x1406
    6 _0 w# h1 F! @) D! r2 H% O( K3 T5 O
  8. #define GL_2_BYTES                        0x1407
    ' t; U# g, |9 O4 ?
  9. #define GL_3_BYTES                        0x14086 O. E: e9 k% c/ z
  10. #define GL_4_BYTES                        0x1409
    7 M2 `, B1 d; c: J, C! t
  11. #define GL_DOUBLE                         0x140A
复制代码

  X5 Z8 o+ p2 c: L/ v2 T7 V# {6 U4 x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

沙发
 楼主| 发表于 2023-9-4 18:28 | 只看该作者
顶上来,顶上来
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表