冒险解谜游戏中文网 ChinaAVG
标题:
【断剑1汉化项目】字体资源文件彻底解说
[打印本页]
作者:
shane007
时间:
2009-9-12 15:28
标题:
【断剑1汉化项目】字体资源文件彻底解说
最近应C版的要求开始研究断剑1的汉化。
\6 |) O' k7 s8 ]) K+ T7 u
看了一下scummvm的代码,看懂了大致的流程。
: P1 q7 Q9 @- I, ]: @, X& L9 t
' q7 @$ J, @" A% @- \5 h
断剑的包文件是由多层的结构组成的。简单的说就是大包套小包。
2 a) [; e8 M$ ?; K& q9 D1 O' M4 i$ [& s
我下面先解说一下字体资源文件。
9 a$ k) e$ A; X( Q, i" C# e: P
! F, C) L. S6 O! L$ t
经过仔细观察源代码,我发现了一个资源文件的导出函数。
, f+ o' x" ]" _% O' e" g
void ResMan::dumpRes(uint32 id) {
) }0 U8 U: F& l
char outn[30];
. g* M' R6 v/ A
sprintf(outn, "DUMP%08X.BIN", id);
' B+ s4 H8 S1 Z. Y$ }
Common::DumpFile outf;
! \; E; F7 u& Y6 u
if (outf.open(outn)) {
6 P, \. m) d- P, f/ }3 E4 X
resOpen(id);
+ d4 r4 ~2 i' ?. u1 F; N
MemHandle *memHandle = resHandle(id);
3 B; ~9 L+ u8 n9 A% q- @
outf.write(memHandle->data, memHandle->size);
9 d: \0 C( @ j; B C
outf.close();
- h* v5 w% P2 J! Q, I
resClose(id);
|- Q0 \! R# n, U' u) M
}
/ T; G0 x$ D6 M* p/ e
}
% o+ x/ A2 e! R9 g, a
j* U- h7 u$ q9 S4 V+ ?' k' C
我又找到了一些各种语言的资源文件的ID
' T& d9 l# d l. I: e( ~8 N9 ^6 K
#define GAME_FONT 0x04000000
% s+ K! J7 u) E, _- F O
#define OTHER_SR_FONT 0x04000001
0 K* I* g- H, G2 C
#define OTHER_SR_REDFONT 0x04000002
6 I; l# F- ]/ v6 X- _/ D9 k
#define SR_DEATHFONT 0x04000003
- y3 Y) E* c8 N0 ^( T
#define CZECH_GAME_FONT 0x04000004
& r( }1 E. ^+ p: C
#define CZECH_SR_FONT 0x04000005
7 b! G) o$ r! [! t1 L! t) @3 r
#define CZECH_SR_REDFONT 0x04000006
6 t" g$ S; n* {0 s* u
#define CZECH_SR_DEATHFONT 0x04000007
( M# F4 i$ T4 d2 O1 @2 |
7 A2 |9 O8 m+ [6 l
这样,我在调试模式下顺利导出了一个字体资源文件。
9 m! f7 X0 c& M$ Z; E
接下去,我分析了一下字体资源文件的格式,制作了一个资料。
( _5 ] L% ^7 k, L# Q: b
看了这个资料很容易就能明白。
, E3 @2 n$ x* Z3 V x" J& [
[attach]14211[/attach]
" z* ~6 \# i$ L' g; h7 [( J
6 H/ d! q% [- w
从源代码里面找到的资源文件头和每个桢的头的结构定义如下,
& G ]- Y+ a, d5 p" _+ E
可以和上面的图一起对照起来看。
/ K. v% ?! s2 L0 R; Y8 S- _$ _& u
* q' O& @/ Q* ^
struct Header {
( p4 H) O. L; g4 \4 Y: k& B
char type[6];
" R4 Z1 o( T/ i5 {- [7 N# E8 J
uint16 version;
6 o* ^' o5 N+ \0 x+ H3 s
uint32 comp_length;
4 k& n/ H7 T4 H2 \5 ]2 z
char compression[4];
0 T( i/ T. d$ @: s$ d
uint32 decomp_length;
# ~1 P4 _$ p9 q+ A' ?0 I1 X+ K8 S
} PACKED_STRUCT;
j. _6 |" z! P4 |" s. ~# n6 B* ?
" [7 T* L$ u. _/ a3 a+ l/ b* B
struct FrameHeader {
) v& J+ w, I( i* B9 R
uint8 runTimeComp[4];
5 l6 Z1 s9 y" k. `
uint32 compSize;
7 }, A0 r$ f3 ^8 B6 ?5 k
uint16 width;
2 J, `* i/ w& e! N. f7 ~) [
uint16 height;
) d3 B1 n, k; `( N+ h( a
int16 offsetX;
3 ^+ X( P" R* G5 ^3 L3 I0 e8 i6 w
int16 offsetY;
3 S3 z4 @7 }. n' V. O
};
7 W' Q; ^4 Y0 |( N& f1 t
" i: M7 f" ]% w ^* }
字体文件的每一个桢都定义了一个字母的字模,根据字模就可以在屏幕上画出每个字母的样子。
+ |! Y. l1 m) T4 z/ l+ Z { Z8 g
每个字模用一个字节来表示一个像素。
% m: y4 c! e- G- y
背景像素 0x00
0 y/ ^7 E7 f v! E
边框像素 0xC8
: ]0 B: Q S- J D
字体像素 0xC1
) G) e: Z% C0 C: ]0 E
% s+ S, B0 U) e n- c
下面这张图片可以使大家对字体的样子有个感性的认识。
9 z0 @! I# E+ U; E1 ]
为了看得清楚,我把 0xC8替换为一个黑色的小方块。
# i- v5 I5 k, K; Z/ Y0 l# ~& e' q4 y
[attach]14214[/attach]
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2