最近应C版的要求开始研究断剑1的汉化。
- Z0 {7 W. j v$ n看了一下scummvm的代码,看懂了大致的流程。
( d! n* q6 a; H, p( x3 t
0 `# B+ r& X' D: y: m断剑的包文件是由多层的结构组成的。简单的说就是大包套小包。: C$ O- r M9 {" V; D' f& }
我下面先解说一下字体资源文件。% ?+ b. d2 L# `) a
- v4 A1 E! ?: w9 C! [/ ^ c
经过仔细观察源代码,我发现了一个资源文件的导出函数。" O7 a. `# [* ^- b
void ResMan::dumpRes(uint32 id) {$ c. j0 \/ I& `! M: m4 P' x
char outn[30];1 }' s Q% @6 Z4 i
sprintf(outn, "DUMP%08X.BIN", id);
' p3 S, O: o/ R8 d9 S) U Common::DumpFile outf;
$ H6 O# X5 m8 J! r6 r if (outf.open(outn)) {
# u. ]/ F0 a$ f resOpen(id);# Q. ~; Y: O2 H8 [5 `. w
MemHandle *memHandle = resHandle(id); K& N3 K# K2 ^ o
outf.write(memHandle->data, memHandle->size);
% ^* G8 |$ R% Q outf.close();: Y. L7 F8 i- x& B$ i# _
resClose(id);$ b7 ~& P& n; d/ {$ c( j3 n
}
4 b* z7 H. }2 h}# p4 i2 S% U! W0 b: @4 p
6 c1 @- x$ I" M9 b我又找到了一些各种语言的资源文件的ID
) F) d+ H* v0 a$ `2 N' F#define GAME_FONT 0x04000000
, k3 P6 z5 W1 P' D8 S* q3 u#define OTHER_SR_FONT 0x04000001
: O' }6 X- |6 ]/ V" x#define OTHER_SR_REDFONT 0x04000002
( I6 t! u' e- v- l3 m! E#define SR_DEATHFONT 0x04000003+ U1 k2 E: D* D- S. s K9 E! s& z2 M
#define CZECH_GAME_FONT 0x04000004; @. E7 p3 i2 p5 u, z2 r. K) n
#define CZECH_SR_FONT 0x04000005! z; S0 }& F# l& q% q! b0 ]& r
#define CZECH_SR_REDFONT 0x04000006
8 \4 ^* e3 \( r. l3 f2 ?#define CZECH_SR_DEATHFONT 0x04000007
8 _' m6 R5 K4 l4 E+ ]0 }4 U
4 v* n- o2 P: X6 J% v" b3 k4 ]# j3 D这样,我在调试模式下顺利导出了一个字体资源文件。
4 }$ {2 ~ |3 ?0 s' D接下去,我分析了一下字体资源文件的格式,制作了一个资料。5 b k6 |: r& @7 ?! H: L& p# Q, u! `
看了这个资料很容易就能明白。
: |6 p! p8 X- D/ x: D/ ? 3 N/ V0 G5 d( ^& B! `
! \$ O# N+ T2 c3 q7 b从源代码里面找到的资源文件头和每个桢的头的结构定义如下,
- _8 i( _: ~. _0 h0 H' T7 O" s可以和上面的图一起对照起来看。8 F( b2 F- u- ~# P
9 Y* z4 `2 z1 o* p( t
struct Header {$ w# f; d! K) T$ t
char type[6];
% s* x6 y9 l; d* s# s uint16 version;, t* \! l8 _# q
uint32 comp_length;
) }' [$ @ f1 T9 B/ c char compression[4];3 y) e1 s( R/ [9 @% J
uint32 decomp_length;+ ^; F" M( D0 R7 M! B @' g
} PACKED_STRUCT;. B! a; N/ U* y( c( y2 x' N
8 e& O; u+ t. H# b; d8 sstruct FrameHeader {( h: W" i Q9 f
uint8 runTimeComp[4];: p. q. d) E. \" I5 m# _
uint32 compSize;
! M* y' `& h) @, b' K$ O uint16 width;
: \5 g9 }. @1 L uint16 height;5 e H+ a# Y4 K" V
int16 offsetX;) g- B! @& y6 O. @$ G; i
int16 offsetY;* u% R# s& v! F# h4 r. d+ D
};
2 R. a) H v3 q S- P6 @
0 x6 k# k# B* u, |# l. b2 S字体文件的每一个桢都定义了一个字母的字模,根据字模就可以在屏幕上画出每个字母的样子。5 L2 j& q5 N- T; I8 i% a5 ^
每个字模用一个字节来表示一个像素。4 S7 T' ]1 ^0 z# i
背景像素 0x00
3 z' s& g( C, v" x) B; N# n& U边框像素 0xC8* c" O2 L$ C6 z/ n( g; M
字体像素 0xC1
; n& m+ c$ }$ I. R4 m- D+ ~7 F: ?6 E% }9 a M
下面这张图片可以使大家对字体的样子有个感性的认识。# G; G+ f# s0 j+ K+ e1 i: r1 X" C
为了看得清楚,我把 0xC8替换为一个黑色的小方块。5 v9 o6 ]/ ]7 q7 i1 n. h
|