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

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

[复制链接]
查看: 382|回复: 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 编辑 : q. G! S0 p3 j- v5 s
- ^. A6 x/ H4 @3 U& u
这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,4 c, t0 @6 n) d9 S7 b
但目前已经有了英文补丁,因此汉化又被提上日程。  S; x+ O2 q: n: _0 |
4 F9 _9 l; R- R5 ?( I
对opengl的调用主要是在toh.exe完成的,
; u& ~8 d! s+ R' P0 S3 E  G对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数! D  {% G5 |1 C: @$ T* k
8 T/ R! [& [) f' x9 i
glGenLists的调用处共有6处,每处都类似,( T$ i& n4 J8 Y
可见游戏初始化了6种字体,每种有256个字符。8 s; p5 {& f1 s1 \
其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。
5 T' X6 _( x: H- j+ R修改的时候,应该还要修改到上层调用的其他函数。' F, p/ z% X2 ^2 ]
  1. BOOL __cdecl sub_4518C0(HDC hdc)
    % Z9 Q- W6 A6 {: i  v9 y
  2. {% @' J+ h5 @7 G' n* F1 l( d* e
  3.   HFONT h; // [esp+4h] [ebp-8h]
    # v2 `' a. }! Z5 m+ J0 l: e8 z% r
  4.   DWORD iCharSet; // [esp+8h] [ebp-4h]
    1 }+ d- F' v/ z4 ]2 x5 A' ~

  5. 3 x1 c# g! u  m
  6.   if ( dword_4A4490 <= 1252 )
    1 k+ g& ]3 K7 i" |. X
  7.   {8 |" N7 U  V3 ~- S
  8.     if ( dword_4A4490 == 1252 )
    7 k8 D" r# F$ b: c2 k* X
  9.     {
    7 c7 I7 H  K/ e7 N/ b9 ?: k
  10.       iCharSet = 1;
    9 w1 [: B* d! `/ Z8 K0 Z  m
  11.       goto LABEL_11;- g+ M7 {3 g9 \6 b* b9 q1 z  h. L
  12.     }
    * Z  o* `9 l3 m5 \" j
  13.     if ( dword_4A4490 != 1250 )
    / H) ~) G$ A+ S" \# _
  14.     {
    " U# h$ x6 t. m8 n/ |6 M
  15.       if ( dword_4A4490 == 1251 )
    0 a# B1 \/ S' Q! E5 G
  16.       {
    . ?+ \2 J3 j6 R+ i* q# H
  17.         iCharSet = 204;% G* r2 a6 I2 A7 d
  18.         goto LABEL_11;
    3 e, W/ g) e( \; o' m" v' {; C
  19.       }
    , S$ S  {% @7 |$ b5 I
  20.       goto LABEL_10;
    5 V5 X1 C3 R8 _( U* j0 p
  21.     }
    5 D3 g2 I$ p/ f
  22. LABEL_7:- X0 f8 {7 M2 Z1 P: H
  23.     iCharSet = 238;
    ) c( ^. D9 w4 E5 `  g
  24.     goto LABEL_11;. o& K! f0 c' c* w
  25.   }
    - G1 J* K' R) w" b" H2 p( F
  26.   if ( dword_4A4490 == 11250 )* s  h$ `& C0 y* l* z
  27.     goto LABEL_7;4 o$ p' Q4 k2 N$ s: J" c
  28. LABEL_10:
    : O% _- }+ h& F/ m% U- {7 L
  29.   iCharSet = 1;
    6 j5 \' _% e! I& w" F+ c9 W
  30. LABEL_11:" _' V$ E# J  j
  31.   base = glGenLists(256);/ F  {, m* w" a% a6 c
  32.   h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);4 ~' C+ p6 R  `% ?  A  t4 b
  33.   if ( !h )
    0 y4 f- V8 E: h
  34.     MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);) u- Y; |+ y/ Q* i2 s! Q7 ^
  35.   SelectObject(hdc, h);  z$ K' o# d8 M) V, H
  36.   return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
    : r/ u  W' ?. L8 Q; K' \" D+ H$ G
  37. }
复制代码

- m- R  Q# R% B; d
% n8 C6 c6 C2 a1 G  z: ]glCallLists调用的地方共有3处,
+ ?# g+ ~9 t6 z8 J9 ^这个函数就是游戏的显示函数,共有3个参数,
4 h$ s* e4 F! s6 Y9 a; Y
  1. void WINAPI glCallLists(
    ; s) u% K- A' ?5 e$ G( \
  2.     GLsizei n,# x! ?! z+ ]  p' Q* M3 N: f
  3.     GLenum type,
    . ]4 S9 x5 U& ^' O+ Y! M3 |$ d
  4.     const GLvoid *lists$ E6 J* s5 ^% h& ?. ~( |2 [% t7 Y
  5. );
复制代码
% ?, C1 K, X1 t2 x
7 m' g# I0 b1 ~
  其中n为字符串长度,type为字符串类型,*lists为字符串指针,
& B0 A# a- G) C0 ^# m  如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:
0 y% f0 e5 e; f7 k  需要修改为GL_UNSIGNED_SHORT,即0x1403。
. i+ }& `, W( V+ F; m; W, b
' K$ m" {* C3 h, b定义9 I& ~8 T! i9 E. C4 @
  1. #define GL_BYTE                           0x1400
    9 S# E4 f6 j3 \& b) S& N
  2. #define GL_UNSIGNED_BYTE                  0x1401
      _# i) x! O& N& d
  3. #define GL_SHORT                          0x1402
    % ^+ Y  p: q" c; a
  4. #define GL_UNSIGNED_SHORT                 0x1403
    4 W% e+ p, _1 e, q6 e. x
  5. #define GL_INT                            0x1404
    " A9 m  ]( o  M2 ^- C5 y6 _
  6. #define GL_UNSIGNED_INT                   0x1405; |) w1 `. R1 O  B: e5 t; b( \. o/ x( U
  7. #define GL_FLOAT                          0x1406, H' |& w- l8 P" P
  8. #define GL_2_BYTES                        0x1407! o+ @8 |9 G6 ]6 Z- l
  9. #define GL_3_BYTES                        0x1408
    - V' {" f- z/ e% S) y- ^
  10. #define GL_4_BYTES                        0x1409
    1 R0 u- D7 m- C- L- S8 |
  11. #define GL_DOUBLE                         0x140A
复制代码

! t7 o3 @) ~% N, c$ z/ X; D* V+ K1 f3 {) b; g" s* B
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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