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

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

[复制链接]
查看: 363|回复: 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 编辑 5 Y' c$ i. T+ [5 u! U  A( [
4 R5 Q" H% k8 Y! _
这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,& U0 c2 W/ w  K6 S
但目前已经有了英文补丁,因此汉化又被提上日程。
3 ?. `! B6 _1 }
7 ?  {8 l% e* s6 W& W& N3 e对opengl的调用主要是在toh.exe完成的,
$ `8 M2 x( b' w" s; y7 y对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数7 z( Q7 M4 X) t, z5 m+ y

% Z$ b3 S) x/ s9 \3 d1 ]- _glGenLists的调用处共有6处,每处都类似,
  _" ]8 _" b# ?! x可见游戏初始化了6种字体,每种有256个字符。) c) k# F, z: g* c0 K2 x# M/ a
其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。
/ L, a! A: L4 b0 ^) O5 D修改的时候,应该还要修改到上层调用的其他函数。) L4 K/ V8 @% S0 S, G  U
  1. BOOL __cdecl sub_4518C0(HDC hdc)4 {+ T7 C* x! t# _/ V- n5 ~' I8 b
  2. {
    5 O2 g2 l5 P6 l, S3 H# K) W% |( E
  3.   HFONT h; // [esp+4h] [ebp-8h]
    & s7 V7 c2 L/ [( [
  4.   DWORD iCharSet; // [esp+8h] [ebp-4h]
    * Z: P" Y2 r. f& y6 y, B0 p0 Q2 ?5 x0 u

  5. ; F: l2 a: ~/ h: o3 U0 Y' \* @- m
  6.   if ( dword_4A4490 <= 1252 )
    - r; H! I/ t1 b/ _- |' H! c% u- G
  7.   {) N8 E# [' O8 Y+ J. U
  8.     if ( dword_4A4490 == 1252 )# p* z$ M0 k. @9 n4 H
  9.     {) A. {3 ]6 d3 V- x5 z; q( m- G( O
  10.       iCharSet = 1;( g. a* v9 W" _( B! N9 J  Y
  11.       goto LABEL_11;: z" s; C9 X) x1 b6 V
  12.     }6 Q5 Y* I/ L2 t( {! e2 o
  13.     if ( dword_4A4490 != 1250 )
    ' C: f: E9 H9 i. n3 t3 J# G
  14.     {
    3 H  m! f9 c1 b* z- K4 e- X
  15.       if ( dword_4A4490 == 1251 )
    : ?9 H0 L3 e% v2 q6 Z/ V4 D3 e
  16.       {
    ; W" G0 B+ B9 w
  17.         iCharSet = 204;
    : O% }( M3 L9 w/ d9 Y
  18.         goto LABEL_11;
    & @. y5 L- u7 U( z: L; v, f
  19.       }
    ! ^, b' u4 N  t% P9 Y
  20.       goto LABEL_10;3 H# [) o. K, y2 l; O
  21.     }
    ; R) j" s9 |5 B- U- Y2 g. i
  22. LABEL_7:1 m7 G& h: U* d, W; {2 F! V7 P
  23.     iCharSet = 238;
    - t8 c9 S' O! ~/ J+ \  ~( {
  24.     goto LABEL_11;, S3 Z- a. V) Q2 V/ ?& j6 R% f
  25.   }
    4 f' A, o6 I" h! b* L
  26.   if ( dword_4A4490 == 11250 )7 v0 U( P1 A  k0 A" e
  27.     goto LABEL_7;
    + L! ]( c4 S: L
  28. LABEL_10:
    ( z) e0 ^/ I7 e8 w  a
  29.   iCharSet = 1;0 C& n6 }1 b# E1 E9 H8 t0 J, z3 |
  30. LABEL_11:
    ! |# J, I1 o; y3 B
  31.   base = glGenLists(256);
    6 S7 E0 y1 ]3 r5 h
  32.   h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);
    0 m* S3 R) f6 ]4 D4 J
  33.   if ( !h ): K: x5 ^# S, v2 C7 Y
  34.     MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
    / [5 ~3 K- c! T5 g3 S+ f+ B$ }& S9 j
  35.   SelectObject(hdc, h);" z2 E, _7 k& A$ J+ F
  36.   return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
    ) ^8 e, x! f  w0 U7 ~+ @3 {
  37. }
复制代码

* w- s. p! L% @, V! I# v* A7 P- j; T! _6 ~  v% l! O
glCallLists调用的地方共有3处,; ?* |2 y7 i3 ^) |1 Z- Z$ D; J
这个函数就是游戏的显示函数,共有3个参数,! F7 o5 P; X+ R( X2 l
  1. void WINAPI glCallLists(! Q) Z! a, R4 G0 q8 c+ w& s
  2.     GLsizei n,5 q; A8 p3 a5 c' k
  3.     GLenum type,4 @, H0 N) R9 ~# H. `/ R9 l8 z
  4.     const GLvoid *lists/ Z& ?7 E, E7 D: a/ o' J
  5. );
复制代码

9 h+ o& j( H% D% g) [: {6 U- @5 Q4 s: z
  其中n为字符串长度,type为字符串类型,*lists为字符串指针," |6 x: b1 d2 i( T7 c7 D" D
  如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:
" o: M: l. K7 \6 }  需要修改为GL_UNSIGNED_SHORT,即0x1403。  R3 e& i2 |8 D8 r% }

7 E& w, J" m( P5 ^" W4 m定义. M9 a# l# @9 ]( i: g9 q
  1. #define GL_BYTE                           0x1400- S. o/ o! T2 s$ P6 ^3 k2 U( m1 O
  2. #define GL_UNSIGNED_BYTE                  0x1401
    0 t% s: `% Q* y& f0 ~. {
  3. #define GL_SHORT                          0x1402
    $ w( \! ?7 ^2 t& v* \
  4. #define GL_UNSIGNED_SHORT                 0x1403
    " k3 O, F/ P, z4 V7 T/ R' `
  5. #define GL_INT                            0x14047 g  [/ }% |3 }/ v  r/ O
  6. #define GL_UNSIGNED_INT                   0x14053 ~% l8 j  `; e# L
  7. #define GL_FLOAT                          0x1406" T+ z# w8 X9 d- G( }
  8. #define GL_2_BYTES                        0x1407
    & b+ F" R# E- S8 P2 C5 V- U  W
  9. #define GL_3_BYTES                        0x1408
    ) r' b, Z* B; D7 r7 J, \
  10. #define GL_4_BYTES                        0x1409, o* j5 o) @/ E6 ~+ z% Y  D
  11. #define GL_DOUBLE                         0x140A
复制代码
3 ]! w/ I  i* C  F% i$ W2 g% |
  G! J4 A9 |6 s( m* ~2 E
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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