最近应C版的要求开始研究断剑1的汉化。& F/ W2 m" M1 Z: R4 B, m5 x
看了一下scummvm的代码,看懂了大致的流程。
! C# C8 {6 t: W7 |. G4 b, ?) Y
, t' Z8 G& C* W6 S2 Q* r y: ]$ y断剑的包文件是由多层的结构组成的。简单的说就是大包套小包。4 _8 E3 h' P; i: _- I
我下面先解说一下字体资源文件。
5 S; h% R) {0 e6 P; R1 ^9 W4 [; C# c$ q# q; D- D! I2 a5 {4 q5 J7 d& v
经过仔细观察源代码,我发现了一个资源文件的导出函数。4 O% n: N2 a$ i ?
void ResMan::dumpRes(uint32 id) {
n( N, Z+ T$ W2 G char outn[30];
7 \0 b9 Z" P8 b1 N sprintf(outn, "DUMP%08X.BIN", id);8 V a; ?( W9 ~* _/ _6 J
Common::DumpFile outf;9 b5 V0 _" w: S
if (outf.open(outn)) {/ q: z) \: D: K& ]% w" z
resOpen(id);
6 }, q8 J0 a- k MemHandle *memHandle = resHandle(id);
4 w4 O1 c4 @+ j1 r X% t& G outf.write(memHandle->data, memHandle->size);! u7 ]; q8 y V$ X C' K' ~
outf.close();
" D$ V# b. @& M; q, _( l* P! c resClose(id);
7 Z; |& m$ d' c. @, F" z1 y) { }5 d" ~2 I3 ~7 v4 j1 i8 D
}
7 X; x P) M. G4 P2 h p' y) \# O+ y
我又找到了一些各种语言的资源文件的ID& {- F3 ?1 y& u$ n9 J, p
#define GAME_FONT 0x04000000
: e" n3 |; m0 Y0 E/ N" E# B#define OTHER_SR_FONT 0x04000001
3 z$ ^3 X- v) H, e#define OTHER_SR_REDFONT 0x04000002
2 S" Z+ ]$ |7 L#define SR_DEATHFONT 0x04000003
* \+ y( F+ f. M7 R, }1 d% V5 X#define CZECH_GAME_FONT 0x04000004! V- P/ @ Z# z; E+ o
#define CZECH_SR_FONT 0x040000058 t" c" z* d' z$ n. k) V. `; P. W
#define CZECH_SR_REDFONT 0x04000006
" O4 \0 _$ R$ c$ D% y#define CZECH_SR_DEATHFONT 0x04000007
- R8 G; `! @7 F9 X4 C
9 @* _" Z( A9 T e4 [这样,我在调试模式下顺利导出了一个字体资源文件。
& L, i% z# X7 x+ T! l& J t接下去,我分析了一下字体资源文件的格式,制作了一个资料。
/ a. Q8 x2 ]" Q$ T" @8 `( o% X: s看了这个资料很容易就能明白。$ f' O7 u% M3 V* }
( ^. k8 W8 [( s
5 E9 `5 d8 x3 h- v V从源代码里面找到的资源文件头和每个桢的头的结构定义如下,
) M1 C Z! c- l0 H' s$ {: R2 H可以和上面的图一起对照起来看。
1 h* m& s# ^' r6 B" r7 H9 k4 y( U1 U3 W
struct Header {
7 o/ v+ U6 L; q9 S% X/ I% d8 Q char type[6];
$ y ^) `6 j: i4 ~ uint16 version;! V% T% A9 [6 Y" u
uint32 comp_length;
9 `: V2 p/ y# B6 S- f7 I0 E char compression[4];
1 o: K2 w4 n0 @ d9 s uint32 decomp_length;
' S. x8 N: w$ }3 T+ K* {1 o2 _6 g} PACKED_STRUCT;
+ s- O0 Z' j W# L, S8 @' x* k0 v* y" j. p
struct FrameHeader {
! n$ D! D& c$ W4 R: f. [3 p: w uint8 runTimeComp[4];* n6 G& ~3 \, M
uint32 compSize;
, V9 K! S; B7 _/ ~ uint16 width;
/ t8 W& z! f; r uint16 height;4 z: R! U; C; Y. i& k8 @, g
int16 offsetX;6 s' h& X& L9 s
int16 offsetY;- b# P# T. e! t& Z9 t8 n
};; Z, ?. @$ N/ d. k3 `
: X2 b( e% ]4 V% z$ d2 M! v
字体文件的每一个桢都定义了一个字母的字模,根据字模就可以在屏幕上画出每个字母的样子。
3 F; A" b. x. H( E每个字模用一个字节来表示一个像素。% f0 r( I B# h- A ~: B+ Z# R/ E
背景像素 0x003 `- [4 F, q1 l) j4 f; R
边框像素 0xC8
9 ?0 c2 R' c7 u; e字体像素 0xC19 `6 X6 V q% |7 D# ?
; f" z: U) K- ]$ V2 m下面这张图片可以使大家对字体的样子有个感性的认识。
( `) a7 z, @1 u为了看得清楚,我把 0xC8替换为一个黑色的小方块。, B) c& o/ B) H, W
|