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

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

[复制链接]
查看: 355|回复: 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 编辑
  G8 W. E# X0 b& C, ~4 T; y0 e# s3 ^0 \  F2 K. d* Y9 d1 d
这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,; [' a* \5 p8 h) d2 H$ j7 m- t
但目前已经有了英文补丁,因此汉化又被提上日程。0 L7 y: Y2 R/ f/ r* f4 Q: H6 o

7 V% U( _! N/ |% N5 M) F对opengl的调用主要是在toh.exe完成的,# {. b& [0 D$ ^8 ?7 x) L6 u
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
- V5 a; ?& l8 Z/ d  }, k7 v. J! m$ @
glGenLists的调用处共有6处,每处都类似,( m2 s9 O7 B' b0 w
可见游戏初始化了6种字体,每种有256个字符。
4 P: J: Q8 Q0 v+ R其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。4 K$ j3 F( q- D& X9 y: j
修改的时候,应该还要修改到上层调用的其他函数。
8 ?* T, s+ N6 H/ }6 E
  1. BOOL __cdecl sub_4518C0(HDC hdc)4 Y+ a0 U! d- |6 g$ t) L# T
  2. {
    - l3 p2 Y3 x7 X
  3.   HFONT h; // [esp+4h] [ebp-8h]
    9 q7 r5 y' J3 b: s; w
  4.   DWORD iCharSet; // [esp+8h] [ebp-4h]( {2 `! e0 j4 d9 y' p7 A9 s
  5. 5 S4 L2 W5 q( i; n& @( U9 t
  6.   if ( dword_4A4490 <= 1252 )% W  w( B# f+ {
  7.   {, D# L' h1 l; G  ~' \
  8.     if ( dword_4A4490 == 1252 )
    1 a% K8 g- r6 x- H
  9.     {
    $ s$ o3 j1 J. G2 i3 F' `
  10.       iCharSet = 1;: c5 |4 _; q) p, y1 J
  11.       goto LABEL_11;
    ) H( S* `; B6 g- m
  12.     }
    4 \2 O  |0 y4 W# q% V$ ]
  13.     if ( dword_4A4490 != 1250 )
    2 a2 o+ n3 U5 f: u# y' Y
  14.     {1 S! c8 Q' b* r+ s0 g/ ~9 z6 t
  15.       if ( dword_4A4490 == 1251 )7 w# C- C# @* S5 d8 P
  16.       {
    1 `6 e3 x5 U2 d7 \+ I" o
  17.         iCharSet = 204;- |* U9 h* d7 X; e7 Y: T
  18.         goto LABEL_11;# }* ^6 q8 f' u7 q/ S
  19.       }
    , J- P+ y2 s4 a$ ?' c/ \  e
  20.       goto LABEL_10;
    : k. P1 h; I4 a# `1 w( ~
  21.     }8 n$ L. ^3 _7 b
  22. LABEL_7:
      l; {1 R* I$ H
  23.     iCharSet = 238;7 a9 F5 V3 U5 d  k& M
  24.     goto LABEL_11;
    5 p$ [+ r- f1 e1 Y
  25.   }' ]/ N# G: n( R" q' j# N1 u
  26.   if ( dword_4A4490 == 11250 )' w5 j0 z% `! [: J' ?
  27.     goto LABEL_7;
    8 j( g7 s/ j* d. j& _: C
  28. LABEL_10:/ v& c. h, ^# `$ J
  29.   iCharSet = 1;1 B4 d& C& S) F) g
  30. LABEL_11:( Q6 b* A' B8 w* [$ b
  31.   base = glGenLists(256);
    6 i( S( o( J# e9 x
  32.   h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);
    / v; Z1 K8 Q  a1 z( C
  33.   if ( !h )- l7 I7 J8 E1 e$ a' V, |) R
  34.     MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
    - ^9 P6 M9 y0 X2 ~
  35.   SelectObject(hdc, h);" j- C4 P2 Q% y+ N
  36.   return wglUseFontBitmapsA(hdc, 0, 0x100u, base);" j- S, J; A: K- `5 |$ Y/ ~. @
  37. }
复制代码
/ F$ E' d1 T% \  z2 g

+ d* R9 q2 G- |; ?! \( A( eglCallLists调用的地方共有3处,4 r; N. B& B! ^8 ]7 T
这个函数就是游戏的显示函数,共有3个参数,; }' `0 L% i$ Q; h0 E
  1. void WINAPI glCallLists(
    0 W4 g7 @9 B5 d5 `
  2.     GLsizei n,  y, \. |  R: h
  3.     GLenum type,
    ; d$ M1 ]$ d0 f1 u# @5 d
  4.     const GLvoid *lists
    1 v/ L% @. \+ h8 {
  5. );
复制代码

/ I9 I  m. J  b9 T
, [4 r( u! k+ T/ D( S  其中n为字符串长度,type为字符串类型,*lists为字符串指针,4 {9 P, h+ e! F/ A) \
  如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:8 v9 b, w: o) U" Y6 l( ^) s
  需要修改为GL_UNSIGNED_SHORT,即0x1403。
' D8 q7 J, j1 r8 F. N8 R
/ v2 y6 r" w& v% H: ~% d定义: ^3 M4 ~# F4 [8 ?8 ?8 S$ S7 `
  1. #define GL_BYTE                           0x1400" a! q: X$ {' ?
  2. #define GL_UNSIGNED_BYTE                  0x1401: y. p' L  x& O0 y# o8 X* u
  3. #define GL_SHORT                          0x1402! W/ P0 w" T# j8 O6 I& R: V
  4. #define GL_UNSIGNED_SHORT                 0x1403
    ( d" ^0 g- |$ \+ `% [: K5 t
  5. #define GL_INT                            0x1404* Q( B4 g1 E4 V* }
  6. #define GL_UNSIGNED_INT                   0x1405% b3 e0 K2 d8 u; G+ e, A  _
  7. #define GL_FLOAT                          0x1406. W) ^' h7 E6 ~+ V& Q8 Q+ Z
  8. #define GL_2_BYTES                        0x1407& P# b. J/ ]: U3 X2 M- N( n+ e
  9. #define GL_3_BYTES                        0x1408
    ' M% O! H! v& g! t; F/ D1 i
  10. #define GL_4_BYTES                        0x1409" j1 G4 `4 A+ ]5 f# W- K( K
  11. #define GL_DOUBLE                         0x140A
复制代码
; m0 R1 H8 @; k; r

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

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