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

📄 cheatdlg.cpp

📁 著名的任天堂FC游戏机模拟器VirtuaNes 085版的源码!
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	ListView_InsertColumn( hWndCtrl, 0, &lvColumn );

	CApp::LoadString( IDS_CHT_COMMENT, szStr, sizeof(szStr) );
	lvColumn.iSubItem = 1;
	lvColumn.cx = nWidth*3/5;
	ListView_InsertColumn( hWndCtrl, 1, &lvColumn );

	// 僠乕僩僐乕僪傪僶僢僋傾僢僾偡傞(Cancel梡)
	INT	codenum = Emu.GetNES()->GetCheatCodeNum();
	if( codenum > 0 ) {
		CHEATCODE	code;

		for( INT i = 0; i < codenum; i++ ) {
			if( Emu.GetNES()->GetCheatCode( i, code ) ) {
				m_CheatCode.push_back( code );
			}
		}
	} else {
		m_CheatCode.clear();
	}

	OnListUpdate();

	m_uTimerID = ::SetTimer( m_hWnd, 0x0001, 1000, NULL );	// 1sec

	return	TRUE;
}

DLGMSG	CCheatCodeDlg::OnDestroy( DLGMSGPARAM )
{
//	DEBUGOUT( "CCheatCodeDlg::OnDestroy\n" );

	::KillTimer( m_hWnd, m_uTimerID );
	m_uTimerID = 0;

	if( m_hImageList ) {
		ImageList_Destroy( m_hImageList );
		m_hImageList = NULL;
	}

	return	TRUE;
}

DLGMSG	CCheatCodeDlg::OnTimer( DLGMSGPARAM )
{
//	DEBUGOUT( "CCheatCodeDlg::OnTimer\n" );

	if( Emu.GetNES()->IsCheatCodeAdd() ) {
		OnListUpdate();
	}

	return	TRUE;
}

DLGNOTIFY CCheatCodeDlg::OnKeyDownListView( DLGNOTIFYPARAM )
{
//	DEBUGOUT( "CCheatCodeDlg::OnKeyDownListView\n" );

	NMLVKEYDOWN* pNMKeyDown = (NMLVKEYDOWN*)pNMHDR;

	if( pNMKeyDown->wVKey != VK_SPACE )
		return;

	INT	codenum = Emu.GetNES()->GetCheatCodeNum();

	for( INT i = 0; i < codenum; i++ ) {
		if( ListView_GetItemState( pNMKeyDown->hdr.hwndFrom, i, LVIS_SELECTED ) ) {
			UINT	state = ListView_GetItemState( pNMKeyDown->hdr.hwndFrom, i, LVIS_STATEIMAGEMASK );
			if( (state+=0x1000) > 0x4000 )
				state = 0x1000;
			ListView_SetItemState( pNMKeyDown->hdr.hwndFrom, i, state, LVIS_STATEIMAGEMASK );

			// 僐乕僪峏怴
			CHEATCODE	code;
			if( Emu.GetNES()->GetCheatCode( i, code ) ) {
				code.enable = (state>>12)-1;
				Emu.GetNES()->ReplaceCheatCode( i, code );
			}
			break;
		}
	}
}

DLGNOTIFY CCheatCodeDlg::OnClickListView( DLGNOTIFYPARAM )
{
//	DEBUGOUT( "CCheatCodeDlg::OnClickListView\n" );

	NMLISTVIEW* pNMListView = (NMLISTVIEW*)pNMHDR;

	LVHITTESTINFO	lvht;

	lvht.pt = pNMListView->ptAction;
	ListView_HitTest( pNMListView->hdr.hwndFrom, &lvht );

	// 僗僥乕僩僀儊乕僕埲奜偼婣傞
	if( (lvht.flags&LVHT_NOWHERE) || (lvht.flags&LVHT_ONITEMLABEL) || lvht.iItem < 0 )
		return;

	// 僗僥乕僩傾僀僐儞側傜偽峏怴
	if( lvht.flags & LVHT_ONITEMSTATEICON ) {
		UINT	state = ListView_GetItemState( pNMListView->hdr.hwndFrom, lvht.iItem, LVIS_STATEIMAGEMASK );
		if( (state+=0x1000) > 0x4000 )
			state = 0x1000;
		ListView_SetItemState( pNMListView->hdr.hwndFrom, lvht.iItem, state, LVIS_STATEIMAGEMASK );

		// 僐乕僪峏怴
		CHEATCODE	code;
		if( Emu.GetNES()->GetCheatCode( lvht.iItem, code ) ) {
			code.enable = (state>>12)-1;
			Emu.GetNES()->ReplaceCheatCode( lvht.iItem, code );
		}
	}
}

DLGNOTIFY CCheatCodeDlg::OnDblClkListView( DLGNOTIFYPARAM )
{
//	DEBUGOUT( "CCheatCodeDlg::OnClickListView\n" );

	NMLISTVIEW* pNMListView = (NMLISTVIEW*)pNMHDR;

	LVHITTESTINFO	lvht;

	lvht.pt = pNMListView->ptAction;
	ListView_HitTest( pNMListView->hdr.hwndFrom, &lvht );

	// 儔儀儖埲奜偼婣傞
	if( (lvht.flags&LVHT_NOWHERE) || !(lvht.flags&LVHT_ONITEMLABEL) || lvht.iItem < 0 )
		return;

	// 僄僨傿僢僩偟偰偹乧偲丅
	::PostMessage( m_hWnd, WM_COMMAND, (WPARAM)IDC_CHT_EDIT, (LPARAM)0 );
}

DLGCMD	CCheatCodeDlg::OnOK( DLGCMDPARAM )
{
//	DEBUGOUT( "CCheatCodeDlg::OnOK\n" );

	// 擮偺偨傔
	m_CheatCode.clear();
	::EndDialog( m_hWnd, IDOK );
}

DLGCMD	CCheatCodeDlg::OnCancel( DLGCMDPARAM )
{
//	DEBUGOUT( "CCheatCodeDlg::OnCancel\n" );

	// 僶僢僋傾僢僾偟偰偄偨僠乕僩僐乕僪傪栠偡
	Emu.GetNES()->CheatInitial();
	for( INT i = 0; i < m_CheatCode.size(); i++ ) {
		Emu.GetNES()->AddCheatCode( m_CheatCode[i] );
	}

	// 擮偺偨傔
	m_CheatCode.clear();
	::EndDialog( m_hWnd, IDCANCEL );
}

DLGCMD	CCheatCodeDlg::OnEnable( DLGCMDPARAM )
{
//	DEBUGOUT( "CCheatCodeDlg::OnEnable\n" );

	Emu.GetNES()->SetCheatCodeAllFlag( TRUE, FALSE );
	OnListUpdate();
}

DLGCMD	CCheatCodeDlg::OnDisable( DLGCMDPARAM )
{
//	DEBUGOUT( "CCheatCodeDlg::OnDisable\n" );

	Emu.GetNES()->SetCheatCodeAllFlag( FALSE, FALSE );
	OnListUpdate();
}

DLGCMD	CCheatCodeDlg::OnClear( DLGCMDPARAM )
{
//	DEBUGOUT( "CCheatCodeDlg::OnClear\n" );

	Emu.GetNES()->CheatInitial();
	OnListUpdate();
}

DLGCMD	CCheatCodeDlg::OnRemove( DLGCMDPARAM )
{
//	DEBUGOUT( "CCheatCodeDlg::OnRemove\n" );

	HWND	hWndCtrl = ::GetDlgItem( m_hWnd, IDC_CHT_CODE_LIST );
	INT	nCount = ListView_GetItemCount( hWndCtrl );

	for( INT i = 0; i < nCount; i++ ) {
		if( ListView_GetItemState( hWndCtrl, i, LVIS_SELECTED ) ) {
			ListView_DeleteItem( hWndCtrl, i );
			// 徚偡
			Emu.GetNES()->DelCheatCode( i );
			break;
		}
	}
}

DLGCMD	CCheatCodeDlg::OnInput( DLGCMDPARAM )
{
	DEBUGOUT( "CCheatCodeDlg::OnInput\n" );

	CCheatCodeInputDlg dlg;

	if( dlg.DoModal( m_hWnd ) == IDOK ) {
		CHEATCODE	code;

		if( ::strlen( dlg.m_Codes.c_str() ) < 10 )
			return;

		const UCHAR seps[] = " -\t\n\0";	// 僙僷儗乕僞
		CHAR	szStr[256];

		::wsprintf( szStr, "%s", dlg.m_Codes.c_str() );

		CHAR*	pToken;

		// 弶婜忬懺偱僀僱乕僽儖偵偡傞
		code.enable = CHEAT_ENABLE;

		// Initial state
		if( szStr[0] == '#' ) {
			if( (pToken = (CHAR*)_mbstok( (UCHAR*)szStr, seps )) ) {
				if( ::strlen(pToken) == 2 ) {
					if( pToken[1] >= '0' && pToken[1] <= '3' ) {
						code.enable = pToken[1] - '0';
					}
				}
			}
		}

		// Address
		if( szStr[0] != '#' ) {
			if( !(pToken = (CHAR*)_mbstok( (UCHAR*)szStr, seps )) )
				return;
		} else {
			if( !(pToken = (CHAR*)_mbstok( NULL, seps )) )
				return;
		}

		code.address = ::strtoul( pToken, NULL, 16 );
		// Type & Length
		if( !(pToken = (CHAR*)_mbstok( NULL, seps )) )
			return;
		code.type   = pToken[0]-'0';
		code.length = pToken[1]-'1';
		if( code.type < CHEAT_TYPE_ALWAYS )
			code.type = CHEAT_TYPE_ALWAYS;
		if( code.type > CHEAT_TYPE_LESS )
			code.type = CHEAT_TYPE_ALWAYS;

		if( code.length < CHEAT_LENGTH_1BYTE )
			code.length = CHEAT_LENGTH_1BYTE;
		if( code.length > CHEAT_LENGTH_4BYTE )
			code.length = CHEAT_LENGTH_1BYTE;

		// Data
		if( !(pToken = (CHAR*)_mbstok( NULL, seps )) )
			return;
		code.data = ::strtoul( pToken, NULL, 16 );

		// Comment
		code.comment = dlg.m_Comment;

		// 捛壛
		Emu.GetNES()->AddCheatCode( code );
		// 僞僀儅乕偱専抦偟側偄傛偆偵僼儔僌徚偟
		(void)Emu.GetNES()->IsCheatCodeAdd();

		// 儕僗僩峏怴
		OnListUpdate();
	}
}

DLGCMD	CCheatCodeDlg::OnEdit( DLGCMDPARAM )
{
//	DEBUGOUT( "CCheatCodeDlg::OnEdit\n" );

	HWND	hWndCtrl = ::GetDlgItem( m_hWnd, IDC_CHT_CODE_LIST );
	INT	nCount = ListView_GetItemCount( hWndCtrl );
	INT	i;

	for( i = 0; i < nCount; i++ ) {
		if( ListView_GetItemState( hWndCtrl, i, LVIS_SELECTED ) ) {
			CCheatCodeEditDlg dlg;

			if( Emu.GetNES()->GetCheatCode( i, dlg.m_Code ) ) {
				dlg.m_nRadix = 16;
				if( dlg.DoModal( m_hWnd ) == IDOK ) {
					Emu.GetNES()->ReplaceCheatCode( i, dlg.m_Code );
					OnListUpdate();
				}
			}
			break;
		}
	}
}

DLGCMD	CCheatCodeDlg::OnLoad( DLGCMDPARAM )
{
//	DEBUGOUT( "CCheatCodeDlg::OnLoad\n" );

	string	pathstr, tempstr;
	if( Config.path.bCheatPath ) {
		pathstr = CPathlib::CreatePath( CApp::GetModulePath(), Config.path.szCheatPath );
		::CreateDirectory( pathstr.c_str(), NULL );
	} else {
		pathstr = Emu.GetNES()->rom->GetRomPath();
	}
	tempstr = CPathlib::MakePathExt( pathstr.c_str(), Emu.GetNES()->rom->GetRomName(), "vct" );
	DEBUGOUT( "Path: %s\n", tempstr.c_str() );

	OPENFILENAME	ofn;
	CHAR	szFile[_MAX_PATH];

	::strcpy( szFile, tempstr.c_str() );
	ZEROMEMORY( &ofn, sizeof(ofn) );

	ofn.lStructSize     = sizeof(ofn);
	ofn.hwndOwner       = m_hWnd;
	ofn.lpstrFile       = szFile;
	ofn.nMaxFile        = sizeof(szFile);
	ofn.lpstrFilter     = "Cheat Files(*.vct)\0*.vct\0All Files(*.*)\0*.*\0";
	ofn.nFilterIndex    = 1;
	ofn.Flags           = OFN_EXPLORER|OFN_PATHMUSTEXIST;
	ofn.lpstrInitialDir = pathstr.c_str();

	CHAR	szTitle[256], szTemp[256];

	CApp::LoadString( IDS_UI_LOADCHEATCODE, szTitle, sizeof(szTitle) );
	ofn.lpstrTitle = szTitle;
	if( ::GetOpenFileName( &ofn ) ) {
		FILE*	fp = NULL;

		if( (fp = ::fopen( szFile, "r" )) ) {
			// 堦扷徚偡
			Emu.GetNES()->CheatInitial();

			while( ::fgets( szTemp, sizeof(szTemp), fp ) ) {
				if( szTemp[0] == ';' )
					continue;

				CHEATCODE	code;

				if( ::strlen( szTemp ) < 10 )
					continue;

				const UCHAR seps[] = " -\t\n\0";	// 僙僷儗乕僞
				const UCHAR seps2[] = "\t\n\0";		// 僙僷儗乕僞
				const UCHAR seps3[] = "-\t\n\0";	// 僙僷儗乕僞

				CHAR*	pToken;

				code.enable = CHEAT_ENABLE;

				// Initial state
				if( szTemp[0] == '#' ) {
					if( !(pToken = (CHAR*)_mbstok( (UCHAR*)szTemp, seps )) )
						continue;

					if( ::strlen(pToken) == 2 ) {
						if( pToken[1] >= '0' && pToken[1] <= '3' ) {
							code.enable = pToken[1] - '0';
						}
					}
				}

				// Address
				if( szTemp[0] != '#' ) {
					if( !(pToken = (CHAR*)_mbstok( (UCHAR*)szTemp, seps )) )
						continue;
				} else {
					if( !(pToken = (CHAR*)_mbstok( NULL, seps )) )
						continue;
				}

				if( ::strlen( pToken ) == 4 ) {
				// VirtuaNES code
					code.address = ::strtoul( pToken, NULL, 16 );
					// Type & Length
					if( !(pToken = (CHAR*)_mbstok( NULL, seps )) )
						continue;

					if( ::strlen( pToken ) == 2 ) {
					// VirtuaNES code
						code.type   = pToken[0]-'0';
						code.length = pToken[1]-'1';
					} else {
					// NNNesterJ code?
						code.type   = CHEAT_TYPE_ALWAYS;
						code.length = pToken[0]-'1';
					}
					if( code.type < CHEAT_TYPE_ALWAYS )
						code.type = CHEAT_TYPE_ALWAYS;
					if( code.type > CHEAT_TYPE_LESS )
						code.type = CHEAT_TYPE_ALWAYS;

					if( code.length < CHEAT_LENGTH_1BYTE )
						code.length = CHEAT_LENGTH_1BYTE;
					if( code.length > CHEAT_LENGTH_4BYTE )
						code.length = CHEAT_LENGTH_1BYTE;

					// Data
					if( !(pToken = (CHAR*)_mbstok( NULL, seps )) )
						continue;
					code.data = ::strtoul( pToken, NULL, 16 );

					// Comment
					if( (pToken = (CHAR*)_mbstok( NULL, seps2 )) ) {
						code.comment = pToken;
					} else {
						code.comment = "";
					}
				} else if( ::strlen( pToken ) == 5 ) {
				// NNNesterJ code?
					if( pToken[0] == '0' ) {
						code.address = ::strtoul( pToken+1, NULL, 16 );
					} else if( pToken[0] == '1' ) {
						code.address = ::strtoul( pToken+1, NULL, 16 );
						code.address += 0x6000;
					}
					// Length
					if( !(pToken = (CHAR*)_mbstok( NULL, seps )) )
						continue;
					code.type = CHEAT_TYPE_ALWAYS;
					code.length = pToken[1]-'1';
					if( code.length < CHEAT_LENGTH_1BYTE )
						code.length = CHEAT_LENGTH_1BYTE;
					if( code.length > CHEAT_LENGTH_4BYTE )
						code.length = CHEAT_LENGTH_1BYTE;

					// Data
					if( !(pToken = (CHAR*)_mbstok( NULL, seps )) )
						continue;
					code.data = ::strtoul( pToken, NULL, 16 );

					// Comment
					if( (pToken = (CHAR*)_mbstok( NULL, seps3 )) ) {
						code.comment = pToken;
					} else {
						code.comment = "";
					}
				}

				// 捛壛
				Emu.GetNES()->AddCheatCode( code );
				// 僞僀儅乕偱専抦偟側偄傛偆偵僼儔僌徚偟
				(void)Emu.GetNES()->IsCheatCodeAdd();
			}
			// 儕僗僩峏怴
			OnListUpdate();
		}
		FCLOSE( fp );
	}
}

DLGCMD	CCheatCodeDlg::OnSave( DLGCMDPARAM )
{
//	DEBUGOUT( "CCheatCodeDlg::OnSave\n" );

	INT	codenum = Emu.GetNES()->GetCheatCodeNum();

	if( !codenum )
		return;

	string	pathstr, tempstr;
	if( Config.path.bCheatPath ) {
		pathstr = CPathlib::CreatePath( CApp::GetModulePath(), Config.path.szCheatPath );
		::CreateDirectory( pathstr.c_str(), NULL );
	} else {
		pathstr = Emu.GetNES()->rom->GetRomPath();
	}
	tempstr = CPathlib::MakePathExt( pathstr.c_str(), Emu.GetNES()->rom->GetRomName(), "vct" );
	DEBUGOUT( "Path: %s\n", tempstr.c_str() );

	OPENFILENAME	ofn;
	CHAR	szFile[_MAX_PATH];

	::strcpy( szFile, tempstr.c_str() );
	ZEROMEMORY( &ofn, sizeof(ofn) );

	ofn.lStructSize     = sizeof(ofn);
	ofn.hwndOwner       = m_hWnd;
	ofn.lpstrFile       = szFile;
	ofn.nMaxFile        = sizeof(szFile);
	ofn.lpstrFilter     = "Cheat Files(*.vct)\0*.vct\0All Files(*.*)\0*.*\0";
	ofn.nFilterIndex    = 1;
	ofn.Flags           = OFN_EXPLORER|OFN_PATHMUSTEXIST;
	ofn.lpstrInitialDir = pathstr.c_str();

	CHAR	szTitle[256], szTemp[256], szTemp2[256];

	ofn.Flags |= OFN_OVERWRITEPROMPT;
	CApp::LoadString( IDS_UI_SAVECHEATCODE, szTitle, sizeof(szTitle) );
	ofn.lpstrTitle = szTitle;
	if( ::GetSaveFileName( &ofn ) ) {
		FILE*	fp = NULL;

		if( (fp = ::fopen( szFile, "w" )) ) {
			::fprintf( fp, "; %s\n", Emu.GetNES()->rom->GetRomName() );

			// 僐乕僪傪僼傽僀儖偵曐懚
			CHEATCODE	code;
			for( INT i = 0; i < codenum; i++ ) {
				Emu.GetNES()->GetCheatCode( i, code );
				// Code
				::wsprintf( szTemp, "#%01d %%04X-%%01d%%01d-%%0%dX", code.enable, (code.length+1)*2 );
				::wsprintf( szTemp2, szTemp, code.address, code.type, code.length+1, code.data );
				::fputs( szTemp2, fp );
				if( ::strlen(szTemp2) >= 16 )
					::fprintf( fp, "\t%s\n", code.comment.c_str() );
				else
					::fprintf( fp, "\t\t%s\n", code.comment.c_str() );
			}
		}
		FCLOSE( fp );
	}
}

⌨️ 快捷键说明

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