0
|
1 /* file.h : KANON の圧縮ファイル・PDT ファイル(画像ファイル)の展開の
|
|
2 * ためのクラス
|
|
3 * class FILESEARCH : ファイルの管理を行う
|
|
4 * class ARCINFO : 書庫ファイルの中の1つのファイルを扱うクラス
|
|
5 * class PDTCONV : PDT ファイルの展開を行う。
|
|
6 */
|
|
7
|
|
8 /*
|
|
9 *
|
|
10 * Copyright (C) 2000- Kazunori Ueno(JAGARL) <jagarl@creator.club.ne.jp>
|
|
11 *
|
|
12 * This program is free software; you can redistribute it and/or modify
|
|
13 * it under the terms of the GNU General Public License as published by
|
|
14 * the Free Software Foundation; either version 2 of the License, or
|
|
15 * (at your option) any later version.
|
|
16 *
|
|
17 * This program is distributed in the hope that it will be useful,
|
|
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
20 * GNU General Public License for more details.
|
|
21 *
|
27
|
22 * You should have received a copy of the GNU General Public License along
|
|
23 * with this program; if not, write to the Free Software Foundation, Inc.,
|
|
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
0
|
25 *
|
|
26 */
|
|
27
|
|
28 #ifndef __KANON_FILE_H__
|
|
29 #define __KANON_FILE_H__
|
|
30
|
|
31 #ifndef DIR_SPLIT
|
|
32 #define DIR_SPLIT '/' /* UNIX */
|
|
33 #endif
|
|
34
|
|
35 // read 'KANON' compressed file
|
|
36
|
|
37 #include<stdio.h>
|
|
38 #include<stdlib.h>
|
|
39 #include<string.h>
|
|
40 #include<sys/types.h>
|
|
41
|
|
42 #ifdef HAVE_CONFIG_H
|
|
43 # include "config.h"
|
|
44 #endif
|
|
45
|
|
46 #if defined(__sparc) || defined(sparc)
|
|
47 # if !defined(WORDS_BIGENDIAN)
|
|
48 # define WORDS_BIGENDIAN 1
|
|
49 # endif
|
|
50 #endif
|
|
51
|
|
52 #define INT_SIZE 4
|
|
53
|
|
54 static int read_little_endian_int(const char* buf) {
|
|
55 const unsigned char *p = (const unsigned char *) buf;
|
|
56 return (p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0];
|
|
57 }
|
|
58
|
|
59 static int read_little_endian_short(const char* buf) {
|
|
60 const unsigned char *p = (const unsigned char *) buf;
|
|
61 return (p[1] << 8) | p[0];
|
|
62 }
|
|
63
|
|
64 static int write_little_endian_int(char* buf, int number) {
|
|
65 int c = read_little_endian_int(buf);
|
|
66 unsigned char *p = (unsigned char *) buf;
|
|
67 unsigned int unum = (unsigned int) number;
|
|
68 p[0] = unum & 255;
|
|
69 unum >>= 8;
|
|
70 p[1] = unum & 255;
|
|
71 unum >>= 8;
|
|
72 p[2] = unum & 255;
|
|
73 unum >>= 8;
|
|
74 p[3] = unum & 255;
|
|
75 return c;
|
|
76 }
|
|
77
|
|
78 static int write_little_endian_short(char* buf, int number) {
|
|
79 int c = read_little_endian_short(buf);
|
|
80 unsigned char *p = (unsigned char *) buf;
|
|
81 unsigned int unum = (unsigned int) number;
|
|
82 p[0] = unum & 255;
|
|
83 unum >>= 8;
|
|
84 p[1] = unum & 255;
|
|
85 return c;
|
|
86 }
|
|
87
|
|
88
|
|
89 /*********************************************
|
|
90 ** FILESEARCH:
|
|
91 ** 書庫ファイル/ディレクトリを含め、
|
|
92 ** 全ファイルの管理を行う。
|
|
93 **
|
|
94 ** 最初に、設定ファイルからファイルの種類ごとに
|
|
95 ** 実際に入っているディレクトリ、書庫を設定する
|
|
96 **
|
|
97 ** 以降はFind() メソッドで実際のファイルの内容を得る
|
|
98 **
|
|
99 */
|
|
100
|
|
101 /* ARCFILE と DIRFILE はファイル種類ごとの情報 */
|
|
102 class ARCFILE;
|
|
103 class DIRFILE;
|
|
104 class SCN2kFILE;
|
|
105 /* ARCINFO はファイルを読み込むために必要 */
|
|
106 class ARCINFO;
|
|
107 class ARCFILE_ATOM;
|
|
108 class FILESEARCH {
|
|
109 public:
|
|
110 #define TYPEMAX 14
|
|
111 enum FILETYPE {
|
|
112 /* 一応、0 - 15 まで reserved */
|
|
113 ALL = 1, /* dat/ 以下のファイル(デフォルトの検索先) */
|
|
114 ROOT= 2, /* ゲームのインストールディレクトリ */
|
|
115 PDT = 3, /* default: PDT/ */
|
|
116 SCN = 4, /* default: DAT/SEEN.TXT */
|
|
117 ANM = 5, /* default: DAT/ALLANM.ANL */
|
|
118 ARD = 6, /* default: DAT/ALLARD.ARD */
|
|
119 CUR = 7, /* default: DAT/ALLCUR.CUR */
|
|
120 MID = 8, /* default: ALL */
|
|
121 WAV = 9, /* default: ALL */
|
|
122 KOE = 10, /* default: KOE/ */
|
|
123 BGM = 11, /* default: BGM */
|
|
124 MOV = 12, /* default : MOV */
|
|
125 GAN = 13 /* default : MOV */
|
|
126 };
|
|
127 enum ARCTYPE {ATYPE_DIR, ATYPE_ARC, ATYPE_SCN2k};
|
|
128 private:
|
|
129 /* InitRoot() の時点で初期化される変数 */
|
|
130 DIRFILE* root_dir;
|
|
131 DIRFILE* dat_dir;
|
|
132 ARCFILE* searcher[TYPEMAX];
|
|
133 /* ファイルの存在位置の information */
|
|
134 ARCTYPE is_archived[TYPEMAX];
|
|
135 char* filenames[TYPEMAX];
|
|
136 /* デフォルトの information */
|
|
137 static ARCTYPE default_is_archived[TYPEMAX];
|
|
138 static char* default_dirnames[TYPEMAX];
|
30
|
139 char xor_key[16];
|
0
|
140 public:
|
|
141 FILESEARCH(void);
|
|
142 ~FILESEARCH();
|
|
143 /* 初めにゲームのデータがあるディレクトリを設定する必要がある */
|
|
144 int InitRoot(char* root);
|
|
145 /* ファイルの型ごとの情報をセットする */
|
|
146 void SetFileInformation(FILETYPE type, ARCTYPE is_arc,
|
|
147 char* filename);
|
|
148 /* 複数のファイルを一つの型に関連づける */
|
|
149 void AppendFileInformation(FILETYPE type, ARCTYPE is_arc,
|
|
150 char* filename);
|
|
151 ARCFILE* MakeARCFILE(ARCTYPE tp, char* filename);
|
|
152 /* fname で指定された名前のファイルを検索 */
|
|
153 class ARCINFO* Find(FILETYPE type, const char* fname, const char* ext=0);
|
|
154 /* ある種類のファイルをすべてリストアップ
|
|
155 ** 末尾は NULL pointer
|
|
156 */
|
30
|
157 void SetXorKey(char*);
|
|
158 void GuessXorKey(char*);
|
|
159 const char* GetXorKey(void);
|
0
|
160 char** ListAll(FILETYPE type);
|
|
161 };
|
|
162
|
|
163 class ARCINFO {
|
|
164 protected:
|
|
165 /* ファイルそのものの情報 */
|
|
166 ARCFILE_ATOM& info;
|
|
167 char* arcfile;
|
|
168 /* mmap している場合、その情報 */
|
|
169 bool use_mmap;
|
|
170 char* mmapped_memory;
|
|
171 int fd;
|
|
172 /* ファイル内容の入っているバッファ */
|
|
173 const char* data;
|
|
174
|
|
175 protected:
|
|
176 ARCINFO(const char* arcfile, ARCFILE_ATOM& from); // only from ARCFILE
|
|
177 friend class ARCFILE;
|
|
178 friend class DIRFILE;
|
|
179
|
|
180 virtual bool ExecExtract(void);
|
|
181 public:
|
|
182 /* dest は256byte 程度の余裕があること */
|
|
183 static void Extract(char*& dest, char*& src, char* destend, char* srcend);
|
|
184 static void Extract2k(char*& dest, char*& src, char* destend, char* srcend);
|
|
185 virtual ~ARCINFO();
|
|
186 /* 必要なら Read 前に呼ぶことで処理を分割できる */
|
|
187 int Size(void) const;
|
|
188 char* CopyRead(void); /* Read() して内容のコピーを返す */
|
|
189 const char* Read(void);
|
|
190 /* ファイルが regular file の場合、ファイル名を帰す */
|
|
191 /* そうでないなら 0 を帰す */
|
|
192 const char* Path(void) const;
|
|
193 FILE* OpenFile(int* length=0) const; /* 互換性のため:raw file の場合、ファイルを開く */
|
|
194 };
|
|
195
|
|
196 class GRPCONV {
|
|
197 public:
|
|
198 int width;
|
|
199 int height;
|
|
200 bool is_mask;
|
|
201
|
|
202 const char* filename;
|
|
203 const char* data;
|
|
204 int datalen;
|
|
205
|
|
206 int Width(void) { return width;}
|
|
207 int Height(void) { return height;}
|
|
208 bool IsMask(void) { return is_mask;}
|
|
209
|
|
210 GRPCONV(void);
|
|
211 virtual ~GRPCONV();
|
|
212 void Init(const char* fname, const char* data, int dlen, int width, int height, bool is_mask);
|
|
213
|
|
214 virtual bool Read(char* image) = 0;
|
|
215 static GRPCONV* AssignConverter(const char* inbuf, int inlen, const char* fname);
|
|
216 static GRPCONV* AssignConverter(ARCINFO* info) {
|
|
217 const char* dat = info->Read();
|
|
218 if (dat == 0) return 0;
|
|
219 return AssignConverter(dat, info->Size(), "???");
|
|
220 }
|
|
221 void CopyRGBA(char* image, const char* from);
|
|
222 void CopyRGB(char* image, const char* from);
|
|
223 void CopyRGBA_rev(char* image, const char* from);
|
|
224 void CopyRGB_rev(char* image, const char* from);
|
|
225 };
|
|
226
|
|
227 extern FILESEARCH file_searcher;
|
|
228
|
|
229 #endif // !defined(__KANON_FILE_H__)
|