最近应C版的要求开始研究断剑1的汉化。) {! R- |- q* [" F
看了一下scummvm的代码,看懂了大致的流程。
+ F2 A2 a; D/ |- Q2 ~, V
) S' v9 j% l; g- I! \/ r A断剑的包文件是由多层的结构组成的。简单的说就是大包套小包。
: E8 O7 `$ ^( c( d我下面先解说一下字体资源文件。
9 O2 j0 B9 _1 ]! S8 L& G0 ~: ^* q
$ m7 E# ]+ R. @, R经过仔细观察源代码,我发现了一个资源文件的导出函数。
7 s3 q. @! k+ U, J- ~void ResMan::dumpRes(uint32 id) {1 s! f: ~3 j- s8 g$ p( J* N+ {
char outn[30];
0 ?: D3 n E# H8 w6 d% `8 g3 [6 u; w sprintf(outn, "DUMP%08X.BIN", id);
1 g' z) p b1 Y% f Common::DumpFile outf;8 D$ b9 m" q m: F) P* D
if (outf.open(outn)) {# v; ~( a3 W- t8 d, t5 \! }5 |; _
resOpen(id);. ~4 M/ a" G6 z) b- p. f
MemHandle *memHandle = resHandle(id);) J3 m: V) U0 Z- N7 o6 d# g3 p* b8 E
outf.write(memHandle->data, memHandle->size);
9 ]+ |: E# r- S: D* e0 w outf.close();
5 }) o7 j& ?4 @ d resClose(id);& n4 T/ S% I7 l3 x6 Y# Q
}
8 R( U# q- p! {5 I}0 k0 l6 v+ N2 y. I
. W0 g: U1 u( Q8 Q4 H
我又找到了一些各种语言的资源文件的ID
m# M* |. e# Q! x# ^: k% J#define GAME_FONT 0x040000008 o4 A1 a8 ] H. U
#define OTHER_SR_FONT 0x04000001
* m' W/ P1 O" Y- L8 b+ E#define OTHER_SR_REDFONT 0x04000002
; \( F8 I9 Y4 F$ f; B8 {9 @6 J#define SR_DEATHFONT 0x04000003
: Q- j# t& ~# C' c#define CZECH_GAME_FONT 0x04000004
0 u' f4 |( g; V1 e+ ^+ i/ T2 u1 A#define CZECH_SR_FONT 0x04000005
- C# p: I7 Z/ e#define CZECH_SR_REDFONT 0x04000006- b0 D; l1 h2 e" {/ i* g
#define CZECH_SR_DEATHFONT 0x04000007
; v8 L. q5 [2 O% c" h3 \ ~ h7 m
- P% o; I8 n" T- K' B这样,我在调试模式下顺利导出了一个字体资源文件。! e; a: p/ Q' s) N! V8 l" p5 x
接下去,我分析了一下字体资源文件的格式,制作了一个资料。9 H+ K& I+ y3 i, _* O
看了这个资料很容易就能明白。
2 X. d( H7 b, m9 O/ B " Q4 E( T9 D) V" G
* ?9 e5 Z+ f5 B: ]从源代码里面找到的资源文件头和每个桢的头的结构定义如下,
; |! q$ G2 r a可以和上面的图一起对照起来看。/ }8 r1 W5 d3 a0 E/ k5 Y% m
: g0 w3 ]% y+ d5 R2 Pstruct Header {
! ^6 B4 O p5 k2 w) m( |! U char type[6];# Y R& B8 ~* H+ F# o9 @5 Q
uint16 version;+ r1 `+ _6 e3 {6 p0 r0 M
uint32 comp_length;+ j [, U8 r, k6 }/ w
char compression[4];
, p( y# z$ z1 |1 l uint32 decomp_length;' {! `- f! Y1 C4 V& d0 i
} PACKED_STRUCT;
7 D W; G# [4 j5 [, C' F2 w( `, L3 H
struct FrameHeader {6 s8 q. e8 D6 w2 O4 U7 S
uint8 runTimeComp[4];$ V6 b" k( Q% ?' e& B. V. h" o
uint32 compSize;2 y% r" \( c4 M: y
uint16 width;: f' z- {9 b- K3 n# X ?* E" E7 C
uint16 height;- L! Y- S5 b9 f ]' D5 y& `
int16 offsetX;
# h; c/ e' P5 i int16 offsetY;
- Q2 S: J5 W7 h5 B% \};
9 Y' |, p" ?: w$ U8 Z/ Y
4 g, I* G# F+ T0 j% P. Z字体文件的每一个桢都定义了一个字母的字模,根据字模就可以在屏幕上画出每个字母的样子。, \% U! m9 l/ j9 G: P
每个字模用一个字节来表示一个像素。
+ [" C5 ^+ H( s) j$ s$ Q& F背景像素 0x00
+ i: B% s: J$ L1 b边框像素 0xC8
; E6 z5 F q" `4 `字体像素 0xC1) l( N6 d# L7 G5 ?& R3 }
6 Y2 u \' @; M& R- [8 M$ `下面这张图片可以使大家对字体的样子有个感性的认识。
( f8 L% Q# \: c6 v为了看得清楚,我把 0xC8替换为一个黑色的小方块。
8 Q. e2 l7 e+ u( K7 G |