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

汉化资料 【scummvm汉化】细说scummvm汉化修改核心机密

[复制链接]
查看: 3480|回复: 0
打印 上一主题 下一主题

[汉化资料] 【scummvm汉化】细说scummvm汉化修改核心机密

跳转到指定楼层
楼主
发表于 2009-8-15 20:47 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

【scummvm汉化】细说scummvm汉化修改核心机密

看这个标题好像挺神秘的,其实,这个帖子只是要向大家详细解释一下是如何修改scummvm,使它能够显示出汉字的。
6 \; k: Y' Z4 S6 G/ X6 w. e- N9 \! {, }0 t! d& c3 {
汉字字库3 x! ~- E; c: ]- q
先说一下汉字字库,scummvm原先支持几个繁体中文的游戏,比如猴岛小英雄3,使用的是16X15的繁体字库。字库的文件名是chinese.fnt,在繁体中文版的文件中可以找到。看字体的样子好像是以前DOS时代的倚天字库。好,我们就从这里入手。既然能用繁体字库,那么使用简体中文的字库应该也是可以的。一开始我找了一个UCDOS的HZK16字库,但是放到游戏里面一试,高度太高了,在对话选择画面的时候,上下2行的字都会互相遮挡住,看来用现成的HZK16字库是不行了。在网上找了半天,也没有找到合适的字库。于是我决定自己造一个点阵字库。要造多大的字库呢,经过一番调查,最小只能用12点阵的字库,再小的话就看不清了。字库是用一个在网是找到的免费的TTF转点阵字库的工具转换的,没有费太大的力气。转换出来的字库是字节对齐的,也就是说,是12X16的,在宽度方向上对齐到16个点,也就是2个字节。既然是这样,1行是2个字节,12行就是24个字节,字库中每24个字节就能表示一个汉字,这一点不难理解吧。+ x% o8 i3 }4 f# U$ s* u

: z+ Y' [0 L- r( w0 Q" `下面我们来看一段代码,这段代码在charset.cpp这个文件里面。6 j5 v2 L& {$ N$ l, U
4 m4 P( H# L2 V& J& x2 E7 i
case Common::ZH_TWN:$ K1 O3 @$ u; v0 [2 ]( @- e
    if (_game.id == GID_CMI) {! L7 Y/ D2 Z0 i+ l/ E
        fontFile = "chinese.fnt";
1 Q0 L" ]8 t  [/ Z: p9 f; }% J        numChar = 13630;
1 [7 ~' D) s1 g( x: j4 g6 t5 I    }
" e+ y4 L; _$ [. c2 Y    break;
# ~- r/ B  U* d! c% j, I2 t( D, Lcase Common::ZH_CNA:                   //add by shane007 2009.7.12, C( f( V9 }1 n- x9 \
    if (_game.id == GID_FT ||
: k; Y/ `) n) a; ]7 f        _game.id == GID_SAMNMAX || ) w0 S1 Z  p+ b* d
        _game.id == GID_LOOM ||4 ]9 J9 a0 w: k4 B4 k8 z
        _game.id == GID_INDY3 ||
- i4 l1 D( e( H4 T! J. [- ?        _game.id == GID_INDY4 ||; d, e, r: p7 g3 `) f
        _game.id == GID_MONKEY||; P2 s) R- _& m; |2 C
        _game.id == GID_MONKEY2||
$ t# U- n7 S4 P0 o        _game.id == GID_TENTACLE) {8 k. y- X: O  \
* Z/ ]% R% Z8 u4 \( A# M3 _
        fontFile = "chinese_gb16x12.fnt";# e% u6 B1 a( v# J+ ^
        numChar = 8178;               
) v7 A, L0 Z3 C, D* G/ [" x    }2 ?1 T, e0 R6 D- C6 K3 P
    break;( @6 w" @  y9 f( A+ @
default:. Z( c% q0 `5 o. H
    break;9 p( n1 t+ t, \4 f
}" _  X- V) Y8 T. D- F( D: j5 w( G7 x
3 Y" P* i! v7 M. @# u+ C7 F( s
代码包括了繁体字库和简体字库的定义,game.id是游戏的ID,我们让那些SCUMM引擎的游戏进来的时候,使用我们制作好的简体字库chinese_gb16x12.fnt。numChar是字库里面的中文字符数量。ZH_CNA是我们新增加的一种语言类型,在原版的scummvm里面是没有的。所以有的朋友在原版的scummvm里面找不到简体中文的选项,就是这个道理。是我加上去的。8 W/ m$ c6 @6 @3 q3 U
4 ^4 I5 q* q' O# H8 y
有的朋友也许还不太清楚,游戏是怎么找到我们需要的那个汉字的字模的,让我们再来看一段代码。
" n6 d; T0 |3 _# H+ }. f5 c
% T7 b' i. t) jcase Common::ZH_CNA:   //add by shane007 2009.5.19& q  d$ n# U9 h9 t1 i
idx = ((idx % 256) - 0xa1)* 94  + ((idx / 256) - 0xa1);
) Q. [4 P7 M/ A& j' hbreak;5 ~! m/ A" E6 [. }

  f- y1 _& v: t. z2 \其实很简单,我们汉字的区位码索引公式就是  (位码- 0xa1)* 94  + (区码 - 0xa1),
% O/ N: e' O& H. b5 r( m9 W3 C: y知道了汉字的区位码就可以推算出这个汉字在我们字库中的索引值,由于每个汉字占用24个字节,我们就可以取得这个汉字的字模。/ S: w% j/ M4 K8 \! G. `; T

7 G' K+ X3 Q3 Y  y* N1 A% |return    _2byteFontPtr + ((_2byteWidth + 7) / 8) * _2byteHeight * idx;1 _' @2 f, C6 l- c: Y( h2 X

: q. t# ]* ?! i# U, `5 k((_2byteWidth + 7) / 8)的意义就是字节对齐。
3 k0 V1 W7 D5 G3 w" I5 T4 J6 j  J- x: Z: n
经过以上的修改,我们的scummvm就能显示出汉字了,是不是很简单呢?# W+ p" H& A$ j9 T( v
当然,在scumm引擎的游戏里面本来就有双字节函数的支持,所以修改相对比较简单,我们的修改主要是使它兼容于简体中文。& @5 v! U" P% ?- p9 b5 ~3 L0 ]6 `
对于其他引擎的游戏的汉化修改就没有这么简单了。但是,我们可以考虑把这些双字节函数移植过去。
' V; B6 C- r4 v4 }. |' f写下这篇小文章希望给后来者以些许启示吧。。。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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