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

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

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

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

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

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

看这个标题好像挺神秘的,其实,这个帖子只是要向大家详细解释一下是如何修改scummvm,使它能够显示出汉字的。
8 A  `: v" z, Y8 V, Y. i% ]
5 Y0 x1 c9 I6 L6 v* }汉字字库
# O2 `( W$ T3 i5 f* P4 p! z先说一下汉字字库,scummvm原先支持几个繁体中文的游戏,比如猴岛小英雄3,使用的是16X15的繁体字库。字库的文件名是chinese.fnt,在繁体中文版的文件中可以找到。看字体的样子好像是以前DOS时代的倚天字库。好,我们就从这里入手。既然能用繁体字库,那么使用简体中文的字库应该也是可以的。一开始我找了一个UCDOS的HZK16字库,但是放到游戏里面一试,高度太高了,在对话选择画面的时候,上下2行的字都会互相遮挡住,看来用现成的HZK16字库是不行了。在网上找了半天,也没有找到合适的字库。于是我决定自己造一个点阵字库。要造多大的字库呢,经过一番调查,最小只能用12点阵的字库,再小的话就看不清了。字库是用一个在网是找到的免费的TTF转点阵字库的工具转换的,没有费太大的力气。转换出来的字库是字节对齐的,也就是说,是12X16的,在宽度方向上对齐到16个点,也就是2个字节。既然是这样,1行是2个字节,12行就是24个字节,字库中每24个字节就能表示一个汉字,这一点不难理解吧。
- w" B1 W: I" U2 @
# r$ S) X& p, P/ d& n1 `# Z3 x8 l下面我们来看一段代码,这段代码在charset.cpp这个文件里面。- ^/ }3 J% r7 r0 D8 c

" |: O: t, l, f. W0 pcase Common::ZH_TWN:
; o# y  S4 ]. u- h1 F) }    if (_game.id == GID_CMI) {. g, t+ y. Z# B, S% E" n
        fontFile = "chinese.fnt";- ~8 i7 d' T4 s( n7 M8 I3 D
        numChar = 13630;
3 M% W! C8 c/ D5 L8 y( Q" i    }
$ c" i9 G; d, }    break;$ `! w- c7 ^  D; ^& h& D
case Common::ZH_CNA:                   //add by shane007 2009.7.12& Z& F$ k4 n" M* S# m* d# a- k. o
    if (_game.id == GID_FT ||   k7 ]0 u% b2 B1 N6 f
        _game.id == GID_SAMNMAX ||
* }/ q) @# l+ G8 s  b        _game.id == GID_LOOM ||3 ~/ J' D9 J( L0 |6 \
        _game.id == GID_INDY3 ||
/ ~8 K) B# W2 f! R$ R0 T" T% b        _game.id == GID_INDY4 ||
- E  _& F, L# e/ Y6 t! p/ q        _game.id == GID_MONKEY||8 m. X, r- l" a  {1 h
        _game.id == GID_MONKEY2||4 R" u" _& F+ w8 e# r
        _game.id == GID_TENTACLE) {
6 W. G3 f/ P3 s* }8 {+ C. p: J! v  k$ z- m
        fontFile = "chinese_gb16x12.fnt";
, C0 o+ k" u! U9 t$ Z/ F* C0 B        numChar = 8178;               
& R. F: K/ e% e! Z) s$ ?: B, e    }
7 {+ r( }2 g. E& X! N    break;
; L! Y3 L2 k# [1 \0 fdefault:) I" x% e% R  w- m$ N
    break;8 ?! P! I' q) g$ L/ y8 a
}
3 j0 B. h, }" m- y3 {
( b2 S) u1 a, [6 \; x& P% n5 h0 E代码包括了繁体字库和简体字库的定义,game.id是游戏的ID,我们让那些SCUMM引擎的游戏进来的时候,使用我们制作好的简体字库chinese_gb16x12.fnt。numChar是字库里面的中文字符数量。ZH_CNA是我们新增加的一种语言类型,在原版的scummvm里面是没有的。所以有的朋友在原版的scummvm里面找不到简体中文的选项,就是这个道理。是我加上去的。
2 A- L# o6 C0 M. u$ M8 V) w2 V; J+ ^' m4 n7 s9 C
有的朋友也许还不太清楚,游戏是怎么找到我们需要的那个汉字的字模的,让我们再来看一段代码。2 V: F* |) ?$ C! P1 h' R0 V( F

7 \: i- v; J) h$ Y1 a3 R9 [case Common::ZH_CNA:   //add by shane007 2009.5.19
. c0 M4 d# P- Z% Yidx = ((idx % 256) - 0xa1)* 94  + ((idx / 256) - 0xa1);  t' F/ f* A9 r6 k
break;
+ C8 z. b. ~/ E' J+ @1 Z0 }8 u+ K/ X' v4 N9 K* B: g3 e5 d
其实很简单,我们汉字的区位码索引公式就是  (位码- 0xa1)* 94  + (区码 - 0xa1),* J$ a' g1 C$ K; m" W* Q$ R* X! E
知道了汉字的区位码就可以推算出这个汉字在我们字库中的索引值,由于每个汉字占用24个字节,我们就可以取得这个汉字的字模。
5 G4 x6 t3 Q! W6 D8 J" r/ B4 {9 ]0 f/ S
return    _2byteFontPtr + ((_2byteWidth + 7) / 8) * _2byteHeight * idx;
& l! b# m8 K' r6 O1 U6 I8 r" u+ F( o
((_2byteWidth + 7) / 8)的意义就是字节对齐。
- I# E  O+ V$ E0 Y! o0 }$ _
' O' [. K& V" t0 }/ P/ {: L经过以上的修改,我们的scummvm就能显示出汉字了,是不是很简单呢?2 R' k. P& J2 e+ O+ o. V- n( O9 c
当然,在scumm引擎的游戏里面本来就有双字节函数的支持,所以修改相对比较简单,我们的修改主要是使它兼容于简体中文。
9 a4 d6 ^/ G8 X& h6 o* V) U' Q对于其他引擎的游戏的汉化修改就没有这么简单了。但是,我们可以考虑把这些双字节函数移植过去。
8 a- j5 I2 N7 ^" h) f; Q写下这篇小文章希望给后来者以些许启示吧。。。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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