最近应C版的要求开始研究断剑1的汉化。$ v" Z, ^" G1 E; ?
看了一下scummvm的代码,看懂了大致的流程。
: Q3 i i, N: d& x
% G% ^6 g' G0 y/ n, U断剑的包文件是由多层的结构组成的。简单的说就是大包套小包。- j7 A% y: N/ l l4 E1 H3 H
我下面先解说一下字体资源文件。0 U6 r% ~+ ?4 i: n" v6 C
0 k. ]( |; Z) C经过仔细观察源代码,我发现了一个资源文件的导出函数。# Y; @6 Z/ Y' ]! j( m
void ResMan::dumpRes(uint32 id) {0 v H$ l" D5 a9 n
char outn[30];4 G% A3 v$ [; R. |
sprintf(outn, "DUMP%08X.BIN", id);5 f1 \. j# V8 ~: R# }" b" c! ?
Common::DumpFile outf;
4 s1 V2 W z) \6 W3 H if (outf.open(outn)) {
+ }( {% U. f& Q' e resOpen(id);3 \2 I/ h6 @5 v- i' [5 B% ~: x
MemHandle *memHandle = resHandle(id);3 Q9 w. [: X3 A G3 u3 P3 a5 B* f
outf.write(memHandle->data, memHandle->size);0 @+ V/ ]% N {8 w
outf.close();
( O. C h3 ~( B7 |% f6 p, }' W" ? resClose(id);7 A+ C+ B" c, ^: X
}
. w0 a- z% E! I7 U4 L}
2 j5 D2 a5 Q) }% ?% e
7 s& ?% i: R( {6 Z) Y. g我又找到了一些各种语言的资源文件的ID- D% H/ U* d3 T6 I+ v/ v/ x
#define GAME_FONT 0x040000009 g2 m. t6 P, @8 p/ c4 G/ `
#define OTHER_SR_FONT 0x04000001
; j e# m% B) h9 c#define OTHER_SR_REDFONT 0x04000002: ^7 t( y0 Q$ a: V
#define SR_DEATHFONT 0x04000003
( K, \# S9 d# |$ `#define CZECH_GAME_FONT 0x04000004
% F4 q5 X. r# P#define CZECH_SR_FONT 0x04000005+ y0 k% X) f9 d u/ G
#define CZECH_SR_REDFONT 0x040000069 V( ^* e# Q9 u' [, F' i+ D
#define CZECH_SR_DEATHFONT 0x04000007
8 _$ A5 r8 s4 Q" c4 V2 p
6 m! z6 y' c: d% G' e; e这样,我在调试模式下顺利导出了一个字体资源文件。6 F$ Y, J5 m7 S) M) I% U
接下去,我分析了一下字体资源文件的格式,制作了一个资料。
# {) \# R: V+ {6 W% i: o( I; q看了这个资料很容易就能明白。
+ \0 m8 t T$ d" ~6 }1 g/ Q1 \- \( M
1 B, G. R% `; w9 i$ l1 e
$ I* ]' W. n; a w5 p从源代码里面找到的资源文件头和每个桢的头的结构定义如下,: Q v" a% e* Q7 _
可以和上面的图一起对照起来看。
6 M/ n, l" R% q0 a! ?
" n% @& t) X1 S8 istruct Header {0 |; c% n% s6 H; U1 f9 s/ E; o
char type[6];; @2 o5 R/ J1 ?
uint16 version;7 ~; k0 p) G2 O: z
uint32 comp_length;
6 N( L I( d0 i, a+ J; U% t char compression[4];! Q2 u' q1 R' F( F( O9 K
uint32 decomp_length;
" [; v& b7 x2 r4 P# q% q2 m! ]} PACKED_STRUCT;
1 ^7 W7 B! b4 F- h; m4 I
: l- e8 _) y- a; X$ \struct FrameHeader {
0 i8 U* ~& u! Z8 S uint8 runTimeComp[4];
1 A+ e8 M8 u& d* J# R$ G uint32 compSize;. y' t+ H9 B# l# h6 I8 y
uint16 width;* t/ I9 F) Z/ A/ e/ }& U; f6 B
uint16 height;7 H* q; U7 m7 t
int16 offsetX;
o; V6 v' \: N int16 offsetY;7 O- C4 |/ }, h
};
' j: c+ g- X& W( p1 R
. ?% R2 [2 ~ b6 ?- e# K8 s |, ~# O字体文件的每一个桢都定义了一个字母的字模,根据字模就可以在屏幕上画出每个字母的样子。
3 N; c: C/ a: }( _2 n每个字模用一个字节来表示一个像素。
$ b# v6 u% _1 w# g; ?背景像素 0x000 A5 {' V% {6 b3 ^; B: n
边框像素 0xC8% i3 C+ m# U9 z, t+ O2 ~
字体像素 0xC1. H" a5 s3 a' V/ S/ T
# x( `6 y2 g% _2 E* x
下面这张图片可以使大家对字体的样子有个感性的认识。9 I+ F. ?3 P$ x8 ?
为了看得清楚,我把 0xC8替换为一个黑色的小方块。; E+ c3 N) J0 `) t: i
|