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

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

[复制链接]
查看: 419|回复: 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 编辑 / x$ \# u9 t/ i4 e

, a6 S! K9 x& \/ F4 |& F这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,; E' M$ p0 j6 N! l: r
但目前已经有了英文补丁,因此汉化又被提上日程。- \0 T4 B0 U4 H& I: }8 [

$ W1 P  `# U0 X+ f  O; {对opengl的调用主要是在toh.exe完成的,, @$ ]0 M8 z' l- t; |
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
7 C/ O+ O" _' H8 R$ ]9 _+ u2 Z7 v
0 U/ d$ e& j  Q, dglGenLists的调用处共有6处,每处都类似,
/ q, p7 M# o) r" ?可见游戏初始化了6种字体,每种有256个字符。* ?+ C" A+ c, g1 u
其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。: i$ w& B: D0 x' K' m4 Z, N
修改的时候,应该还要修改到上层调用的其他函数。3 e6 I# P9 Z) @" B: ~: Q( V' z, q
  1. BOOL __cdecl sub_4518C0(HDC hdc)
    * t6 _. K% u6 v% H/ O+ R, S  F
  2. {
    ; M2 U6 {& j& `) h3 N+ p
  3.   HFONT h; // [esp+4h] [ebp-8h]
    & y+ ]+ S1 r; {/ Y; Q3 X
  4.   DWORD iCharSet; // [esp+8h] [ebp-4h]& f+ a5 U8 p! U' A2 Y
  5. 8 b. N$ l# }) V( l( \2 z* G: ]2 x
  6.   if ( dword_4A4490 <= 1252 )
    , i; R- S3 @' p0 K" M
  7.   {
    / u, ^$ c2 f9 }8 T/ k
  8.     if ( dword_4A4490 == 1252 )
    " ?! s2 v- {" S
  9.     {( d# i1 I6 }! ~# C/ ]' x4 W
  10.       iCharSet = 1;! g$ H9 y  O5 E  j! W& j
  11.       goto LABEL_11;
    ' s$ V- P: b4 j0 _. ^  n4 `, L
  12.     }0 ]( F& h# [- D' c9 {% R. Z
  13.     if ( dword_4A4490 != 1250 )$ n4 q  Q& R( B6 E
  14.     {
    6 a+ s. Q$ z' R" C
  15.       if ( dword_4A4490 == 1251 )
    / k) {: u: C- ]2 c' J/ q3 W
  16.       {
    ; v5 {; M) H# o6 S& K/ g/ g
  17.         iCharSet = 204;  g7 X9 u& p3 I% k& v: g
  18.         goto LABEL_11;; r. p3 s9 ?) Y# e! L, Q' y; d
  19.       }' M4 b5 Z9 |3 ]4 Z  Z
  20.       goto LABEL_10;
    % y# s6 ]4 x# o' c
  21.     }% C  s) h3 X- X6 Y# L$ K9 c* }$ S5 w# a
  22. LABEL_7:
    1 ?5 m1 M" L) [0 v3 C3 H1 c
  23.     iCharSet = 238;
    6 k" C: h$ X/ E
  24.     goto LABEL_11;
    ' X: |% |% e. ?' y* X
  25.   }
    + U- Y  S6 a% ?
  26.   if ( dword_4A4490 == 11250 )
    : |8 A2 I* D, v( r7 C
  27.     goto LABEL_7;% y( `; [! G4 a
  28. LABEL_10:& |# |7 g5 @- u2 _3 E6 q- k
  29.   iCharSet = 1;
    * `) P; C7 \2 }% V
  30. LABEL_11:# `: t6 P1 l! m( M. l9 s" t
  31.   base = glGenLists(256);. y/ B' C  m3 i( t
  32.   h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);
    ) e% w- c4 m% z( ?- R; Q: I" F
  33.   if ( !h )
    7 c- N8 b) u9 C
  34.     MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);$ G' m9 a6 B+ r5 T
  35.   SelectObject(hdc, h);8 a# l# H! ]; Z
  36.   return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
      U4 A0 }* j( ~
  37. }
复制代码

( {8 _/ f6 P/ M) w$ C4 k3 k/ a* ^& y, k2 p; A9 p: s1 x- g
glCallLists调用的地方共有3处,' P# q* z/ T6 Y/ k) e3 ^
这个函数就是游戏的显示函数,共有3个参数,
6 Q! u) q/ J7 ^4 E6 H
  1. void WINAPI glCallLists(
    $ C$ q- P* ^. \* [' p
  2.     GLsizei n,- a$ y) o3 C2 U6 ]0 S$ p+ [
  3.     GLenum type,( i: F9 \. [, ~& _+ ]0 u2 ~
  4.     const GLvoid *lists
    0 c8 A! q8 d" N
  5. );
复制代码
% d, x$ l4 o4 K. z1 J

0 ?0 C( y) K+ x# f6 s- z% _- w  其中n为字符串长度,type为字符串类型,*lists为字符串指针,
  ]/ W6 d5 z, X5 |9 v  如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:
' B9 S, ^: X3 M) U5 O2 L3 ]  需要修改为GL_UNSIGNED_SHORT,即0x1403。% E4 P) K$ h# a# T- F

! r8 a9 m* i- M/ k6 f) S定义
& c  T/ c& z( W- _$ _8 S
  1. #define GL_BYTE                           0x14009 L' T5 f  j  v- Z( w. |4 r
  2. #define GL_UNSIGNED_BYTE                  0x1401
    2 |$ O  A( T9 p: G- S
  3. #define GL_SHORT                          0x1402/ z. o1 D8 G; w$ Y/ D6 K# }
  4. #define GL_UNSIGNED_SHORT                 0x14036 M( e. q7 l  A% K# S3 q
  5. #define GL_INT                            0x1404
    # x; t0 j8 m# ^6 t
  6. #define GL_UNSIGNED_INT                   0x14059 Y' n: ?( q/ w( @7 o& @2 t
  7. #define GL_FLOAT                          0x1406
    4 X/ M8 b1 G5 U4 ]+ B( _0 h
  8. #define GL_2_BYTES                        0x1407
    6 R7 f2 _; ^3 [% n: c( W# ], a
  9. #define GL_3_BYTES                        0x1408! @5 j; w8 _% `% Q5 Q2 Z3 \7 p1 |: m
  10. #define GL_4_BYTES                        0x14096 A  P( \( S2 o
  11. #define GL_DOUBLE                         0x140A
复制代码

5 u# S2 @% s8 `# t
: G; L2 l4 d" p7 ^) n7 F' j- Q
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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