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

📄 ani.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "basefunc.H"
#include "nd_bitmap.H"
#include "ani.H"

// static 
HANDLE	CAni::s_hHeap	=NULL;
UINT	CAni::s_uNumAllocsInHeap	=0;
CAniFileSet CAni::s_setAniFile;
IDai* CAni::s_pDai = IDai::CreateNew();
IFrameSet* CAni::s_pFrameSet = IFrameSet::CreateNew();
CRITICAL_SECTION	sAniCritical;
//--------------------------------------------------------------
DWORD Str2ID( const char* str )
{
	int i;
	unsigned int v;
	static unsigned m[70];
	strncpy((char *)m,str,256);
	for (i=0;i<256/4 && m[i];i++) ;
	m[i++]=0x9BE74448,m[i++]=0x66F42C48;
	v=0xF4FA8928;

	__asm {
		mov esi,0x37A8470E		;x0=0x37A8470E
		mov edi,0x7758B42B		;y0=0x7758B42B
		xor ecx,ecx
_loop:
		mov ebx,0x267B0B11		;w=0x267B0B11
		rol v,1
		lea eax,m
		xor ebx,v

		mov eax,[eax+ecx*4]
		mov edx,ebx
		xor esi,eax
		xor edi,eax

		add edx,edi
		or edx,0x2040801		;a=0x2040801
		and edx,0xBFEF7FDF		;c=0xBFEF7FDF

		mov eax,esi
		mul edx
		adc eax,edx
		mov edx,ebx
		adc eax,0

		add edx,esi
		or edx,0x804021			;b=0x804021
		and edx,0x7DFEFBFF		;d=0x7DFEFBFF

		mov esi,eax
		mov eax,edi
		mul edx

		add edx,edx
		adc eax,edx
		jnc _skip
		add eax,2
_skip:
		inc ecx;
		mov edi,eax
		cmp ecx,i
		jnz _loop
		xor esi,edi
		mov v,esi
	}
	return v;
}

//--------------------------------------------------------------
void * CAni::operator new(size_t size)
{
	// got heap?
	if (!s_hHeap)
	{
		s_hHeap	=::HeapCreate(0, 0, 0);
		if (!s_hHeap)
			return NULL;
	}
	// alloc mem for new obj
	void* p	=::HeapAlloc(s_hHeap, HEAP_ZERO_MEMORY, size);
	if (p)
	{
		s_uNumAllocsInHeap++;
	}

	return p;
}

//--------------------------------------------------------------
void CAni::operator delete(void* p)
{
	// check param
	if (!s_hHeap || s_uNumAllocsInHeap <= 0)
		return;

	// free it...
	if (::HeapFree(s_hHeap, 0, p))
	{
		s_uNumAllocsInHeap--;
	}

	// time to destroy heap?
	if (s_uNumAllocsInHeap <= 0)
	{
		if (::HeapDestroy(s_hHeap))
			s_hHeap	=NULL;
	}
}

//--------------------------------------------------------------
BOOL CAni::IsValidPt(void* p)
{
	if (!s_hHeap || !p)
		return false;

	if ((DWORD)p < 0x00010000 || (DWORD)p >= 0x7FFEFFFF)	// user address range from 1M--2G-64k
		return false;

	if (::IsBadCodePtr((FARPROC)p))
		return false;

	return ::HeapValidate(s_hHeap, 0, p);
}

//--------------------------------------------------------------
void CAni::Init(void)
{
	m_nStatus	=ANISTATUS_INIT;
	m_bHalf		=false;
	m_iFrameAmount	=0;
	for(int i=0;i<_MAX_FRAME;i++)
	{
		m_pbmpFrame[i]	=NULL;
	}

	return;
}

//#define USE_ENCRYPTANI
#ifdef USE_ENCRYPTANI

//--------------------------------------------------------------
BOOL CAni::Create(const char* pszDataFile, const char* pszIndex, BOOL bHalf,DWORD dwLoadWay)
{
	if (!pszDataFile || !pszIndex)
		return false;

	if (m_nStatus == ANISTATUS_LOADED)
		Destroy();
	
	m_bHalf = bHalf;
	FILE *fp= fopen(pszDataFile,"rb");
	if (!fp)	{	
		m_nStatus	=ANISTATUS_FAILED;
		return false;
	}
	
	WORD wFileFlag = 0;
	fread(&wFileFlag,sizeof(WORD),1,fp);

	WORD ANIFILE_FLAG  =  0x8888; 
	if(wFileFlag != ANIFILE_FLAG)
		return false;

	int nTotal = 0;
	fread(&nTotal,sizeof(int),1,fp);

	typedef struct CSection{
		DWORD dwID;
		int   nFrame;
		int   nOffSet;
	}Section;

	Section* pTitle = (Section*)calloc(sizeof(Section),nTotal);
	if (!pTitle)
		return false;

	fread(pTitle,sizeof(Section),nTotal,fp);

	// search the titile 
	DWORD dwIDSearch = String2ID( pszIndex );
	int i = 0, nfind = -1;
	Section* pTitleFind = NULL;
	for (i=0; i<nTotal; i++)
	{
		pTitleFind = pTitle + i;
		if (pTitleFind->dwID == dwIDSearch)
		{
			nfind = i;
			break;
		}
	}

	if(nfind == -1)
	{
		m_nStatus	=ANISTATUS_FAILED;
		fclose(fp);
		return false;
	}
	else	
		pTitleFind = pTitle+nfind;
	

	fseek(fp, 256*pTitleFind->nOffSet, SEEK_CUR);
	m_iFrameAmount	= pTitleFind->nFrame%_MAX_FRAME;
	// get frame file name & load it...
	for( i=0; i<m_iFrameAmount; i ++)
	{
	 	
		char szFrame[MAX_PATH];	 
		if(!feof(fp))
			fread(szFrame,256,1,fp);	

		m_pbmpFrame[i]	=new CMyBitmap;
		assert(m_pbmpFrame[i]);
		if((i != 0)&&(i%2 == 0)&&m_bHalf)
		{
			m_pbmpFrame[i] = m_pbmpFrame[i-1];
		}
		else
		if (!m_pbmpFrame[i]->Load(szFrame,dwLoadWay))	// frame load error
		{
			for(int j=0; j<i+1; j++)
			{
				if (m_pbmpFrame[j])
					delete m_pbmpFrame[j];
				
				m_pbmpFrame[j]	=NULL;
			}			
			fclose(fp);			
			m_iFrameAmount	=0;
			m_nStatus	=ANISTATUS_FAILED;		
			return false;
		}
	}

	fclose(fp);
	m_nStatus	=ANISTATUS_LOADED;
	return true;
}

//--------------------------------------------------------------
#else
//--------------------------------------------------------------
BOOL CAni::Create(const char* pszDataFile, const char* pszIndex, BOOL bHalf,DWORD dwLoadWay)
{
	// param check
	::EnterCriticalSection(&sAniCritical);
	if (!pszDataFile || !pszIndex)
		return false;

	// release mem if data have loaded.
	if (m_nStatus == ANISTATUS_LOADED)
		Destroy();
	
	m_bHalf = bHalf;
	
	if(s_pDai->Locate(pszDataFile, pszIndex, CAni::s_pFrameSet) == IDai::SUCCESS)
	{
		BOOL bReturn = this->Create(CAni::s_pFrameSet);
		::LeaveCriticalSection(&sAniCritical);
		return bReturn;
	}
	else
	{
		m_nStatus	=ANISTATUS_FAILED;
		::LeaveCriticalSection(&sAniCritical);
		return false;
	}
	::LeaveCriticalSection(&sAniCritical);
	return false;
}
//--------------------------------------------------------------
#endif
//--------------------------------------------------------------
BOOL CAni::Create(AniIndexInfo* pInfo)
{
	if(!pInfo)
	{
		m_nStatus	=ANISTATUS_FAILED;
		return false;
	}
	
	m_iFrameAmount = pInfo->setAniLine.size()-1;

	for(int i=0; i<m_iFrameAmount; i ++)
	{
		char* pszFile = pInfo->setAniLine[i+1];
		
		m_pbmpFrame[i]	=new CMyBitmap;
		assert(m_pbmpFrame[i]);

		if((i != 0)&&(i%2 == 0)&&m_bHalf)
		{
			m_pbmpFrame[i] = m_pbmpFrame[i-1];
		}
		else
		if (!pszFile || !m_pbmpFrame[i]->Load(pszFile))	// frame load error
		{
			for(int j=0; j<i+1; j++)
			{
				if (m_pbmpFrame[j])
					delete m_pbmpFrame[j];
				
				m_pbmpFrame[j]	=NULL;
			}
			
			m_iFrameAmount	=0;
			m_nStatus	=ANISTATUS_FAILED;
			
			//::ErrorOut("Error: %s load failed in CAni::Create().", szFrame);
			return false;
		}
	}
	m_nStatus	=ANISTATUS_LOADED;
	return true;
}

//--------------------------------------------------------------
BOOL	CAni::Create(IFrameSet* pFrameSet)
{
	if(!pFrameSet)
	{
		m_nStatus	=ANISTATUS_FAILED;
		return false;
	}
	
	m_iFrameAmount = pFrameSet->GetFrameAmount();
	
	for(int i=0; i<m_iFrameAmount; i ++)
	{
		char* pszFile = pFrameSet->GetFrameByIndex(i);
		
		m_pbmpFrame[i]	=new CMyBitmap;
		assert(m_pbmpFrame[i]);
		
		if((i != 0)&&(i%2 == 0)&&m_bHalf)
		{
			m_pbmpFrame[i] = m_pbmpFrame[i-1];
		}
		else
			if (!pszFile || !m_pbmpFrame[i]->Load(pszFile))	// frame load error
			{
				for(int j=0; j<i+1; j++)
				{
					if (m_pbmpFrame[j])
						delete m_pbmpFrame[j];
					
					m_pbmpFrame[j]	=NULL;
				}
				
				m_iFrameAmount	=0;
				m_nStatus	=ANISTATUS_FAILED;
				
				//::ErrorOut("Error: %s load failed in CAni::Create().", szFrame);
				return false;
			}
	}
	m_nStatus	=ANISTATUS_LOADED;
	return true;
}
//--------------------------------------------------------------
// return true means is the last frame
BOOL CAni::Show(UINT uFrame, int x, int y, int alpha,DWORD dwShowWay) const
{
	if(m_nStatus != ANISTATUS_LOADED || m_iFrameAmount <= 0)
		return false;

	uFrame	%=m_iFrameAmount;

	m_pbmpFrame[uFrame]->Show(x, y, alpha,dwShowWay);

	if(uFrame+1 >= m_iFrameAmount)
		return true;
	else
		return false;
}

//--------------------------------------------------------------
BOOL CAni::ShowEx(UINT uFrame, int x, int y, RECT *lpSrc, DWORD dwWidth, DWORD dwHeight, int alpha, DWORD dwShowWay)
{
	if(m_nStatus != ANISTATUS_LOADED || m_iFrameAmount <= 0)
		return false;

	uFrame	%=m_iFrameAmount;

	m_pbmpFrame[uFrame]->ShowEx(x, y, lpSrc, dwWidth, dwHeight, alpha, dwShowWay);

⌨️ 快捷键说明

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