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

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

[复制链接]
查看: 448|回复: 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, p7 {2 T. V# d% I
5 E# [" v8 k1 v/ k这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,( I8 M$ s: [& g: o
但目前已经有了英文补丁,因此汉化又被提上日程。3 L8 L" t& ~. x% X* o
! \6 J' ]; W) L$ t; ]
对opengl的调用主要是在toh.exe完成的,
3 H, h( K6 v: `; ^6 k- L$ }4 R对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
9 O  N/ a7 g6 K0 V/ Y/ g
3 T" E/ j/ H3 |1 X# t8 t; y- rglGenLists的调用处共有6处,每处都类似,+ L- k6 Q8 r9 u, f  D
可见游戏初始化了6种字体,每种有256个字符。5 Q2 j) y! e- ~0 }6 Q+ Q3 V
其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。, P5 M2 _8 ?" K, ]1 P+ a
修改的时候,应该还要修改到上层调用的其他函数。
- }/ U$ F# X% E
  1. BOOL __cdecl sub_4518C0(HDC hdc). m: [  W) a' ]/ _# j, H
  2. {
    + d0 j6 @# B" L& h4 Y6 z
  3.   HFONT h; // [esp+4h] [ebp-8h]
    5 N7 A$ [& O- N* g1 M% E
  4.   DWORD iCharSet; // [esp+8h] [ebp-4h]
    ' v* m3 g% n5 X4 n* s

  5. . v2 G2 L+ x; o, r( W$ ?
  6.   if ( dword_4A4490 <= 1252 )# J4 j4 g( _2 g0 n. D
  7.   {$ M, G9 j; Q: l! M" p
  8.     if ( dword_4A4490 == 1252 )
    ' B2 S+ O* b, H! w' a
  9.     {( W4 R1 S0 T% |3 G+ S
  10.       iCharSet = 1;. n; J3 a7 o! R) v8 K
  11.       goto LABEL_11;  J5 e  c3 ^7 D8 C+ M
  12.     }
    6 p) K* m! Q8 n3 U0 n, \
  13.     if ( dword_4A4490 != 1250 )5 @2 l# z6 [: y4 b7 q' K2 U
  14.     {
    ; R# Y, N: e1 f; ^
  15.       if ( dword_4A4490 == 1251 )
    0 s1 I; h/ l3 c. n( g# w! f; k; b: v
  16.       {
    $ \) w; y0 a- A5 [; K( r$ f- Y8 `! S
  17.         iCharSet = 204;
    5 s  _4 P9 Q* e' H1 X3 L$ r- i" j
  18.         goto LABEL_11;5 p7 s( G1 \9 N! t1 E: k
  19.       }+ K! N- Q8 O/ ?0 w
  20.       goto LABEL_10;4 ]: ?  q$ @) {
  21.     }3 |  K$ q) ?6 C2 c  I+ c. F
  22. LABEL_7:, ^- A8 h. b- K1 }3 z
  23.     iCharSet = 238;" k, r1 B& D1 I4 I( G1 J
  24.     goto LABEL_11;
    / Q: b( S! [2 _: Z' n; a
  25.   }) m2 ^: F3 _! j4 {
  26.   if ( dword_4A4490 == 11250 )
    * v6 R! w5 m* K$ v3 G
  27.     goto LABEL_7;
    1 a+ ^0 F. E, H. H
  28. LABEL_10:$ h6 U! N1 [2 T  b$ V  B
  29.   iCharSet = 1;
    ! g. _# z) j9 h# H7 r5 n! r
  30. LABEL_11:' N1 {/ ~! W6 x* e4 o
  31.   base = glGenLists(256);3 U- V) i9 d3 G0 J& E
  32.   h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);( V8 t( w% \  i4 \/ u+ `  J! p
  33.   if ( !h )* \; _0 a; @; P  ]4 ^* g
  34.     MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);$ p, V" R" c( d" i9 q( F. K9 o( F
  35.   SelectObject(hdc, h);
    3 _, d: h8 |+ V! {/ q1 z
  36.   return wglUseFontBitmapsA(hdc, 0, 0x100u, base);) v. j6 Z9 S8 A) r& q7 h' h+ X
  37. }
复制代码

, F# f' R: b$ Z& B0 Y. ^
( I9 y! ^. E" ^- a* CglCallLists调用的地方共有3处,: N7 |- t! w' K0 C6 O" x
这个函数就是游戏的显示函数,共有3个参数,/ T- z' q# m1 ~+ c) \7 y; U
  1. void WINAPI glCallLists(
    2 Q: Z- R8 W& {6 _
  2.     GLsizei n,1 Q2 g# v2 ^" Y3 y
  3.     GLenum type,2 e6 F( ^) J0 N
  4.     const GLvoid *lists
    ; G0 \5 p/ B$ s" M- U) \
  5. );
复制代码

* b7 c7 a" M, ~( m& E$ S6 `& `- a
2 `. o' v& Q$ [6 ~; ?  其中n为字符串长度,type为字符串类型,*lists为字符串指针,3 [( _+ o' ?6 G4 l* E5 |  t2 D
  如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:
0 Z- i+ i3 C! V7 B7 A  需要修改为GL_UNSIGNED_SHORT,即0x1403。* o5 [2 g; d6 H! K+ V! s

3 S1 t5 k0 Y! w3 B* F定义
! N' P( S) R* A' W
  1. #define GL_BYTE                           0x1400) ^8 L/ A1 p6 r8 V( U
  2. #define GL_UNSIGNED_BYTE                  0x1401
    8 A8 }& y0 H; |2 t) `) I
  3. #define GL_SHORT                          0x1402- a. U4 e( m$ H3 J. O) R: o
  4. #define GL_UNSIGNED_SHORT                 0x1403
    2 y  s4 b3 Y$ j/ J4 W
  5. #define GL_INT                            0x14046 P! w$ q2 ]" H6 h, p; ]/ z( R4 C
  6. #define GL_UNSIGNED_INT                   0x1405
    3 z/ H. C& i! W% U7 c
  7. #define GL_FLOAT                          0x1406
      F1 B# v4 U( G! `! B
  8. #define GL_2_BYTES                        0x1407
      g7 g  s  b4 L
  9. #define GL_3_BYTES                        0x14083 `0 e, [% E8 d) {* s; d. i! L
  10. #define GL_4_BYTES                        0x1409: i4 j+ {. A2 A; T5 A
  11. #define GL_DOUBLE                         0x140A
复制代码
. S, \% C0 c2 K" z2 I

, ?6 r0 i% i! T/ L1 h, ^- U
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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