// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. // Copyright (C) 1999-2003 Forgotten // Copyright (C) 2004 Forgotten and the VBA development team // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2, or(at your option) // any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software Foundation, // Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // GBACheats.cpp : implementation file // #include "stdafx.h" #include "vba.h" #include "GBACheats.h" #include "../System.h" #include "../Cheats.h" #include "../CheatSearch.h" #include "../GBA.h" #include "../Globals.h" #include "Reg.h" #include "StringTokenizer.h" #include "WinResUtil.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // GBACheatSearch dialog GBACheatSearch::GBACheatSearch(CWnd* pParent /*=NULL*/) : CDialog(GBACheatSearch::IDD, pParent) { //{{AFX_DATA_INIT(GBACheatSearch) valueType = -1; sizeType = -1; searchType = -1; numberType = -1; updateValues = FALSE; //}}AFX_DATA_INIT data = NULL; } GBACheatSearch::~GBACheatSearch() { if(data) free(data); } void GBACheatSearch::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(GBACheatSearch) DDX_Control(pDX, IDC_VALUE, m_value); DDX_Control(pDX, IDC_CHEAT_LIST, m_list); DDX_Radio(pDX, IDC_OLD_VALUE, valueType); DDX_Radio(pDX, IDC_SIZE_8, sizeType); DDX_Radio(pDX, IDC_EQ, searchType); DDX_Radio(pDX, IDC_SIGNED, numberType); DDX_Check(pDX, IDC_UPDATE, updateValues); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(GBACheatSearch, CDialog) //{{AFX_MSG_MAP(GBACheatSearch) ON_BN_CLICKED(ID_OK, OnOk) ON_BN_CLICKED(IDC_START, OnStart) ON_BN_CLICKED(IDC_SEARCH, OnSearch) ON_BN_CLICKED(IDC_ADD_CHEAT, OnAddCheat) ON_BN_CLICKED(IDC_UPDATE, OnUpdate) ON_NOTIFY(LVN_GETDISPINFO, IDC_CHEAT_LIST, OnGetdispinfoCheatList) ON_NOTIFY(LVN_ITEMCHANGED, IDC_CHEAT_LIST, OnItemchangedCheatList) ON_CONTROL_RANGE(BN_CLICKED, IDC_OLD_VALUE, IDC_SPECIFIC_VALUE, OnValueType) ON_CONTROL_RANGE(BN_CLICKED, IDC_EQ, IDC_GE, OnSearchType) ON_CONTROL_RANGE(BN_CLICKED, IDC_SIGNED, IDC_HEXADECIMAL, OnNumberType) ON_CONTROL_RANGE(BN_CLICKED, IDC_SIZE_8, IDC_SIZE_32, OnSizeType) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // GBACheatSearch message handlers void GBACheatSearch::OnOk() { EndDialog(TRUE); } void GBACheatSearch::OnStart() { if(cheatSearchData.count == 0) { CheatSearchBlock *block = &cheatSearchData.blocks[0]; block->size = 0x40000; block->offset = 0x2000000; block->bits = (u8 *)malloc(0x40000>>3); block->data = workRAM; block->saved = (u8 *)malloc(0x40000); block = &cheatSearchData.blocks[1]; block->size = 0x8000; block->offset = 0x3000000; block->bits = (u8 *)malloc(0x8000>>3); block->data = internalRAM; block->saved = (u8 *)malloc(0x8000); cheatSearchData.count = 2; } cheatSearchStart(&cheatSearchData); GetDlgItem(IDC_SEARCH)->EnableWindow(TRUE); } void GBACheatSearch::OnSearch() { CString buffer; if(valueType == 0) cheatSearch(&cheatSearchData, searchType, sizeType, numberType == 0); else { m_value.GetWindowText(buffer); if(buffer.IsEmpty()) { systemMessage(IDS_NUMBER_CANNOT_BE_EMPTY, "Number cannot be empty"); return; } int value = 0; switch(numberType) { case 0: sscanf(buffer, "%d", &value); break; case 1: sscanf(buffer, "%u", &value); break; default: sscanf(buffer, "%x", &value); } cheatSearchValue(&cheatSearchData, searchType, sizeType, numberType == 0, value); } addChanges(true); if(updateValues) cheatSearchUpdateValues(&cheatSearchData); } void GBACheatSearch::OnAddCheat() { int mark = m_list.GetSelectionMark(); if(mark != -1) { LVITEM item; memset(&item,0, sizeof(item)); item.mask = LVIF_PARAM; item.iItem = mark; if(m_list.GetItem(&item)) { AddCheat dlg((u32)item.lParam); dlg.DoModal(); } } } void GBACheatSearch::OnUpdate() { if(GetDlgItem(IDC_UPDATE)->SendMessage(BM_GETCHECK, 0, 0) & BST_CHECKED) updateValues = true; else updateValues = false; regSetDwordValue("cheatsUpdate", updateValues); } void GBACheatSearch::OnGetdispinfoCheatList(NMHDR* pNMHDR, LRESULT* pResult) { LV_DISPINFO* info = (LV_DISPINFO*)pNMHDR; if(info->item.mask & LVIF_TEXT) { int index = info->item.iItem; int col = info->item.iSubItem; switch(col) { case 0: strcpy(info->item.pszText, data[index].address); break; case 1: strcpy(info->item.pszText, data[index].oldValue); break; case 2: strcpy(info->item.pszText, data[index].newValue); break; } } *pResult = TRUE; } void GBACheatSearch::OnItemchangedCheatList(NMHDR* pNMHDR, LRESULT* pResult) { GetDlgItem(IDC_ADD_CHEAT)->EnableWindow(m_list.GetSelectionMark() != -1); *pResult = TRUE; } BOOL GBACheatSearch::OnInitDialog() { CDialog::OnInitDialog(); CString temp = winResLoadString(IDS_ADDRESS); m_list.InsertColumn(0, temp, LVCFMT_CENTER, 125, 0); temp = winResLoadString(IDS_OLD_VALUE); m_list.InsertColumn(1, temp, LVCFMT_CENTER, 125, 1); temp = winResLoadString(IDS_NEW_VALUE); m_list.InsertColumn(2, temp, LVCFMT_CENTER, 125, 2); m_list.SetFont(CFont::FromHandle((HFONT)GetStockObject(SYSTEM_FIXED_FONT)), TRUE); m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT); if(!cheatSearchData.count) { GetDlgItem(IDC_SEARCH)->EnableWindow(FALSE); GetDlgItem(IDC_ADD_CHEAT)->EnableWindow(FALSE); } valueType = regQueryDwordValue("cheatsValueType", 0); if(valueType < 0 || valueType > 1) valueType = 0; searchType = regQueryDwordValue("cheatsSearchType", SEARCH_EQ); if(searchType > 5 || searchType < 0) searchType = 0; numberType = regQueryDwordValue("cheatsNumberType", 2); if(numberType < 0 || numberType > 2) numberType = 2; sizeType = regQueryDwordValue("cheatsSizeType", 0); if(sizeType < 0 || sizeType > 2) sizeType = 0; updateValues = regQueryDwordValue("cheatsUpdate", 0) ? true : false; UpdateData(FALSE); if(valueType == 0) m_value.EnableWindow(FALSE); CenterWindow(); if(cheatSearchData.count) { addChanges(false); } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void GBACheatSearch::addChanges(bool showMsgs) { int count = cheatSearchGetCount(&cheatSearchData, sizeType); m_list.DeleteAllItems(); if(count > 1000) { if(showMsgs) systemMessage(IDS_SEARCH_PRODUCED_TOO_MANY, "Search produced %d results. Please refine better", count); return; } if(count == 0) { if(showMsgs) systemMessage(IDS_SEARCH_PRODUCED_NO_RESULTS, "Search produced no results."); return; } m_list.SetItemCount(count); if(data) free(data); data = (WinCheatsData *)calloc(count,sizeof(WinCheatsData)); int inc = 1; switch(sizeType) { case 1: inc = 2; break; case 2: inc = 4; break; } int index = 0; if(numberType == 0) { for(int i = 0; i < cheatSearchData.count; i++) { CheatSearchBlock *block = &cheatSearchData.blocks[i]; for(int j = 0; j < block->size; j+= inc) { if(IS_BIT_SET(block->bits, j)) { addChange(index++, block->offset | j, cheatSearchSignedRead(block->saved, j, sizeType), cheatSearchSignedRead(block->data, j, sizeType)); } } } } else { for(int i = 0; i < cheatSearchData.count; i++) { CheatSearchBlock *block = &cheatSearchData.blocks[i]; for(int j = 0; j < block->size; j+= inc) { if(IS_BIT_SET(block->bits, j)) { addChange(index++, block->offset | j, cheatSearchRead(block->saved, j, sizeType), cheatSearchRead(block->data, j, sizeType)); } } } } for(int i = 0; i < count; i++) { LVITEM item; item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE; item.iItem = i; item.iSubItem = 0; item.lParam = data[i].addr; item.state = 0; item.stateMask = 0; item.pszText = LPSTR_TEXTCALLBACK; m_list.InsertItem(&item); m_list.SetItemText(i, 1, LPSTR_TEXTCALLBACK); m_list.SetItemText(i, 2, LPSTR_TEXTCALLBACK); } } void GBACheatSearch::addChange(int index, u32 address, u32 oldValue, u32 newValue) { data[index].addr = address; sprintf(data[index].address, "%08x",address); switch(numberType) { case 0: sprintf(data[index].oldValue, "%d", oldValue); sprintf(data[index].newValue, "%d", newValue); break; case 1: sprintf(data[index].oldValue, "%u", oldValue); sprintf(data[index].newValue, "%u", newValue); break; case 2: switch(sizeType) { case 0: sprintf(data[index].oldValue, "%02x", oldValue); sprintf(data[index].newValue, "%02x", newValue); break; case 1: sprintf(data[index].oldValue, "%04x", oldValue); sprintf(data[index].newValue, "%04x", newValue); break; case 2: sprintf(data[index].oldValue, "%08x", oldValue); sprintf(data[index].newValue, "%08x", newValue); break; } } } void GBACheatSearch::OnValueType(UINT id) { switch(id) { case IDC_OLD_VALUE: valueType = 0; m_value.EnableWindow(FALSE); regSetDwordValue("cheatsValueType", 0); break; case IDC_SPECIFIC_VALUE: valueType = 1; m_value.EnableWindow(TRUE); regSetDwordValue("cheatsValueType", 1); break; } } void GBACheatSearch::OnSearchType(UINT id) { switch(id) { case IDC_EQ: searchType = SEARCH_EQ; regSetDwordValue("cheatsSearchType", 0); break; case IDC_NE: searchType = SEARCH_NE; regSetDwordValue("cheatsSearchType", 1); break; case IDC_LT: searchType = SEARCH_LT; regSetDwordValue("cheatsSearchType", 2); break; case IDC_LE: searchType = SEARCH_LE; regSetDwordValue("cheatsSearchType", 3); break; case IDC_GT: searchType = SEARCH_GT; regSetDwordValue("cheatsSearchType", 4); break; case IDC_GE: searchType = SEARCH_GE; regSetDwordValue("cheatsSearchType", 5); break; } } void GBACheatSearch::OnNumberType(UINT id) { switch(id) { case IDC_SIGNED: numberType = 0; regSetDwordValue("cheatsNumberType", 0); if(m_list.GetItemCount()) { addChanges(false); } break; case IDC_UNSIGNED: numberType = 1; regSetDwordValue("cheatsNumberType", 1); if(m_list.GetItemCount()) { addChanges(false); } break; case IDC_HEXADECIMAL: numberType = 2; regSetDwordValue("cheatsNumberType", 2); if(m_list.GetItemCount()) { addChanges(false); } break; } } void GBACheatSearch::OnSizeType(UINT id) { switch(id) { case IDC_SIZE_8: sizeType = BITS_8; regSetDwordValue("cheatsSizeType", 0); if(m_list.GetItemCount()) { addChanges(false); } break; case IDC_SIZE_16: sizeType = BITS_16; regSetDwordValue("cheatsSizeType", 1); if(m_list.GetItemCount()) { addChanges(false); } break; case IDC_SIZE_32: sizeType = BITS_32; regSetDwordValue("cheatsSizeType", 2); if(m_list.GetItemCount()) { addChanges(false); } break; } } ///////////////////////////////////////////////////////////////////////////// // AddCheat dialog AddCheat::AddCheat(u32 address, CWnd* pParent /*=NULL*/) : CDialog(AddCheat::IDD, pParent) { //{{AFX_DATA_INIT(AddCheat) sizeType = -1; numberType = -1; //}}AFX_DATA_INIT this->address = address; } void AddCheat::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(AddCheat) DDX_Control(pDX, IDC_VALUE, m_value); DDX_Control(pDX, IDC_DESC, m_desc); DDX_Control(pDX, IDC_ADDRESS, m_address); DDX_Radio(pDX, IDC_SIZE_8, sizeType); DDX_Radio(pDX, IDC_SIGNED, numberType); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(AddCheat, CDialog) //{{AFX_MSG_MAP(AddCheat) ON_BN_CLICKED(ID_OK, OnOk) ON_BN_CLICKED(ID_CANCEL, OnCancel) ON_CONTROL_RANGE(BN_CLICKED, IDC_SIGNED, IDC_HEXADECIMAL, OnNumberType) ON_CONTROL_RANGE(BN_CLICKED, IDC_SIZE_8, IDC_SIZE_32, OnSizeType) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // AddCheat message handlers void AddCheat::OnOk() { // add cheat if(addCheat()) { EndDialog(TRUE); } } void AddCheat::OnCancel() { EndDialog(FALSE); } BOOL AddCheat::OnInitDialog() { CDialog::OnInitDialog(); if(address != 0) { CString buffer; buffer.Format("%08x", address); m_address.SetWindowText(buffer); m_address.EnableWindow(FALSE); } numberType = regQueryDwordValue("cheatsNumberType", 2); if(numberType < 0 || numberType > 2) numberType = 2; sizeType = regQueryDwordValue("cheatsSizeType", 0); if(sizeType < 0 || sizeType > 2) sizeType = 0; UpdateData(FALSE); GetDlgItem(IDC_DESC)->SendMessage(EM_LIMITTEXT, 32, 0); if(address != 0) { GetDlgItem(IDC_SIZE_8)->EnableWindow(FALSE); GetDlgItem(IDC_SIZE_16)->EnableWindow(FALSE); GetDlgItem(IDC_SIZE_32)->EnableWindow(FALSE); GetDlgItem(IDC_HEXADECIMAL)->EnableWindow(FALSE); GetDlgItem(IDC_UNSIGNED)->EnableWindow(FALSE); GetDlgItem(IDC_SIGNED)->EnableWindow(FALSE); } CenterWindow(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void AddCheat::OnNumberType(UINT id) { switch(id) { case IDC_SIGNED: numberType = 0; regSetDwordValue("cheatsNumberType", 0); break; case IDC_UNSIGNED: numberType = 1; regSetDwordValue("cheatsNumberType", 1); break; case IDC_HEXADECIMAL: numberType = 2; regSetDwordValue("cheatsNumberType", 2); break; } } void AddCheat::OnSizeType(UINT id) { switch(id) { case IDC_SIZE_8: sizeType = BITS_8; regSetDwordValue("cheatsSizeType", 0); break; case IDC_SIZE_16: sizeType = BITS_16; regSetDwordValue("cheatsSizeType", 1); break; case IDC_SIZE_32: sizeType = BITS_32; regSetDwordValue("cheatsSizeType", 2); break; } } bool AddCheat::addCheat() { CString buffer; CString code; m_address.GetWindowText(buffer); u32 address = 0; sscanf(buffer, "%x", &address); if((address >= 0x02000000 && address < 0x02040000) || (address >= 0x03000000 && address < 0x03008000)) { } else { systemMessage(IDS_INVALID_ADDRESS, "Invalid address: %08x", address); return false; } if(sizeType != 0) { if(sizeType == 1 && address & 1) { systemMessage(IDS_MISALIGNED_HALFWORD, "Misaligned half-word address: %08x", address); return false; } if(sizeType == 2 && address & 3) { systemMessage(IDS_MISALIGNED_WORD, "Misaligned word address: %08x", address); return false; } } u32 value; m_value.GetWindowText(buffer); if(buffer.IsEmpty()) { systemMessage(IDS_VALUE_CANNOT_BE_EMPTY, "Value cannot be empty"); return false; } switch(numberType) { case 0: sscanf(buffer, "%d", &value); break; case 1: sscanf(buffer, "%u", &value); break; default: sscanf(buffer, "%x", &value); } m_desc.GetWindowText(buffer); switch(sizeType) { case 0: code.Format("%08x:%02x", address, value); break; case 1: code.Format("%08x:%04x", address, value); break; case 2: code.Format("%08x:%08x", address, value); break; } cheatsAdd(code, buffer,address, value,-1, sizeType); return true; } ///////////////////////////////////////////////////////////////////////////// // GBACheatList dialog GBACheatList::GBACheatList(CWnd* pParent /*=NULL*/) : CDialog(GBACheatList::IDD, pParent) { //{{AFX_DATA_INIT(GBACheatList) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT duringRefresh = false; } void GBACheatList::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(GBACheatList) DDX_Control(pDX, IDC_RESTORE, m_restore); DDX_Control(pDX, IDC_CHEAT_LIST, m_list); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(GBACheatList, CDialog) //{{AFX_MSG_MAP(GBACheatList) ON_BN_CLICKED(IDC_ADD_CHEAT, OnAddCheat) ON_BN_CLICKED(IDC_ADD_CODE, OnAddCode) ON_BN_CLICKED(IDC_ADD_CODEBREAKER, OnAddCodebreaker) ON_BN_CLICKED(IDC_ADD_GAMESHARK, OnAddGameshark) ON_BN_CLICKED(IDC_ENABLE, OnEnable) ON_BN_CLICKED(IDC_REMOVE, OnRemove) ON_BN_CLICKED(IDC_REMOVE_ALL, OnRemoveAll) ON_BN_CLICKED(IDC_RESTORE, OnRestore) ON_BN_CLICKED(ID_OK, OnOk) ON_NOTIFY(LVN_ITEMCHANGED, IDC_CHEAT_LIST, OnItemchangedCheatList) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // GBACheatList message handlers void GBACheatList::OnAddCheat() { AddCheat dlg(0); dlg.DoModal(); refresh(); } void GBACheatList::OnAddCode() { AddCheatCode dlg; dlg.DoModal(); refresh(); } void GBACheatList::OnAddCodebreaker() { AddCBACode dlg; dlg.DoModal(); refresh(); } void GBACheatList::OnAddGameshark() { AddGSACode dlg; dlg.DoModal(); refresh(); } void GBACheatList::OnEnable() { int mark = m_list.GetSelectionMark(); int count = m_list.GetItemCount(); if(mark != -1) { LVITEM item; for(int i = 0; i < count; i++) { memset(&item,0, sizeof(item)); item.mask = LVIF_PARAM|LVIF_STATE; item.stateMask = LVIS_SELECTED; item.iItem = i; if(m_list.GetItem(&item)) { if(item.state & LVIS_SELECTED) { if(cheatsList[item.lParam].enabled) cheatsDisable(item.lParam); else cheatsEnable(item.lParam); } } } refresh(); } } void GBACheatList::OnRemove() { int mark = m_list.GetSelectionMark(); int count = m_list.GetItemCount(); if(mark != -1) { for(int i = count - 1; i >= 0; i--) { LVITEM item; memset(&item,0, sizeof(item)); item.mask = LVIF_PARAM|LVIF_STATE; item.iItem = i; item.stateMask = LVIS_SELECTED; if(m_list.GetItem(&item)) { if(item.state & LVIS_SELECTED) { cheatsDelete(item.lParam, restoreValues); } } } refresh(); } } void GBACheatList::OnRemoveAll() { cheatsDeleteAll(restoreValues); refresh(); } void GBACheatList::OnRestore() { restoreValues = !restoreValues; regSetDwordValue("cheatsRestore", restoreValues); } void GBACheatList::OnOk() { EndDialog(TRUE); } void GBACheatList::OnItemchangedCheatList(NMHDR* pNMHDR, LRESULT* pResult) { if(m_list.GetSelectionMark() != -1) { GetDlgItem(IDC_REMOVE)->EnableWindow(TRUE); GetDlgItem(IDC_ENABLE)->EnableWindow(TRUE); } else { GetDlgItem(IDC_REMOVE)->EnableWindow(FALSE); GetDlgItem(IDC_ENABLE)->EnableWindow(FALSE); } if(!duringRefresh) { LPNMLISTVIEW l = (LPNMLISTVIEW)pNMHDR; if(l->uChanged & LVIF_STATE) { if(((l->uOldState & LVIS_STATEIMAGEMASK)>>12) != (((l->uNewState & LVIS_STATEIMAGEMASK)>>12))) { if(m_list.GetCheck(l->iItem)) cheatsEnable(l->lParam); else cheatsDisable(l->lParam); refresh(); } } } *pResult = 0; } BOOL GBACheatList::OnInitDialog() { CDialog::OnInitDialog(); CString temp = winResLoadString(IDS_CODE); m_list.InsertColumn(0, temp, LVCFMT_LEFT, 170, 0); temp = winResLoadString(IDS_DESCRIPTION); m_list.InsertColumn(1, temp, LVCFMT_LEFT, 150, 1); temp = winResLoadString(IDS_STATUS); m_list.InsertColumn(2, temp, LVCFMT_LEFT, 80, 1); m_list.SetFont(CFont::FromHandle((HFONT)GetStockObject(SYSTEM_FIXED_FONT)), TRUE); m_list.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT); restoreValues = regQueryDwordValue("cheatsRestore", 0) ? true : false; m_restore.SetCheck(restoreValues); refresh(); GetDlgItem(IDC_REMOVE)->EnableWindow(FALSE); GetDlgItem(IDC_ENABLE)->EnableWindow(FALSE); CenterWindow(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void GBACheatList::refresh() { duringRefresh = true; m_list.DeleteAllItems(); CString buffer; for(int i = 0; i < cheatsNumber; i++) { LVITEM item; item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE; item.iItem = i; item.iSubItem = 0; item.lParam = i; item.state = 0; item.stateMask = 0; item.pszText = cheatsList[i].codestring; m_list.InsertItem(&item); m_list.SetCheck(i, (cheatsList[i].enabled) ? TRUE : FALSE); m_list.SetItemText(i, 1, cheatsList[i].desc); buffer = (cheatsList[i].enabled) ? 'E' : 'D'; m_list.SetItemText(i, 2, buffer); } duringRefresh = false; } ///////////////////////////////////////////////////////////////////////////// // AddGSACode dialog AddGSACode::AddGSACode(CWnd* pParent /*=NULL*/) : CDialog(AddGSACode::IDD, pParent) { //{{AFX_DATA_INIT(AddGSACode) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } void AddGSACode::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(AddGSACode) DDX_Control(pDX, IDC_DESC, m_desc); DDX_Control(pDX, IDC_CODE, m_code); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(AddGSACode, CDialog) //{{AFX_MSG_MAP(AddGSACode) ON_BN_CLICKED(ID_OK, OnOk) ON_BN_CLICKED(ID_CANCEL, OnCancel) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // AddGSACode message handlers void AddGSACode::OnOk() { CString desc; CString buffer; CString part1; CString code; CString token; m_code.GetWindowText(buffer); m_desc.GetWindowText(desc); StringTokenizer st(buffer, " \t\n\r"); part1.Empty(); const char *t = st.next(); while(t) { token = t; token.MakeUpper(); if(token.GetLength() == 16) cheatsAddGSACode(token, desc, false); else if(token.GetLength() == 12) { code = token.Left(8); code += " "; code += token.Right(4); cheatsAddCBACode(code, desc); } else if(part1.IsEmpty()) part1 = token; else { if(token.GetLength() == 4) { code = part1; code += " "; code += token; cheatsAddCBACode(code, desc); } else { code = part1 + token; cheatsAddGSACode(code, desc, true); } part1.Empty(); } t = st.next(); } EndDialog(TRUE); } void AddGSACode::OnCancel() { EndDialog(FALSE); } BOOL AddGSACode::OnInitDialog() { CDialog::OnInitDialog(); m_code.LimitText(1024); m_desc.LimitText(32); CString title = winResLoadString(IDS_ADD_GSA_CODE); SetWindowText(title); CenterWindow(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } ///////////////////////////////////////////////////////////////////////////// // AddCBACode dialog AddCBACode::AddCBACode(CWnd* pParent /*=NULL*/) : CDialog(AddCBACode::IDD, pParent) { //{{AFX_DATA_INIT(AddCBACode) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } void AddCBACode::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(AddCBACode) DDX_Control(pDX, IDC_DESC, m_desc); DDX_Control(pDX, IDC_CODE, m_code); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(AddCBACode, CDialog) //{{AFX_MSG_MAP(AddCBACode) ON_BN_CLICKED(ID_OK, OnOk) ON_BN_CLICKED(ID_CANCEL, OnCancel) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // AddCBACode message handlers void AddCBACode::OnOk() { CString desc; CString buffer; CString part1; CString code; CString token; m_code.GetWindowText(buffer); m_desc.GetWindowText(desc); StringTokenizer st(buffer, " \t\n\r"); part1.Empty(); const char *t = st.next(); while(t) { token = t; token.MakeUpper(); if(token.GetLength() == 16) cheatsAddGSACode(token, desc, false); else if(token.GetLength() == 12) { code = token.Left(8); code += " "; code += token.Right(4); cheatsAddCBACode(code, desc); } else if(part1.IsEmpty()) part1 = token; else { if(token.GetLength() == 4) { code = part1; code += " "; code += token; cheatsAddCBACode(code, desc); } else { code = part1 + token; cheatsAddGSACode(code, desc, true); } part1.Empty(); } t = st.next(); } EndDialog(TRUE); } void AddCBACode::OnCancel() { EndDialog(FALSE); } BOOL AddCBACode::OnInitDialog() { CDialog::OnInitDialog(); m_code.LimitText(1024); m_desc.LimitText(32); CString title = winResLoadString(IDS_ADD_CBA_CODE); SetWindowText(title); CenterWindow(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } ///////////////////////////////////////////////////////////////////////////// // AddCheatCode dialog AddCheatCode::AddCheatCode(CWnd* pParent /*=NULL*/) : CDialog(AddCheatCode::IDD, pParent) { //{{AFX_DATA_INIT(AddCheatCode) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } void AddCheatCode::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(AddCheatCode) DDX_Control(pDX, IDC_DESC, m_desc); DDX_Control(pDX, IDC_CODE, m_code); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(AddCheatCode, CDialog) //{{AFX_MSG_MAP(AddCheatCode) ON_BN_CLICKED(ID_OK, OnOk) ON_BN_CLICKED(ID_CANCEL, OnCancel) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // AddCheatCode message handlers void AddCheatCode::OnOk() { CString desc; CString buffer; CString token; m_code.GetWindowText(buffer); m_desc.GetWindowText(desc); StringTokenizer st(buffer, " \t\n\r"); const char *t = st.next(); while(t) { token = t; token.MakeUpper(); cheatsAddCheatCode(token, desc); t = st.next(); } EndDialog(TRUE); } void AddCheatCode::OnCancel() { EndDialog(FALSE); } BOOL AddCheatCode::OnInitDialog() { CDialog::OnInitDialog(); m_code.LimitText(1024); m_desc.LimitText(32); CString title = winResLoadString(IDS_ADD_CHEAT_CODE); SetWindowText(title); CenterWindow(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }