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

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

[复制链接]
查看: 354|回复: 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 编辑 + h/ b% |1 K# K8 I

" R9 ^* O/ M5 @, D3 x+ Z这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,
  {: u7 P1 z, M  S  b( p但目前已经有了英文补丁,因此汉化又被提上日程。# }( ]9 ]. E- \' w3 F: C' d
3 F- ]$ t, G+ n& P
对opengl的调用主要是在toh.exe完成的,
- r; n# E0 j5 s对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
/ W* ~2 Z; J5 c  a: t' A
. C! B2 V# F& p3 [! N; \glGenLists的调用处共有6处,每处都类似,2 u2 q. ]; t/ }2 `2 R$ E
可见游戏初始化了6种字体,每种有256个字符。
& [& }0 \9 _0 c+ R5 R3 A2 z' u. N其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。
. w. D/ P0 M2 |5 o8 B/ y修改的时候,应该还要修改到上层调用的其他函数。) {/ K) R, }7 f/ _& J. y
  1. BOOL __cdecl sub_4518C0(HDC hdc)
    9 a8 e6 @( E; J% o) f4 o9 O/ G7 q
  2. {1 O9 E  ?* t4 e. N# O$ d
  3.   HFONT h; // [esp+4h] [ebp-8h]
    # {5 O8 Y# Z/ ]; B1 v
  4.   DWORD iCharSet; // [esp+8h] [ebp-4h]0 @4 F, [3 [# h+ ?

  5. : i% H: M+ x. ]' Q9 t7 b4 O
  6.   if ( dword_4A4490 <= 1252 )2 X$ l0 ~- r* N3 h& f
  7.   {3 ~5 Y! C2 M3 g( x0 m3 O
  8.     if ( dword_4A4490 == 1252 )3 x; P0 Y5 D! p0 t
  9.     {
    3 i" b) I5 @1 A/ c- w
  10.       iCharSet = 1;, h) |# Z( Z' e& |: T
  11.       goto LABEL_11;6 ~+ P# e4 q& K3 o) D" c0 W
  12.     }
    - P' B7 F) I& |
  13.     if ( dword_4A4490 != 1250 )
    * ]5 T4 L3 [- Z3 R2 X, M
  14.     {  g2 {/ p1 y. Z4 @, i# D
  15.       if ( dword_4A4490 == 1251 )
    : Y% e4 }4 r2 ]6 w3 e$ A" p" M8 B; @
  16.       {
    5 u& s, f4 A! X7 ?
  17.         iCharSet = 204;- A, [3 }/ a6 V7 }
  18.         goto LABEL_11;9 J0 y' f  X% Z! ?4 X6 b
  19.       }
    # k3 `( X! b2 N& `3 u
  20.       goto LABEL_10;. ~$ Y! V4 z4 Z; F3 V
  21.     }
    3 T" T2 S" K0 [6 T7 \
  22. LABEL_7:$ Z8 V5 s+ Z5 S6 X' j
  23.     iCharSet = 238;
      Q: A( I# Z! C! i8 ?& S
  24.     goto LABEL_11;+ M7 J) C; w- s$ M9 Y5 S" o
  25.   }
    7 f2 ^$ n" \# e; u
  26.   if ( dword_4A4490 == 11250 )
    - D+ m  K6 S# j
  27.     goto LABEL_7;  b$ `! U7 ~  D  ^8 u# x8 m" p
  28. LABEL_10:- U2 E, \4 O$ \) A
  29.   iCharSet = 1;$ G0 |2 |+ n4 \- u) d5 b- p5 x. W$ C
  30. LABEL_11:! ]8 w% s! x3 f7 i+ D: B
  31.   base = glGenLists(256);
      {( }3 }5 m% V0 f4 d/ z( p4 [
  32.   h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);( b6 T0 Q* m5 n
  33.   if ( !h )' O% e7 e% o% l, H( L
  34.     MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
    - G# e- D/ e! l. }% B3 b/ `
  35.   SelectObject(hdc, h);) }1 s% d$ s( r; \+ L
  36.   return wglUseFontBitmapsA(hdc, 0, 0x100u, base);  K: r; b& m& x( \1 r
  37. }
复制代码

+ a3 v' F( c7 b8 G2 k. x6 y
3 `. @) g* T& g6 VglCallLists调用的地方共有3处,, |/ P0 b# d+ j. a) l- q8 c6 t7 [, s
这个函数就是游戏的显示函数,共有3个参数,
& ]9 z8 L- v8 a4 K- ]- c7 Q% o
  1. void WINAPI glCallLists(
    ) w( o& ?. N4 a6 p; y; t
  2.     GLsizei n,/ R& }& Q1 N) e" E. K7 v; G: g
  3.     GLenum type,+ a! y; N. F' I
  4.     const GLvoid *lists
    $ y$ T2 {7 ^. i' a2 a, e% w- @
  5. );
复制代码

7 n" p$ C# q% X3 @2 l0 o
& i4 r1 j- w" _1 k* g  G! Q9 p  其中n为字符串长度,type为字符串类型,*lists为字符串指针,
7 G- w/ o9 T% S8 G  如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:' ^# s. P6 B7 _  U  @
  需要修改为GL_UNSIGNED_SHORT,即0x1403。" Z! K4 E7 l: V: F8 p, T6 P# b

) J: b9 C. e6 L$ w3 x+ v定义
' v& \) ?" l* [4 h5 k
  1. #define GL_BYTE                           0x1400) I1 }" P( ]/ P/ p
  2. #define GL_UNSIGNED_BYTE                  0x1401
    9 y: p! n8 }1 K# G- }2 T5 B: t
  3. #define GL_SHORT                          0x1402
    $ t  a: }; B- x, Z  A
  4. #define GL_UNSIGNED_SHORT                 0x1403+ |" Y. q8 f, ]4 z& F% @
  5. #define GL_INT                            0x1404
    ! }/ j+ s0 ?& i9 C: C# o
  6. #define GL_UNSIGNED_INT                   0x1405
    " M4 b3 n$ ?$ j5 E* o
  7. #define GL_FLOAT                          0x1406
      X0 p; u) [" Z$ I, \
  8. #define GL_2_BYTES                        0x1407) o% J) E2 R8 s, h% _$ Z+ e
  9. #define GL_3_BYTES                        0x1408
    ) P7 r1 E( |$ _. C& @: }
  10. #define GL_4_BYTES                        0x1409
    0 e/ V7 x0 l9 \4 ?: N
  11. #define GL_DOUBLE                         0x140A
复制代码
3 H0 M; S4 p- e, q& G8 l
5 x$ Y- _: @% e: I$ ^( {
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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