⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pakfile.c

📁 著名物理引擎Hawk的源代码
💻 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 + -