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

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

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

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

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

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

看这个标题好像挺神秘的,其实,这个帖子只是要向大家详细解释一下是如何修改scummvm,使它能够显示出汉字的。
! ]6 `/ k8 c! T* ?
. U4 O7 S1 d/ h3 m. X* d* R7 e% }3 r汉字字库
* o2 J$ ]. ^9 k0 G) y+ R1 m先说一下汉字字库,scummvm原先支持几个繁体中文的游戏,比如猴岛小英雄3,使用的是16X15的繁体字库。字库的文件名是chinese.fnt,在繁体中文版的文件中可以找到。看字体的样子好像是以前DOS时代的倚天字库。好,我们就从这里入手。既然能用繁体字库,那么使用简体中文的字库应该也是可以的。一开始我找了一个UCDOS的HZK16字库,但是放到游戏里面一试,高度太高了,在对话选择画面的时候,上下2行的字都会互相遮挡住,看来用现成的HZK16字库是不行了。在网上找了半天,也没有找到合适的字库。于是我决定自己造一个点阵字库。要造多大的字库呢,经过一番调查,最小只能用12点阵的字库,再小的话就看不清了。字库是用一个在网是找到的免费的TTF转点阵字库的工具转换的,没有费太大的力气。转换出来的字库是字节对齐的,也就是说,是12X16的,在宽度方向上对齐到16个点,也就是2个字节。既然是这样,1行是2个字节,12行就是24个字节,字库中每24个字节就能表示一个汉字,这一点不难理解吧。
1 ~( ], j7 n5 V, {4 x( H$ q$ J9 R0 x2 n0 A$ X' `% _
下面我们来看一段代码,这段代码在charset.cpp这个文件里面。
6 u5 |9 ^, G4 W& V$ M0 H- f
6 b( ]4 @6 N4 F" j/ h6 Hcase Common::ZH_TWN:; B3 ^6 X2 w2 a
    if (_game.id == GID_CMI) {+ e9 U9 _* K9 _0 \% }1 P! d
        fontFile = "chinese.fnt";
+ W& }) I' G: R6 s: s        numChar = 13630;( N2 b$ {- @  }) J: V
    }% Z* D+ f( B9 G2 G9 X5 ^! p
    break;
! X4 I8 ]7 X1 }8 y9 J8 ccase Common::ZH_CNA:                   //add by shane007 2009.7.12& u3 O9 G' x3 j  Z5 j
    if (_game.id == GID_FT || 9 L9 i: ]+ P) E/ w* y! W0 E
        _game.id == GID_SAMNMAX ||
! ~1 E- O- \0 Z        _game.id == GID_LOOM ||5 C- h9 P: p" h4 {$ ^1 A
        _game.id == GID_INDY3 ||$ v2 l# J: J" q
        _game.id == GID_INDY4 ||3 c( Z# |0 j1 ?5 S
        _game.id == GID_MONKEY||  D+ ^% g- p0 ?* Q# \! D& l3 H
        _game.id == GID_MONKEY2||
5 o" ~' t9 j7 J        _game.id == GID_TENTACLE) {: v) @7 x3 C" c0 u- [

; @* R1 j$ A, Y4 T        fontFile = "chinese_gb16x12.fnt";* b( I- |( Y% A
        numChar = 8178;               , v- A1 d+ G, |4 [( L* b& X( o. t, q  n
    }' B# n3 d6 d' y. S- A7 A3 G
    break;; `" }4 {" k; s" M' |; n* ]
default:
) B/ T7 O  }8 q+ P2 q1 h8 P    break;
. f5 Q9 H2 D5 M" F9 V}+ V0 T4 S7 F1 Y  P% D5 d" r$ i

& M  N4 o( J. e& `4 q; ^代码包括了繁体字库和简体字库的定义,game.id是游戏的ID,我们让那些SCUMM引擎的游戏进来的时候,使用我们制作好的简体字库chinese_gb16x12.fnt。numChar是字库里面的中文字符数量。ZH_CNA是我们新增加的一种语言类型,在原版的scummvm里面是没有的。所以有的朋友在原版的scummvm里面找不到简体中文的选项,就是这个道理。是我加上去的。
0 i$ @6 x" B, _* ~7 L, t3 w, G
( G( \; F4 l. G- X/ s0 g* k$ o有的朋友也许还不太清楚,游戏是怎么找到我们需要的那个汉字的字模的,让我们再来看一段代码。
$ k" x( i; u6 m# z: ^  C* e+ P' j0 T3 r9 w  ?5 @. m/ V6 i
case Common::ZH_CNA:   //add by shane007 2009.5.19
" r' o3 N. O% w3 vidx = ((idx % 256) - 0xa1)* 94  + ((idx / 256) - 0xa1);
. [  M- U8 n1 h# ]4 i. k8 ]( Obreak;3 A" J3 P+ [; ]/ f1 H
/ W% v* w# G' }+ x; Q: z" u/ N5 ~
其实很简单,我们汉字的区位码索引公式就是  (位码- 0xa1)* 94  + (区码 - 0xa1)," [, g0 c, g# x6 V; h. H
知道了汉字的区位码就可以推算出这个汉字在我们字库中的索引值,由于每个汉字占用24个字节,我们就可以取得这个汉字的字模。: O' q6 i/ x% F: d
; T( T& s6 V- l! ^. z! s- x
return    _2byteFontPtr + ((_2byteWidth + 7) / 8) * _2byteHeight * idx;
) R+ `3 }+ F/ m
% d* {/ m# I/ ]((_2byteWidth + 7) / 8)的意义就是字节对齐。
/ F; q8 y3 P" k0 i$ d5 o! x) D4 o0 j* t' C" Y+ m0 W
经过以上的修改,我们的scummvm就能显示出汉字了,是不是很简单呢?
$ s$ R# H$ m1 E" B! `: M" P, m当然,在scumm引擎的游戏里面本来就有双字节函数的支持,所以修改相对比较简单,我们的修改主要是使它兼容于简体中文。
. E% U: i2 u7 g2 m$ r% n对于其他引擎的游戏的汉化修改就没有这么简单了。但是,我们可以考虑把这些双字节函数移植过去。
1 |, J# `, l1 a/ _写下这篇小文章希望给后来者以些许启示吧。。。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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