冒险解谜游戏中文网 ChinaAVG

标题: 【scummvm汉化】细说scummvm汉化修改核心机密 [打印本页]

作者: shane007    时间: 2009-8-15 20:47
标题: 【scummvm汉化】细说scummvm汉化修改核心机密
看这个标题好像挺神秘的,其实,这个帖子只是要向大家详细解释一下是如何修改scummvm,使它能够显示出汉字的。
" ?% v# W+ p% q. f5 O6 f; g4 ^, @. U: D1 E
汉字字库
: d+ ~- C0 o# K9 W9 o先说一下汉字字库,scummvm原先支持几个繁体中文的游戏,比如猴岛小英雄3,使用的是16X15的繁体字库。字库的文件名是chinese.fnt,在繁体中文版的文件中可以找到。看字体的样子好像是以前DOS时代的倚天字库。好,我们就从这里入手。既然能用繁体字库,那么使用简体中文的字库应该也是可以的。一开始我找了一个UCDOS的HZK16字库,但是放到游戏里面一试,高度太高了,在对话选择画面的时候,上下2行的字都会互相遮挡住,看来用现成的HZK16字库是不行了。在网上找了半天,也没有找到合适的字库。于是我决定自己造一个点阵字库。要造多大的字库呢,经过一番调查,最小只能用12点阵的字库,再小的话就看不清了。字库是用一个在网是找到的免费的TTF转点阵字库的工具转换的,没有费太大的力气。转换出来的字库是字节对齐的,也就是说,是12X16的,在宽度方向上对齐到16个点,也就是2个字节。既然是这样,1行是2个字节,12行就是24个字节,字库中每24个字节就能表示一个汉字,这一点不难理解吧。
& N% T+ R& A" e5 N6 O9 Z
9 \0 [2 G- K8 U; H$ F# i% V- q下面我们来看一段代码,这段代码在charset.cpp这个文件里面。: u* ^. x7 H$ v: T/ k) ?) Y
+ N% j1 |6 C6 S
case Common::ZH_TWN:
) c- ]! o4 @' Y  ^+ `    if (_game.id == GID_CMI) {2 k4 d! g) V" b. q' k- S* P& y
        fontFile = "chinese.fnt";
3 Y, m9 ^6 R; s" L' o4 O% P        numChar = 13630;' \! q+ i0 H2 H$ z
    }4 F) |) A/ V/ A* {) b% r6 G
    break;
4 P( h" N) H# Y! ]2 K9 xcase Common::ZH_CNA:                   //add by shane007 2009.7.12
9 R* q8 v- s) ]    if (_game.id == GID_FT ||
6 g# W% x9 y4 G& S5 V8 {        _game.id == GID_SAMNMAX ||   r4 v8 x% e! F3 K" B1 d/ Z
        _game.id == GID_LOOM ||
$ M! @' H. ]4 u2 v8 d5 r        _game.id == GID_INDY3 ||( D( i& s) n- ^; U: }
        _game.id == GID_INDY4 ||
; `% T+ o4 K' x, i7 E+ g: X        _game.id == GID_MONKEY||; q$ ?4 ]9 s5 e$ h! e( y1 A
        _game.id == GID_MONKEY2||3 E: U' P4 D! y4 _# Y* m
        _game.id == GID_TENTACLE) {
/ d+ [3 k0 e' |6 b# w4 _
0 P5 C+ t  @$ |1 r        fontFile = "chinese_gb16x12.fnt";" f1 c( L( L. O( U; s
        numChar = 8178;               2 Y6 T( q- h* \
    }
/ t) z1 w) K# L4 r    break;
, b* I8 j: V* i- s: T' D0 xdefault:4 A% x7 J+ D8 i4 A: G& O' B# ^% d
    break;
: E4 i2 P, s' s7 I5 Q' v& G}' b0 D8 ~/ l- u8 q
8 d. v0 m0 _! F
代码包括了繁体字库和简体字库的定义,game.id是游戏的ID,我们让那些SCUMM引擎的游戏进来的时候,使用我们制作好的简体字库chinese_gb16x12.fnt。numChar是字库里面的中文字符数量。ZH_CNA是我们新增加的一种语言类型,在原版的scummvm里面是没有的。所以有的朋友在原版的scummvm里面找不到简体中文的选项,就是这个道理。是我加上去的。& P7 \5 ^1 \( m1 [! V) z$ ]
& F8 g! ~2 r& ~# ]" l- X
有的朋友也许还不太清楚,游戏是怎么找到我们需要的那个汉字的字模的,让我们再来看一段代码。$ B& m6 c" c) b' H8 X

( F4 U6 `6 b2 W9 p+ xcase Common::ZH_CNA:   //add by shane007 2009.5.19' [  ^% L; G; ~6 r& W' |' j
idx = ((idx % 256) - 0xa1)* 94  + ((idx / 256) - 0xa1);' X& f: e" }& J) t8 }7 t% `
break;
. W7 j) e' b5 i* {) F* M# A7 Y8 I# a( c9 B+ j
其实很简单,我们汉字的区位码索引公式就是  (位码- 0xa1)* 94  + (区码 - 0xa1),/ L/ _. t" Y: ^
知道了汉字的区位码就可以推算出这个汉字在我们字库中的索引值,由于每个汉字占用24个字节,我们就可以取得这个汉字的字模。
" g, e- W) p# ?/ ^3 L$ H
6 [/ a- t+ T5 C0 kreturn    _2byteFontPtr + ((_2byteWidth + 7) / 8) * _2byteHeight * idx;1 U) \; G4 Q; S! B- g" p# y1 `

3 Q* h5 n3 ]5 u$ I3 t4 ?- j0 r* z7 ^((_2byteWidth + 7) / 8)的意义就是字节对齐。
7 ]6 i& z" d# I% u/ u
6 d2 a  N* j! w+ }+ C经过以上的修改,我们的scummvm就能显示出汉字了,是不是很简单呢?
/ ^) K4 u) A$ g8 E0 W: K当然,在scumm引擎的游戏里面本来就有双字节函数的支持,所以修改相对比较简单,我们的修改主要是使它兼容于简体中文。9 q: M  H' t# X" _, O
对于其他引擎的游戏的汉化修改就没有这么简单了。但是,我们可以考虑把这些双字节函数移植过去。+ f. F) w* H! Q* f+ J! z: T6 J2 J) x
写下这篇小文章希望给后来者以些许启示吧。。。




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2