冒险解谜游戏中文网 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" gvoid 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         0x040000026 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        0x040000057 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
背景像素 0x000 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