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

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

[复制链接]
查看: 636|回复: 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 编辑
6 W. l, G& i; m' q% b7 n1 r2 k, i
这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,
$ }8 C5 ^* Q; f/ w1 u3 r7 Y7 q4 t7 ?但目前已经有了英文补丁,因此汉化又被提上日程。
& S1 T1 p- C1 \5 G1 g7 U+ c% h, t& a% [
对opengl的调用主要是在toh.exe完成的,
3 h0 b3 g) O( f' B+ l对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数3 F) i8 ^: n: u
+ K& ?7 y( |5 n9 G* d
glGenLists的调用处共有6处,每处都类似,
6 P6 [: h! |3 q" \% }0 F可见游戏初始化了6种字体,每种有256个字符。
9 e( \- P* E4 q% F5 h7 W其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。" {) o0 r0 Q& z7 ]
修改的时候,应该还要修改到上层调用的其他函数。( y: Q. X  {- h4 m" c( z
  1. BOOL __cdecl sub_4518C0(HDC hdc)
    0 O" R  p# {1 u
  2. {8 g) E3 O. A/ }* V& I* ]: _
  3.   HFONT h; // [esp+4h] [ebp-8h]
    : _! G$ N  W( J" r9 R! r
  4.   DWORD iCharSet; // [esp+8h] [ebp-4h]5 W# \: K5 ~& T; E
  5. # o3 y% r% a  r: L' _
  6.   if ( dword_4A4490 <= 1252 )8 r5 S- N6 G8 x; y3 H, U
  7.   {( Q0 Q; _  N) G0 d2 b) X7 t
  8.     if ( dword_4A4490 == 1252 )3 p+ f7 b0 f2 e' a7 B
  9.     {% B" M; u( b+ v% M6 J6 [/ L0 j
  10.       iCharSet = 1;$ e" M" W+ |$ K0 O# s/ J# ~0 S
  11.       goto LABEL_11;
    6 }+ u: K' Z" v/ @) }" z
  12.     }
    3 y4 L- o* J  R+ ?
  13.     if ( dword_4A4490 != 1250 )
    * X9 u0 k( h1 W: ]/ w" a# e$ ^. r% t
  14.     {! U6 a7 @$ T5 w
  15.       if ( dword_4A4490 == 1251 )  V8 b, e, k7 ?# t1 W
  16.       {. k" c7 v! C3 D+ o
  17.         iCharSet = 204;* n8 ^) c5 x* u! K
  18.         goto LABEL_11;
    9 ^3 Q5 o+ d& B/ y) X
  19.       }
    8 ]# a9 z1 q' g  {$ H
  20.       goto LABEL_10;
    6 q% \3 V& R8 m- N- N( N3 G/ h
  21.     }8 L% R9 \( B! t* M2 j- B1 J
  22. LABEL_7:$ K" w% S# r7 G$ M  x6 l4 z
  23.     iCharSet = 238;1 `! x# N6 V( r
  24.     goto LABEL_11;
    5 @5 S0 R6 O2 U& Q) D) x
  25.   }* l6 k( y7 @- D% \7 W" b% u
  26.   if ( dword_4A4490 == 11250 )
    % [. w5 v7 Z8 f( A% \/ `& b
  27.     goto LABEL_7;; K1 T7 |  q6 |2 g6 H# \6 Y$ N
  28. LABEL_10:
    ! e1 i8 r7 R0 }! y  l5 D1 b
  29.   iCharSet = 1;: c, B" X5 M* M1 A  P" n
  30. LABEL_11:
    ! A9 M" X' v) f+ ^7 C' ]
  31.   base = glGenLists(256);
    6 ]$ h7 w3 L! c, _6 Q
  32.   h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);1 J) |7 n. ~# K! W! o4 b. c
  33.   if ( !h )# e6 l! j" h# y. m$ o
  34.     MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
    8 H0 u, T" D2 @% `3 Z9 p. S7 Q# V
  35.   SelectObject(hdc, h);; o2 k1 B! L  U
  36.   return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
    , T$ [' S5 u( z
  37. }
复制代码
4 S3 ]1 Q4 x  S

- w! k) I3 D1 J8 ~glCallLists调用的地方共有3处,% s' e% s9 ~+ Q8 p. t
这个函数就是游戏的显示函数,共有3个参数,
. ~2 c5 \) t2 b+ D
  1. void WINAPI glCallLists(4 ^+ J/ u1 i$ S" l
  2.     GLsizei n,
    6 t/ O. |9 T# H% L$ @" I
  3.     GLenum type,) T& ^2 t* c, M
  4.     const GLvoid *lists: W( ~' t3 f% h% K$ g: Z5 i
  5. );
复制代码
  i' t2 ~% u/ S) G
: H3 F- |1 u7 B: M% X5 ]
  其中n为字符串长度,type为字符串类型,*lists为字符串指针,6 ?9 ]7 L; X! c5 q0 o3 t
  如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:+ |' P( p% _! E, Q
  需要修改为GL_UNSIGNED_SHORT,即0x1403。/ ~- P7 w) G$ b& c
! k+ D$ v! z- l$ o
定义! Z- y3 d* u1 w& z8 |2 e
  1. #define GL_BYTE                           0x1400
    * d+ Q: a- \. l
  2. #define GL_UNSIGNED_BYTE                  0x1401# x) W9 a% y1 V0 E9 r$ j5 p
  3. #define GL_SHORT                          0x1402# Z1 ?" p0 j" {( Q3 N0 j7 A8 |
  4. #define GL_UNSIGNED_SHORT                 0x1403
    ; b4 C5 b, e0 W
  5. #define GL_INT                            0x1404
    ' z* X+ {. k  c
  6. #define GL_UNSIGNED_INT                   0x1405
    ' n% y# k  ^- ]( e9 v) r
  7. #define GL_FLOAT                          0x1406
    , f" o9 T, L. ?2 [$ w  h2 o
  8. #define GL_2_BYTES                        0x1407
    - k7 `  z  p" @! A$ H  K
  9. #define GL_3_BYTES                        0x1408
    6 Y( k7 f' F2 T
  10. #define GL_4_BYTES                        0x1409
    + y% r) J, I3 d
  11. #define GL_DOUBLE                         0x140A
复制代码

; ]) ^$ w+ H) s- ~
& u4 P3 V  p  Y" A7 D; c+ R
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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