最近应C版的要求开始研究断剑1的汉化。
: S0 I, _: u+ I% m" a4 x: P看了一下scummvm的代码,看懂了大致的流程。3 n, ^. R. D: ]% M
8 [7 Q4 L3 p9 y8 P断剑的包文件是由多层的结构组成的。简单的说就是大包套小包。
' R" k, a# B6 ]我下面先解说一下字体资源文件。7 w* ^7 | }. F* o3 d
1 R6 V* R }) d7 t& [- |8 V
经过仔细观察源代码,我发现了一个资源文件的导出函数。# _& q1 e/ w0 f% Y& w. J. D
void ResMan::dumpRes(uint32 id) {
; w3 h% s$ c0 l5 r9 t) P7 U char outn[30];# A0 ]2 O3 `; y$ m2 h3 E9 p
sprintf(outn, "DUMP%08X.BIN", id);* H4 A( \! E8 S. I8 z" o9 s8 t
Common::DumpFile outf;- Z/ A" S$ }. `7 [6 p. X6 k$ W
if (outf.open(outn)) {
2 k. x: C" e' K& f# ?5 h( Z3 [ resOpen(id);
, L3 F5 V# L0 M/ R' E MemHandle *memHandle = resHandle(id);8 f# Q w) l$ s
outf.write(memHandle->data, memHandle->size);
/ }: K; k A+ b" a2 D+ f* z! R K outf.close();
& ~8 ^- A& d1 S$ ~/ ]7 k resClose(id);
% m) R. q* C7 c }
* N, y, d/ _& T- b' Y; O1 j}% ~: v" c! \1 v7 w5 X
8 W. u' Q; |9 F- H) d2 Q4 v C' K
我又找到了一些各种语言的资源文件的ID
6 ?+ s* q" \& P! `#define GAME_FONT 0x04000000
0 Y) j+ n5 h$ z4 H) ~7 J9 q- Q1 W0 c: @#define OTHER_SR_FONT 0x04000001
8 P) |9 v a' c& \7 O, ?#define OTHER_SR_REDFONT 0x04000002, D& w- J. G8 O4 a2 n, w. l
#define SR_DEATHFONT 0x04000003/ S% Z1 S7 r* h! R5 G
#define CZECH_GAME_FONT 0x04000004$ i* Q4 r1 P+ i+ {& ?
#define CZECH_SR_FONT 0x04000005
v: {: u; b0 d: X#define CZECH_SR_REDFONT 0x04000006
) ], r; Z6 b# b* z1 A- ?#define CZECH_SR_DEATHFONT 0x04000007( u" X. i, Y: O
" M& V( P' _/ _; Z. R这样,我在调试模式下顺利导出了一个字体资源文件。+ }, d" y( ]$ M/ e9 k1 r
接下去,我分析了一下字体资源文件的格式,制作了一个资料。8 y, h9 V2 ~0 m
看了这个资料很容易就能明白。
$ N$ h6 _ a$ ]' I' S- ] ; l4 r V$ j& t6 n5 @* r
5 S; i4 A) w+ D0 n4 W
从源代码里面找到的资源文件头和每个桢的头的结构定义如下,
$ v8 M& m1 ?6 r& q0 }可以和上面的图一起对照起来看。
1 T1 I: }7 A v. F5 T, m* }# }* ? ]/ i
struct Header {# v- V0 Y6 @- l y4 r
char type[6];
1 [8 N; G F, W* \! l uint16 version;
, i p9 k! H# l) ` uint32 comp_length;; V& B/ l" _; i/ v# J
char compression[4];
! Z2 [' K- d) H n* J uint32 decomp_length;; X! i$ F" X3 `* K# Z) d4 p" g
} PACKED_STRUCT;( }( A, D! ], z0 I4 I L$ O3 U
; R o( L8 R: T) K9 e2 f4 {8 ~struct FrameHeader {
}; Q! Y, Y' W& ~- h6 C uint8 runTimeComp[4];
& @ n! j3 g$ S8 D4 r* Q3 C uint32 compSize;
2 C6 o; b, H" r6 p uint16 width;, L0 O$ a& i F$ W3 s+ X
uint16 height;
, m: f2 M( x/ L: t) s int16 offsetX;6 ]; _; b+ w4 [ q$ T' i
int16 offsetY;1 G% ~9 D7 Q w4 C0 W6 r/ N
};
% t: e1 p2 ]+ k2 g% H$ K
/ l: C D' `6 U' c字体文件的每一个桢都定义了一个字母的字模,根据字模就可以在屏幕上画出每个字母的样子。$ y6 e3 s$ \; |! t, Q
每个字模用一个字节来表示一个像素。0 T' G: s: p4 m8 ~! O0 N, _6 o
背景像素 0x00+ l4 j2 T- h/ B" j
边框像素 0xC8
) s; l* T7 [" o7 m+ n, s字体像素 0xC1
1 K6 {' z, b7 X" K& h6 a/ M2 Z% ~$ ^5 C' j9 X' U: Y. Y% C
下面这张图片可以使大家对字体的样子有个感性的认识。6 Y8 o( `" ^# B, z0 R2 J
为了看得清楚,我把 0xC8替换为一个黑色的小方块。$ j& l/ T, f4 ~& e2 }6 h4 t7 E
|