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

📄 mhfile.cpp

📁 墨香最新私服
💻 CPP
字号:
// MHFile.cpp: implementation of the CMHFile class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MHFile.h"
//#include "./interface/Line_Node.h"
//#include "./interface/cWindowFunc.h"
#include "Engine/GraphicEngine.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMHFile::CMHFile()
{
	fp = NULL;
	memset( &m_Header, 0, sizeof(m_Header) );
	m_crc1 = m_crc2 = 0;
	m_pData = NULL;
	m_Dfp = 0;
	m_bInit = FALSE;
	memset( m_sFileName, 0, MAX_PATH );

	m_pFileStorage = 0;
	m_pFilePointer = 0;
}

CMHFile::~CMHFile()
{
	Release();
}
/*
BOOL CMHFile::OpenBin( char* filename )
{
	if( filename == NULL )
		return FALSE;

	fp = fopen( filename, "rb" );
	strcpy(m_sFileName,filename);
	if( fp )
	{
		Clear();
		fread( &m_Header, sizeof(m_Header), 1, fp );
		fread( &m_crc1, sizeof(char), 1, fp );

		if( CheckHeader() )
		{
			if( m_Header.FileSize )
			{
				m_pData = new char[m_Header.FileSize];
				fread( m_pData, sizeof(char), m_Header.FileSize, fp );
			}
		}
		else
		{
			fclose( fp );
			fp = NULL;
			return FALSE;
		}
	}	
	else
	{
		return FALSE;
	}
	fclose( fp );
	fp = NULL;

	if( !CheckCRC() ) return FALSE;

	m_bInit = TRUE;

	return TRUE;
}

BOOL CMHFile::CheckHeader()
{
	return TRUE;
}

BOOL CMHFile::CheckCRC()
{
	char crc = 0;
	// data 函券
	for( DWORD i = 0; i < m_Header.FileSize; ++i )
	{
		crc += m_pData[i];
		m_pData[i] -= (char)i;		
	}

	if( m_crc1 != crc )
	{
		Clear();
		return FALSE;
	}

	return TRUE;
}
*/

BOOL CMHFile::OpenBin( char* filename )
{
	if( filename == NULL )
		return FALSE;

	fp = fopen( filename, "rb" );
	strcpy(m_sFileName,filename);
	if( fp )
	{
		Clear();
		fread( &m_Header, sizeof(m_Header), 1, fp );	// header
		fread( &m_crc1, sizeof(char), 1, fp );			// crc1
		if( m_Header.FileSize )							// data
		{
			m_pData = new char[m_Header.FileSize];
			fread( m_pData, sizeof(char), m_Header.FileSize, fp );
		}
		fread( &m_crc2, sizeof(char), 1, fp );			// crc2
	}	
	else
	{
		return FALSE;
	}
	fclose( fp );
	fp = NULL;

	if( !CheckHeader() )	return FALSE;
	if( !CheckCRC() )		return FALSE;

	m_bInit = TRUE;

	return TRUE;
}

BOOL CMHFile::CheckHeader()
{
	if( m_Header.dwVersion != (DWORD)(20040308+m_Header.dwType+m_Header.FileSize) )
	{
		Clear();
		MessageBox( NULL, "Header Version Error!!", m_sFileName, MB_OK );
		return FALSE;
	}
	if( m_Header.dwType == 0 )
	{
		Clear();
		MessageBox( NULL, "Header Type Error!!", m_sFileName, MB_OK );
		return FALSE;
	}	

	return TRUE;
}

BOOL CMHFile::CheckCRC()
{
	if( m_crc1 != m_crc2 )
	{
		Clear();
		MessageBox( NULL, "CheckCrc Error!!", "Error!!", MB_OK );
		return FALSE;
	}

	// decode
	char crc = (char)m_Header.dwType;
	for( DWORD i = 0; i < m_Header.FileSize; ++i )
	{
		crc += m_pData[i];
		m_pData[i] -= (char)i;
		if( i%m_Header.dwType == 0 )
			m_pData[i] -= (char)m_Header.dwType;
	}

	if( m_crc1 != crc )
	{
		Clear();
		MessageBox( NULL, "CheckCrc Error!!", "Error!!", MB_OK );
		return FALSE;
	}

	return TRUE;
}

void CMHFile::Clear()
{
	if( m_pData )
	{
		delete [] m_pData;
		m_pData = NULL;
	}
	m_Dfp = 0;
	m_bInit = FALSE;
}

BOOL CMHFile::Init(char* filename,char* mode,DWORD dwFlag)
{
	if(!(dwFlag & MHFILE_FLAG_DONOTCHANGE_DIRECTORY_TOROOT))
		DIRECTORYMGR->SetLoadMode(eLM_Root);
	
	if( strcmp( filename, "./image/image_msg.bin" ) == 0 )
		int a = 1;
//	printf( "%s\n", filename );	//KES DEBUG
	
	if(g_bUsingEnginePack)
	{
		if( strcmp( "rb", mode ) == 0 )		m_bReadMode = MHFILE_PACKEDFILE;
		else if( strcmp( "ET", mode ) == 0 )m_bReadMode = MHFILE_ENGINEPACKEDFILE;
		else if( strcmp( "EB", mode ) == 0 )m_bReadMode = MHFILE_ENGINEPACKEDFILE;
		else								m_bReadMode = MHFILE_NORMALMODE;
	}
	else
	{
		if( strcmp( "rb", mode ) == 0 )		m_bReadMode = MHFILE_PACKEDFILE;
		else								m_bReadMode = MHFILE_NORMALMODE;
	}

	
	ySWITCH(m_bReadMode)
		yCASE(MHFILE_PACKEDFILE)
			return OpenBin( filename );
		yCASE(MHFILE_NORMALMODE)
			fp = fopen(filename,"r");
			if(fp)
				return TRUE;
			else
			{
				if(!(dwFlag & MHFILE_FLAG_DONOTDISPLAY_NOTFOUNDERROR))
				{
					char buffer[255];
					sprintf(buffer, "[%s] file is not found",filename);
					LOGEX(buffer,PT_MESSAGEBOX);
				}
				
				return FALSE;
			}
		yCASE(MHFILE_ENGINEPACKEDFILE)
			g_pExecutive->GetFileStorage(&m_pFileStorage);
			m_pFilePointer = m_pFileStorage->FSOpenFile(filename,FSFILE_ACCESSMODE_TEXT);
			if(m_pFilePointer && m_pFileStorage)
				return TRUE;
			else
				return FALSE;
	yENDSWITCH

	return FALSE;
}

void CMHFile::Release()
{
	if(fp)
	{
		fclose(fp);
		fp = NULL;
	}
	Clear();

	if(m_pFilePointer)
	{
		m_pFileStorage->FSCloseFile(m_pFilePointer);
		m_pFileStorage->Release();
		m_pFilePointer = NULL;
		m_pFileStorage = NULL;
	}
}

char* CMHFile::GetString()
{
	static char buf[256];
	GetString(buf);
	return buf;
}

int CMHFile::GetString( char* pBuf )
{
	char buf[256] = {0,};
	DWORD j = 0;
	BOOL bStart, bEnd;
	bStart = bEnd = FALSE;
	// yh;
	int rt = 0;

	ySWITCH(m_bReadMode)
		yCASE(MHFILE_PACKEDFILE)
			if(m_Dfp == m_Header.FileSize) return (rt=EOF);

			for( DWORD i = m_Dfp; i < m_Header.FileSize; ++i )
			{
				if( m_pData[i] == 0x0d && m_pData[i+1] == 0x0a )	// return
				{
					if( bStart )
						break;
					else
					{
						m_Dfp += 2;
						++i;
					}
				}
				else if( m_pData[i] == 0x20 || m_pData[i] == 0x09 )	// spacebar, tab
				{
					m_Dfp++;
					if( bStart )
						bEnd = TRUE;
				}
				else
				{
					if( bEnd ) break;

					buf[j] = m_pData[i];
					j++;
					m_Dfp++;
					bStart = TRUE;
				}
			}
			buf[j] = 0;
		yCASE(MHFILE_NORMALMODE)
			rt = fscanf( fp, "%s", buf );
		yCASE(MHFILE_ENGINEPACKEDFILE)
			rt = m_pFileStorage->FSScanf(m_pFilePointer,"%s",buf);

	yENDSWITCH

	_parsingKeywordString( buf, (char**)(&pBuf) );

	return rt;
}
/*
int CMHFile::GetString( char* pBuf )
{
	char buf[256] = {0,};
	DWORD j = 0;
	BOOL bflag = FALSE;
	// yh;
	int rt = 0;

	ySWITCH(m_bReadMode)
		yCASE(MHFILE_PACKEDFILE)
			if(m_Dfp == m_Header.FileSize) return (rt=EOF);

			for( DWORD i = m_Dfp; i < m_Header.FileSize; ++i )
			{
				if( m_pData[i] == 0x0d && m_pData[i+1] == 0x0a )	// return
				{
					m_Dfp += 2;
					break;
				}
				else if( m_pData[i] == 0x20 || m_pData[i] == 0x09 )	// spacebar, tab
				{
					m_Dfp++;
					if( bflag )	break;
					else		continue;
				}
				else
				{
					buf[j] = m_pData[i];
					j++;
					m_Dfp++;
					bflag = TRUE;
				}
			}
			buf[j] = 0;
		yCASE(MHFILE_NORMALMODE)
			rt = fscanf( fp, "%s", buf );
		yCASE(MHFILE_ENGINEPACKEDFILE)
			rt = m_pFileStorage->FSScanf(m_pFilePointer,"%s",buf);

	yENDSWITCH

	_parsingKeywordString( buf, (char**)(&pBuf) );

	return rt;
}
*/
char* CMHFile::GetStringInQuotation()
{
	char buf[512]={0,};
	static char buf2[512];
	int c;

	ySWITCH(m_bReadMode)
		yCASE(MHFILE_PACKEDFILE)
//			m_Dfp--;
			while( (c=m_pData[m_Dfp]) != '"' )	// 霉蝶咳钎 唱棵锭鳖瘤 胶诺
			{
				++m_Dfp;
				if( c == 10 )					//霉蝶咳钎 唱坷扁傈俊 浚磐啊 乐栏搁 吝瘤
				{
					buf2[0] = 0;
					return buf2;
				}
			}
			int n = 0;
			while( 1 )
			{
				++m_Dfp;
				buf[n] = m_pData[m_Dfp];
				if( buf[n] == '"' )
				{
					buf[n] = 0;
					++m_Dfp;
					break;
				}
				if( buf[n] == 10 )				// 浚磐
				{
					__asm int 3;
					buf[n] = 0;
					break;
				}
				++n;
			}
			char* aa = &buf2[0];
			memcpy( buf2, buf, n+1 );	
		yCASE(MHFILE_NORMALMODE)
			while( (c=fgetc(fp)) != '"')	// 霉蝶咳钎 唱棵锭鳖瘤 胶诺
			{
				if( c == 10 )//霉蝶咳钎 唱坷扁傈俊 浚磐啊 乐栏搁 吝瘤
				{
					Seek(-1);
					buf2[0] = 0;
					return buf2;
				}
			}
			int n=0;
			while(1)
			{
				ASSERT(!feof(fp));
				buf[n] = fgetc(fp);
				if(buf[n] == '"' )
				{
					buf[n] = 0;
					break;
				}
				if(buf[n] == 10) // 浚磐
				{
					Seek(-1);
					buf[n] = 0;
					break;
				}
				++n;
			}
			char * aa = &buf2[0];
			//	_parsingKeywordString(buf, &aa);	//KES 030828 阜疽澜. 漂荐扁瓷 虐啊 漏覆?
			memcpy( buf2, buf, n+1 );
		yCASE(MHFILE_ENGINEPACKEDFILE)
			ASSERT(0);
			// 秽!~ 瘤盔救窃

	yENDSWITCH

	return buf2;
}

void CMHFile::GetStringInQuotation(char* pBuf)
{
	strcpy(pBuf,GetStringInQuotation());
}

void CMHFile::GetLine(char * pBuf, int len)
{
	char buf[512] = {0,};
	DWORD j = 0;

	ySWITCH(m_bReadMode)
		yCASE(MHFILE_PACKEDFILE)
			for( DWORD i = m_Dfp; i < m_Header.FileSize; ++i )
			{
				if( m_pData[i] == 0x0d && m_pData[i+1] == 0x0a )	// return
				{
					m_Dfp += 2;
					break;
				}
				else
				{
					buf[j] = m_pData[i];
					j++;
					m_Dfp++;
				}
			}
			buf[j] = 0;
		yCASE(MHFILE_NORMALMODE)
			fgets(buf, 512, fp);
			if( buf[strlen(buf)-1] == 10 )
				buf[strlen(buf)-1] = 0;
		yCASE(MHFILE_ENGINEPACKEDFILE)
			ASSERT(0);
			// 秽!~ 瘤盔救窃

	yENDSWITCH

	_parsingKeywordString(buf, &pBuf);
}

void CMHFile::GetLineX(char * pBuf, int len)
{
	char buf[512] = {0,};
	DWORD j = 0;

	ySWITCH(m_bReadMode)
		yCASE(MHFILE_PACKEDFILE)
			if( m_Dfp > 2 ) m_Dfp -= 2;
			for( DWORD i = m_Dfp; i < m_Header.FileSize; ++i )
			{
				if( m_pData[i] == 0x0d && m_pData[i+1] == 0x0a )	// return
				{
					m_Dfp += 2;
					break;
				}
				else
				{
					buf[j] = m_pData[i];
					j++;
					m_Dfp++;
				}
			}
			buf[j] = 0;
		yCASE(MHFILE_NORMALMODE)
			fgets(buf, 512, fp);
			if( buf[strlen(buf)-1] == 10 )
				buf[strlen(buf)-1] = 0;
		yCASE(MHFILE_ENGINEPACKEDFILE)
			ASSERT(0);
			// 秽!~ 瘤盔救窃

	yENDSWITCH

	_parsingKeywordString(buf, &pBuf);
}

int CMHFile::GetInt()
{
	return atoi(GetString());
}

LONG CMHFile::GetLong()
{
	return (LONG)atoi(GetString());
}

float CMHFile::GetFloat()
{
	return (float)atof(GetString());
}

DWORD CMHFile::GetDword()
{
	return (DWORD)atoi(GetString());
}

WORD CMHFile::GetWord()
{
	return (WORD)atoi(GetString());
}

BYTE CMHFile::GetByte()
{
	return (BYTE)atoi(GetString());
}

BOOL CMHFile::GetBool()
{
	return (BOOL)atoi(GetString());
}

void CMHFile::GetFloat(float* pArray,int count)
{
	for(int n=0;n<count;++n)
	{
		pArray[n] = GetFloat();
	}
}

void CMHFile::GetWord(WORD* pArray,int count)
{
	for(int n=0;n<count;++n)
	{
		pArray[n] = GetWord();
	}
}

void CMHFile::GetDword(DWORD* pArray,int count)
{
	for(int n=0;n<count;++n)
	{
		pArray[n] = GetDword();
	}
}

int CMHFile::GetWord(WORD* pOut)
{
	ASSERT(m_bReadMode == MHFILE_ENGINEPACKEDFILE);
	
	return m_pFileStorage->FSScanf(m_pFilePointer,"%d",pOut);
}

BOOL CMHFile::GetExpPoint()
{
	return (EXPTYPE)atoi(GetString());
}
BOOL CMHFile::GetLevel()
{
	return (LEVELTYPE)atoi(GetString());
}

BOOL CMHFile::IsEOF()
{
	ySWITCH(m_bReadMode)
		yCASE(MHFILE_PACKEDFILE)
			if( m_Header.FileSize == (DWORD)m_Dfp )
				return TRUE;
			else
				return FALSE;
		yCASE(MHFILE_NORMALMODE)
			return feof(fp) ? TRUE : FALSE;
		yCASE(MHFILE_ENGINEPACKEDFILE)
			ASSERT(0);
			// 秽!~ 瘤盔救窃

	yENDSWITCH
		
	return TRUE;
}

BOOL CMHFile::IsInited()
{
	ySWITCH(m_bReadMode)
		yCASE(MHFILE_PACKEDFILE)
			return m_bInit ? TRUE : FALSE;
		yCASE(MHFILE_NORMALMODE)
			return fp ? TRUE : FALSE;
		yCASE(MHFILE_ENGINEPACKEDFILE)
			ASSERT(0);
			// 秽!~ 瘤盔救窃

	yENDSWITCH
		
	return TRUE;
}
BOOL CMHFile::Seek(int n)
{
	ySWITCH(m_bReadMode)
		yCASE(MHFILE_PACKEDFILE)
			m_Dfp += n;
			return TRUE;
		yCASE(MHFILE_NORMALMODE)
			return fseek( fp, n, SEEK_CUR );
		yCASE(MHFILE_ENGINEPACKEDFILE)
			ASSERT(0);
			// 秽!~ 瘤盔救窃

	yENDSWITCH
		
	return TRUE;
}
BOOL CMHFile::GetHex(DWORD* pOut)
{
	ySWITCH(m_bReadMode)
		yCASE(MHFILE_PACKEDFILE)
			ASSERT(0);
			// 秽!~ 瘤盔救窃
		yCASE(MHFILE_NORMALMODE)
			return fscanf( fp, "%x", pOut );
		yCASE(MHFILE_ENGINEPACKEDFILE)
			return m_pFileStorage->FSScanf(m_pFilePointer,"%x",pOut);

	yENDSWITCH

	return TRUE;
}

void _parsingKeywordString(char * inString, char ** outString)
{
	char * sp = inString;
	char * sp2 = *outString;
	while(*sp != 0)
	{
		if(*sp & 0x80)
		{
			*sp2++ = *sp++;
			*sp2++ = *sp++;
		}
		else
		{
			switch(*sp)
			{
			case TEXT_DELIMITER:
				{
					++sp;
					char tmp = *sp;
					switch(tmp)
					{
					case TEXT_SPACECHAR:
						{	
							*sp2 = ' ';
							++sp2;
						}
						break;
					case TEXT_EMPTYCHAR:
						{
							*outString[0] = 0;
						}
						break;
					}

				}
				break;
			default:
				{
					*sp2 = *sp;
					++sp2;
				}
			}
			++sp;
		}
	}
	*sp2 = 0;
}

/*
void _parsingKeywordStringEx(char * inString, line_node ** Top)
{
	line_node::release_line_node(Top);

	if(*inString == 0 || Top == NULL) return;
	
	char * sp = inString;
	line_node * curLineNode = (*Top) = new line_node;
	curLineNode->nextLine = NULL;
	char * cur_line = curLineNode->line;
	while(*sp != 0)
	{
		if(*sp & 0x80)
		{
			*cur_line++ = *sp++;
			*cur_line++ = *sp++;
		}
		else
		{
			switch(*sp)
			{
			case TEXT_DELIMITER:
				{
					++sp;
					char tmp = *sp;
					switch(tmp)
					{
					case TEXT_NEWLINECHAR:	// new line
						{
							*cur_line = 0;
							curLineNode->len = strlen(curLineNode->line);
							curLineNode = curLineNode->nextLine = new line_node;
							curLineNode->nextLine = NULL;
							cur_line = curLineNode->line;
						}
						break;
					case TEXT_TABCHAR:
						{
						}
						break;
					case TEXT_SPACECHAR:
						{	
							*cur_line = ' ';
							++cur_line;
						}
						break;
					}// - switch()
				}
				break;
			default:
				{
					*cur_line = *sp;
					++cur_line;
				}
			}//- switch()
			++sp;
		}
	}
	curLineNode->len = strlen(curLineNode->line);
}
*/

⌨️ 快捷键说明

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