📄 cheatdlg.cpp
字号:
// 僨乕僞専嶕岓曗偺愝掕
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 + -