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

📄 pack.cpp

📁 vc写的源程序,是关于游戏类的程序。调用了系统的很多API
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		{
			memcpy(Buffer, pbuffer, linesize);
			pbuffer += linesize;
			Offset = bmp->bit + i * bmpinfo.biWidth; 
			for (int j = 0; j < bmpinfo.biWidth; j++)
				Offset[j] = true_to_hi((*(DWORD *)(Buffer + j * 3)));
		}
		delete filebuffer;
		delete Buffer;
		Offset = NULL;
		return bmp;
	}
}	

// 装入位图文件
BMP *load_pack_bmp_file(char *filename)
{
	BOOL find_ok = FALSE;
	seek_to_first(data_file->pack_file_list);
	PACK_FILE *pf;
	for (DWORD c = 0; c < data_file->file_count; c++)
	{
		pf = (PACK_FILE *)get_data(data_file->pack_file_list);
		if (strcmp(pf->filename, filename) == 0)
		{
			find_ok = TRUE;
			break;
		}
		seek_to_next(data_file->pack_file_list);
	}
	if (!find_ok)
		return NULL;

	BMP *bmp;
	fseek(data_file->fp, pf->pos, SEEK_SET);
	bmp = new BMP;
	put_message(bmp == NULL, "错误,没有足够的内存空间。");

	if (!pf->compress)
	{
		// 处理没有压缩的
		fread(bmp, sizeof(BMP), 1, data_file->fp);
		char *buffer = new char [bmp->surface_byte];
		fread(buffer, bmp->surface_byte, 1, data_file->fp);
		bmp->bit = (WORD *)buffer;
		return bmp;
	}
	else
	{
		// 处理压缩过的
		char *cbuffer = new char [pf->filesize];
		put_message(cbuffer == NULL, "错误,没有足够的内存空间。");
		fread(cbuffer, pf->filesize, 1, data_file->fp);
		char *filebuffer = new char [pf->oldsize], *pbuffer;
		put_message(filebuffer == NULL, "错误,没有足够的内存空间。");
		decompress(cbuffer, pf->filesize, filebuffer);
		delete cbuffer;
		pbuffer = filebuffer;
		memcpy(bmp, pbuffer, sizeof(BMP));
		pbuffer += sizeof(BMP);
		char *buffer = new char [bmp->surface_byte];
		memcpy(buffer, pbuffer, bmp->surface_byte);
		bmp->bit = (WORD *)buffer;
		delete filebuffer;
		return bmp;
	}
}

// 装入数据文件
void *load_pack_file(char *filename)
{
	BOOL find_ok = FALSE;
	seek_to_first(data_file->pack_file_list);
	PACK_FILE *pf;
	for (DWORD c = 0; c < data_file->file_count; c++)
	{
		pf = (PACK_FILE *)get_data(data_file->pack_file_list);
		if (strcmp(pf->filename, filename) == 0)
		{
			find_ok = TRUE;
			break;
		}
		seek_to_next(data_file->pack_file_list);
	}
	if (!find_ok)
		return NULL;

	fseek(data_file->fp, pf->pos, SEEK_SET);

	if (!pf->compress)
	{
		// 处理没有压缩的
		char *buffer = new char [pf->filesize];
		fread(buffer, pf->filesize, 1, data_file->fp);
		return buffer;
	}
	else
	{
		// 处理压缩过的
		char *cbuffer = new char [pf->filesize];
		fread(cbuffer, pf->filesize, 1, data_file->fp);
		char *buffer = new char [pf->oldsize];
		decompress(cbuffer, pf->filesize, buffer);
		delete cbuffer;
		return buffer;
	}
}

// 读取音效文件
SAMPLE *load_pack_sample(char *filename)
{
	BOOL find_ok = FALSE;
	seek_to_first(data_file->pack_file_list);
	PACK_FILE *pf;
	for (DWORD c = 0; c < data_file->file_count; c++)
	{
		pf = (PACK_FILE *)get_data(data_file->pack_file_list);
		if (strcmp(pf->filename, filename) == 0)
		{
			find_ok = TRUE;
			break;
		}
		seek_to_next(data_file->pack_file_list);
	}
	if (!find_ok)
		return NULL;

	fseek(data_file->fp, pf->pos, SEEK_SET);

	SAMPLE *sample;
	sample = new SAMPLE;
	put_message(sample == NULL, "错误,没有足够的内存。");
	if (!pf->compress)
	{
		// 处理没有压缩的
		sample->number = -1;
		DWORD riff = 0, size = 0, type = 0, entry = 0, filesize = 0, data_size = 0;
		filesize = pf->filesize;
		fread(&riff, sizeof(DWORD), 1, data_file->fp);
		fread(&size, sizeof(DWORD), 1, data_file->fp);
		fread(&type, sizeof(DWORD), 1, data_file->fp);
		BOOL format_read = FALSE, data_read = FALSE;
		if (riff != mmioFOURCC('R', 'I', 'F', 'F') ||
			type != mmioFOURCC('W', 'A', 'V', 'E'))
			return NULL;
		entry += 12;
		while(entry < filesize)
		{
			fread(&type, sizeof(DWORD), 1, data_file->fp);
			fread(&size, sizeof(DWORD), 1, data_file->fp);
			entry += 8;
			switch(type)
			{
			case mmioFOURCC('f', 'm', 't', ' '):
				if (size < sizeof(WAVEFORMAT))
					return NULL;
				fseek(data_file->fp, sizeof(WAVEFORMAT), SEEK_CUR);
				entry += sizeof(WAVEFORMAT);
				if (format_read && data_read)
					return sample;
				format_read = TRUE;
				break;
			case mmioFOURCC('d', 'a', 't', 'a'):
				sample->bit = new char [size];
				put_message(sample->bit == NULL, "错误,没有足够的内存。");
				fread(sample->bit, size, 1, data_file->fp);
				entry += size;
				sample->size = size;
				if (format_read)
					return sample;
				break;
			}
		}
		return sample;
	}
	else
	{
		// 处理压缩过的
		char *cbuffer, *filebuffer, *pbuffer;
		cbuffer = new char [pf->filesize];
		put_message(cbuffer == NULL, "错误,没有足够的内存空间。");
		fread(cbuffer, pf->filesize, 1, data_file->fp);
		filebuffer = new char [pf->oldsize];
		put_message(filebuffer == NULL, "错误,没有足够的内存空间。");
		decompress(cbuffer, pf->filesize, filebuffer);
		delete cbuffer;
		pbuffer = filebuffer;

		sample->number = -1;
		DWORD riff = 0, size = 0, type = 0, entry = 0, filesize = 0, data_size = 0;
		filesize = pf->oldsize;
		memcpy(&riff, pbuffer, sizeof(DWORD));
		pbuffer += sizeof(DWORD);
		memcpy(&size, pbuffer, sizeof(DWORD));
		pbuffer += sizeof(DWORD);
		memcpy(&type, pbuffer, sizeof(DWORD));
		pbuffer += sizeof(DWORD);
		BOOL format_read = FALSE, data_read = FALSE;
		if (riff != mmioFOURCC('R', 'I', 'F', 'F') ||
			type != mmioFOURCC('W', 'A', 'V', 'E'))
		{
			delete filebuffer;
			return NULL;
		}
		entry += 12;
		while(entry < filesize)
		{
			memcpy(&type, pbuffer, sizeof(DWORD));
			pbuffer += sizeof(DWORD);
			memcpy(&size, pbuffer, sizeof(DWORD));
			pbuffer += sizeof(DWORD);
			entry += 8;
			switch(type)
			{
			case mmioFOURCC('f', 'm', 't', ' '):
				if (size < sizeof(WAVEFORMAT))
				{
					delete filebuffer;
					return NULL;
				}
				pbuffer += sizeof(WAVEFORMAT);
				entry += sizeof(WAVEFORMAT);
				if (format_read && data_read)
				{
					delete filebuffer;
					return sample;
				}
				format_read = TRUE;
				break;
			case mmioFOURCC('d', 'a', 't', 'a'):
				sample->bit = new char [size];
				put_message(sample->bit == NULL, "错误,没有足够的内存。");
				memcpy(sample->bit, pbuffer, size);
				pbuffer += size;
				entry += size;
				sample->size = size;
				if (format_read)
				{
					delete filebuffer;
					return sample;
				}
				break;
			}
		}
		return sample;
	}
}

// 读取音乐文件
MUSIC *load_pack_music(char *filename)
{
	BOOL find_ok = FALSE;
	seek_to_first(data_file->pack_file_list);
	PACK_FILE *pf;
	for (DWORD c = 0; c < data_file->file_count; c++)
	{
		pf = (PACK_FILE *)get_data(data_file->pack_file_list);
		if (strcmp(pf->filename, filename) == 0)
		{
			find_ok = TRUE;
			break;
		}
		seek_to_next(data_file->pack_file_list);
	}
	if (!find_ok)
		return NULL;

	fseek(data_file->fp, pf->pos, SEEK_SET);

	MUSIC *music;
	music = new MUSIC;
	put_message(music == NULL, "错误,没有足够的内存。");
	music->source = MUSIC_IN_PACKFILE;
	put_message(music->fp == NULL, "错误,读取文件%s失败。", filename);
	DWORD riff = 0, size = 0, type = 0, entry = 0, filesize = 0, data_size = 0;
	filesize = pf->filesize;
	fread(&riff, sizeof(DWORD), 1, data_file->fp);
	fread(&size, sizeof(DWORD), 1, data_file->fp);
	fread(&type, sizeof(DWORD), 1, data_file->fp);
	BOOL format_read = FALSE, data_read = FALSE;
	if (riff != mmioFOURCC('R', 'I', 'F', 'F') ||
		type != mmioFOURCC('W', 'A', 'V', 'E'))
		return NULL;
	entry += 12;
	while(entry < filesize)
	{
		fread(&type, sizeof(DWORD), 1, data_file->fp);
		fread(&size, sizeof(DWORD), 1, data_file->fp);
		entry += 8;
		switch(type)
		{
		case mmioFOURCC('f', 'm', 't', ' '):
			if (size < sizeof(WAVEFORMAT))
				return NULL;
			fseek(data_file->fp, sizeof(WAVEFORMAT), SEEK_CUR);
			entry += sizeof(WAVEFORMAT);
			if (format_read && data_read)
				return music;
			format_read = TRUE;
			break;
		case mmioFOURCC('d', 'a', 't', 'a'):
			music->size = size;
			music->pack_offset = music->pos = ftell(data_file->fp);
			data_read = TRUE;
			if (format_read)
				return music;
			break;
		}
	}
	return music;
}

// 写数据包内子文件到磁盘文件
BOOL write_pack_file(char *filename, char *destfile)
{
	BOOL find_ok = FALSE;
	seek_to_first(data_file->pack_file_list);
	PACK_FILE *pf;
	for (DWORD c = 0; c < data_file->file_count; c++)
	{
		pf = (PACK_FILE *)get_data(data_file->pack_file_list);
		if (strcmp(pf->filename, filename) == 0)
		{
			find_ok = TRUE;
			break;
		}
		seek_to_next(data_file->pack_file_list);
	}
	if (!find_ok)
		return NULL;

	fseek(data_file->fp, pf->pos, SEEK_SET);

	char *buffer = new char [pf->filesize];
	if (buffer == NULL)
		return FALSE;
	fread(buffer, pf->filesize, 1, data_file->fp);
	FILE *fp;
	fp = fopen(destfile, "wb+");
	if (fp == NULL)
	{
		delete buffer;
		return FALSE;
	}
	fwrite(buffer, pf->filesize, 1, fp);
	fclose(fp);
	delete buffer;
	return TRUE;
}

// 写全部数据包文件到磁盘文件
BOOL write_all_pack_file()
{
	PACK_FILE *pf;
	seek_to_first(data_file->pack_file_list);
	for (DWORD c = 0; c < data_file->file_count; c++)
	{
		pf = (PACK_FILE *)get_data(data_file->pack_file_list);

		fseek(data_file->fp, pf->pos, SEEK_SET);
		char *buffer = new char [pf->filesize];
		if (buffer == NULL)
			return FALSE;
		fread(buffer, pf->filesize, 1, data_file->fp);
		FILE *fp;
		fp = fopen(pf->filename, "wb+");
		if (fp == NULL)
		{
			delete buffer;
			return FALSE;
		}
		fwrite(buffer, pf->filesize, 1, fp);
		fclose(fp);
		delete buffer;

		seek_to_next(data_file->pack_file_list);
	}
	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -