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

📄 wilfile.cpp.svn-base

📁 传奇2地图编辑程序
💻 SVN-BASE
字号:
#include "StdAfx.h"
#include "wilfile.h"
#include <stdio.h>
#include ".\wilfile.h"

CWilFile::CWilFile(LPCTSTR lpFileName)
{
	m_lpPal=NULL;
	m_lpOffs=NULL;
	m_lpBitMaps=NULL;

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

	strcpy(m_szWixFileName,szModuleFileName);
	strcat(m_szWixFileName,lpFileName);
	strcat(m_szWixFileName,".wix");

	FILE*fp;

	fp=fopen(m_szWixFileName,"rb");
	if(fp!=NULL)
	{
		fread(&m_WixHead,sizeof(m_WixHead),1,fp);
		if(m_lpOffs!=NULL)
		{
			delete[]m_lpOffs;
		}
		m_lpOffs=new DWORD[m_WixHead.IndexCount];
		ZeroMemory(m_lpOffs,sizeof(DWORD)*m_WixHead.IndexCount);
		fread(m_lpOffs,sizeof(DWORD),m_WixHead.IndexCount,fp);
		fclose(fp);

		fp=fopen(m_szWilFileName,"rb");
		if(fp!=NULL)
		{
			if(m_lpBitMaps)
			{
				delete[]m_lpBitMaps;
			}
			m_lpBitMaps=new LP_BITMAPX[m_WixHead.IndexCount];
			for(DWORD i=0;i<m_WixHead.IndexCount;i++)
			{
				m_lpBitMaps[i]=NULL;
			}
			fread(&m_WilHead,sizeof(m_WilHead),1,fp);
			if(m_lpPal!=NULL)
			{
				delete[]m_lpPal;
			}
			m_lpPal=new DWORD[m_WilHead.ColorCount];
			ZeroMemory(m_lpPal,sizeof(DWORD)*m_WilHead.ColorCount);
			fread(m_lpPal,m_WilHead.PaletteSize,1,fp);
			fclose(fp);
			return;
		}
	}
	MessageBox(0,m_szWilFileName,"读取失败",0);
}

CWilFile::~CWilFile(void)
{
	//释放内存缓冲
	if(m_lpOffs!=NULL)
		delete[]m_lpOffs;
	if(m_lpPal!=NULL)
		delete[]m_lpPal;
}

LP_BITMAPX CWilFile::LoadBitmap(LP_DISPLAY lpDisplay,DWORD nIndex)
{
	if(nIndex>m_WixHead.IndexCount)
	{
		return NULL;
	}
	if(m_lpBitMaps[nIndex]!=NULL)
	{
		return m_lpBitMaps[nIndex];
	}
	else
	{
		LP_BITMAPX Bitmap=NULL;
		FILE* fp=NULL;
		BYTE* pImage=NULL;
		BYTE* pb=NULL;
		__try
		{
			fp=fopen(m_szWilFileName,"rb");
			if(fp==NULL)
			{
				return Bitmap;
			}
			ImageInfo Image;
			fseek(fp,m_lpOffs[nIndex],SEEK_SET);
			fread(&Image,sizeof(Image),1,fp);

			pImage=new BYTE[Image.Height*Image.Width];
			ZeroMemory(pImage,Image.Height*Image.Width);
			fseek(fp,m_lpOffs[nIndex]+8,SEEK_SET);
			fread(pImage,Image.Height*Image.Width,1,fp);
			fclose(fp);

			Bitmap=lpDisplay->CreateBitmap(Image.Width,Image.Height,true);
			if(Bitmap==NULL)
			{
				return Bitmap;
			}
			
			for(WORD i=0;i<Image.Width;i++)
			{
				for(WORD j=0;j<Image.Height;j++)
				{
					//if(pImage[j*Image.Width+i])
					{
						pb=(BYTE*)(m_lpPal+pImage[j*Image.Width+i]);
						lpDisplay->DrawPixel(Bitmap,i,Image.Height-j-1,RGB2Hi(pb[2],pb[1],pb[0]));
					}
				}
			}

			pb=(BYTE*)(m_lpPal);
			Bitmap->SetColorKey(RGB2Hi(pb[2],pb[1],pb[0]));
		}
		__finally
		{
			if(pImage!=NULL)
				delete[]pImage;
		}
		m_lpBitMaps[nIndex]=Bitmap;
		return Bitmap;
	}
}

⌨️ 快捷键说明

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