最近应C版的要求开始研究断剑1的汉化。* ^( g) u# H* G
看了一下scummvm的代码,看懂了大致的流程。
" ?$ ^+ @9 _6 {; E8 U5 D& X* y" V& c( l$ T; \
断剑的包文件是由多层的结构组成的。简单的说就是大包套小包。
" p: k, ?( G/ x* u) |9 d我下面先解说一下字体资源文件。6 a$ X# m4 v- V; J s& _8 I
8 b# R. C& M$ Y6 t0 t* }
经过仔细观察源代码,我发现了一个资源文件的导出函数。
8 q. K: a! Z4 ^3 M+ X0 nvoid ResMan::dumpRes(uint32 id) {
3 H0 M) g7 `4 L" ^8 K* s char outn[30];$ `+ y& S( E- C- j1 K/ M
sprintf(outn, "DUMP%08X.BIN", id);
$ M- n( ~; j: L5 l- h Common::DumpFile outf;: C, M' y5 K; O; d/ P0 d! s
if (outf.open(outn)) {
6 y/ D7 l- Q7 } resOpen(id);
/ b! R( O9 s$ e. R I& o MemHandle *memHandle = resHandle(id);
6 G4 J; O' |9 P/ t8 v outf.write(memHandle->data, memHandle->size);0 L# q/ `8 F# N q3 @1 ]
outf.close();
& @6 J6 k% w. C* ? resClose(id);: U G. Z7 e h6 C
}
. q9 [- w4 [* x2 S2 A# G0 q}
8 B4 r/ f ]7 e5 i" B2 w: T
$ r3 h$ q f, t( }4 [+ O+ P' U我又找到了一些各种语言的资源文件的ID; G# p0 U% U( B# N% U( }& _" x3 w
#define GAME_FONT 0x04000000# m u }# D9 B4 r
#define OTHER_SR_FONT 0x04000001
% ^ k2 R- f$ d% R#define OTHER_SR_REDFONT 0x04000002
' ^3 F1 N' J% R C2 c#define SR_DEATHFONT 0x04000003
+ A# N( u+ f7 |$ p) u) x3 S#define CZECH_GAME_FONT 0x040000041 c4 r- U( R/ y0 A3 n
#define CZECH_SR_FONT 0x04000005
8 a( n# |& p' ]) G/ I#define CZECH_SR_REDFONT 0x04000006
1 x" X$ w* b" B#define CZECH_SR_DEATHFONT 0x04000007* l/ [9 ~* P J* K0 P7 g
; y) w! f8 c, U) R$ J U8 h& g; O7 l这样,我在调试模式下顺利导出了一个字体资源文件。; ?+ G% E: Z8 G
接下去,我分析了一下字体资源文件的格式,制作了一个资料。
3 }+ v8 z) E, i( y8 g, o看了这个资料很容易就能明白。
/ ~% H* m1 b) V$ T( a' Z 3 O& c! \3 s* E! t
, O4 D4 R: j! j5 k" @ k( h+ P
从源代码里面找到的资源文件头和每个桢的头的结构定义如下,- s1 a* m+ @' o: \: m; G- K
可以和上面的图一起对照起来看。% \; Q% `, g4 g' [2 {
1 T+ |. N3 x, V) g7 s r* ~' j* `+ w! P
struct Header {* J7 O% N4 V" K+ z) x, n! K
char type[6];
, [4 q5 l) h; h! J6 g7 g uint16 version;6 C! n1 i# g6 M; y$ i. n
uint32 comp_length;9 ^( O8 o3 ?/ C& h4 x, l0 j
char compression[4];% c3 l2 p( @' D, o& p2 X; |, F
uint32 decomp_length;$ F) i% [ r/ Z
} PACKED_STRUCT; l4 h* A- C" @, d$ i7 D
7 }5 A4 M: G" m1 l% v: O. X n
struct FrameHeader {7 {3 t0 A6 E ?
uint8 runTimeComp[4]; G* e, u- V8 ?! O) P }( d
uint32 compSize;
* T& ]* Z2 X) r6 \1 ~ uint16 width;
* _& C' W8 @& Y x$ V! G# \. { uint16 height;
$ k# U8 _+ O' G/ k) s8 i8 y) h int16 offsetX;
/ {! q/ V6 P& A; X% N& r int16 offsetY;
_$ T3 P2 O# r: s8 ~};/ C1 f5 i' |0 W) `% |' h
0 t6 U7 g- F( F+ V5 o- S字体文件的每一个桢都定义了一个字母的字模,根据字模就可以在屏幕上画出每个字母的样子。& V" |$ D# a: u
每个字模用一个字节来表示一个像素。
/ ]! J0 P8 X) E: x: q" ^背景像素 0x00
+ O3 M+ t4 m7 m% J- S边框像素 0xC8
6 o. b5 m/ R' |3 s3 ? y字体像素 0xC1& _* d0 c4 Y, o- t# ?, i5 A
' s9 ` K1 O' u1 [
下面这张图片可以使大家对字体的样子有个感性的认识。: K7 I3 `9 q3 e. ^& z2 R
为了看得清楚,我把 0xC8替换为一个黑色的小方块。
6 A4 \% S, U/ p1 t+ { |