冒险解谜游戏中文网 ChinaAVG

标题: 【断剑1汉化项目】字体资源文件彻底解说 [打印本页]

作者: shane007    时间: 2009-9-12 15:28
标题: 【断剑1汉化项目】字体资源文件彻底解说
最近应C版的要求开始研究断剑1的汉化。
5 G  v' M7 h+ U. K/ L! Z看了一下scummvm的代码,看懂了大致的流程。
* @8 M* }7 ~2 p- n5 W& M# l
6 {5 B7 C. P! Z- a断剑的包文件是由多层的结构组成的。简单的说就是大包套小包。8 h! Q9 ~, `9 R4 L
我下面先解说一下字体资源文件。; a: C: `0 E) Y) L
/ ~/ Y, M: F( Q5 K5 k4 w$ ^6 `
经过仔细观察源代码,我发现了一个资源文件的导出函数。
; B  _* b! z5 d1 x; S' Uvoid ResMan::dumpRes(uint32 id) {" I# U+ K& _: \( a  O9 ~
    char outn[30];
9 A( K# Q) Q' L& }    sprintf(outn, "DUMP%08X.BIN", id);
! q" C" W$ Y5 d# ^/ K) @. l& s    Common::DumpFile outf;
# f: _$ x# M6 g4 w! r6 X  }8 M    if (outf.open(outn)) {
; j$ V" a" f  y% u" x. T  C% \        resOpen(id);
* O! ?; x" d0 [9 n        MemHandle *memHandle = resHandle(id);
" g+ |; x8 q. @9 g6 j" `7 a        outf.write(memHandle->data, memHandle->size);7 i* C( P  }' X
        outf.close();
- e* t$ ^' g0 y' z        resClose(id);* B3 V9 k1 Q6 l1 N# N& p5 v+ ]+ T* i
    }, ^- S+ c& Q( \1 d
}+ P& Z; U- b8 b; D/ E$ o1 v0 n

1 H7 P. x8 y, B6 O0 S我又找到了一些各种语言的资源文件的ID
% P4 ^- |$ k, Z( j#define GAME_FONT            0x04000000
: U8 B) O. B) x; |5 w#define OTHER_SR_FONT         0x04000001
" S- q0 {: I* r; u#define OTHER_SR_REDFONT         0x04000002
& ~# ?7 {. }, t# E+ |% W9 _#define SR_DEATHFONT        0x04000003, w% ?) D, b  y% O
#define CZECH_GAME_FONT        0x04000004* B1 s, v1 F: T
#define CZECH_SR_FONT        0x04000005
: R& m6 f; P" n3 x- e#define CZECH_SR_REDFONT         0x04000006
6 h- i4 h$ L5 I: t' Y% N( i#define CZECH_SR_DEATHFONT         0x04000007
- g6 a0 I* d# _: k( a5 h: D
+ f/ [2 S" C$ R; [/ I4 F0 S这样,我在调试模式下顺利导出了一个字体资源文件。( e" }% q+ o6 l
接下去,我分析了一下字体资源文件的格式,制作了一个资料。. A, E! t6 _& v+ d% g1 L
看了这个资料很容易就能明白。
2 k. W( o  y) c% {+ S2 B [attach]14211[/attach]
# C: U, K0 z2 X, U. g( N4 ?; e: N
6 _$ c! I: n0 p. E% L从源代码里面找到的资源文件头和每个桢的头的结构定义如下,
, A9 N$ x9 V( X" d! O( u可以和上面的图一起对照起来看。
  t2 o& A# i6 \$ h5 G% O6 f& r* i: k* r. d2 g2 u
struct Header {
( Y0 f1 s& l! w6 U- X) m    char type[6];
! r) |, ^$ ^6 f; u, R" w    uint16 version;- `& Z, J) s, q. Q/ w9 F
    uint32    comp_length;
$ m/ ]" V& d2 T    char    compression[4];
2 a0 v+ J" r0 M1 G2 [8 I. w& j+ v    uint32    decomp_length;' W* j$ K: M2 J" a. L
} PACKED_STRUCT;
. \5 i4 _4 R! o( q. `  V; J
+ L% F3 j% i, Q& hstruct FrameHeader {" ]3 c9 t, P* f/ D5 g
    uint8 runTimeComp[4];
) `2 \' U: [( O. A; c0 Y' d- q    uint32 compSize;
0 _# X) s2 F& K+ |    uint16 width;' u2 I5 l" \' C& z$ m8 k' B
    uint16 height;- I+ D/ o9 g; m2 S
    int16 offsetX;
( f% U) L. T- y$ d9 }) n& _    int16 offsetY;! U8 K/ a7 B$ @8 ]
};
. E: H- ]" Q; @- Q7 \
( |, R, u  \; n$ p% u+ @字体文件的每一个桢都定义了一个字母的字模,根据字模就可以在屏幕上画出每个字母的样子。% c% @& ^6 E' k8 I, d+ p8 A
每个字模用一个字节来表示一个像素。3 U  I, {% v9 Q
背景像素 0x001 ^2 H8 {- P- z
边框像素 0xC8! W8 ^* P( j! M: i) q
字体像素 0xC1
/ a% I# S) s- v. x2 ~+ ^
0 Q3 e0 _9 R6 Z% m7 ^; w8 b& s下面这张图片可以使大家对字体的样子有个感性的认识。- H- |7 U% C2 y8 b+ {# A
为了看得清楚,我把 0xC8替换为一个黑色的小方块。
' }  G) k% p6 G0 H* Q [attach]14214[/attach]




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