📄 pakfile.c
字号:
/* pakfile.c, HAWK game engine
*
* Copyright 1997-1998 by Phil Frisbie, Jr.
* for Hawk Software
*
*/
#include "internal.h"
#include <sys/stat.h>
#include <io.h>
#include <fcntl.h>
#ifdef WIN32
#define open _open
#define close _close
#define lseek _lseek
#define read _read
#define stat _stat
#define O_RDONLY _O_RDONLY
#define O_BINARY _O_BINARY
#endif
#define PAKSHANDLES 2048 /* start of phony file handles for our file routines */
#define PAKFILENAME "pak0.pak"
BOOL usePAK;
dpackfile_t *PAKdir;
int nPAKdir;
int PAKhandle;
char *mapnames = NULL;
char *pakGetMapNames(void)
{
if(!mapnames)/* first time called */
{
mapnames = TagMalloc(80*20, TAG_GAME);
}
return mapnames;
}
void initPAKfile(void)
{
if(fileSize(PAKFILENAME))
{
dpackheader_t p;
loadFile(PAKFILENAME, 0, sizeof(dpackheader_t), &p);
PAKdir = TagMalloc(p.dirlen, TAG_GAME);
memset(PAKdir, 0, p.dirlen);
loadFile(PAKFILENAME, p.dirofs, p.dirlen, PAKdir);
nPAKdir = p.dirlen / sizeof(dpackfile_t);
PAKhandle = open(PAKFILENAME, O_RDONLY|O_BINARY);
usePAK = TRUE;
}
else
{
usePAK = FALSE;
}
}
void closePAKfile(void)
{
close(PAKhandle);
}
int findinPAK(char *name)
{
int i;
if(!usePAK)
return -1;
for(i=0;i<nPAKdir;i++)
{
if(!_stricmp(name, PAKdir[i].name))
return i;
}
return -1;
}
int openFile(char *filename, int oflag)
{
int pf;
pf = findinPAK(filename);
if(pf >= 0)
{
int start = PAKdir[pf].filepos;
lseek(PAKhandle, start, SEEK_SET);
return(PAKSHANDLES + pf);
}
return open(filename, oflag);
}
long seekFile(int handle, long offset, int origin)
{
if(handle > PAKSHANDLES)
{
int pf = handle - PAKSHANDLES;
int start = PAKdir[pf].filepos;
int size = PAKdir[pf].filelen;
int result;
if(origin == SEEK_SET)
{
result = lseek(PAKhandle, start + offset, SEEK_SET);
if(result < 0)
return result;
else
return (result - start);
}
if(origin == SEEK_CUR)
{
result = lseek(PAKhandle, offset, SEEK_CUR);
if(result < 0)
return result;
else
return (result - start);
}
if(origin == SEEK_END)
{
result = lseek(PAKhandle, start + size, SEEK_SET);
if(result < 0)
return result;
else
return size;
}
}
else
{
return(lseek(handle, offset, origin));
}
}
int readFile(int handle, void *buffer, unsigned int count)
{
if(handle > PAKSHANDLES)
{
return(read(PAKhandle, buffer, count));
}
else
{
return(read(handle, buffer, count));
}
}
void closeFile(int handle)
{
if(handle > PAKSHANDLES)
return; /* do nothing for the phony handles */
}
int fileSize(char *filename)
{
int f, pf;
struct stat st;
pf = findinPAK(filename);
if(pf >= 0)
{
return PAKdir[pf].filelen;
}
f = open(filename, O_RDONLY);
if(f < 0)
{
close(f);
return (0);
}
stat( filename, &st );
close(f);
return (st.st_size);
}
int loadFile(char *filename, int start, int length, void *buffer)
{
int f, pf;
pf = findinPAK(filename);
if(pf >= 0)
{
f = PAKhandle;
start = start + PAKdir[pf].filepos;
lseek(f, start, SEEK_SET);
length = read(f, buffer, length);
}
else
{
f = open(filename, O_RDONLY|O_BINARY);
if(f < 0)
{
close(f);
return (0);
}
lseek(f, start, SEEK_SET);
length = read(f, buffer, length);
close(f);
}
return length;
}
int saveFile(char *filename, int length, void *buffer)
{
int f, l;
f = _open(filename, _O_RDWR|_O_CREAT|_O_BINARY, _S_IREAD | _S_IWRITE);
if(f < 0)
{
close(f);
return FALSE;
}
l = _write(f, buffer, length);
close(f);
if(l != length)
return FALSE;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -