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

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

[复制链接]
查看: 629|回复: 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 编辑
/ f$ A$ C) x* s$ Q$ p
6 d0 c9 w9 s8 T! X' \' r& a2 V, d这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,4 E  i- W# Q' Z9 I- p
但目前已经有了英文补丁,因此汉化又被提上日程。' R- `2 N3 w( V2 g  R

2 S! C. j3 q; r% p对opengl的调用主要是在toh.exe完成的,7 I5 S/ E- E" c, d' g9 B, U
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
. S8 R4 R/ K' J2 l, t
1 l' u" Z) d5 Z: p# A0 V' VglGenLists的调用处共有6处,每处都类似,# x$ r# I6 l: n2 J5 Z6 R- k
可见游戏初始化了6种字体,每种有256个字符。1 F. E/ S9 _* e; Z1 G
其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。: B) R! [4 W% p* _+ q
修改的时候,应该还要修改到上层调用的其他函数。" f$ R% M4 K+ ?$ e3 Q
  1. BOOL __cdecl sub_4518C0(HDC hdc)
    ( q7 x$ J: X2 {2 I$ W) g
  2. {) S$ a+ D/ T& ^; c; j' @
  3.   HFONT h; // [esp+4h] [ebp-8h]8 t. N9 Q) O* l. g2 u
  4.   DWORD iCharSet; // [esp+8h] [ebp-4h]
    5 ^* K% a8 ~* g# ^* q  P
  5. $ J% o: _5 U9 u: @, z* p' r
  6.   if ( dword_4A4490 <= 1252 )) ]7 }7 w2 L4 ?. p% T: C9 o2 i* n& ]
  7.   {
    : A6 r- T' P1 g" a+ m
  8.     if ( dword_4A4490 == 1252 )% F% ?3 J. ^9 D# a) l
  9.     {0 G: l3 W) |9 x
  10.       iCharSet = 1;( D; G! E* X; s3 H- k
  11.       goto LABEL_11;2 O) P+ W" I/ S0 t
  12.     }( K$ @- g8 h6 z# H
  13.     if ( dword_4A4490 != 1250 ); X8 j3 L. B& @
  14.     {+ ^* p- B( }8 ~1 T
  15.       if ( dword_4A4490 == 1251 )
    2 b0 n# u& q1 k% M" H& h, W5 e7 v
  16.       {
    0 |9 b5 N" `. x5 \5 i$ B7 @
  17.         iCharSet = 204;
    ! l) z4 Z# c0 L8 @: o6 V6 G
  18.         goto LABEL_11;
    ; K  t  e5 Y) J. e2 s
  19.       }
    6 Q1 ^: J- {" a: J4 i& _
  20.       goto LABEL_10;0 h6 n% g1 c: Z
  21.     }. z$ d6 B, @+ i5 Q  e$ c) x
  22. LABEL_7:/ H0 y% ~- v* b: _$ L, z8 A; Z4 V
  23.     iCharSet = 238;
    4 z4 T  a+ Z8 V. {( O, ~
  24.     goto LABEL_11;
    ' Y$ X7 |' m! w% x# [
  25.   }- n& m5 X# u* F3 p0 v3 R4 m9 h$ c
  26.   if ( dword_4A4490 == 11250 )
    2 ~& Y% i* Y  I" w! J9 v+ f
  27.     goto LABEL_7;( f6 ^0 z- k  `! w" q
  28. LABEL_10:! L# ?- c% j. Z' h2 [: p) n' o
  29.   iCharSet = 1;
    8 g9 p) l! {/ |) P) s, x
  30. LABEL_11:
    ! @( Z$ l& C' v. x3 _5 o
  31.   base = glGenLists(256);' A9 V: h! ]$ i9 }. {5 u
  32.   h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);" E$ s  r4 u6 F' L
  33.   if ( !h )
    ! ], d4 C# S& n
  34.     MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
    6 `2 C$ Y  i: k# Q( R) C! w
  35.   SelectObject(hdc, h);& L  e  b2 L7 T/ l% D' @# y( @
  36.   return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
    ! D$ d% q6 ~* ^* R7 }  C2 u; b6 t
  37. }
复制代码

' R9 z- O; W5 g& \- l, t1 X# o, t* ^& S4 R; _6 o
glCallLists调用的地方共有3处,
1 {! j# b' ~. ?+ ^这个函数就是游戏的显示函数,共有3个参数,
8 f: W0 r4 a2 d* }; i
  1. void WINAPI glCallLists(- x  B; I3 K/ y0 t
  2.     GLsizei n,+ d2 \. B$ l# D8 O! I4 {# j; P! l
  3.     GLenum type,
    3 {0 i- `4 y" X- a
  4.     const GLvoid *lists
    1 i  w9 o$ l# I) M" a6 Q/ K) K
  5. );
复制代码
6 M. ~7 e, ]6 ?4 ~

# j1 l& Q7 E; z4 n4 Q  其中n为字符串长度,type为字符串类型,*lists为字符串指针,
: `0 a$ F$ _9 b  \$ |0 W* j) w  如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:% D7 I- v; w) {
  需要修改为GL_UNSIGNED_SHORT,即0x1403。$ I7 J$ Z6 `( J

2 W- b9 C& ], Z( t- i: s7 `2 y定义4 q! d7 U8 Q1 ^7 T" Z
  1. #define GL_BYTE                           0x1400
    , Z, G) u2 C+ H4 F* z
  2. #define GL_UNSIGNED_BYTE                  0x14018 c# t" V, ^9 O/ g: k5 d
  3. #define GL_SHORT                          0x1402
    9 E; u) g1 b2 A( ?3 B
  4. #define GL_UNSIGNED_SHORT                 0x14036 N& e2 r) v" T* c
  5. #define GL_INT                            0x1404' a* S' ^8 o2 E
  6. #define GL_UNSIGNED_INT                   0x1405
    2 _' d: a1 P8 k' u7 L( m
  7. #define GL_FLOAT                          0x1406
    9 [9 ^! P' h- I3 P
  8. #define GL_2_BYTES                        0x1407
      f* G1 T4 }0 Y" o& @) ^
  9. #define GL_3_BYTES                        0x14082 ]! j3 A+ C, \( A0 w
  10. #define GL_4_BYTES                        0x1409  J7 _' b( |, [: _  K! a& r7 q
  11. #define GL_DOUBLE                         0x140A
复制代码

  c& W6 Y9 h+ f  F8 x
1 N9 a( }2 B+ o% _2 V/ P# M& s
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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