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

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

  [复制链接]
查看: 808|回复: 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 编辑 9 P' g7 u, D% I1 j
3 r4 ^5 R: E( p
这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,
0 S" R7 e, Q  n! m4 [但目前已经有了英文补丁,因此汉化又被提上日程。. V  H  P1 }; v5 D5 A. i
7 M/ \1 {8 X" M& Q. R! m( u. P
对opengl的调用主要是在toh.exe完成的,
, l1 O2 s1 d+ d3 ?9 K对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数$ u+ `2 {3 u: V

7 }# m( U  _' |' HglGenLists的调用处共有6处,每处都类似,) |( T" c$ M* D
可见游戏初始化了6种字体,每种有256个字符。1 K; E0 n' Q: M, ^& p! M! O( U
其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。( H/ i; p8 S$ Y, S$ r9 {3 N- X6 l
修改的时候,应该还要修改到上层调用的其他函数。
$ t8 c  [, Q2 Y* A7 J' r# B7 V
  1. BOOL __cdecl sub_4518C0(HDC hdc)
    0 v4 F3 ~/ I, ?
  2. {. _- F; M, U4 f0 f  Q% I4 A# {
  3.   HFONT h; // [esp+4h] [ebp-8h]
    ; g7 k, G/ N$ C" i/ |
  4.   DWORD iCharSet; // [esp+8h] [ebp-4h]% j- v. r# m. j# J
  5. ' Y4 @) a) o& x, X
  6.   if ( dword_4A4490 <= 1252 )
    6 R( [: Z" l1 F5 f9 J& r. }
  7.   {
    - f# V' G; g' w1 v3 o5 N
  8.     if ( dword_4A4490 == 1252 )
    1 e! S" ^, m9 X7 R* h" E
  9.     {3 p# I8 K* G+ ^$ c8 H
  10.       iCharSet = 1;
    . [7 ]. @7 ~& D  S: M, w' V
  11.       goto LABEL_11;
    1 O! k4 c, y0 p8 h% U+ I: M
  12.     }
    / ^% Z: O7 D3 b+ c/ M& n  _7 A
  13.     if ( dword_4A4490 != 1250 )
    & E: }; p/ u) [" \
  14.     {
    ! u8 M8 {- `9 m8 M1 \5 {( o" o5 X
  15.       if ( dword_4A4490 == 1251 )0 a, q7 p( C4 S) M0 I1 h
  16.       {
    ! W$ Y, G: H1 ~" \; L. W+ Y
  17.         iCharSet = 204;7 R" H+ t: U6 d1 B% J
  18.         goto LABEL_11;: U: l7 _2 }/ \8 j6 E1 \+ f, @
  19.       }3 {4 E% _4 R9 ~9 ]5 s% [
  20.       goto LABEL_10;6 }, g2 p# E5 p
  21.     }
    # J; b8 `" o- X; X
  22. LABEL_7:; p- W+ e9 U0 C0 o
  23.     iCharSet = 238;
    % d- X9 C! b/ |5 d; @
  24.     goto LABEL_11;2 `  J0 g5 }/ h3 w% {1 |* r1 e
  25.   }0 |( ^- \1 Q: z/ k( G
  26.   if ( dword_4A4490 == 11250 )
    6 F3 W7 L. o5 ]& E+ u! o% `
  27.     goto LABEL_7;: U: e0 ^; A$ U
  28. LABEL_10:
    2 |5 y8 Z8 b  h# t+ C
  29.   iCharSet = 1;
      m, {4 P* b5 L6 i9 i$ W2 g% ]* {
  30. LABEL_11:
    " z4 [/ O( [- o( C
  31.   base = glGenLists(256);
    : m% S# \3 t& r. z) C, Y8 q$ [
  32.   h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);2 K# {4 I# d' L2 e1 g  f% T& F( j
  33.   if ( !h )
    # q% n- D( ^3 [. L
  34.     MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);3 U* S: X3 n8 `4 ]$ O
  35.   SelectObject(hdc, h);
    2 z/ j' c" A4 q, j
  36.   return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
    / Q. |/ }" _1 Q# |$ O
  37. }
复制代码
: y; ^; \, O! `5 l1 A9 @4 Y
% j3 U  P% i! \( u; a
glCallLists调用的地方共有3处,# b) m! q# q) B6 {, g
这个函数就是游戏的显示函数,共有3个参数,% [2 d% t$ N8 S; L2 G. I$ i
  1. void WINAPI glCallLists(
    $ o+ H- U% a) \6 q6 G
  2.     GLsizei n,
    4 M% O0 e8 p, @
  3.     GLenum type,6 K4 L$ ?8 F/ t1 }" E9 n3 U) O
  4.     const GLvoid *lists: p; h" Q, ?0 G5 D
  5. );
复制代码
! L& S9 B# \4 r- y& g

3 t; X. b# I, [  其中n为字符串长度,type为字符串类型,*lists为字符串指针,; |2 T" y! w$ ?" Y" L
  如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:
9 B. i+ \9 f0 c% e' }# ]  需要修改为GL_UNSIGNED_SHORT,即0x1403。
5 K1 [9 f$ X6 c% n& O. G; v
+ V2 `: E# Z2 E( k3 z( Z: N定义
- P' \  q. D5 N. j- r
  1. #define GL_BYTE                           0x1400
    : h5 g6 A" O: B2 k2 Q
  2. #define GL_UNSIGNED_BYTE                  0x14010 b, d& }9 Q' N% b- O4 |
  3. #define GL_SHORT                          0x1402, m# h: R, `- ?
  4. #define GL_UNSIGNED_SHORT                 0x1403
    & q% N. z7 s& r- n0 l4 ?
  5. #define GL_INT                            0x14046 w9 ?7 i) }$ F  P+ U4 r, l# ?
  6. #define GL_UNSIGNED_INT                   0x1405
    ! a  A3 Q/ M  `$ ]
  7. #define GL_FLOAT                          0x14062 |/ ~% D; g% G0 |8 H& t) W% c
  8. #define GL_2_BYTES                        0x1407# u" w' o0 `4 E) p3 `2 S
  9. #define GL_3_BYTES                        0x1408
    $ m" z, S9 Y/ N) d6 G
  10. #define GL_4_BYTES                        0x1409
    ) e+ G7 ~: w: I% F
  11. #define GL_DOUBLE                         0x140A
复制代码

6 H( Q! ^- |7 F; Q6 _% z( u' a9 f' y. ~7 q! J% e" L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好1 很差劲很差劲
回复

使用道具 举报

沙发
 楼主| 发表于 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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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