最近应C版的要求开始研究断剑1的汉化。
, I8 Z8 O' ?& V8 |$ E看了一下scummvm的代码,看懂了大致的流程。7 Z0 i/ ]4 g$ s
) u, `% { g5 L( J
断剑的包文件是由多层的结构组成的。简单的说就是大包套小包。
4 `5 y* h6 a# n% E" H4 O. {我下面先解说一下字体资源文件。
! N3 F0 ]7 \7 l" c" x
1 I5 u* F$ H" m7 K+ [经过仔细观察源代码,我发现了一个资源文件的导出函数。) j* W: z3 d# p
void ResMan::dumpRes(uint32 id) {
* p7 @# E7 J1 D6 w; _ char outn[30];% N& t1 y' U: o
sprintf(outn, "DUMP%08X.BIN", id);
2 d) g* |, ^, l$ ` Common::DumpFile outf;
! v+ f2 i2 b8 Q+ x/ t/ h8 a( q if (outf.open(outn)) {; ^$ N$ z; B' a3 N4 G7 G2 M2 \
resOpen(id);
% q7 x+ i3 E4 p \ MemHandle *memHandle = resHandle(id);6 S$ [/ ~/ r$ N/ m
outf.write(memHandle->data, memHandle->size);( {' l+ a7 z' k. ]
outf.close();
8 D# H) z9 K) X# K' _. D e resClose(id);
9 ~" F" H6 L- G* P* o; w( t; q }
4 Q2 }2 u$ A3 ?" h}
/ ]' d/ X8 @+ x" a$ m Z- @
* n' A1 U4 u5 r& a我又找到了一些各种语言的资源文件的ID
( j: j0 t6 e& q#define GAME_FONT 0x04000000) P$ R6 E& `4 s; D
#define OTHER_SR_FONT 0x04000001
5 J& D7 }" Z* g' e( W8 ^4 D& P#define OTHER_SR_REDFONT 0x04000002
5 u; V* h3 J7 h" n: {+ |; Y2 T9 c#define SR_DEATHFONT 0x04000003
3 P$ f: o+ c" u4 o8 o- I" A#define CZECH_GAME_FONT 0x040000049 \, C d% ]( r3 g
#define CZECH_SR_FONT 0x04000005
& P& W+ d; w) M; H#define CZECH_SR_REDFONT 0x04000006' q0 L' j5 ~# b* p* U$ K6 Z; l
#define CZECH_SR_DEATHFONT 0x04000007
0 U- b* v0 m4 \5 Z% q
9 K S& L$ v) t( }$ q% j6 t8 I这样,我在调试模式下顺利导出了一个字体资源文件。9 O, }& h7 i ? m7 w0 I
接下去,我分析了一下字体资源文件的格式,制作了一个资料。
6 A/ I* L8 T* d: a* P看了这个资料很容易就能明白。0 Q q( c% r' R
7 a5 x! T7 R. G, B: ~. s" M2 d. q7 S
从源代码里面找到的资源文件头和每个桢的头的结构定义如下,
" ^+ H) W ^4 t" ~/ n可以和上面的图一起对照起来看。1 o, [7 g3 i1 j* a
; t K8 L) Y8 V, a2 p* k1 n8 Istruct Header {
4 s1 d! O5 o) t1 Y) ~5 t char type[6];' d O" R2 I+ q
uint16 version;( p Q3 J9 N: M( L0 \
uint32 comp_length;
4 I! w' B4 |. V) ^5 P: D _+ |' ` char compression[4];
- N R: z4 d4 n: o/ `6 p uint32 decomp_length;
: {7 C! F9 b2 i6 u$ ^ W} PACKED_STRUCT;
! W4 H8 w, R$ @' L6 ?# h) F
6 S2 q1 l/ R( u6 s$ @( m) q5 Vstruct FrameHeader {
9 w0 E, d7 H# E+ U z; O' K: F uint8 runTimeComp[4];
2 k8 q$ V7 [5 P7 X; k6 ~( ~ uint32 compSize;& v) n7 o% P6 j/ M; J
uint16 width;; e; q' ?; H$ _2 q
uint16 height;. a5 b: B3 {) S6 g' i
int16 offsetX;
- E W: i% ~6 b7 W# r# X int16 offsetY;
4 n; \- f5 f, U2 |$ E( Z' F6 S# W* h};
$ ~7 x: k- X2 T5 y# f$ {
. \( e5 }4 g% U% V, w9 N字体文件的每一个桢都定义了一个字母的字模,根据字模就可以在屏幕上画出每个字母的样子。0 J+ z+ o2 V: |/ d: I) T* _# i
每个字模用一个字节来表示一个像素。8 M# e/ h+ Y$ t5 i+ y
背景像素 0x00
8 N2 N& Y! n3 w5 X边框像素 0xC8) s' q5 m$ v8 H! f2 w# f7 S9 R' P) A. x
字体像素 0xC1
# s+ }) j( B3 _) @3 A6 \6 r( N, x! ]! o- ]0 a2 Q
下面这张图片可以使大家对字体的样子有个感性的认识。
, x) a7 L$ E2 |为了看得清楚,我把 0xC8替换为一个黑色的小方块。
8 h6 }" O1 g% E) s z |