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

📄 cheatdlg.cpp

📁 著名的任天堂FC游戏机模拟器VirtuaNes 085版的源码!
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	// 僨乕僞専嶕岓曗偺愝掕
	if( IsBTNCHECK( IDC_SCH_AREA_RAM ) ) {
		for( i = 0; i < 0x0800; i++ ) {
			m_Result.RAM_N[i] = m_Result.RAM_O[i] = Emu.GetNES()->Read( (WORD)i );
			m_Result.RAM_F[i] = 1;
		}
	}

	if( IsBTNCHECK( IDC_SCH_AREA_SRAM ) ) {
		for( i = 0; i < 0x2000; i++ ) {
			m_Result.SRAM_N[i] = m_Result.SRAM_O[i] = Emu.GetNES()->Read( (WORD)i+0x6000 );
			m_Result.SRAM_F[i] = 1;
		}
	}

	OnListUpdate();

	// Undo儃僞儞傪僀僱乕僽儖
	::EnableWindow( ::GetDlgItem( m_hWnd, IDC_SCH_UNDO ), TRUE );
}

DLGCMD	CSearchDlg::OnUpdate( DLGCMDPARAM )
{
//	DEBUGOUT( "CSearchDlg::OnUpdate\n" );

	INT	i;

	// Undo僶僢僼傽偵僙乕僽
	m_ResultOld = m_Result;

	// 僨乕僞偺峏怴
	if( IsBTNCHECK( IDC_SCH_AREA_RAM ) ) {
		for( i = 0; i < 0x0800; i++ ) {
			m_Result.RAM_O[i] = m_Result.RAM_N[i];
			m_Result.RAM_N[i] = Emu.GetNES()->Read( (WORD)i );
		}
	}

	if( IsBTNCHECK( IDC_SCH_AREA_SRAM ) ) {
		for( i = 0; i < 0x2000; i++ ) {
			m_Result.SRAM_N[i] = m_Result.SRAM_O[i];
			m_Result.SRAM_N[i] = Emu.GetNES()->Read( (WORD)i+0x6000 );
		}
	}

	OnListUpdate();

	// Undo儃僞儞傪僀僱乕僽儖
	::EnableWindow( ::GetDlgItem( m_hWnd, IDC_SCH_UNDO ), TRUE );
}

DLGCMD	CSearchDlg::OnUndo( DLGCMDPARAM )
{
//	DEBUGOUT( "CSearchDlg::OnUndo\n" );

//	// Undo
	m_Result = m_ResultOld;

	OnListUpdate();

	// Undo儃僞儞傪僨傿僙乕僽儖
	::EnableWindow( ::GetDlgItem( m_hWnd, IDC_SCH_UNDO ), FALSE );
}

DLGCMD	CSearchDlg::OnSearchCommand( DLGCMDPARAM )
{
//	DEBUGOUT( "CSearchDlg::OnSearchCommand\n" );

	INT	i;
	INT	type = (INT)uID - IDC_SCH_EQUAL;

	// Undo僶僢僼傽偵僙乕僽
	m_ResultOld = m_Result;

	// 僥儞億儔儕
	struct	RESULT	ResultTemp;
	::memset( &ResultTemp, 0, sizeof(ResultTemp) );

	// 岓曗偺拞偐傜忦審偱専嶕偡傞
	if( IsBTNCHECK( IDC_SCH_AREA_RAM ) ) {
		for( i = 0; i < 0x0800-m_nLength; i++ ) {
			if( m_Result.RAM_F[i] ) {
				if( CompareData( type, GetNesMemory( m_nLength, i ), GetSearchMemory( m_nLength, i ) ) ) {
					ResultTemp.RAM_F[i] = 1;
				}
			}
		}
		// RAM偺忬懺傪僐僺乕
		for( i = 0; i < 0x0800; i++ ) {
			ResultTemp.RAM_O[i] = m_Result.RAM_N[i];
			ResultTemp.RAM_N[i] = Emu.GetNES()->Read( (WORD)i );
		}
	}
	if( IsBTNCHECK( IDC_SCH_AREA_SRAM ) ) {
		for( i = 0; i < 0x2000-m_nLength; i++ ) {
			if( m_Result.SRAM_F[i] ) {
				if( CompareData( type, GetNesMemory( m_nLength, i+0x6000 ), GetSearchMemory( m_nLength, i+0x6000 ) ) ) {
					ResultTemp.SRAM_F[i] = 1;
				}
			}
		}
		// RAM偺忬懺傪僐僺乕
		for( i = 0; i < 0x2000; i++ ) {
			ResultTemp.SRAM_O[i] = m_Result.SRAM_N[i];
			ResultTemp.SRAM_N[i] = Emu.GetNES()->Read( (WORD)i+0x6000 );
		}
	}

	// 僥儞億儔儕僨乕僞傪僐僺乕
	m_Result = ResultTemp;

	OnListUpdate();

	// Undo儃僞儞傪僀僱乕僽儖
	::EnableWindow( ::GetDlgItem( m_hWnd, IDC_SCH_UNDO ), TRUE );
}

DLGCMD	CSearchDlg::OnSearchData( DLGCMDPARAM )
{
//	DEBUGOUT( "CSearchDlg::OnSearchData\n" );

	INT	i;
	DWORD	data;
	CHAR	szStr[256];

	// Undo僶僢僼傽偵僙乕僽
	m_ResultOld = m_Result;

	// 僨乕僞/儗儞僕偺庢摼
	::GetDlgItemText( m_hWnd, IDC_SCH_DATA_EDIT, szStr, sizeof(szStr) );
	if( m_nRadix == 10 ) {
		::GetDlgItemText( m_hWnd, IDC_SCH_DATA_EDIT, szStr, sizeof(szStr) );
		data = (DWORD)::strtoul( szStr, NULL, 10 );
	} else {
		::GetDlgItemText( m_hWnd, IDC_SCH_DATA_EDIT, szStr, sizeof(szStr) );
		data = (DWORD)::strtoul( szStr, NULL, 16 );
	}

	// 僥儞億儔儕
	struct	RESULT	ResultTemp;
	::memset( &ResultTemp, 0, sizeof(ResultTemp) );

	// 岓曗偺拞偐傜僨乕僞偲斖埻偱専嶕偡傞
	if( IsBTNCHECK( IDC_SCH_AREA_RAM ) ) {
		for( i = 0; i < 0x0800-m_nLength; i++ ) {
			if( m_Result.RAM_F[i] ) {
				if( CompareData( 0, GetNesMemory( m_nLength, i ), data ) ) {
					ResultTemp.RAM_F[i] = 1;
				}
			}
		}
		// RAM偺忬懺傪僐僺乕
		for( i = 0; i < 0x0800; i++ ) {
			ResultTemp.RAM_O[i] = m_Result.RAM_O[i];
			ResultTemp.RAM_N[i] = Emu.GetNES()->Read( (WORD)i );
		}
	}
	if( IsBTNCHECK( IDC_SCH_AREA_SRAM ) ) {
		for( i = 0; i < 0x2000-m_nLength; i++ ) {
			if( m_Result.SRAM_F[i] ) {
				if( CompareData( 0, GetNesMemory( m_nLength, i+0x6000 ), data ) ) {
					ResultTemp.SRAM_F[i] = 1;
				}
			}
		}
		// RAM偺忬懺傪僐僺乕
		for( i = 0; i < 0x2000; i++ ) {
			ResultTemp.SRAM_O[i] = m_Result.SRAM_O[i];
			ResultTemp.SRAM_N[i] = Emu.GetNES()->Read( (WORD)i+0x6000 );
		}
	}

	// 僥儞億儔儕僨乕僞傪僐僺乕
	m_Result = ResultTemp;

	OnListUpdate();

	// Undo儃僞儞傪僀僱乕僽儖
	::EnableWindow( ::GetDlgItem( m_hWnd, IDC_SCH_UNDO ), TRUE );
}

DLGCMD	CSearchDlg::OnWriteData( DLGCMDPARAM )
{
//	DEBUGOUT( "CSearchDlg::OnWriteData\n" );

	DWORD	addr, data;
	CHAR	szStr[256];

	// 傾僪儗僗/僨乕僞偺庢摼
	::GetDlgItemText( m_hWnd, IDC_SCH_WADDR_EDIT, szStr, sizeof(szStr) );
	addr = (DWORD)::strtoul( szStr, NULL, 16 );

	if( m_nRadix == 10 ) {
		::GetDlgItemText( m_hWnd, IDC_SCH_WDATA_EDIT, szStr, sizeof(szStr) );
		data = (DWORD)::strtoul( szStr, NULL, 10 );
	} else {
		::GetDlgItemText( m_hWnd, IDC_SCH_WDATA_EDIT, szStr, sizeof(szStr) );
		data = (DWORD)::strtoul( szStr, NULL, 16 );
	}

	for( INT i = 0; i <= m_nLength; i++ ) {
		Emu.GetNES()->Write( (WORD)(addr+i), data&0xFF );
		data >>= 8;
	}
}

DLGCMD	CSearchDlg::OnCodeAppend( DLGCMDPARAM )
{
//	DEBUGOUT( "CSearchDlg::OnCodeAppend\n" );

	if( Emu.IsRunning() )
		Emu.Pause();

	CCheatCodeEditDlg dlg;
	dlg.m_Code.enable  = 1;
	dlg.m_Code.address = m_Address;
	dlg.m_Code.data    = 0;
	dlg.m_Code.length  = m_nLength;
	dlg.m_Code.type    = CHEAT_TYPE_ALWAYS;

	dlg.m_nRadix = m_nRadix;

	m_bShortCutDisable = TRUE;

	if( dlg.DoModal( m_hWnd ) == IDOK ) {
		Emu.GetNES()->AddCheatCode( dlg.m_Code );
	}

	m_bShortCutDisable = FALSE;

	if( Emu.IsRunning() )
		Emu.Resume();
}

DLGNOTIFY CSearchDlg::OnDoubleClickListView( DLGNOTIFYPARAM )
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
//DEBUGOUT( "Column click!! I:%d S:%d\n", pNMListView->iItem, pNMListView->iSubItem );

	CHAR	szStr[256];
	ListView_GetItemText( pNMHDR->hwndFrom, pNMListView->iItem, 0, szStr, sizeof(szStr) );

	::SetDlgItemText( m_hWnd, IDC_SCH_WADDR_EDIT, szStr );
}

//
// 僠乕僩僐乕僪曇廤僟僀傾儘僌
//
DLG_MESSAGE_BEGIN(CCheatCodeEditDlg)
DLG_ON_MESSAGE( WM_INITDIALOG,	OnInitDialog )

DLG_COMMAND_BEGIN()
DLG_ON_COMMAND( IDOK, OnOK )
DLG_ON_COMMAND( IDCANCEL, OnCancel )
DLG_COMMAND_END()
DLG_MESSAGE_END()

INT	CCheatCodeEditDlg::DoModal( HWND hWndParent )
{
	return	::DialogBoxParam( CApp::GetPlugin(), MAKEINTRESOURCE(IDD_CODEEDIT),
				hWndParent, g_DlgProc, (LPARAM)this );
}

DLGMSG	CCheatCodeEditDlg::OnInitDialog( DLGMSGPARAM )
{
//	DEBUGOUT( "CCheatCodeEditDlg::OnInitDialog\n" );

	CHAR	szStr[256], szTemp[256];

	// 傾僪儗僗
	::wsprintf( szStr, "%04X", m_Code.address );
	::SetDlgItemText( m_hWnd, IDC_CED_ADDR, szStr );

	// 僨乕僞
	if( m_nRadix == 10 ) {
		::wsprintf( szStr, "%d", m_Code.data );
	} else {
		::wsprintf( szTemp, "%%0%dX", (m_Code.length+1)*2 );
		::wsprintf( szStr, szTemp, m_Code.data );
	}
	::SetDlgItemText( m_hWnd, IDC_CED_DATA, szStr );

	// 僐儊儞僩
	::SetDlgItemText( m_hWnd, IDC_CED_COMMENT, m_Code.comment.c_str() );

	// 儔僕僆儃僞儞
	BTNCHECK( (m_nRadix==10)?IDC_CED_RADIX_DEC:IDC_CED_RADIX_HEX, TRUE );
	BTNCHECK( (IDC_CED_LENGTH_1BYTE+m_Code.length), TRUE );

	if( m_Code.type == CHEAT_TYPE_ALWAYS ) {
		BTNCHECK( IDC_CED_TYPE_ALWAYS, TRUE );
	} else
	if( m_Code.type == CHEAT_TYPE_ONCE ) {
		BTNCHECK( IDC_CED_TYPE_ONCE, TRUE );
	} else
	if( m_Code.type == CHEAT_TYPE_GREATER ) {
		BTNCHECK( IDC_CED_TYPE_GREATER, TRUE );
	} else
	if( m_Code.type == CHEAT_TYPE_LESS ) {
		BTNCHECK( IDC_CED_TYPE_LESS, TRUE );
	}

	::PostMessage( CApp::GetHWnd(), WM_VNS_SHORTCUTENABLE, (WPARAM)FALSE, 0 );

	return	TRUE;
}

DLGCMD	CCheatCodeEditDlg::OnOK( DLGCMDPARAM )
{
//	DEBUGOUT( "CCheatCodeEditDlg::OnOK\n" );
	CHAR	szStr[256];
	DWORD	data;

	::GetDlgItemText( m_hWnd, IDC_CED_DATA, szStr, sizeof(szStr) );
	if( IsBTNCHECK( IDC_CED_RADIX_DEC ) ) {
		data = (DWORD)::strtoul( szStr, NULL, 10 );
	} else {
		data = (DWORD)::strtoul( szStr, NULL, 16 );
	}

	if( IsBTNCHECK( IDC_CED_LENGTH_1BYTE ) ) {
		data &= 0x000000FF;
		m_Code.length = CHEAT_LENGTH_1BYTE;
	} else
	if( IsBTNCHECK( IDC_CED_LENGTH_2BYTE ) ) {
		data &= 0x0000FFFF;
		m_Code.length = CHEAT_LENGTH_2BYTE;
	} else
	if( IsBTNCHECK( IDC_CED_LENGTH_3BYTE ) ) {
		data &= 0x00FFFFFF;
		m_Code.length = CHEAT_LENGTH_3BYTE;
	} else
	if( IsBTNCHECK( IDC_CED_LENGTH_4BYTE ) ) {
		m_Code.length = CHEAT_LENGTH_4BYTE;
	}

	m_Code.data    = data;

	if( IsBTNCHECK( IDC_CED_TYPE_ALWAYS ) ) {
		m_Code.type = CHEAT_TYPE_ALWAYS;
	} else
	if( IsBTNCHECK( IDC_CED_TYPE_ONCE ) ) {
		m_Code.type = CHEAT_TYPE_ONCE;
	} else
	if( IsBTNCHECK( IDC_CED_TYPE_GREATER ) ) {
		m_Code.type = CHEAT_TYPE_GREATER;
	} else
	if( IsBTNCHECK( IDC_CED_TYPE_LESS ) ) {
		m_Code.type = CHEAT_TYPE_LESS;
	}

	::GetDlgItemText( m_hWnd, IDC_CED_COMMENT, szStr, sizeof(szStr) );
	m_Code.comment = szStr;

	::EndDialog( m_hWnd, IDOK );
}

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

	::EndDialog( m_hWnd, IDCANCEL );
}

//
// 僠乕僩僐乕僪擖椡僟僀傾儘僌
//
DLG_MESSAGE_BEGIN(CCheatCodeInputDlg)
DLG_ON_MESSAGE( WM_INITDIALOG,	OnInitDialog )

DLG_COMMAND_BEGIN()
DLG_ON_COMMAND( IDOK, OnOK )
DLG_ON_COMMAND( IDCANCEL, OnCancel )
DLG_COMMAND_END()
DLG_MESSAGE_END()

INT	CCheatCodeInputDlg::DoModal( HWND hWndParent )
{
	return	::DialogBoxParam( CApp::GetPlugin(), MAKEINTRESOURCE(IDD_CODEINPUT),
				hWndParent, g_DlgProc, (LPARAM)this );
}

DLGMSG	CCheatCodeInputDlg::OnInitDialog( DLGMSGPARAM )
{
//	DEBUGOUT( "CCheatCodeInputDlg::OnInitDialog\n" );

	::SetDlgItemText( m_hWnd, IDC_CHC_CODE, m_Codes.c_str() );
	::SetDlgItemText( m_hWnd, IDC_CHC_COMMENT, m_Comment.c_str() );

	return	TRUE;
}

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

	CHAR	szStr[256];

	::GetDlgItemText( m_hWnd, IDC_CHC_CODE, szStr, sizeof(szStr) );
	m_Codes = szStr;

	::GetDlgItemText( m_hWnd, IDC_CHC_COMMENT, szStr, sizeof(szStr) );
	m_Comment = szStr;

	::EndDialog( m_hWnd, IDOK );
}

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

	::EndDialog( m_hWnd, IDCANCEL );
}

//
// 僠乕僩僐乕僪僟僀傾儘僌
//

// 儊僢僙乕僕
DLG_MESSAGE_BEGIN(CCheatCodeDlg)
DLG_ON_MESSAGE( WM_INITDIALOG,	OnInitDialog )
DLG_ON_MESSAGE( WM_DESTROY,	OnDestroy )
DLG_ON_MESSAGE( WM_TIMER,	OnTimer )
// 僐儅儞僪
DLG_COMMAND_BEGIN()
DLG_ON_COMMAND( IDOK, OnOK )
DLG_ON_COMMAND( IDCANCEL, OnCancel )
DLG_ON_COMMAND( IDC_CHT_ENABLE, OnEnable )
DLG_ON_COMMAND( IDC_CHT_DISABLE, OnDisable )
DLG_ON_COMMAND( IDC_CHT_CLEAR, OnClear )
DLG_ON_COMMAND( IDC_CHT_REMOVE, OnRemove )
DLG_ON_COMMAND( IDC_CHT_INPUT, OnInput )
DLG_ON_COMMAND( IDC_CHT_EDIT, OnEdit )
DLG_ON_COMMAND( IDC_CHT_LOAD, OnLoad )
DLG_ON_COMMAND( IDC_CHT_SAVE, OnSave )
DLG_COMMAND_END()
// Notify 儊僢僙乕僕
DLG_NOTIFY_BEGIN()
DLG_ON_NOTIFY( IDC_CHT_CODE_LIST, LVN_KEYDOWN, OnKeyDownListView )
DLG_ON_NOTIFY( IDC_CHT_CODE_LIST, NM_CLICK, OnClickListView )
DLG_ON_NOTIFY( IDC_CHT_CODE_LIST, NM_DBLCLK, OnDblClkListView )
DLG_NOTIFY_END()

DLG_MESSAGE_END()

INT	CCheatCodeDlg::DoModal( HWND hWndParent )
{
	m_hImageList = NULL;

	return	::DialogBoxParam( CApp::GetPlugin(), MAKEINTRESOURCE(IDD_CHEAT),
				hWndParent, g_DlgProc, (LPARAM)this );
}

void	CCheatCodeDlg::OnListUpdate()
{
	HWND	hWndCtrl = ::GetDlgItem( m_hWnd, IDC_CHT_CODE_LIST );
	ListView_DeleteAllItems( hWndCtrl );

	INT	i;
	CHAR	szStr[256], szTemp[256];

	LVITEM	lvitem;
	lvitem.mask = LVIF_TEXT;
	lvitem.iSubItem = 0;

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

	for( i = 0; i < codenum; i++ ) {
		CHEATCODE	code;
		Emu.GetNES()->GetCheatCode( i, code );

		// Code
		::wsprintf( szTemp, "%%04X-%%01d%%01d-%%0%dX", (code.length+1)*2 );
		::wsprintf( szStr, szTemp, code.address, code.type, code.length+1, code.data );
		lvitem.pszText = szStr;
		lvitem.iItem = i;

		ListView_InsertItem( hWndCtrl, &lvitem );

		// Comment
		ListView_SetItemText( hWndCtrl, i, 1, (LPSTR)code.comment.c_str() );

		// State
		ListView_SetItemState( hWndCtrl, i, INDEXTOSTATEIMAGEMASK(code.enable+1), LVIS_STATEIMAGEMASK );
	}
}

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

	HWND	hWndCtrl;
	CHAR	szStr[256];

	// 儕僗僩價儏乕
	hWndCtrl = ::GetDlgItem( m_hWnd, IDC_CHT_CODE_LIST );
//	ListView_SetExtendedListViewStyle( hWndCtrl, LVS_EX_CHECKBOXES|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES );
	ListView_SetExtendedListViewStyle( hWndCtrl, LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES );
	ListView_DeleteAllItems( hWndCtrl );

	// 僀儊乕僕儕僗僩偺嶌惉
	m_hImageList = ImageList_LoadBitmap(
		CApp::GetInstance(), MAKEINTRESOURCE(IDB_CHEATIMAGELIST),
		16, 4, RGB(255,0,255) );

	// 僀儊乕僕儕僗僩傪儕僗僩價儏乕偵妱傝摉偰
	ListView_SetImageList( hWndCtrl, m_hImageList, LVSIL_STATE );

	// 僿僢僟僐儞僩儘乕儖偺愝掕
	LVCOLUMN	lvColumn;
	lvColumn.mask = LVCF_FMT|LVCF_TEXT|LVCF_SUBITEM|LVCF_WIDTH;
	lvColumn.fmt = LVCFMT_LEFT;
	lvColumn.pszText = szStr;

	RECT	rc;
	::GetClientRect( hWndCtrl, &rc );
	INT	nWidth = RCWIDTH(rc) - ::GetSystemMetrics( SM_CXVSCROLL );

	CApp::LoadString( IDS_CHT_CHEATCODE, szStr, sizeof(szStr) );
	lvColumn.iSubItem = 0;
	lvColumn.cx = nWidth*2/5;

⌨️ 快捷键说明

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