最近应C版的要求开始研究断剑1的汉化。2 j( c+ J% Q( K6 ?
看了一下scummvm的代码,看懂了大致的流程。7 V# L. Q" U. O& V5 @8 K. i* F
! s. w% H1 e7 ^
断剑的包文件是由多层的结构组成的。简单的说就是大包套小包。, ]$ E7 Y* P" w8 a: g. v/ H
我下面先解说一下字体资源文件。
0 I( p/ y! b- t7 W3 R
/ g$ l$ M! a- o, z$ f0 b$ s: Y经过仔细观察源代码,我发现了一个资源文件的导出函数。
! a* P8 D/ n+ b8 i! Evoid ResMan::dumpRes(uint32 id) {
) j, A" K* }. a8 H9 o j) F char outn[30];
8 J4 f- S: ~$ r$ H9 @ sprintf(outn, "DUMP%08X.BIN", id);
6 O2 N' D9 y! L4 k) {. Z Common::DumpFile outf;
P5 M5 G* d0 u- b' _# O N) W if (outf.open(outn)) {
& O7 z3 w- @# e' a6 H resOpen(id);" F4 c2 T e$ O1 }9 s' p
MemHandle *memHandle = resHandle(id);( i+ l1 K7 F2 R8 @2 U( `! t& @
outf.write(memHandle->data, memHandle->size);4 N! N9 T/ ^8 e( X0 o/ X( @
outf.close(); n! [4 z$ o1 O
resClose(id);
* {" c7 v& Q* a7 P }
8 e9 k5 J) `/ b3 e3 a}1 g3 ~& R& Q5 D
5 e2 X7 d9 B; S' g/ n* I8 k我又找到了一些各种语言的资源文件的ID, m) q1 R( ?' y0 v0 k' ^% i6 [( r8 s
#define GAME_FONT 0x04000000" l9 g) U: A2 m6 z
#define OTHER_SR_FONT 0x04000001
& q* W' {) t* c#define OTHER_SR_REDFONT 0x04000002: n- ?) v4 _- b) J! a! m
#define SR_DEATHFONT 0x04000003
3 U/ b( |: V8 [2 @4 s#define CZECH_GAME_FONT 0x04000004
+ a9 R+ m. |5 u5 v5 U#define CZECH_SR_FONT 0x04000005
- M8 J. m, v% e5 E: a#define CZECH_SR_REDFONT 0x04000006, P, @' P8 E0 ?/ z( U- O2 V# z
#define CZECH_SR_DEATHFONT 0x04000007
& ?. ~) i. l- [+ N! B
4 W; ]% @" @9 ?& A9 R这样,我在调试模式下顺利导出了一个字体资源文件。" V' X3 `* J1 k( C: |! t3 w+ W
接下去,我分析了一下字体资源文件的格式,制作了一个资料。3 e4 b3 e' p) p
看了这个资料很容易就能明白。8 X) k# r2 x( e; _0 s8 h
; j4 q, Q' }' I1 U( x- b. G
& g3 z; J8 v, r# C6 T从源代码里面找到的资源文件头和每个桢的头的结构定义如下,
5 H: ]) Y a* v5 \可以和上面的图一起对照起来看。
5 Q o: E7 s4 n5 y
. d/ o1 F$ e7 i# |- @: b* ostruct Header {
, ]4 ?$ a E6 e; _6 t. b" t char type[6];' A4 e- P9 K/ w- a; R$ b: o9 K7 y% [
uint16 version;/ j+ D# b' O# M
uint32 comp_length;
1 l1 [0 R5 z# C char compression[4];' _- D* q) e5 W9 h
uint32 decomp_length;
# b' E# {, L- {5 X9 Y5 \4 z} PACKED_STRUCT;: P1 w. O; n1 w3 F' ?- ~; |; A
" W% a" V# i d; M6 z0 R7 Pstruct FrameHeader {
$ o1 |" h. h3 v | uint8 runTimeComp[4];
& A$ S6 B) y, x+ u b6 d' |2 C uint32 compSize;& G- \" Q* |8 R# y8 W
uint16 width;% s* T2 `8 f# Y6 `5 P( G5 d- |% P
uint16 height;1 I$ ]& p# C) V0 e
int16 offsetX;
. _: i, \( `2 i! Q% m$ _ int16 offsetY;
- [8 m, d g5 d$ F i};8 V+ Z9 ]2 U' `% p1 z2 ?
# `! p- p' o- E0 B
字体文件的每一个桢都定义了一个字母的字模,根据字模就可以在屏幕上画出每个字母的样子。
" h4 n: J4 j' I( z3 m( r7 @每个字模用一个字节来表示一个像素。
* p2 t: C% W; C Z背景像素 0x00, \- ]" p% N* e {6 t4 t8 D
边框像素 0xC8' F4 [/ n+ P( L$ g
字体像素 0xC1
8 Y3 y1 ?! c* Z! k0 s, W" Y& p
! V* F* i$ l5 C下面这张图片可以使大家对字体的样子有个感性的认识。
p7 Y8 x6 Y. h r1 D为了看得清楚,我把 0xC8替换为一个黑色的小方块。6 Z/ W( m! r2 N8 p( M
|