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

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

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

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

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

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

看这个标题好像挺神秘的,其实,这个帖子只是要向大家详细解释一下是如何修改scummvm,使它能够显示出汉字的。& L( w+ g3 ]: ~, S
+ T' d8 G& ~/ Z' ?8 w# i& v
汉字字库$ z: F  j& J9 C
先说一下汉字字库,scummvm原先支持几个繁体中文的游戏,比如猴岛小英雄3,使用的是16X15的繁体字库。字库的文件名是chinese.fnt,在繁体中文版的文件中可以找到。看字体的样子好像是以前DOS时代的倚天字库。好,我们就从这里入手。既然能用繁体字库,那么使用简体中文的字库应该也是可以的。一开始我找了一个UCDOS的HZK16字库,但是放到游戏里面一试,高度太高了,在对话选择画面的时候,上下2行的字都会互相遮挡住,看来用现成的HZK16字库是不行了。在网上找了半天,也没有找到合适的字库。于是我决定自己造一个点阵字库。要造多大的字库呢,经过一番调查,最小只能用12点阵的字库,再小的话就看不清了。字库是用一个在网是找到的免费的TTF转点阵字库的工具转换的,没有费太大的力气。转换出来的字库是字节对齐的,也就是说,是12X16的,在宽度方向上对齐到16个点,也就是2个字节。既然是这样,1行是2个字节,12行就是24个字节,字库中每24个字节就能表示一个汉字,这一点不难理解吧。7 I1 [( u- w9 V1 L6 T
# D% f; x5 a$ L8 [
下面我们来看一段代码,这段代码在charset.cpp这个文件里面。
" X. }( T8 i+ s7 c6 s7 Y: R& n. z7 |! C( p6 Y( P* I/ `
case Common::ZH_TWN:
8 r. Y3 P& x! b9 @! h    if (_game.id == GID_CMI) {
8 v8 M/ N/ y! z2 O) [3 Z' i        fontFile = "chinese.fnt";
+ _+ g  w* O$ J: I        numChar = 13630;
/ S4 ], D1 U$ ]- w" V    }2 t) j% V; w( H1 h8 ?
    break;9 B4 t; Q* {6 |, Q# x
case Common::ZH_CNA:                   //add by shane007 2009.7.12
' B/ F) }9 |" M) g$ `    if (_game.id == GID_FT || 4 I' l: ^8 {" t2 R
        _game.id == GID_SAMNMAX || # h; s% {( Y& D' p
        _game.id == GID_LOOM ||% p- s# ~9 p. Z4 H* X- c9 y
        _game.id == GID_INDY3 ||
/ ?0 P2 D' N( {2 Y9 ], \, M, O; G        _game.id == GID_INDY4 ||# m- G) J( l6 {0 m
        _game.id == GID_MONKEY||% z# a8 O, m( L' X5 T# u. p
        _game.id == GID_MONKEY2||
( ?4 `; l2 I; B# X) m: X/ r        _game.id == GID_TENTACLE) {
+ S' J. R! B1 ~* X- }6 P& P% A% d+ {. e& w7 h8 q
        fontFile = "chinese_gb16x12.fnt";
: }* F7 P$ b& j1 H        numChar = 8178;               & Z. C1 N' d. @) D9 F! N
    }
! O" i* x5 a# t3 k' z    break;  V. K. E9 i, C( E1 x
default:
1 P6 V) J5 T0 S5 N9 d+ q: W    break;& s. M8 J7 W3 i$ c
}- v7 X" {: P* F, m
5 D: R5 ~3 d8 P% S) \. \
代码包括了繁体字库和简体字库的定义,game.id是游戏的ID,我们让那些SCUMM引擎的游戏进来的时候,使用我们制作好的简体字库chinese_gb16x12.fnt。numChar是字库里面的中文字符数量。ZH_CNA是我们新增加的一种语言类型,在原版的scummvm里面是没有的。所以有的朋友在原版的scummvm里面找不到简体中文的选项,就是这个道理。是我加上去的。
% _1 c4 \( E2 T. |0 A9 Q5 r% a  V! Y* \! M$ X% n7 J
有的朋友也许还不太清楚,游戏是怎么找到我们需要的那个汉字的字模的,让我们再来看一段代码。
' b0 A$ o$ E2 D. d8 D5 B* l* ~1 b& u6 g1 K
case Common::ZH_CNA:   //add by shane007 2009.5.19
1 D  q) u) Y* p2 B% Zidx = ((idx % 256) - 0xa1)* 94  + ((idx / 256) - 0xa1);
& ^* @2 ]3 Q6 ~, Z) B+ N0 |- |! ebreak;
4 D# C# Z, @1 |6 ~0 z0 @; Y  I
5 a0 \  R! q4 f& G: N  H, Q其实很简单,我们汉字的区位码索引公式就是  (位码- 0xa1)* 94  + (区码 - 0xa1),, Q3 O2 o. M+ B  q, p2 o
知道了汉字的区位码就可以推算出这个汉字在我们字库中的索引值,由于每个汉字占用24个字节,我们就可以取得这个汉字的字模。
& P1 g7 \  Y9 i2 x& T* E! H! |4 M
. ?" V" B  y$ n' g# E' T9 Greturn    _2byteFontPtr + ((_2byteWidth + 7) / 8) * _2byteHeight * idx;% C, |9 G4 t4 F/ f! d6 ~+ [

4 J8 z0 L1 @4 l( P((_2byteWidth + 7) / 8)的意义就是字节对齐。, }4 G# \6 b, ]; ~+ }1 }
1 l3 z% W! y7 \  \3 B. F$ P% ^! ^
经过以上的修改,我们的scummvm就能显示出汉字了,是不是很简单呢?
& o) F. W1 X8 t' m  i  `2 \当然,在scumm引擎的游戏里面本来就有双字节函数的支持,所以修改相对比较简单,我们的修改主要是使它兼容于简体中文。0 ]- Q/ }% v1 I4 y7 O( I
对于其他引擎的游戏的汉化修改就没有这么简单了。但是,我们可以考虑把这些双字节函数移植过去。+ ^* M, H+ u6 m
写下这篇小文章希望给后来者以些许启示吧。。。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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