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

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

[复制链接]
查看: 630|回复: 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 编辑 ) `/ z# K4 m/ `. s: i

" c% o$ a3 s: M( J: O这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了,1 |3 b8 z, o: X4 h) h. z* a, y
但目前已经有了英文补丁,因此汉化又被提上日程。* C  A9 }4 f; L3 V, F( t+ J
8 i, D9 Y2 H9 q( |3 ]" B9 W' A  D7 j
对opengl的调用主要是在toh.exe完成的,
' j7 N! E2 z  t( O' n对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
& P9 ^! J% q2 A2 L* a) O6 h2 Q, Z
/ X- p. `3 f2 ?/ \glGenLists的调用处共有6处,每处都类似,1 N: c+ W: i! u1 B) j" t
可见游戏初始化了6种字体,每种有256个字符。
" R6 B6 J9 [# y1 b, {" l& L% k5 i其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。
" o0 f8 j" k% i" {/ c% [修改的时候,应该还要修改到上层调用的其他函数。
( I; F6 l/ |* x9 m0 d
  1. BOOL __cdecl sub_4518C0(HDC hdc)
    / f+ }2 }8 A. L* A. S
  2. {
    3 Q5 O. }2 i6 P4 s: j* c3 d
  3.   HFONT h; // [esp+4h] [ebp-8h]
    : v' c: K# B6 Q& v& W; F. i
  4.   DWORD iCharSet; // [esp+8h] [ebp-4h]5 i/ O. N5 L- I: Q1 j1 J

  5. $ X+ d6 W) U7 J
  6.   if ( dword_4A4490 <= 1252 )
    1 v* J: n, p& q  l4 t9 v3 r' p6 b
  7.   {* _. p/ n, ]& l1 ^2 Q( M
  8.     if ( dword_4A4490 == 1252 )+ t- B' E9 K6 y& J
  9.     {
    2 Y1 }, k) f4 w, O3 {
  10.       iCharSet = 1;& U# m( J2 a  Q. W. Z6 M, J. w% y
  11.       goto LABEL_11;( C, w" M, E8 Y. a
  12.     }$ w% L/ e8 k5 O  ~8 r* Z3 A4 `* ~
  13.     if ( dword_4A4490 != 1250 )" d' e+ \; r! Z
  14.     {
    4 V. F, t8 n* C, A0 D( q9 o! X* y
  15.       if ( dword_4A4490 == 1251 )
    ) H9 @1 L  k: H& m4 m
  16.       {0 ?+ i: B  R/ [
  17.         iCharSet = 204;
    ; _* S) Z* Y( Y- Z! Q! h
  18.         goto LABEL_11;; T: _, t' u5 U, ]
  19.       }
    2 I3 Y9 q  F7 q% A0 H# c
  20.       goto LABEL_10;0 Q3 Z( t4 Q# s- X. y; K2 v) `
  21.     }$ }6 D: k9 u. m# `1 |3 c* _# n
  22. LABEL_7:
    : Y7 r% C) M9 H- D" M! ]! u
  23.     iCharSet = 238;
    & A( d7 ~2 L  p- ^* P2 t. I' i
  24.     goto LABEL_11;2 ?2 a0 d: s) z- s/ N8 n
  25.   }! Q) d/ j: [  R+ I& L$ |
  26.   if ( dword_4A4490 == 11250 )
    6 B, S5 G2 K; ^1 c8 y% B% O  ?
  27.     goto LABEL_7;
    2 o- w3 X( h, [3 e
  28. LABEL_10:
    0 z: a" D2 O  j. c8 ~4 A
  29.   iCharSet = 1;
    4 Y, `: `# p3 [
  30. LABEL_11:
    % r8 F* s0 q: b7 P! {; m! N/ _
  31.   base = glGenLists(256);0 b0 {. J9 K2 o0 N2 h
  32.   h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);
    ' S+ f$ ~* n9 N
  33.   if ( !h )
    ' B8 s/ C9 I  L9 D! C
  34.     MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);! O. e7 @' w( o& e2 w
  35.   SelectObject(hdc, h);
    8 f% }0 x5 N/ v$ h
  36.   return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
    5 g! B) y6 y8 R7 Z% a
  37. }
复制代码

2 y0 z, b* _- w' o5 R3 Z( t" [6 P6 s3 w4 ~
glCallLists调用的地方共有3处,
! u: T, l  Y, W7 r3 y' A这个函数就是游戏的显示函数,共有3个参数,0 m, U' {3 l% ]6 n- J
  1. void WINAPI glCallLists(; x7 b$ G' X+ i. w
  2.     GLsizei n,
    0 l  H$ N6 ?3 W8 p0 y' o' d9 V, S
  3.     GLenum type,
    $ @$ G" @, _, ]+ j$ Y3 S5 a
  4.     const GLvoid *lists* P+ t! ?! Z' e9 @% X
  5. );
复制代码
: r. @  z' _% d- L

" }( j- N& k; C3 Z  其中n为字符串长度,type为字符串类型,*lists为字符串指针,
" w5 b" O, I$ t$ i6 s  如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:7 R! i( [# D5 c7 J8 C1 d
  需要修改为GL_UNSIGNED_SHORT,即0x1403。. f' I  |1 Y" Q8 @5 d' R
0 K( k$ Z' r) c$ T9 C+ _6 Z# H
定义4 N2 D$ k* _, f) O
  1. #define GL_BYTE                           0x1400
    / H9 ?0 j. _- c  V9 g3 `' H
  2. #define GL_UNSIGNED_BYTE                  0x1401) Q3 n& Z- V9 r/ b
  3. #define GL_SHORT                          0x1402
    % x7 x5 r0 ]& h' p4 X" c7 Z* G
  4. #define GL_UNSIGNED_SHORT                 0x1403
    " w( s" m1 ]6 c
  5. #define GL_INT                            0x14048 a# z* G5 S3 ^
  6. #define GL_UNSIGNED_INT                   0x1405
    + E% U$ E( p' h% x) P
  7. #define GL_FLOAT                          0x14069 g3 S. m3 |' Z% C% k2 z! D1 J+ R
  8. #define GL_2_BYTES                        0x14079 Z  w7 h# c; R8 m
  9. #define GL_3_BYTES                        0x1408" ^9 {0 W  q4 W& ^+ r: K
  10. #define GL_4_BYTES                        0x1409. X+ v8 K+ A2 q9 X# Y6 p3 G. g/ Q
  11. #define GL_DOUBLE                         0x140A
复制代码
% B, M# N! f3 _1 c" w
& U# a0 d/ A( J! m0 P" ~
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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