最近应C版的要求开始研究断剑1的汉化。9 F; O7 n& {# U4 c9 M: t6 X
看了一下scummvm的代码,看懂了大致的流程。& r7 ?4 |2 o f9 S. \
& n4 _1 G3 P4 ~5 s+ |2 k% Y
断剑的包文件是由多层的结构组成的。简单的说就是大包套小包。
1 p( w# f9 e9 P) C6 f$ L1 ?我下面先解说一下字体资源文件。0 }$ y: F; H8 ^7 g7 V7 a" ]
$ I/ M# O5 q6 [) V: ?0 r经过仔细观察源代码,我发现了一个资源文件的导出函数。 P: i5 T/ P4 ?. g; I
void ResMan::dumpRes(uint32 id) {4 B) u2 K X5 {/ z0 `
char outn[30];
9 M3 G& I0 V) z/ d8 x4 ` sprintf(outn, "DUMP%08X.BIN", id);
5 M/ U4 j, _, u; W: d Common::DumpFile outf;
! a; a8 R3 a' q if (outf.open(outn)) {
( V% S# _) t; u4 d! s$ T resOpen(id);
3 [ n9 l6 o3 _5 e0 t6 h1 R; T. K MemHandle *memHandle = resHandle(id);
; d' N. R& y8 e outf.write(memHandle->data, memHandle->size);
3 T: f+ T# s. q4 G outf.close();5 b+ ?8 K" r) c* n( T
resClose(id);$ W- S f4 A( r( o Y( g2 q
}
( B) b/ ?9 b3 f7 N. j# i' e} n! M; P/ Y7 x4 t, d3 d2 }
2 N6 z& d' a4 u+ d' r7 N+ u: z" u" n
我又找到了一些各种语言的资源文件的ID
& k4 t+ j3 v3 {- [# m+ W. [#define GAME_FONT 0x04000000' P" ^% X& n/ {: ?/ l5 ]6 _: }
#define OTHER_SR_FONT 0x040000015 v# c. @$ {3 P6 F
#define OTHER_SR_REDFONT 0x04000002% d9 l) P9 N- X1 E+ p
#define SR_DEATHFONT 0x04000003
9 p$ k! ?+ K; Z+ r0 c#define CZECH_GAME_FONT 0x04000004
( V' _/ S, Z" u; Q7 z4 z4 z* C#define CZECH_SR_FONT 0x04000005
. l0 M$ |+ l$ z, C' \: D7 m#define CZECH_SR_REDFONT 0x04000006
6 M. n. R! P3 I8 t% I( U t#define CZECH_SR_DEATHFONT 0x04000007
7 F. Y# V6 a5 z! k% C/ R3 X( W( Y1 u X5 u* V9 `7 U
这样,我在调试模式下顺利导出了一个字体资源文件。
& `, T0 I$ R d6 x1 y- J接下去,我分析了一下字体资源文件的格式,制作了一个资料。. a: s; m% }2 }0 j
看了这个资料很容易就能明白。, c8 R9 e8 T3 \) A2 F: z, T. d/ H
0 `- j5 E- d0 w, @6 o
; Z$ ~) ]3 }9 ]2 _+ ]从源代码里面找到的资源文件头和每个桢的头的结构定义如下,- y5 S/ {2 V [" c9 ?
可以和上面的图一起对照起来看。3 c) X) N& Y {% t
# \) U$ [3 u( ]! [% Q, p8 [: ?
struct Header {+ R8 H( Y" V! w* V. ^2 S& r9 u2 ^; f
char type[6];
$ h4 f" w) @. } uint16 version;
& H8 l( }0 p4 p1 M6 G3 W5 p, D" Q uint32 comp_length;0 Z+ R( L8 {- ~8 y6 X
char compression[4];
0 D; b/ e6 j5 W# s uint32 decomp_length;' r+ e& w! E# h- V* _5 @7 T, A
} PACKED_STRUCT;
8 @/ n6 I7 |8 F n' J. M A: s/ V3 q" i4 d3 n
struct FrameHeader {
% P. U: E1 I( _2 r5 c5 O uint8 runTimeComp[4];' h. O, g+ B0 g7 B0 K6 v
uint32 compSize;+ w9 N6 E4 j" i5 u {+ u! O/ L, G
uint16 width;+ P% r. N! \% L" J: ]
uint16 height;
" A' s/ M- |. u) g7 ]; K int16 offsetX;
/ |- T4 J0 V1 _9 } int16 offsetY;
4 W/ L7 a& P7 S* O# `};
1 |- T) x, @5 f3 Z6 x9 }4 @1 j
4 S+ }) @/ B4 _" U字体文件的每一个桢都定义了一个字母的字模,根据字模就可以在屏幕上画出每个字母的样子。
: O% u" q; g! J0 I1 y) i! N3 f: M每个字模用一个字节来表示一个像素。0 i! T+ p& `9 c6 g" J* p9 p
背景像素 0x00
' o1 G1 T K3 W9 `3 t+ H边框像素 0xC8
! N/ G% ?* B9 q字体像素 0xC1
4 F0 A9 Q' d$ M5 F- C% D+ k/ l- r$ Q( L' S. D
下面这张图片可以使大家对字体的样子有个感性的认识。0 f5 y0 J* ]$ o5 f
为了看得清楚,我把 0xC8替换为一个黑色的小方块。
0 }, d0 _6 \' r |