最近应C版的要求开始研究断剑1的汉化。* |2 \! s6 H! V5 ^$ X
看了一下scummvm的代码,看懂了大致的流程。
. o: P. Z5 m+ f6 o! o% H. F+ ^( U; J( I. D
断剑的包文件是由多层的结构组成的。简单的说就是大包套小包。
. Y& J( e7 Y/ L( R S; Q. g; |我下面先解说一下字体资源文件。
$ y. Z' m/ B3 ^) a$ q4 W) a9 R: V: Z# n9 ?
经过仔细观察源代码,我发现了一个资源文件的导出函数。) a1 C' l1 z2 u; G* D% l
void ResMan::dumpRes(uint32 id) {
6 c; I8 b! l$ V: z' w g s char outn[30];* F( n" S. M* R; A' H# J
sprintf(outn, "DUMP%08X.BIN", id);
. f* z. A& v5 h ? Common::DumpFile outf;
! Q0 A( X- u" h+ \+ j if (outf.open(outn)) {3 z+ v- g: ^ U# K& X- _
resOpen(id);4 ^6 o# B( v1 D. d
MemHandle *memHandle = resHandle(id);8 R j# b; n! w( h
outf.write(memHandle->data, memHandle->size);$ \5 F3 d& r+ J; \/ I/ @
outf.close();7 V K% x3 L, Z4 j0 k
resClose(id);
/ T7 S' x) m+ ^4 t+ n5 y( U }0 a- X1 v# i+ p/ y: k
}
. F& Z$ h$ Y6 E) g' \
+ s( C6 l) T) x1 ]1 ^- x我又找到了一些各种语言的资源文件的ID4 v4 o$ J S2 `* T8 I
#define GAME_FONT 0x04000000; Y: P p6 ?6 P
#define OTHER_SR_FONT 0x04000001
* d, D( L8 N0 K9 x: J& h9 p#define OTHER_SR_REDFONT 0x04000002: N/ F D7 s/ S& W3 G- R
#define SR_DEATHFONT 0x04000003& {% i9 C7 g2 B- n+ F( u8 [
#define CZECH_GAME_FONT 0x04000004
, }1 W1 w5 H% g) ?6 C& Y#define CZECH_SR_FONT 0x04000005
( Z/ q, ?9 M W( r8 G#define CZECH_SR_REDFONT 0x040000065 [4 |: |, L6 t% i( }
#define CZECH_SR_DEATHFONT 0x04000007# U- L- J' E/ }. E$ ~/ t( q
) H, ~8 @. c( T* m z
这样,我在调试模式下顺利导出了一个字体资源文件。1 x3 y0 p! w8 q( Q
接下去,我分析了一下字体资源文件的格式,制作了一个资料。5 ]8 Q$ B8 d% n8 R
看了这个资料很容易就能明白。
2 K& c0 j8 `/ p4 U/ A, z - U* B/ V S/ b4 C
9 i6 R. M+ }2 I4 P6 s7 \从源代码里面找到的资源文件头和每个桢的头的结构定义如下,3 ?8 g: X6 c) e i
可以和上面的图一起对照起来看。
, X$ u8 |& D8 F+ Q
; i" h7 M) f$ mstruct Header {/ f3 f' q0 s. ]) X" h+ s# l, }
char type[6];5 p, _/ ?2 Y1 \- p2 E
uint16 version;$ |! m$ X" ~# G) m" u
uint32 comp_length;
2 s- \, a" Y7 q; Q/ i char compression[4];7 j0 G5 X( l8 ?; ^1 E5 G/ i; S" U
uint32 decomp_length;
1 I% Z# A& b# C" f} PACKED_STRUCT;
5 w. M4 W! I9 F: m+ e0 i4 G! G4 i, s/ K, ~+ q
struct FrameHeader {
: O+ P& x' D; @! \# f# G6 ]% I& o uint8 runTimeComp[4];
* `9 d) Z: v, C9 T5 b# x5 R0 o uint32 compSize;6 h; }3 z: G- w+ s/ Z! z. I
uint16 width;3 c. m. f/ f z9 W* f& X. [
uint16 height;
3 L K' ^4 V" l2 W; R. n int16 offsetX;& m3 m7 u z& z5 i+ A
int16 offsetY;
9 z' C' t: }" A2 a+ D* G; k6 Y};/ `8 C1 r' ?2 r% J9 y
) H2 X5 j, [' [6 R3 k& Z
字体文件的每一个桢都定义了一个字母的字模,根据字模就可以在屏幕上画出每个字母的样子。5 ?) g2 B' g/ s& Q
每个字模用一个字节来表示一个像素。
, T5 d! h0 Y" }! ?背景像素 0x00/ h0 }1 C* x* M) l
边框像素 0xC8# z7 X( y. @8 R
字体像素 0xC1
! n; i% a4 r5 S. ]# _, z+ A! i0 |$ u) i e) p
下面这张图片可以使大家对字体的样子有个感性的认识。8 X2 m# g6 B6 ?% f$ {% H: A
为了看得清楚,我把 0xC8替换为一个黑色的小方块。
" o' Y7 w1 L( ?! {+ B5 z* e0 G5 h |