Files
FC1/RenderDll/Common/ResFile.h
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

246 lines
4.4 KiB
C++

#ifndef __RESFILE_H__
#define __RESFILE_H__
#define IDRESHEADER (('K'<<24)+('C'<<16)+('P'<<8)+'C')
#define RESVERSION 1
enum EResId
{
eRI_UNKNOWN = -1,
eRI_BIN = 0,
eRI_IMAGE = 1,
eRI_MIPTEX = 2,
eRI_SOUND = 3,
eRI_MODEL = 4,
eRI_PALETTE = 5
};
enum EArc
{
eARC_NONE = 0,
eARC_RLE = 1,
eARC_LZSS = 2
};
// Resource header
struct SFileResHeader
{
uint hid;
int ver;
uint optimize_mode;
int num_files;
#ifdef PS2
int ofs_first;
#else
long ofs_first;
#endif
};
enum EFS_DirType
{
eFSD_name,
eFSD_id,
};
// Each file entry in resource
struct SFileDirEntry_0
{
char name[256-6*4];
int size;
int offset;
int offnext;
int offprev;
EResId eid; // eRI_
EArc earc; // eARC_
};
// Each file entry in resource
struct SFileDirEntry_1
{
int ID;
int size;
int offset;
int offnext;
int offprev;
EResId eid; // eRI_
EArc earc; // eARC_
};
struct SCacheUser
{
void *data;
};
// Intrinsic file entry
struct SDirEntry
{
uint ID;
int size;
#ifdef PS2
long offset;
long offsetHeader;
long curseek;
#else
int offset;
int offsetHeader;
int curseek;
#endif
EResId eid; // eRI_
EArc earc; // eARC_
SCacheUser user;
uint flags;
SDirEntry()
{
memset(this, 0, sizeof(SDirEntry));
}
const char *Name()
{
return CName(ID).c_str();
}
};
typedef std::map<uint,SDirEntry*> ResFilesMap;
typedef ResFilesMap::iterator ResFilesMapItor;
// Resource access types
#define RA_READ 1
#define RA_WRITE 2
#define RA_CREATE 4
// Resource files flags
#define RF_NOTSAVED 1
#define RF_DELETED 2
#define RF_INTRINSIC 4
#define RF_CACHED 8
#define RF_BIG 0x10
#define RF_TEMPDATA 0x20
// Resource optimize flags
#define RO_HEADERS_IN_BEGIN 1
#define RO_HEADERS_IN_END 2
#define RO_HEADER_FILE 4
#define RO_SORT_ALPHA_ASC 8
#define RO_SORT_ALPHA_DESC 0x10
#define MAX_OPEN_RESFILES 40
class CResFile
{
private:
char m_name[1024];
char *m_szAccess;
FILE* m_handle;
EFS_DirType m_eDT;
ResFilesMap m_dir;
int m_typeaccess;
uint m_optimize;
char m_ermes[1024];
int m_version;
int m_holesSize;
static CResFile m_Root;
static int m_nNumOpenResources;
CResFile *m_Next;
CResFile *m_Prev;
bool mfActivate(bool bFirstTime);
void mfDeactivate();
_inline void Relink(CResFile* Before)
{
if (m_Next && m_Prev)
{
m_Next->m_Prev = m_Prev;
m_Prev->m_Next = m_Next;
}
m_Next = Before->m_Next;
Before->m_Next->m_Prev = this;
Before->m_Next = this;
m_Prev = Before;
}
_inline void Unlink()
{
if (!m_Next || !m_Prev)
return;
m_Next->m_Prev = m_Prev;
m_Prev->m_Next = m_Next;
m_Next = m_Prev = NULL;
}
_inline void Link(CResFile* Before)
{
if (m_Next || m_Prev)
return;
m_Next = Before->m_Next;
Before->m_Next->m_Prev = this;
Before->m_Next = this;
m_Prev = Before;
}
public:
CResFile(const char* name, EFS_DirType eDT);
CResFile();
~CResFile();
char* mfGetError(void);
void mfSetError(const char *er);
const char *mfGetFileName() {return m_name;}
bool mfGetDir(TArray<SDirEntry *>& Dir);
bool mfOpen(int type);
bool mfClose();
bool mfFlush();
bool mfOptimize(uint type);
int mfGetNumFiles() { return m_dir.size(); }
int mfFileGetNum(const char* name);
int mfFileRead(SDirEntry *de);
int mfFileRead(const char* name);
int mfFileRead(int num);
int mfFileRead(SDirEntry *de, void* data);
int mfFileRead(int num, void* data);
int mfFileRead(const char* name, void* data);
void* mfFileRead2(SDirEntry *de, int size);
void* mfFileRead2(int num, int size);
void* mfFileRead2(const char* name, int size);
void mfFileRead2(SDirEntry *de, int size, void *buf);
void mfFileRead2(int num, int size, void *buf);
void* mfFileGetBuf(SDirEntry *de);
void* mfFileGetBuf(int num);
void* mfFileGetBuf(char* name);
int mfFileSeek(SDirEntry *de, int offs, int type);
int mfFileSeek(int num, int offs, int type);
int mfFileSeek(char* name, int offs, int type);
int mfFileLength(SDirEntry *de);
int mfFileLength(int num);
int mfFileLength(char* name);
int mfFileAdd(SDirEntry* de);
int mfFileDelete(SDirEntry *de);
int mfFileDelete(int num);
int mfFileDelete(char* name);
int mfFileExist(int ID);
int mfFileExist(const char* name);
SDirEntry *mfGetEntry(int num);
FILE *mfGetHandle() { return m_handle; }
int mfGetResourceSize();
int mfGetHolesSize();
};
#endif // __RESFILE_H__