冒险解谜游戏中文网 ChinaAVG
标题:
【断剑1汉化项目】字体资源文件彻底解说
[打印本页]
作者:
shane007
时间:
2009-9-12 15:28
标题:
【断剑1汉化项目】字体资源文件彻底解说
最近应C版的要求开始研究断剑1的汉化。
5 G v' M7 h+ U. K/ L! Z
看了一下scummvm的代码,看懂了大致的流程。
* @8 M* }7 ~2 p- n5 W& M# l
6 {5 B7 C. P! Z- a
断剑的包文件是由多层的结构组成的。简单的说就是大包套小包。
8 h! Q9 ~, `9 R4 L
我下面先解说一下字体资源文件。
; a: C: `0 E) Y) L
/ ~/ Y, M: F( Q5 K5 k4 w$ ^6 `
经过仔细观察源代码,我发现了一个资源文件的导出函数。
; B _* b! z5 d1 x; S' U
void ResMan::dumpRes(uint32 id) {
" I# U+ K& _: \( a O9 ~
char outn[30];
9 A( K# Q) Q' L& }
sprintf(outn, "DUMP%08X.BIN", id);
! q" C" W$ Y5 d# ^/ K) @. l& s
Common::DumpFile outf;
# f: _$ x# M6 g4 w! r6 X }8 M
if (outf.open(outn)) {
; j$ V" a" f y% u" x. T C% \
resOpen(id);
* O! ?; x" d0 [9 n
MemHandle *memHandle = resHandle(id);
" g+ |; x8 q. @9 g6 j" `7 a
outf.write(memHandle->data, memHandle->size);
7 i* C( P }' X
outf.close();
- e* t$ ^' g0 y' z
resClose(id);
* B3 V9 k1 Q6 l1 N# N& p5 v+ ]+ T* i
}
, ^- S+ c& Q( \1 d
}
+ P& Z; U- b8 b; D/ E$ o1 v0 n
1 H7 P. x8 y, B6 O0 S
我又找到了一些各种语言的资源文件的ID
% P4 ^- |$ k, Z( j
#define GAME_FONT 0x04000000
: U8 B) O. B) x; |5 w
#define OTHER_SR_FONT 0x04000001
" S- q0 {: I* r; u
#define OTHER_SR_REDFONT 0x04000002
& ~# ?7 {. }, t# E+ |% W9 _
#define SR_DEATHFONT 0x04000003
, w% ?) D, b y% O
#define CZECH_GAME_FONT 0x04000004
* B1 s, v1 F: T
#define CZECH_SR_FONT 0x04000005
: R& m6 f; P" n3 x- e
#define CZECH_SR_REDFONT 0x04000006
6 h- i4 h$ L5 I: t' Y% N( i
#define CZECH_SR_DEATHFONT 0x04000007
- g6 a0 I* d# _: k( a5 h: D
+ f/ [2 S" C$ R; [/ I4 F0 S
这样,我在调试模式下顺利导出了一个字体资源文件。
( e" }% q+ o6 l
接下去,我分析了一下字体资源文件的格式,制作了一个资料。
. A, E! t6 _& v+ d% g1 L
看了这个资料很容易就能明白。
2 k. W( o y) c% {+ S2 B
[attach]14211[/attach]
# C: U, K0 z2 X, U. g( N4 ?; e: N
6 _$ c! I: n0 p. E% L
从源代码里面找到的资源文件头和每个桢的头的结构定义如下,
, A9 N$ x9 V( X" d! O( u
可以和上面的图一起对照起来看。
t2 o& A# i6 \$ h5 G
% O6 f& r* i: k* r. d2 g2 u
struct Header {
( Y0 f1 s& l! w6 U- X) m
char type[6];
! r) |, ^$ ^6 f; u, R" w
uint16 version;
- `& Z, J) s, q. Q/ w9 F
uint32 comp_length;
$ m/ ]" V& d2 T
char compression[4];
2 a0 v+ J" r0 M1 G2 [8 I. w& j+ v
uint32 decomp_length;
' W* j$ K: M2 J" a. L
} PACKED_STRUCT;
. \5 i4 _4 R! o( q. ` V; J
+ L% F3 j% i, Q& h
struct FrameHeader {
" ]3 c9 t, P* f/ D5 g
uint8 runTimeComp[4];
) `2 \' U: [( O. A; c0 Y' d- q
uint32 compSize;
0 _# X) s2 F& K+ |
uint16 width;
' u2 I5 l" \' C& z$ m8 k' B
uint16 height;
- I+ D/ o9 g; m2 S
int16 offsetX;
( f% U) L. T- y$ d9 }) n& _
int16 offsetY;
! U8 K/ a7 B$ @8 ]
};
. E: H- ]" Q; @- Q7 \
( |, R, u \; n$ p% u+ @
字体文件的每一个桢都定义了一个字母的字模,根据字模就可以在屏幕上画出每个字母的样子。
% c% @& ^6 E' k8 I, d+ p8 A
每个字模用一个字节来表示一个像素。
3 U I, {% v9 Q
背景像素 0x00
1 ^2 H8 {- P- z
边框像素 0xC8
! W8 ^* P( j! M: i) q
字体像素 0xC1
/ a% I# S) s- v. x2 ~+ ^
0 Q3 e0 _9 R6 Z% m7 ^; w8 b& s
下面这张图片可以使大家对字体的样子有个感性的认识。
- H- |7 U% C2 y8 b+ {# A
为了看得清楚,我把 0xC8替换为一个黑色的小方块。
' } G) k% p6 G0 H* Q
[attach]14214[/attach]
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2