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

📄 anifile.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		int nExtAmount = m_pDaiFileByOrder->setExt.size();
		for(i= 0; i < nExtAmount; i ++)
		{
			char* pszStr = m_pDaiFileByOrder->setExt[i];
			if(pszStr)
				delete[] pszStr;
		}
		m_pDaiFileByOrder->setExt.clear();			
		
		int nStrAmount = m_pDaiFileByOrder->setStr.size();
		for(i= 0; i < nStrAmount; i ++)
		{
			char* pszStr = m_pDaiFileByOrder->setStr[i];
			if(pszStr)
				delete[] pszStr;
		}
		m_pDaiFileByOrder->setStr.clear();	
		
		delete m_pDaiFileByOrder;
		m_pDaiFileByOrder = NULL;
	}
	m_pDaiFileByOrder = new DaiFileInfoByOrder;
	if(!m_pDaiFileByOrder)
		return IDai::CODE_INTERIOR_ERROR;
	


	FILE* fp = fopen(pszFile, "wb");
	if(!fp)
		return IDai::CODE_OPENFILE_FALSE;
	int nRecordAmount = m_pAniFileByOrder->setAniInfo.size();
	int i;
	for(i = 0; i < nRecordAmount; i++)
	{
		AniInfoByOrder* pAniInfo = m_pAniFileByOrder->setAniInfo[i];
		if(!pAniInfo)
			return IDai::CODE_INTERIOR_ERROR;		
		DaiInfo* pInfo = new DaiInfo;
		if(!pInfo)
			return IDai::CODE_INTERIOR_ERROR;
		m_pDaiFileByOrder->setDaiInfo.push_back(pInfo);

		if(!pAniInfo->pszIndex)
			return IDai::CODE_INTERIOR_ERROR;

		this->ZipStr(m_pDaiFileByOrder->setStr, pAniInfo->pszIndex, pInfo->usIndexNameIndex,
						pInfo->cIndexNameAdjust1, pInfo->cIndexNameAdjust2);

		// frame ...
		pInfo->ucFrameAmount = pAniInfo->setFrame.size();
		if(pInfo->ucFrameAmount >= 255)
			return IDai::CODE_FRAMEAMOUNT_OVERFLOW;
		pInfo->pFrameInfo = new DaiFrameInfo[pInfo->ucFrameAmount];
		if(!pInfo->pFrameInfo)
			return IDai::CODE_INTERIOR_ERROR;
		for(int j = 0; j < pInfo->ucFrameAmount; j ++)
		{
			char* pszFrame = pAniInfo->setFrame[j];
			if(!pszFrame)
				return IDai::CODE_INTERIOR_ERROR;
			DaiFrameInfo* pCurrentInfo = pInfo->pFrameInfo+j;
			this->ZipFrame(m_pDaiFileByOrder->setStr, m_pDaiFileByOrder->setExt, m_pDaiFileByOrder->setDir,
							pszFrame, pCurrentInfo->usPath, pCurrentInfo->ucExtendName, pCurrentInfo->usFileNameIndex,
							pCurrentInfo->cFileNameAdjust1, pCurrentInfo->cFileNameAdjust2);
		}
	}
	
	// now save ...
	char szTitle[8] = "ND_DAI";
	DWORD dwVersion = 1000;
	fwrite(szTitle, sizeof(char), 8, fp);
	fwrite(&dwVersion, sizeof(DWORD), 1, fp);
	
	// path...
	unsigned short usPathAmount = m_pDaiFileByOrder->setDir.size();
	fwrite(&usPathAmount, sizeof(unsigned short), 1, fp);
	for(i = 0; i < usPathAmount; i ++)
	{
		char* pszDir = m_pDaiFileByOrder->setDir[i];
		if(!pszDir)
		{
			fclose(fp);
			return IDai::CODE_INTERIOR_ERROR;
		}
		unsigned short usLength = strlen(pszDir)+1;
		fwrite(&usLength, sizeof(unsigned short), 1, fp);

		fwrite(pszDir, sizeof(char), usLength, fp);
	}
	
	// save Ext ...
	unsigned char ucExtAmount = m_pDaiFileByOrder->setExt.size();
	fwrite(&ucExtAmount, sizeof(unsigned char), 1, fp);
	for(i = 0; i < ucExtAmount; i ++)
	{
		char* pszExt = m_pDaiFileByOrder->setExt[i];
		if(!pszExt)
		{
			fclose(fp);
			return IDai::CODE_INTERIOR_ERROR;
		}
		unsigned short usLength = strlen(pszExt)+1;
		fwrite(&usLength, sizeof(unsigned short), 1, fp);

		fwrite(pszExt, sizeof(char), usLength, fp);
	}
	
	// save Str ...
	unsigned short usStrAmount = m_pDaiFileByOrder->setStr.size();
	fwrite(&usStrAmount, sizeof(unsigned short), 1, fp);
	for(i = 0; i < usStrAmount; i ++)
	{
		char* pszStr = m_pDaiFileByOrder->setStr[i];
		if(!pszStr)
		{
			fclose(fp);
			return IDai::CODE_INTERIOR_ERROR;
		}
		unsigned short usLength = strlen(pszStr)+1;
		fwrite(&usLength, sizeof(unsigned short), 1, fp);
		
		fwrite(pszStr, sizeof(char), usLength, fp);
	}
	
	// get filename
	// save record
	unsigned long uAniAmount = m_pDaiFileByOrder->setDaiInfo.size();
	fwrite(&uAniAmount, sizeof(DWORD), 1, fp);

	char szDir[_MAX_DIR]		=	"";
	char szDrive[_MAX_PATH]		=	"";
	char szFileName[_MAX_FNAME]	=	"";
	char szExt[_MAX_EXT]		=	"";
	_splitpath(pszFile, szDrive, szDir, szFileName, szExt);

	for(i = 0; i < uAniAmount; i ++)
	{
		DaiInfo* pInfo = m_pDaiFileByOrder->setDaiInfo[i];
		if(!pInfo)
		{
			fclose(fp);
			return IDai::CODE_INTERIOR_ERROR;
		}
		if(!pInfo->pFrameInfo)
		{
			fclose(fp);
			return IDai::CODE_INTERIOR_ERROR;
		}

		// encrypt ...
		int nLength = strlen(szFileName);
		strupr(szFileName);
		unsigned char ucFrameAmount = pInfo->ucFrameAmount^szFileName[i%nLength];
		fwrite(&ucFrameAmount, sizeof(unsigned char), 1, fp);

		fwrite(&pInfo->usIndexNameIndex, sizeof(unsigned short), 1, fp);
		fwrite(&pInfo->cIndexNameAdjust1, sizeof(char), 1, fp);
		fwrite(&pInfo->cIndexNameAdjust2, sizeof(char), 1, fp);

		fwrite(pInfo->pFrameInfo, sizeof(DaiFrameInfo), pInfo->ucFrameAmount, fp);
	}

	fclose(fp);
	return IDai::SUCCESS;
}
//--------------------------------------------------------------------------------------
unsigned long	CAniFile::ZipStr(deque<char*>& setStr, const char* pszStr, unsigned short& usStrIndex, char& cAdjustA, char& cAdjustB)
{
	if(!pszStr)
		return IDai::CODE_INTERIOR_ERROR;

	DWORD dwLength = strlen(pszStr);
	if(dwLength == 1)
	{
		usStrIndex = 65535;
		cAdjustA = pszStr[0];
		cAdjustB = '\0';
		return IDai::SUCCESS; 
	}
	
	if(dwLength == 2)
	{
		usStrIndex = 65534;
		cAdjustA = pszStr[0];
		cAdjustB = pszStr[1];
		return IDai::SUCCESS; 
	}
	
	// get index
	char szIndex[_MAX_PATH];
	strcpy(szIndex, pszStr);
	szIndex[dwLength-2] = '\0';
	int nAmount = setStr.size();
	for(int i = 0; i < nAmount; i ++)
	{
		char* pStr = setStr[i];
		if(pStr	&& strcmp(pStr, szIndex) == 0)
		{
			// found ...
			usStrIndex = i;
			break;
		}
	}
	if(i == nAmount)
	{
		if(i >= 65533)
			return IDai::CODE_STRINDEX_OVERFLOW;

		char* pszNewIndex = new char[strlen(szIndex)+1];
		if(!pszNewIndex)
			return IDai::CODE_INTERIOR_ERROR;
		strcpy(pszNewIndex, szIndex);
		setStr.push_back(pszNewIndex);
		usStrIndex = setStr.size()-1;
	}
	
	cAdjustA = pszStr[dwLength-2];
	cAdjustB = pszStr[dwLength-1];
	
	return IDai::SUCCESS;	
	
}
//--------------------------------------------------------------------------------------
unsigned long	CAniFile::ZipFrame(deque<char*>& setStr, deque<char*>& setExt, deque<char*>& setDir,
								   const char* pszFrame, unsigned short& usPathIndex, unsigned char& ucExtIndex,
									unsigned short& usNameIndex, char& cNameAdjustA, char& cNameAdjustB)
{
	if(!pszFrame)
		return IDai::CODE_INTERIOR_ERROR;

	// assay path
	char szDir[_MAX_DIR]			=	"";
	char szDrive[_MAX_PATH]		=	"";
	char szFileName[_MAX_FNAME]	=	"";
	char szExt[_MAX_EXT]			=	"";
	_splitpath(pszFrame, szDrive, szDir, szFileName, szExt);

	// continue ...
	int i;

	// direction ...
	int nDirAmount = setDir.size();
	for(i = 0; i < nDirAmount; i ++)
	{
		char* pszDir = setDir[i];
		if(pszDir && (strcmp(szDir, pszDir) == 0))
		{
			usPathIndex = i;
			break;
		}
	}
	if(i == nDirAmount)
	{
		if(i >= 65535)
			return IDai::CODE_DIRINDEX_OVERFLOW;
		char* pszNewDir = new char[strlen(szDir)+1];
		if(!pszNewDir)
			return IDai::CODE_INTERIOR_ERROR;
		strcpy(pszNewDir, szDir);
		setDir.push_back(pszNewDir);
		usPathIndex = setDir.size()-1;
	}

	// ext name ...
	int nExtNameAmount = setExt.size();
	for(i = 0;  i < nExtNameAmount; i ++)
	{
		char* pszExt = setExt[i];
		if(pszExt && strcmp(pszExt, szExt) == 0)
		{
			ucExtIndex = i;
			break;
		}
	}
	if(i == nExtNameAmount)
	{
		if(i >= 255)
			return IDai::CODE_EXTINDEX_OVERFLOW;
		char* pszNewExt = new char[strlen(szExt)+1];
		if(!pszNewExt)
			return IDai::CODE_INTERIOR_ERROR;
		strcpy(pszNewExt, szExt);
		setExt.push_back(pszNewExt);
		ucExtIndex = setExt.size()-1;
	}
	
	// file name ...
	unsigned long uCode = this->ZipStr(setStr, szFileName, usNameIndex, cNameAdjustA, cNameAdjustB);
	if(IDai::SUCCESS != uCode)
		return uCode;
	return IDai::SUCCESS;
}
//--------------------------------------------------------------------------------------
bool	CAniFile::CheckFile(const char* pszDir, const char* pszFileName)
{
	if(!pszDir || !pszFileName)
		return false;
	if(strcmp(this->m_infoIndex.szPath, pszDir) == 0 && strcmp(this->m_infoIndex.szFile, pszFileName) == 0)
		return true;
	return false;
}
//--------------------------------------------------------------------------------------
unsigned long	CAniFile::UnZipStr(deque<char*>& setStr, char* pszBuffer, unsigned long uBufferSize, 
						 unsigned short& usStrIndex, char& cAdjustA, char& cAdjustB)
{
	if(!pszBuffer)
		return IDai::CODE_INTERIOR_ERROR;
	int nStrAmount = setStr.size();

	// special string index ...
	if(uBufferSize < 3)
		return IDai::CODE_STRINGBUFFER_OVERFLOW;
	if(usStrIndex == 65535)
	{
		pszBuffer[0] = cAdjustA;
		pszBuffer[1] = '\0';
		return IDai::SUCCESS;
	}
	if(usStrIndex == 65534)
	{
		pszBuffer[0] = cAdjustA;
		pszBuffer[1] = cAdjustB;
		pszBuffer[2] = '\0';
		return IDai::SUCCESS;
	}

	// check index
	int nAmount = setStr.size();
	if(usStrIndex >= nAmount)
		return IDai::CODE_STRINDEX_OVERFLOW;
	if(!setStr[usStrIndex])
		return IDai::CODE_INTERIOR_ERROR;

	// check size
	unsigned long uSize = 1+1+1+sizeof(setStr[usStrIndex]);
	if(uSize > uBufferSize)
		return IDai::CODE_STRINGBUFFER_OVERFLOW;

	strcpy(pszBuffer, setStr[usStrIndex]);

	// adjust ...
	int nLength = strlen(pszBuffer);
	pszBuffer[nLength] = cAdjustA;
	pszBuffer[nLength+1] = cAdjustB;
	pszBuffer[nLength+2] = '\0';

	return IDai::SUCCESS;
}
//--------------------------------------------------------------------------------------

unsigned long	CAniFile::UnZipFrame(deque<char*>& setStr, deque<char*>& setExt, deque<char*>& setDir,
						   char* pszBuffer, unsigned long uBufferSize, unsigned short& usPathIndex, unsigned char& ucExtIndex,
						   unsigned short& usNameIndex, char& cNameAdjustA, char& cNameAdjustB)
{
	if(!pszBuffer)	
		return IDai::CODE_INTERIOR_ERROR;

	// check index
	int nExtAmount = setExt.size();
	if(ucExtIndex >= nExtAmount)
		return IDai::CODE_EXTINDEX_OVERFLOW;
	int nDirAmount = setDir.size();
	if(usPathIndex >= nDirAmount)
		return IDai::CODE_DIRINDEX_OVERFLOW;
	if(!setExt[ucExtIndex] || !setDir[usPathIndex])
		return IDai::CODE_INTERIOR_ERROR;

	static char szFileName[512];
	unsigned long uCode = this->UnZipStr(setStr, szFileName, 512, usNameIndex, cNameAdjustA, cNameAdjustB);
	if(uCode != IDai::SUCCESS)
		return uCode;

	// check size 
	unsigned long uSize = strlen(szFileName)+strlen(setExt[ucExtIndex])+strlen(setDir[usPathIndex])+1;
	if(uBufferSize < uSize)
		return IDai::CODE_STRINGBUFFER_OVERFLOW;
	sprintf(pszBuffer, "%s%s%s", setDir[usPathIndex], szFileName, setExt[ucExtIndex]);
	return IDai::SUCCESS;
}
//--------------------------------------------------------------------------------------
unsigned long	CAniFile::GetAni(const char* pszIndex, IFrameSet* pInfoFrame)
{
	if(!pszIndex && ! pInfoFrame)
		return IDai::CODE_EXTERIOR_ERROR;
	if(!m_pAniFile && !m_pDaiFile)
		return IDai::CODE_INTERIOR_ERROR;
	unsigned long uKey = this->Str2Id(pszIndex);

	// clear buffer if not empty
	pInfoFrame->Clear();

	if(m_pDaiFile)
	{
		// search ...
		map<unsigned long, DaiInfo*>::iterator iter=	m_pDaiFile->setDaiInfo.find(uKey);
		if(iter == m_pDaiFile->setDaiInfo.end())
			return IDai::CODE_INFO_NOTFOUND;
		// found ...					
		DaiInfo* pInfo = iter->second;
		if(!pInfo)
			return IDai::CODE_INTERIOR_ERROR;
		for(int i = 0; i < pInfo->ucFrameAmount; i++)
		{
			if(!pInfo)
				return IDai::CODE_INTERIOR_ERROR;
			DaiFrameInfo* pFrameInfo =  pInfo->pFrameInfo + i;
			char szFrame[256];

			unsigned long uCode;
			uCode = this->UnZipFrame(m_pDaiFile->setStr, m_pDaiFile->setExt, m_pDaiFile->setDir,
								szFrame, 256, pFrameInfo->usPath, pFrameInfo->ucExtendName,
								pFrameInfo->usFileNameIndex, pFrameInfo->cFileNameAdjust1,
								pFrameInfo->cFileNameAdjust2);
			pInfoFrame->InsertFrame(szFrame);
			if(uCode != IDai::SUCCESS)
				return uCode;
						
		}
		return IDai::SUCCESS;
	}
	else if(m_pAniFile)
	{
		// search ...
		map<unsigned long, AniInfo*>::iterator iter=	m_pAniFile->setAniInfo.find(uKey);
		if(iter == m_pAniFile->setAniInfo.end())
			return IDai::CODE_INFO_NOTFOUND;
		AniInfo* pAniInfo = iter->second;
		if(!pAniInfo)
			return IDai::CODE_INTERIOR_ERROR;
		// found ...
		int nFrameAmount = 	pAniInfo->setFrame.size();
		for(int i = 0; i < nFrameAmount; i ++)
		{
			char* pszFile = pAniInfo->setFrame[i];
			if(!pszFile)
				return IDai::CODE_INTERIOR_ERROR;
			pInfoFrame->InsertFrame(pszFile);
		}
		return IDai::SUCCESS;
	}

	return IDai::CODE_INFO_NOTFOUND;
}
//--------------------------------------------------------------------------------------

⌨️ 快捷键说明

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