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

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

[复制链接]
查看: 634|回复: 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 编辑 7 F2 H$ f& h" t7 H" }' c2 t6 I

3 g9 b% m7 Y% c- v0 _这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,
7 M: n8 J! `  ]. V# f: t. ]- |& M但目前已经有了英文补丁,因此汉化又被提上日程。
. l, z. B8 {; O3 ^# [) U3 A5 Q0 J2 |- t
对opengl的调用主要是在toh.exe完成的,7 |4 U. U/ X& H  V! F/ e" h
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
3 r; C4 }/ P/ o" v+ t- f* B& Z/ R# A) n. r1 n
glGenLists的调用处共有6处,每处都类似,4 X" m# n: |( U0 {: m; Y
可见游戏初始化了6种字体,每种有256个字符。
; [/ v$ i: z  ~' [& K, H: l% i其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。
3 w+ F% i2 O( Z" Q3 J9 x7 c+ W* d! O修改的时候,应该还要修改到上层调用的其他函数。
1 _, Y; x6 ]9 V! Y
  1. BOOL __cdecl sub_4518C0(HDC hdc)! L( W' Z8 n9 I8 a- ~
  2. {1 Z8 L. K9 ?* h  G
  3.   HFONT h; // [esp+4h] [ebp-8h]  t: M! C; Q' ^9 B" r( c+ U) I
  4.   DWORD iCharSet; // [esp+8h] [ebp-4h]
    ) M8 L; @3 J. K

  5.   t, ], \/ B( d% y  {! C# s
  6.   if ( dword_4A4490 <= 1252 )
    / S; v: g" g' `, S) V) j
  7.   {% U; N& S9 C0 |6 ]& V; q( r
  8.     if ( dword_4A4490 == 1252 ), ^2 A" P, ^. h  l3 V
  9.     {- k8 D- \2 K- F+ e
  10.       iCharSet = 1;) K( _0 s$ e, d4 N3 P
  11.       goto LABEL_11;
    5 J" d; c$ G( ?8 o* t
  12.     }
    : U3 ^- H: Z4 V$ H6 h% a
  13.     if ( dword_4A4490 != 1250 )
    - P! G) a3 z6 e: N! Q
  14.     {
    # ^* M1 x+ P) k1 ?5 w
  15.       if ( dword_4A4490 == 1251 )) v- g4 }" u8 u6 F/ U7 F3 M
  16.       {) p& Y3 j" Q, r) ?
  17.         iCharSet = 204;2 f8 p- u6 K7 ]  V$ T+ X( @
  18.         goto LABEL_11;. M6 _5 w9 {# Y" _6 y
  19.       }1 C. m0 C7 |: }. @! g
  20.       goto LABEL_10;
    # D5 F5 w; u+ T+ I# k5 [/ A
  21.     }
    7 m" |# _8 d2 d! ]% i( Z
  22. LABEL_7:
    " P# Q" }2 n+ b2 b$ f4 w, }' o
  23.     iCharSet = 238;" `$ d8 ^; W7 P1 y1 B0 D' L$ p
  24.     goto LABEL_11;
    : r& j/ X) l# P% q" B' m
  25.   }
    - \# b! J* o+ V
  26.   if ( dword_4A4490 == 11250 )
    : ~+ ~, }4 b+ h! i$ _2 x5 {
  27.     goto LABEL_7;
    ( I* T( H- A) F: \
  28. LABEL_10:( g  N( t% C1 h. @; t2 Z- x- q0 ^2 c
  29.   iCharSet = 1;
    6 Y+ V7 l0 [2 }8 G8 F
  30. LABEL_11:6 Z  k' U/ H) [0 L. B
  31.   base = glGenLists(256);
    # r, E3 z) A! U/ X; m' N/ w6 A
  32.   h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);7 j+ y2 ~$ N/ ^- ~# A
  33.   if ( !h )
    7 e; d9 i6 p! Z+ p/ P1 @: ^
  34.     MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);* k, F8 _- ?7 S' C6 V' O, _: d& ^
  35.   SelectObject(hdc, h);
    - Y8 M% a1 N! P1 F3 V) `
  36.   return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
    ! [2 C' K5 B1 r( [
  37. }
复制代码

' A  p  k: ~1 I
, L% c# W- J# d4 S- yglCallLists调用的地方共有3处,
0 u4 W* {* L; v' q2 ]$ }5 Q" q4 Z这个函数就是游戏的显示函数,共有3个参数,
0 q1 n! a* f) F
  1. void WINAPI glCallLists(
    , {" A' B7 r! u- f0 O, P
  2.     GLsizei n,
    & Y8 a, u' q1 j
  3.     GLenum type,8 z7 Y1 A: C; L5 @5 e
  4.     const GLvoid *lists* F7 j8 s' \# L
  5. );
复制代码
# D' z% q) v6 }9 K  x) C9 o' t/ d
/ Q! P0 E9 h; b8 x; O$ w
  其中n为字符串长度,type为字符串类型,*lists为字符串指针,
; X6 j) c2 S6 V  如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:, P5 v3 e8 x7 g3 ^) P
  需要修改为GL_UNSIGNED_SHORT,即0x1403。% y4 p) _3 ?7 E3 V& D
# \" i) J, f$ G( k$ M  U
定义
, O( [  d6 j0 K: }# Z
  1. #define GL_BYTE                           0x1400* z: ?9 F' j  q8 [2 \1 O  \
  2. #define GL_UNSIGNED_BYTE                  0x1401
    / K. D" ?3 |+ A* g
  3. #define GL_SHORT                          0x1402
    , ^% S# O7 \& l! x! R0 U' Y
  4. #define GL_UNSIGNED_SHORT                 0x14037 ~8 O: z# I  f6 F7 V8 [( ?
  5. #define GL_INT                            0x14041 j8 t* U- S1 v  q* F
  6. #define GL_UNSIGNED_INT                   0x1405
    4 @1 m8 i" c1 W- W
  7. #define GL_FLOAT                          0x14067 a* g5 l; E8 h! w
  8. #define GL_2_BYTES                        0x1407: q, p: N, V! t: ~0 \7 W
  9. #define GL_3_BYTES                        0x14083 t" K4 Y; _6 i$ {
  10. #define GL_4_BYTES                        0x1409% a; Y9 ]/ c0 w$ x
  11. #define GL_DOUBLE                         0x140A
复制代码

& n9 X. h4 o* t) A
% X4 e3 D% a9 y  A
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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