最近应C版的要求开始研究断剑1的汉化。* \( h/ N1 f4 `3 h7 F
看了一下scummvm的代码,看懂了大致的流程。
; c& r9 r3 q% P) K3 Q# {; N- U3 P; N; o; L7 R: M
断剑的包文件是由多层的结构组成的。简单的说就是大包套小包。. a- a! _' k. N! x' u+ ]& A
我下面先解说一下字体资源文件。8 k0 P0 N2 H5 B7 T2 L6 e
1 ~# z! b% W( ]经过仔细观察源代码,我发现了一个资源文件的导出函数。' \5 A- N: C* [" f1 B+ N0 I
void ResMan::dumpRes(uint32 id) {) `, A6 y8 P) I3 p
char outn[30];
- {( R1 \6 Y) W) w+ K; ^ sprintf(outn, "DUMP%08X.BIN", id);: K, i' p) b7 F1 u+ r, T9 f
Common::DumpFile outf;
1 p# M" I0 U$ c% N0 y" z if (outf.open(outn)) {
~+ f% w2 t8 ^2 \; p B6 g: e resOpen(id);
8 z6 g6 [$ w5 s n8 S# ^: x9 u8 }" {7 H MemHandle *memHandle = resHandle(id);
; u% H0 r1 F8 X6 S5 Z outf.write(memHandle->data, memHandle->size);) q5 T3 v" z7 T4 i
outf.close();
' l6 t4 `, c! P5 f resClose(id);
" i7 N' W' F7 ] }
1 y9 Y1 P$ u* ~}* f- k9 D1 n4 z6 u
4 Y4 r Y2 C# y4 ?' ^5 e% }) U. C我又找到了一些各种语言的资源文件的ID
3 R7 ~' C6 Y. j" R) u#define GAME_FONT 0x04000000
7 I& b' h- J. h0 X! o x#define OTHER_SR_FONT 0x040000015 ]5 j. X" z3 L7 B h$ h6 P( Z
#define OTHER_SR_REDFONT 0x04000002
7 \0 n( K$ N5 `" U9 h7 G" {' j8 E#define SR_DEATHFONT 0x04000003( _1 I# I( J" v+ A- q: I' h, j
#define CZECH_GAME_FONT 0x04000004
- o8 J; _2 t& c( Z2 p#define CZECH_SR_FONT 0x04000005
7 `. ~( c/ R3 l* F' v1 ^#define CZECH_SR_REDFONT 0x04000006! k1 Z% A' G; P/ f
#define CZECH_SR_DEATHFONT 0x04000007) a$ f7 k0 u& g4 Y
, F1 d+ j: r( R2 m! Q& i% |
这样,我在调试模式下顺利导出了一个字体资源文件。6 Q% P3 l6 x, q& V: T
接下去,我分析了一下字体资源文件的格式,制作了一个资料。2 j$ ^( t( k6 f, G
看了这个资料很容易就能明白。" Q. T' M5 |: H/ b) s( J% ]
) C! o& ^! q, V2 H
% n, X( Q( Q) `7 h; K从源代码里面找到的资源文件头和每个桢的头的结构定义如下,
! p% }7 V" ?; r" M9 L' i可以和上面的图一起对照起来看。: `+ b5 x$ ^( [
( x) v) b1 ^& b& S# g5 [0 N0 _
struct Header {
* a! g0 w/ G1 k; A8 f char type[6];" v6 M9 G2 ^" X, _/ ]
uint16 version;5 j; ~- v% O3 ]
uint32 comp_length;
- ]- g* C, O- A$ m char compression[4];
" S* ]- j: v/ i- X* S2 X uint32 decomp_length;
* r! K0 a( W: b0 Q( r} PACKED_STRUCT;
" d6 | z3 E% Y# B3 A: C
8 e. m4 l6 e, q2 `struct FrameHeader {
/ W; O0 ]9 \$ |' R* L uint8 runTimeComp[4];
" L, s w' A% _, [6 R: ?+ q3 B; M uint32 compSize;
4 P- d. g* g- Q0 H: G+ H uint16 width;9 P- T" w* ?% r# w
uint16 height;
# X( i9 I# Z9 e8 u int16 offsetX;4 I. k9 Q1 M$ d; d6 r
int16 offsetY;
0 p( P! w1 |3 Y2 E; z};& e* D( T- s# F; |7 P7 u7 p/ V
; G3 G- L0 R9 _2 I [8 h字体文件的每一个桢都定义了一个字母的字模,根据字模就可以在屏幕上画出每个字母的样子。
8 l: E3 F, ?: t! r每个字模用一个字节来表示一个像素。; D3 f/ J s& y
背景像素 0x004 n* C% F {( v0 f8 `' h0 d5 t
边框像素 0xC87 a! `+ k8 a- h2 v- r: v
字体像素 0xC1
( M% W7 j" N0 ^; \! ]* V; i# b9 D3 u" A$ k' n: d- B2 o
下面这张图片可以使大家对字体的样子有个感性的认识。
, }7 o% f3 @: L! G1 h为了看得清楚,我把 0xC8替换为一个黑色的小方块。9 y% _, |! B Y, ]( c. Z
|