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

📄 wilfile.cpp

📁 是一个基于热血战国协议的网络游戏。现在脱机客户端先放出来给大家研究
💻 CPP
字号:

/*
 * name:		wilfile.h
 *
 * desc:		这是传奇地图文件格式封装文件
 *
*/

#include "stdafx.h"
#include ".\wilfile.h"
namespace shaker_utility
{
	/*
	================
	sWixHead 
	Wix文件头
	================
	*/
	//struct sWixHead
	typedef struct tag_TWIXHEAD
	{
		char Title[44];
		DWORD IndexCount;
	}_TWIXHEAD,*_LPTWIXHEAD;
	/*
	================
	sWilHead 
	Wil文件头
	================
	*/
	//struct sWilHead
	typedef struct tag_TWILHEAD
	{
		char Title[44];
		DWORD ImageCount;
		DWORD ColorCount;
		DWORD PaletteSize;
	}_TWILHEAD,*_LPTWILHEAD;
	/*
	================
	sImageInfo 
	图片信息
	================
	*/
	//struct sImageInfo
	typedef struct tag_TIMAGEINFO
	{
		WORD Width;
		WORD Height;
		BYTE unknow[4];
	}_TIMAGEINFO,*_LPTIMAGEINFO;
	
	/*
	=======================================================================
	函数名       : LoadBitmapWil
	功能描述     : 导入位图文件
	参数         : void
	返回值       : NULL
	=======================================================================
	*/
	bool LoadBitmapWil(LPCTSTR name, DWORD index, CDC& dc/*, CBitmap& Bitmap*/ )
	{
		char szWilFileName[MAX_PATH];
		char szWixFileName[MAX_PATH];

		char szModuleFileName[MAX_PATH];
		GetModuleFileName(0,szModuleFileName,MAX_PATH);
		long nPos=strlen(szModuleFileName);
		while(nPos>0)
		{
			if(szModuleFileName[nPos]=='\\')
			{
				szModuleFileName[nPos]=(char)0;
				strcat(szModuleFileName,"\\data\\");
				break;
			}
			nPos--;
		}
		strcpy(szWilFileName,szModuleFileName);
		strcat(szWilFileName,name);
		strcat(szWilFileName,".wil");

		strcpy(szWixFileName,szModuleFileName);
		strcat(szWixFileName,name);
		strcat(szWixFileName,".wix");

		_TWIXHEAD WixHead;
		_TWILHEAD WilHead;
		BYTE* lpPal=NULL;
		DWORD* lpOffs=NULL;
		_TIMAGEINFO Image;
		BYTE* pImage=NULL;
		BYTE* pb=NULL;

		FILE*fp;
		fp=fopen(szWixFileName,"rb");
		if(fp!=NULL)
		{
			fread(&WixHead,sizeof(WixHead),1,fp);

			if ( !(index<WixHead.IndexCount) )
			{
				fclose(fp);
				return false;
			}

			std::auto_ptr<DWORD> lpOffs_auto(new DWORD[WixHead.IndexCount]);
			lpOffs=lpOffs_auto.get();

			ZeroMemory(lpOffs,sizeof(DWORD)*WixHead.IndexCount);
			fread(lpOffs,sizeof(DWORD),WixHead.IndexCount,fp);
			fclose(fp);

			fp=fopen(szWilFileName,"rb");
			if(fp!=NULL)
			{
				fread(&WilHead,sizeof(WilHead),1,fp);

				std::auto_ptr<BYTE> lpPal_auto(new BYTE[WilHead.ColorCount*4]);
				lpPal=lpPal_auto.get();

				ZeroMemory(lpPal,sizeof(DWORD)*WilHead.ColorCount);
				fread(lpPal,WilHead.PaletteSize,1,fp);

				fseek(fp,lpOffs[index],SEEK_SET);
				fread(&Image,sizeof(Image),1,fp);

				std::auto_ptr<BYTE> pImage_auto(new BYTE[Image.Height*Image.Width]);
				pImage=pImage_auto.get();

				ZeroMemory(pImage,Image.Height*Image.Width);
				fseek(fp,lpOffs[index]+8,SEEK_SET);
				fread(pImage,Image.Height*Image.Width,1,fp);
				fclose(fp);

				for(WORD i=0;i<Image.Width;i++)
				{
					for(WORD j=0;j<Image.Height;j++)
					{
						pb=&lpPal[pImage[j*Image.Width+i]*4];
						dc.SetPixel(i,Image.Height-j-1,RGB(pb[2],pb[1],pb[0]));
					}
				}
				return true;
			}
		}
		return false;
	}
}

⌨️ 快捷键说明

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