📄 cheatdlg.cpp
字号:
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 + -