rlm@1: // GBACheats.cpp : implementation file rlm@1: // rlm@1: rlm@1: #include "stdafx.h" rlm@1: #include "resource.h" rlm@1: #include "GBACheatsDlg.h" rlm@1: #include "Reg.h" rlm@1: #include "StringTokenizer.h" rlm@1: #include "WinResUtil.h" rlm@1: #include "Sound.h" rlm@1: #include "VBA.h" rlm@1: rlm@1: #include "../gba/GBACheats.h" rlm@1: #include "../gba/GBAGlobals.h" rlm@1: #include "../common/CheatSearch.h" rlm@1: rlm@1: //////////////////////////////// rlm@1: rlm@1: bool winGbaCheatReaddress() rlm@1: { rlm@1: if (cheatSearchData.count != 2) rlm@1: return false; rlm@1: rlm@1: CheatSearchBlock *block = &cheatSearchData.blocks[0]; rlm@1: block->data = workRAM; rlm@1: rlm@1: block = &cheatSearchData.blocks[1]; rlm@1: block->data = internalRAM; rlm@1: rlm@1: cheatSearchData.count = 2; rlm@1: return true; rlm@1: } rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // GBACheatSearch dialog rlm@1: rlm@1: GBACheatSearch::GBACheatSearch(CWnd*pParent /*=NULL*/) rlm@1: : CDialog(GBACheatSearch::IDD, pParent) rlm@1: { rlm@1: //{{AFX_DATA_INIT(GBACheatSearch) rlm@1: valueType = -1; rlm@1: sizeType = -1; rlm@1: searchType = -1; rlm@1: numberType = -1; rlm@1: updateValues = FALSE; rlm@1: //}}AFX_DATA_INIT rlm@1: data = NULL; rlm@1: } rlm@1: rlm@1: GBACheatSearch::~GBACheatSearch() rlm@1: { rlm@1: if (data) rlm@1: free(data); rlm@1: } rlm@1: rlm@1: void GBACheatSearch::DoDataExchange(CDataExchange*pDX) rlm@1: { rlm@1: CDialog::DoDataExchange(pDX); rlm@1: //{{AFX_DATA_MAP(GBACheatSearch) rlm@1: DDX_Control(pDX, IDC_VALUE, m_value); rlm@1: DDX_Control(pDX, IDC_CHEAT_LIST, m_list); rlm@1: DDX_Radio(pDX, IDC_OLD_VALUE, valueType); rlm@1: DDX_Radio(pDX, IDC_SIZE_8, sizeType); rlm@1: DDX_Radio(pDX, IDC_EQ, searchType); rlm@1: DDX_Radio(pDX, IDC_SIGNED, numberType); rlm@1: DDX_Check(pDX, IDC_UPDATE, updateValues); rlm@1: //}}AFX_DATA_MAP rlm@1: } rlm@1: rlm@1: BEGIN_MESSAGE_MAP(GBACheatSearch, CDialog) rlm@1: //{{AFX_MSG_MAP(GBACheatSearch) rlm@1: ON_BN_CLICKED(ID_OK, OnOk) rlm@1: ON_BN_CLICKED(IDC_START, OnStart) rlm@1: ON_BN_CLICKED(IDC_SEARCH, OnSearch) rlm@1: ON_BN_CLICKED(IDC_ADD_CHEAT, OnAddCheat) rlm@1: ON_BN_CLICKED(IDC_UPDATE, OnUpdate) rlm@1: ON_NOTIFY(LVN_GETDISPINFO, IDC_CHEAT_LIST, OnGetdispinfoCheatList) rlm@1: ON_NOTIFY(LVN_ITEMCHANGED, IDC_CHEAT_LIST, OnItemchangedCheatList) rlm@1: ON_CONTROL_RANGE(BN_CLICKED, IDC_OLD_VALUE, IDC_SPECIFIC_VALUE, OnValueType) rlm@1: ON_CONTROL_RANGE(BN_CLICKED, IDC_EQ, IDC_GE, OnSearchType) rlm@1: ON_CONTROL_RANGE(BN_CLICKED, IDC_SIGNED, IDC_HEXADECIMAL, OnNumberType) rlm@1: ON_CONTROL_RANGE(BN_CLICKED, IDC_SIZE_8, IDC_SIZE_32, OnSizeType) rlm@1: //}}AFX_MSG_MAP rlm@1: ON_WM_CLOSE() rlm@1: ON_BN_CLICKED(IDC_CHEATREFRESHBUTTON, OnBnClickedCheatrefreshbutton) rlm@1: //ON_WM_DESTROY() rlm@1: //ON_WM_NCDESTROY() rlm@1: //ON_WM_SYSCOMMAND() rlm@1: //ON_WM_ACTIVATE() rlm@1: END_MESSAGE_MAP() rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // GBACheatSearch message handlers rlm@1: rlm@1: void GBACheatSearch::OnOk() rlm@1: { rlm@1: if (theApp.modelessCheatDialogIsOpen) rlm@1: { rlm@1: theApp.modelessCheatDialogIsOpen = false; rlm@1: DestroyWindow(); rlm@1: } rlm@1: else rlm@1: { rlm@1: EndDialog(TRUE); rlm@1: } rlm@1: } rlm@1: rlm@1: void GBACheatSearch::OnClose() rlm@1: { rlm@1: CDialog::OnClose(); rlm@1: if (theApp.modelessCheatDialogIsOpen) rlm@1: { rlm@1: theApp.modelessCheatDialogIsOpen = false; rlm@1: DestroyWindow(); rlm@1: } rlm@1: else rlm@1: { rlm@1: EndDialog(FALSE); rlm@1: } rlm@1: } rlm@1: rlm@1: void GBACheatSearch::OnStart() rlm@1: { rlm@1: if (cheatSearchData.count == 0) rlm@1: { rlm@1: CheatSearchBlock *block = &cheatSearchData.blocks[0]; rlm@1: block->data = workRAM; rlm@1: block->offset = 0x2000000; rlm@1: block->size = 0x40000; rlm@1: block->saved = (u8 *)malloc(0x40000); rlm@1: block->bits = (u8 *)malloc(0x40000>>3); rlm@1: rlm@1: block = &cheatSearchData.blocks[1]; rlm@1: block->data = internalRAM; rlm@1: block->offset = 0x3000000; rlm@1: block->size = 0x8000; rlm@1: block->saved = (u8 *)malloc(0x8000); rlm@1: block->bits = (u8 *)malloc(0x8000>>3); rlm@1: rlm@1: cheatSearchData.count = 2; rlm@1: } rlm@1: rlm@1: cheatSearchStart(&cheatSearchData); rlm@1: GetDlgItem(IDC_SEARCH)->EnableWindow(TRUE); rlm@1: rlm@1: if (theApp.modelessCheatDialogIsOpen) rlm@1: { rlm@1: GetDlgItem(IDC_CHEATREFRESHBUTTON)->ShowWindow(TRUE); rlm@1: GetDlgItem(IDC_CHEATREFRESHBUTTON)->EnableWindow(FALSE); rlm@1: } rlm@1: } rlm@1: rlm@1: void GBACheatSearch::OnSearch() rlm@1: { rlm@1: CString buffer; rlm@1: rlm@1: if (valueType == 0) rlm@1: cheatSearch(&cheatSearchData, rlm@1: searchType, rlm@1: sizeType, rlm@1: numberType == 0); rlm@1: else rlm@1: { rlm@1: m_value.GetWindowText(buffer); rlm@1: if (buffer.IsEmpty()) rlm@1: { rlm@1: systemMessage(IDS_NUMBER_CANNOT_BE_EMPTY, "Number cannot be empty"); rlm@1: return; rlm@1: } rlm@1: int value = 0; rlm@1: switch (numberType) rlm@1: { rlm@1: case 0: rlm@1: sscanf(buffer, "%d", &value); rlm@1: break; rlm@1: case 1: rlm@1: sscanf(buffer, "%u", &value); rlm@1: break; rlm@1: default: rlm@1: sscanf(buffer, "%x", &value); rlm@1: } rlm@1: cheatSearchValue(&cheatSearchData, rlm@1: searchType, rlm@1: sizeType, rlm@1: numberType == 0, rlm@1: value); rlm@1: } rlm@1: rlm@1: addChanges(true); rlm@1: rlm@1: if (updateValues) rlm@1: cheatSearchUpdateValues(&cheatSearchData); rlm@1: rlm@1: if (theApp.modelessCheatDialogIsOpen) rlm@1: GetDlgItem(IDC_CHEATREFRESHBUTTON)->EnableWindow(cheatSearchGetCount(&cheatSearchData, sizeType) == 0 ? FALSE : TRUE); rlm@1: rlm@1: if (0 == cheatSearchGetCount(&cheatSearchData, sizeType)) rlm@1: OnStart(); rlm@1: } rlm@1: rlm@1: void GBACheatSearch::OnAddCheat() rlm@1: { rlm@1: int mark = m_list.GetSelectionMark(); rlm@1: rlm@1: if (mark != -1) rlm@1: { rlm@1: LVITEM item; rlm@1: memset(&item, 0, sizeof(item)); rlm@1: item.mask = LVIF_PARAM; rlm@1: item.iItem = mark; rlm@1: if (m_list.GetItem(&item)) rlm@1: { rlm@1: AddCheat dlg((u32)item.lParam); rlm@1: dlg.DoModal(); rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void GBACheatSearch::OnUpdate() rlm@1: { rlm@1: if (GetDlgItem(IDC_UPDATE)->SendMessage(BM_GETCHECK, rlm@1: 0, rlm@1: 0) & BST_CHECKED) rlm@1: updateValues = true; rlm@1: else rlm@1: updateValues = false; rlm@1: regSetDwordValue("cheatsUpdate", updateValues); rlm@1: } rlm@1: rlm@1: void GBACheatSearch::OnGetdispinfoCheatList(NMHDR*pNMHDR, LRESULT*pResult) rlm@1: { rlm@1: LV_DISPINFO*info = (LV_DISPINFO *)pNMHDR; rlm@1: if (info->item.mask & LVIF_TEXT) rlm@1: { rlm@1: int index = info->item.iItem; rlm@1: int col = info->item.iSubItem; rlm@1: rlm@1: switch (col) rlm@1: { rlm@1: case 0: rlm@1: strcpy(info->item.pszText, data[index].address); rlm@1: break; rlm@1: case 1: rlm@1: strcpy(info->item.pszText, data[index].oldValue); rlm@1: break; rlm@1: case 2: rlm@1: strcpy(info->item.pszText, data[index].newValue); rlm@1: break; rlm@1: } rlm@1: } rlm@1: *pResult = TRUE; rlm@1: } rlm@1: rlm@1: void GBACheatSearch::OnItemchangedCheatList(NMHDR*pNMHDR, LRESULT*pResult) rlm@1: { rlm@1: GetDlgItem(IDC_ADD_CHEAT)->EnableWindow(m_list.GetSelectionMark() != -1); rlm@1: *pResult = TRUE; rlm@1: } rlm@1: rlm@1: BOOL GBACheatSearch::OnInitDialog() rlm@1: { rlm@1: CDialog::OnInitDialog(); rlm@1: rlm@1: CString temp = winResLoadString(IDS_ADDRESS); rlm@1: rlm@1: m_list.InsertColumn(0, temp, LVCFMT_CENTER, 125, 0); rlm@1: rlm@1: temp = winResLoadString(IDS_OLD_VALUE); rlm@1: m_list.InsertColumn(1, temp, LVCFMT_CENTER, 125, 1); rlm@1: rlm@1: temp = winResLoadString(IDS_NEW_VALUE); rlm@1: m_list.InsertColumn(2, temp, LVCFMT_CENTER, 125, 2); rlm@1: rlm@1: m_list.SetFont(CFont::FromHandle((HFONT)GetStockObject(SYSTEM_FIXED_FONT)), rlm@1: TRUE); rlm@1: rlm@1: m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT); rlm@1: rlm@1: if (!cheatSearchData.count) rlm@1: { rlm@1: GetDlgItem(IDC_SEARCH)->EnableWindow(FALSE); rlm@1: GetDlgItem(IDC_ADD_CHEAT)->EnableWindow(FALSE); rlm@1: } rlm@1: rlm@1: valueType = regQueryDwordValue("cheatsValueType", 0); rlm@1: if (valueType < 0 || valueType > 1) rlm@1: valueType = 0; rlm@1: rlm@1: searchType = regQueryDwordValue("cheatsSearchType", SEARCH_EQ); rlm@1: if (searchType > 5 || searchType < 0) rlm@1: searchType = 0; rlm@1: rlm@1: numberType = regQueryDwordValue("cheatsNumberType", 2); rlm@1: if (numberType < 0 || numberType > 2) rlm@1: numberType = 2; rlm@1: rlm@1: sizeType = regQueryDwordValue("cheatsSizeType", 0); rlm@1: if (sizeType < 0 || sizeType > 2) rlm@1: sizeType = 0; rlm@1: rlm@1: updateValues = regQueryDwordValue("cheatsUpdate", 0) ? rlm@1: true : false; rlm@1: rlm@1: UpdateData(FALSE); rlm@1: rlm@1: if (valueType == 0) rlm@1: m_value.EnableWindow(FALSE); rlm@1: CenterWindow(); rlm@1: rlm@1: if (theApp.modelessCheatDialogIsOpen) rlm@1: GetDlgItem(IDC_CHEATREFRESHBUTTON)->ShowWindow(TRUE); rlm@1: rlm@1: if (cheatSearchData.count) rlm@1: { rlm@1: addChanges(false); rlm@1: if (theApp.modelessCheatDialogIsOpen) rlm@1: GetDlgItem(IDC_CHEATREFRESHBUTTON)->EnableWindow(cheatSearchGetCount(&cheatSearchData, rlm@1: sizeType) == 0 ? FALSE : TRUE); rlm@1: } rlm@1: else rlm@1: { rlm@1: if (theApp.modelessCheatDialogIsOpen) rlm@1: GetDlgItem(IDC_CHEATREFRESHBUTTON)->EnableWindow(FALSE); rlm@1: } rlm@1: rlm@1: return TRUE; // return TRUE unless you set the focus to a control rlm@1: // EXCEPTION: OCX Property Pages should return FALSE rlm@1: } rlm@1: rlm@1: void GBACheatSearch::addChanges(bool showMsgs) rlm@1: { rlm@1: int count = cheatSearchGetCount(&cheatSearchData, sizeType); rlm@1: rlm@1: m_list.DeleteAllItems(); rlm@1: rlm@1: if (count > 4000) rlm@1: { rlm@1: if (showMsgs) rlm@1: systemMessage( rlm@1: IDS_SEARCH_PRODUCED_TOO_MANY, rlm@1: "Search produced %d results.\nThey have been remembered, but are too many to display.\nPlease refine it better by performing additional searches.", rlm@1: count); rlm@1: return; rlm@1: } rlm@1: rlm@1: if (count == 0) rlm@1: { rlm@1: if (showMsgs) rlm@1: systemMessage(IDS_SEARCH_PRODUCED_NO_RESULTS, "Search produced no results."); rlm@1: return; rlm@1: } rlm@1: rlm@1: m_list.SetItemCount(count); rlm@1: if (data) rlm@1: free(data); rlm@1: rlm@1: data = (WinCheatsData *)calloc(count, sizeof(WinCheatsData)); rlm@1: rlm@1: int inc = 1; rlm@1: switch (sizeType) rlm@1: { rlm@1: case 1: rlm@1: inc = 2; rlm@1: break; rlm@1: case 2: rlm@1: inc = 4; rlm@1: break; rlm@1: } rlm@1: rlm@1: int index = 0; rlm@1: if (numberType == 0) rlm@1: { rlm@1: for (int i = 0; i < cheatSearchData.count; i++) rlm@1: { rlm@1: CheatSearchBlock *block = &cheatSearchData.blocks[i]; rlm@1: rlm@1: for (int j = 0; j < block->size; j += inc) rlm@1: { rlm@1: if (IS_BIT_SET(block->bits, j)) rlm@1: { rlm@1: addChange(index++, rlm@1: block->offset | j, rlm@1: cheatSearchSignedRead(block->saved, rlm@1: j, rlm@1: sizeType), rlm@1: cheatSearchSignedRead(block->data, rlm@1: j, rlm@1: sizeType)); rlm@1: } rlm@1: } rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: for (int i = 0; i < cheatSearchData.count; i++) rlm@1: { rlm@1: CheatSearchBlock *block = &cheatSearchData.blocks[i]; rlm@1: rlm@1: for (int j = 0; j < block->size; j += inc) rlm@1: { rlm@1: if (IS_BIT_SET(block->bits, j)) rlm@1: { rlm@1: addChange(index++, rlm@1: block->offset | j, rlm@1: cheatSearchRead(block->saved, rlm@1: j, rlm@1: sizeType), rlm@1: cheatSearchRead(block->data, rlm@1: j, rlm@1: sizeType)); rlm@1: } rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: for (int i = 0; i < count; i++) rlm@1: { rlm@1: LVITEM item; rlm@1: rlm@1: item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE; rlm@1: item.iItem = i; rlm@1: item.iSubItem = 0; rlm@1: item.lParam = data[i].addr; rlm@1: item.state = 0; rlm@1: item.stateMask = 0; rlm@1: item.pszText = LPSTR_TEXTCALLBACK; rlm@1: m_list.InsertItem(&item); rlm@1: rlm@1: m_list.SetItemText(i, 1, LPSTR_TEXTCALLBACK); rlm@1: m_list.SetItemText(i, 2, LPSTR_TEXTCALLBACK); rlm@1: } rlm@1: } rlm@1: rlm@1: void GBACheatSearch::addChange(int index, u32 address, u32 oldValue, u32 newValue) rlm@1: { rlm@1: data[index].addr = address; rlm@1: sprintf(data[index].address, "%08x", address); rlm@1: switch (numberType) rlm@1: { rlm@1: case 0: rlm@1: sprintf(data[index].oldValue, "%d", oldValue); rlm@1: sprintf(data[index].newValue, "%d", newValue); rlm@1: break; rlm@1: case 1: rlm@1: sprintf(data[index].oldValue, "%u", oldValue); rlm@1: sprintf(data[index].newValue, "%u", newValue); rlm@1: break; rlm@1: case 2: rlm@1: switch (sizeType) rlm@1: { rlm@1: case 0: rlm@1: sprintf(data[index].oldValue, "%02x", oldValue); rlm@1: sprintf(data[index].newValue, "%02x", newValue); rlm@1: break; rlm@1: case 1: rlm@1: sprintf(data[index].oldValue, "%04x", oldValue); rlm@1: sprintf(data[index].newValue, "%04x", newValue); rlm@1: break; rlm@1: case 2: rlm@1: sprintf(data[index].oldValue, "%08x", oldValue); rlm@1: sprintf(data[index].newValue, "%08x", newValue); rlm@1: break; rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void GBACheatSearch::OnValueType(UINT id) rlm@1: { rlm@1: switch (id) rlm@1: { rlm@1: case IDC_OLD_VALUE: rlm@1: valueType = 0; rlm@1: m_value.EnableWindow(FALSE); rlm@1: regSetDwordValue("cheatsValueType", 0); rlm@1: break; rlm@1: case IDC_SPECIFIC_VALUE: rlm@1: valueType = 1; rlm@1: m_value.EnableWindow(TRUE); rlm@1: regSetDwordValue("cheatsValueType", 1); rlm@1: break; rlm@1: } rlm@1: } rlm@1: rlm@1: void GBACheatSearch::OnSearchType(UINT id) rlm@1: { rlm@1: switch (id) rlm@1: { rlm@1: case IDC_EQ: rlm@1: searchType = SEARCH_EQ; rlm@1: regSetDwordValue("cheatsSearchType", 0); rlm@1: break; rlm@1: case IDC_NE: rlm@1: searchType = SEARCH_NE; rlm@1: regSetDwordValue("cheatsSearchType", 1); rlm@1: break; rlm@1: case IDC_LT: rlm@1: searchType = SEARCH_LT; rlm@1: regSetDwordValue("cheatsSearchType", 2); rlm@1: break; rlm@1: case IDC_LE: rlm@1: searchType = SEARCH_LE; rlm@1: regSetDwordValue("cheatsSearchType", 3); rlm@1: break; rlm@1: case IDC_GT: rlm@1: searchType = SEARCH_GT; rlm@1: regSetDwordValue("cheatsSearchType", 4); rlm@1: break; rlm@1: case IDC_GE: rlm@1: searchType = SEARCH_GE; rlm@1: regSetDwordValue("cheatsSearchType", 5); rlm@1: break; rlm@1: } rlm@1: } rlm@1: rlm@1: void GBACheatSearch::OnNumberType(UINT id) rlm@1: { rlm@1: switch (id) rlm@1: { rlm@1: case IDC_SIGNED: rlm@1: numberType = 0; rlm@1: regSetDwordValue("cheatsNumberType", 0); rlm@1: if (m_list.GetItemCount()) rlm@1: { rlm@1: addChanges(false); rlm@1: } rlm@1: break; rlm@1: case IDC_UNSIGNED: rlm@1: numberType = 1; rlm@1: regSetDwordValue("cheatsNumberType", 1); rlm@1: if (m_list.GetItemCount()) rlm@1: { rlm@1: addChanges(false); rlm@1: } rlm@1: break; rlm@1: case IDC_HEXADECIMAL: rlm@1: numberType = 2; rlm@1: regSetDwordValue("cheatsNumberType", 2); rlm@1: if (m_list.GetItemCount()) rlm@1: { rlm@1: addChanges(false); rlm@1: } rlm@1: break; rlm@1: } rlm@1: } rlm@1: rlm@1: void GBACheatSearch::OnSizeType(UINT id) rlm@1: { rlm@1: switch (id) rlm@1: { rlm@1: case IDC_SIZE_8: rlm@1: sizeType = BITS_8; rlm@1: regSetDwordValue("cheatsSizeType", 0); rlm@1: if (m_list.GetItemCount()) rlm@1: { rlm@1: addChanges(false); rlm@1: } rlm@1: break; rlm@1: case IDC_SIZE_16: rlm@1: sizeType = BITS_16; rlm@1: regSetDwordValue("cheatsSizeType", 1); rlm@1: if (m_list.GetItemCount()) rlm@1: { rlm@1: addChanges(false); rlm@1: } rlm@1: break; rlm@1: case IDC_SIZE_32: rlm@1: sizeType = BITS_32; rlm@1: regSetDwordValue("cheatsSizeType", 2); rlm@1: if (m_list.GetItemCount()) rlm@1: { rlm@1: addChanges(false); rlm@1: } rlm@1: break; rlm@1: } rlm@1: } rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // AddCheat dialog rlm@1: rlm@1: AddCheat::AddCheat(u32 address, CWnd*pParent /*=NULL*/) rlm@1: : CDialog(AddCheat::IDD, pParent) rlm@1: { rlm@1: //{{AFX_DATA_INIT(AddCheat) rlm@1: numberType = regQueryDwordValue("cheatsNumberType", 2); rlm@1: if (numberType < 0 || numberType > 2) rlm@1: numberType = 2; rlm@1: sizeType = regQueryDwordValue("cheatsSizeType", 0); rlm@1: if (sizeType < 0 || sizeType > 2) rlm@1: sizeType = 0; rlm@1: //}}AFX_DATA_INIT rlm@1: this->address = address; rlm@1: } rlm@1: rlm@1: void AddCheat::DoDataExchange(CDataExchange*pDX) rlm@1: { rlm@1: CDialog::DoDataExchange(pDX); rlm@1: //{{AFX_DATA_MAP(AddCheat) rlm@1: DDX_Control(pDX, IDC_VALUE, m_value); rlm@1: DDX_Control(pDX, IDC_DESC, m_desc); rlm@1: DDX_Control(pDX, IDC_ADDRESS, m_address); rlm@1: DDX_Radio(pDX, IDC_SIZE_8, sizeType); rlm@1: DDX_Radio(pDX, IDC_SIGNED, numberType); rlm@1: //}}AFX_DATA_MAP rlm@1: } rlm@1: rlm@1: BEGIN_MESSAGE_MAP(AddCheat, CDialog) rlm@1: //{{AFX_MSG_MAP(AddCheat) rlm@1: ON_BN_CLICKED(ID_OK, OnOk) rlm@1: ON_BN_CLICKED(ID_CANCEL, OnCancel) rlm@1: ON_CONTROL_RANGE(BN_CLICKED, IDC_SIGNED, IDC_HEXADECIMAL, OnNumberType) rlm@1: ON_CONTROL_RANGE(BN_CLICKED, IDC_SIZE_8, IDC_SIZE_32, OnSizeType) rlm@1: //}}AFX_MSG_MAP rlm@1: END_MESSAGE_MAP() rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // AddCheat message handlers rlm@1: rlm@1: void AddCheat::OnOk() rlm@1: { rlm@1: // add cheat rlm@1: if (addCheat()) rlm@1: { rlm@1: EndDialog(TRUE); rlm@1: } rlm@1: } rlm@1: rlm@1: void AddCheat::OnCancel() rlm@1: { rlm@1: EndDialog(FALSE); rlm@1: } rlm@1: rlm@1: BOOL AddCheat::OnInitDialog() rlm@1: { rlm@1: CDialog::OnInitDialog(); rlm@1: rlm@1: if (address != 0) rlm@1: { rlm@1: CString buffer; rlm@1: buffer.Format("%08x", address); rlm@1: m_address.SetWindowText(buffer); rlm@1: m_address.EnableWindow(FALSE); rlm@1: } rlm@1: rlm@1: UpdateData(FALSE); rlm@1: rlm@1: GetDlgItem(IDC_DESC)->SendMessage(EM_LIMITTEXT, rlm@1: 32, rlm@1: 0); rlm@1: if (address != 0) rlm@1: { rlm@1: GetDlgItem(IDC_SIZE_8)->EnableWindow(FALSE); rlm@1: GetDlgItem(IDC_SIZE_16)->EnableWindow(FALSE); rlm@1: GetDlgItem(IDC_SIZE_32)->EnableWindow(FALSE); rlm@1: GetDlgItem(IDC_HEXADECIMAL)->EnableWindow(FALSE); rlm@1: GetDlgItem(IDC_UNSIGNED)->EnableWindow(FALSE); rlm@1: GetDlgItem(IDC_SIGNED)->EnableWindow(FALSE); rlm@1: } rlm@1: rlm@1: CenterWindow(); rlm@1: rlm@1: return TRUE; // return TRUE unless you set the focus to a control rlm@1: // EXCEPTION: OCX Property Pages should return FALSE rlm@1: } rlm@1: rlm@1: void AddCheat::OnNumberType(UINT id) rlm@1: { rlm@1: switch (id) rlm@1: { rlm@1: case IDC_SIGNED: rlm@1: numberType = 0; rlm@1: regSetDwordValue("cheatsNumberType", 0); rlm@1: break; rlm@1: case IDC_UNSIGNED: rlm@1: numberType = 1; rlm@1: regSetDwordValue("cheatsNumberType", 1); rlm@1: break; rlm@1: case IDC_HEXADECIMAL: rlm@1: numberType = 2; rlm@1: regSetDwordValue("cheatsNumberType", 2); rlm@1: break; rlm@1: } rlm@1: } rlm@1: rlm@1: void AddCheat::OnSizeType(UINT id) rlm@1: { rlm@1: switch (id) rlm@1: { rlm@1: case IDC_SIZE_8: rlm@1: sizeType = BITS_8; rlm@1: regSetDwordValue("cheatsSizeType", 0); rlm@1: break; rlm@1: case IDC_SIZE_16: rlm@1: sizeType = BITS_16; rlm@1: regSetDwordValue("cheatsSizeType", 1); rlm@1: break; rlm@1: case IDC_SIZE_32: rlm@1: sizeType = BITS_32; rlm@1: regSetDwordValue("cheatsSizeType", 2); rlm@1: break; rlm@1: } rlm@1: } rlm@1: rlm@1: bool AddCheat::addCheat() rlm@1: { rlm@1: CString buffer; rlm@1: CString code; rlm@1: rlm@1: m_address.GetWindowText(buffer); rlm@1: u32 address = 0; rlm@1: sscanf(buffer, "%x", &address); rlm@1: if ((address >= 0x02000000 && address < 0x02040000) || rlm@1: (address >= 0x03000000 && address < 0x03008000)) rlm@1: {} rlm@1: else rlm@1: { rlm@1: systemMessage(IDS_INVALID_ADDRESS, "Invalid address: %08x", address); rlm@1: return false; rlm@1: } rlm@1: if (sizeType != 0) rlm@1: { rlm@1: if (sizeType == 1 && address & 1) rlm@1: { rlm@1: systemMessage(IDS_MISALIGNED_HALFWORD, "Misaligned half-word address: %08x", address); rlm@1: return false; rlm@1: } rlm@1: if (sizeType == 2 && address & 3) rlm@1: { rlm@1: systemMessage(IDS_MISALIGNED_WORD, "Misaligned word address: %08x", address); rlm@1: return false; rlm@1: } rlm@1: } rlm@1: u32 value; rlm@1: m_value.GetWindowText(buffer); rlm@1: rlm@1: if (buffer.IsEmpty()) rlm@1: { rlm@1: systemMessage(IDS_VALUE_CANNOT_BE_EMPTY, "Value cannot be empty"); rlm@1: return false; rlm@1: } rlm@1: rlm@1: switch (numberType) rlm@1: { rlm@1: case 0: rlm@1: sscanf(buffer, "%d", &value); rlm@1: break; rlm@1: case 1: rlm@1: sscanf(buffer, "%u", &value); rlm@1: break; rlm@1: default: rlm@1: sscanf(buffer, "%x", &value); rlm@1: } rlm@1: rlm@1: m_desc.GetWindowText(buffer); rlm@1: rlm@1: switch (sizeType) rlm@1: { rlm@1: case 0: rlm@1: code.Format("%08x:%02x", address, value); rlm@1: break; rlm@1: case 1: rlm@1: code.Format("%08x:%04x", address, value); rlm@1: break; rlm@1: case 2: rlm@1: code.Format("%08x:%08x", address, value); rlm@1: break; rlm@1: } rlm@1: rlm@1: cheatsAdd(code, buffer, address, value, -1, sizeType); rlm@1: return true; rlm@1: } rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // GBACheatList dialog rlm@1: rlm@1: GBACheatList::GBACheatList(CWnd*pParent /*=NULL*/) rlm@1: : CDialog(GBACheatList::IDD, pParent) rlm@1: { rlm@1: //{{AFX_DATA_INIT(GBACheatList) rlm@1: // NOTE: the ClassWizard will add member initialization here rlm@1: //}}AFX_DATA_INIT rlm@1: } rlm@1: rlm@1: void GBACheatList::DoDataExchange(CDataExchange*pDX) rlm@1: { rlm@1: CDialog::DoDataExchange(pDX); rlm@1: //{{AFX_DATA_MAP(GBACheatList) rlm@1: DDX_Control(pDX, IDC_RESTORE, m_restore); rlm@1: DDX_Control(pDX, IDC_CHEAT_LIST, m_list); rlm@1: //}}AFX_DATA_MAP rlm@1: } rlm@1: rlm@1: BEGIN_MESSAGE_MAP(GBACheatList, CDialog) rlm@1: //{{AFX_MSG_MAP(GBACheatList) rlm@1: ON_BN_CLICKED(IDC_ADD_CHEAT, OnAddCheat) rlm@1: ON_BN_CLICKED(IDC_ADD_CODE, OnAddCode) rlm@1: ON_BN_CLICKED(IDC_ADD_CODEBREAKER, OnAddCodebreaker) rlm@1: ON_BN_CLICKED(IDC_ADD_GAMESHARK, OnAddGameshark) rlm@1: ON_BN_CLICKED(IDC_ENABLE, OnEnable) rlm@1: ON_BN_CLICKED(IDC_REMOVE, OnRemove) rlm@1: ON_BN_CLICKED(IDC_REMOVE_ALL, OnRemoveAll) rlm@1: ON_BN_CLICKED(IDC_RESTORE, OnRestore) rlm@1: ON_BN_CLICKED(ID_OK, OnOk) rlm@1: ON_NOTIFY(LVN_ITEMCHANGED, IDC_CHEAT_LIST, OnItemchangedCheatList) rlm@1: //}}AFX_MSG_MAP rlm@1: END_MESSAGE_MAP() rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // GBACheatList message handlers rlm@1: rlm@1: void GBACheatList::OnAddCheat() rlm@1: { rlm@1: AddCheat dlg(0); rlm@1: dlg.DoModal(); rlm@1: refresh(); rlm@1: } rlm@1: rlm@1: void GBACheatList::OnAddCode() rlm@1: { rlm@1: AddCheatCode dlg; rlm@1: dlg.DoModal(); rlm@1: refresh(); rlm@1: } rlm@1: rlm@1: void GBACheatList::OnAddCodebreaker() rlm@1: { rlm@1: AddCBACode dlg; rlm@1: dlg.DoModal(); rlm@1: refresh(); rlm@1: } rlm@1: rlm@1: void GBACheatList::OnAddGameshark() rlm@1: { rlm@1: AddGSACode dlg; rlm@1: dlg.DoModal(); rlm@1: refresh(); rlm@1: } rlm@1: rlm@1: void GBACheatList::OnEnable() rlm@1: { rlm@1: int mark = m_list.GetSelectionMark(); rlm@1: int count = m_list.GetItemCount(); rlm@1: rlm@1: if (mark != -1) rlm@1: { rlm@1: LVITEM item; rlm@1: for (int i = 0; i < count; i++) rlm@1: { rlm@1: memset(&item, 0, sizeof(item)); rlm@1: item.mask = LVIF_PARAM|LVIF_STATE; rlm@1: item.stateMask = LVIS_SELECTED; rlm@1: item.iItem = i; rlm@1: if (m_list.GetItem(&item)) rlm@1: { rlm@1: if (item.state & LVIS_SELECTED) rlm@1: { rlm@1: if (cheatsList[item.lParam].enabled) rlm@1: cheatsDisable(item.lParam); rlm@1: else rlm@1: cheatsEnable(item.lParam); rlm@1: } rlm@1: } rlm@1: } rlm@1: refresh(); rlm@1: } rlm@1: } rlm@1: rlm@1: void GBACheatList::OnRemove() rlm@1: { rlm@1: int mark = m_list.GetSelectionMark(); rlm@1: int count = m_list.GetItemCount(); rlm@1: rlm@1: if (mark != -1) rlm@1: { rlm@1: for (int i = count - 1; i >= 0; i--) rlm@1: { rlm@1: LVITEM item; rlm@1: memset(&item, 0, sizeof(item)); rlm@1: item.mask = LVIF_PARAM|LVIF_STATE; rlm@1: item.iItem = i; rlm@1: item.stateMask = LVIS_SELECTED; rlm@1: if (m_list.GetItem(&item)) rlm@1: { rlm@1: if (item.state & LVIS_SELECTED) rlm@1: { rlm@1: cheatsDelete(item.lParam, restoreValues); rlm@1: } rlm@1: } rlm@1: } rlm@1: refresh(); rlm@1: } rlm@1: } rlm@1: rlm@1: void GBACheatList::OnRemoveAll() rlm@1: { rlm@1: cheatsDeleteAll(restoreValues); rlm@1: refresh(); rlm@1: } rlm@1: rlm@1: void GBACheatList::OnRestore() rlm@1: { rlm@1: restoreValues = !restoreValues; rlm@1: regSetDwordValue("cheatsRestore", restoreValues); rlm@1: } rlm@1: rlm@1: void GBACheatList::OnOk() rlm@1: { rlm@1: EndDialog(TRUE); rlm@1: } rlm@1: rlm@1: void GBACheatList::OnItemchangedCheatList(NMHDR*pNMHDR, LRESULT*pResult) rlm@1: { rlm@1: if (m_list.GetSelectionMark() != -1) rlm@1: { rlm@1: GetDlgItem(IDC_REMOVE)->EnableWindow(TRUE); rlm@1: GetDlgItem(IDC_ENABLE)->EnableWindow(TRUE); rlm@1: } rlm@1: else rlm@1: { rlm@1: GetDlgItem(IDC_REMOVE)->EnableWindow(FALSE); rlm@1: GetDlgItem(IDC_ENABLE)->EnableWindow(FALSE); rlm@1: } rlm@1: rlm@1: if (!duringRefresh) rlm@1: { rlm@1: LPNMLISTVIEW l = (LPNMLISTVIEW)pNMHDR; rlm@1: if (l->uChanged & LVIF_STATE) rlm@1: { rlm@1: if (((l->uOldState & LVIS_STATEIMAGEMASK)>>12) != rlm@1: (((l->uNewState & LVIS_STATEIMAGEMASK)>>12))) rlm@1: { rlm@1: if (m_list.GetCheck(l->iItem)) rlm@1: cheatsEnable(l->lParam); rlm@1: else rlm@1: cheatsDisable(l->lParam); rlm@1: refresh(); rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: *pResult = 0; rlm@1: } rlm@1: rlm@1: BOOL GBACheatList::OnInitDialog() rlm@1: { rlm@1: CDialog::OnInitDialog(); rlm@1: rlm@1: CString temp = winResLoadString(IDS_CODE); rlm@1: m_list.InsertColumn(0, temp, LVCFMT_LEFT, 170, 0); rlm@1: temp = winResLoadString(IDS_DESCRIPTION); rlm@1: m_list.InsertColumn(1, temp, LVCFMT_LEFT, 150, 1); rlm@1: temp = winResLoadString(IDS_STATUS); rlm@1: m_list.InsertColumn(2, temp, LVCFMT_LEFT, 80, 1); rlm@1: rlm@1: m_list.SetFont(CFont::FromHandle((HFONT)GetStockObject(SYSTEM_FIXED_FONT)), rlm@1: TRUE); rlm@1: rlm@1: m_list.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT); rlm@1: rlm@1: duringRefresh = false; rlm@1: rlm@1: restoreValues = regQueryDwordValue("cheatsRestore", 0) ? rlm@1: true : false; rlm@1: rlm@1: m_restore.SetCheck(restoreValues); rlm@1: rlm@1: refresh(); rlm@1: GetDlgItem(IDC_REMOVE)->EnableWindow(FALSE); rlm@1: GetDlgItem(IDC_ENABLE)->EnableWindow(FALSE); rlm@1: CenterWindow(); rlm@1: rlm@1: return TRUE; // return TRUE unless you set the focus to a control rlm@1: // EXCEPTION: OCX Property Pages should return FALSE rlm@1: } rlm@1: rlm@1: void GBACheatList::refresh() rlm@1: { rlm@1: duringRefresh = true; rlm@1: m_list.DeleteAllItems(); rlm@1: rlm@1: CString buffer; rlm@1: rlm@1: for (int i = 0; i < cheatsNumber; i++) rlm@1: { rlm@1: LVITEM item; rlm@1: rlm@1: item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE; rlm@1: item.iItem = i; rlm@1: item.iSubItem = 0; rlm@1: item.lParam = i; rlm@1: item.state = 0; rlm@1: item.stateMask = 0; rlm@1: item.pszText = cheatsList[i].codestring; rlm@1: m_list.InsertItem(&item); rlm@1: rlm@1: m_list.SetCheck(i, (cheatsList[i].enabled) ? TRUE : FALSE); rlm@1: rlm@1: m_list.SetItemText(i, 1, cheatsList[i].desc); rlm@1: rlm@1: buffer = (cheatsList[i].enabled) ? 'E' : 'D'; rlm@1: m_list.SetItemText(i, 2, buffer); rlm@1: } rlm@1: duringRefresh = false; rlm@1: } rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // AddGSACode dialog rlm@1: rlm@1: AddGSACode::AddGSACode(CWnd*pParent /*=NULL*/) rlm@1: : CDialog(AddGSACode::IDD, pParent) rlm@1: { rlm@1: //{{AFX_DATA_INIT(AddGSACode) rlm@1: // NOTE: the ClassWizard will add member initialization here rlm@1: //}}AFX_DATA_INIT rlm@1: } rlm@1: rlm@1: void AddGSACode::DoDataExchange(CDataExchange*pDX) rlm@1: { rlm@1: CDialog::DoDataExchange(pDX); rlm@1: //{{AFX_DATA_MAP(AddGSACode) rlm@1: DDX_Control(pDX, IDC_DESC, m_desc); rlm@1: DDX_Control(pDX, IDC_CODE, m_code); rlm@1: //}}AFX_DATA_MAP rlm@1: } rlm@1: rlm@1: BEGIN_MESSAGE_MAP(AddGSACode, CDialog) rlm@1: //{{AFX_MSG_MAP(AddGSACode) rlm@1: ON_BN_CLICKED(ID_OK, OnOk) rlm@1: ON_BN_CLICKED(ID_CANCEL, OnCancel) rlm@1: //}}AFX_MSG_MAP rlm@1: END_MESSAGE_MAP() rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // AddGSACode message handlers rlm@1: rlm@1: void AddGSACode::OnOk() rlm@1: { rlm@1: CString desc; rlm@1: CString buffer; rlm@1: CString part1; rlm@1: CString code; rlm@1: CString token; rlm@1: rlm@1: m_code.GetWindowText(buffer); rlm@1: m_desc.GetWindowText(desc); rlm@1: rlm@1: StringTokenizer st(buffer, " \t\n\r"); rlm@1: part1.Empty(); rlm@1: const char *t = st.next(); rlm@1: while (t) rlm@1: { rlm@1: token = t; rlm@1: token.MakeUpper(); rlm@1: if (token.GetLength() == 16) rlm@1: cheatsAddGSACode(token, desc, false); rlm@1: else if (token.GetLength() == 12) rlm@1: { rlm@1: code = token.Left(8); rlm@1: code += " "; rlm@1: code += token.Right(4); rlm@1: cheatsAddCBACode(code, desc); rlm@1: } rlm@1: else if (part1.IsEmpty()) rlm@1: part1 = token; rlm@1: else rlm@1: { rlm@1: if (token.GetLength() == 4) rlm@1: { rlm@1: code = part1; rlm@1: code += " "; rlm@1: code += token; rlm@1: cheatsAddCBACode(code, desc); rlm@1: } rlm@1: else rlm@1: { rlm@1: code = part1 + token; rlm@1: cheatsAddGSACode(code, desc, true); rlm@1: } rlm@1: part1.Empty(); rlm@1: } rlm@1: rlm@1: t = st.next(); rlm@1: } rlm@1: EndDialog(TRUE); rlm@1: } rlm@1: rlm@1: void AddGSACode::OnCancel() rlm@1: { rlm@1: EndDialog(FALSE); rlm@1: } rlm@1: rlm@1: BOOL AddGSACode::OnInitDialog() rlm@1: { rlm@1: CDialog::OnInitDialog(); rlm@1: rlm@1: m_code.LimitText(1024); rlm@1: m_desc.LimitText(32); rlm@1: CString title = winResLoadString(IDS_ADD_GSA_CODE); rlm@1: SetWindowText(title); rlm@1: CenterWindow(); rlm@1: rlm@1: return TRUE; // return TRUE unless you set the focus to a control rlm@1: // EXCEPTION: OCX Property Pages should return FALSE rlm@1: } rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // AddCBACode dialog rlm@1: rlm@1: AddCBACode::AddCBACode(CWnd*pParent /*=NULL*/) rlm@1: : CDialog(AddCBACode::IDD, pParent) rlm@1: { rlm@1: //{{AFX_DATA_INIT(AddCBACode) rlm@1: // NOTE: the ClassWizard will add member initialization here rlm@1: //}}AFX_DATA_INIT rlm@1: } rlm@1: rlm@1: void AddCBACode::DoDataExchange(CDataExchange*pDX) rlm@1: { rlm@1: CDialog::DoDataExchange(pDX); rlm@1: //{{AFX_DATA_MAP(AddCBACode) rlm@1: DDX_Control(pDX, IDC_DESC, m_desc); rlm@1: DDX_Control(pDX, IDC_CODE, m_code); rlm@1: //}}AFX_DATA_MAP rlm@1: } rlm@1: rlm@1: BEGIN_MESSAGE_MAP(AddCBACode, CDialog) rlm@1: //{{AFX_MSG_MAP(AddCBACode) rlm@1: ON_BN_CLICKED(ID_OK, OnOk) rlm@1: ON_BN_CLICKED(ID_CANCEL, OnCancel) rlm@1: //}}AFX_MSG_MAP rlm@1: END_MESSAGE_MAP() rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // AddCBACode message handlers rlm@1: rlm@1: void AddCBACode::OnOk() rlm@1: { rlm@1: CString desc; rlm@1: CString buffer; rlm@1: CString part1; rlm@1: CString code; rlm@1: CString token; rlm@1: rlm@1: m_code.GetWindowText(buffer); rlm@1: m_desc.GetWindowText(desc); rlm@1: rlm@1: StringTokenizer st(buffer, " \t\n\r"); rlm@1: part1.Empty(); rlm@1: const char *t = st.next(); rlm@1: while (t) rlm@1: { rlm@1: token = t; rlm@1: token.MakeUpper(); rlm@1: if (token.GetLength() == 16) rlm@1: cheatsAddGSACode(token, desc, false); rlm@1: else if (token.GetLength() == 12) rlm@1: { rlm@1: code = token.Left(8); rlm@1: code += " "; rlm@1: code += token.Right(4); rlm@1: cheatsAddCBACode(code, desc); rlm@1: } rlm@1: else if (part1.IsEmpty()) rlm@1: part1 = token; rlm@1: else rlm@1: { rlm@1: if (token.GetLength() == 4) rlm@1: { rlm@1: code = part1; rlm@1: code += " "; rlm@1: code += token; rlm@1: cheatsAddCBACode(code, desc); rlm@1: } rlm@1: else rlm@1: { rlm@1: code = part1 + token; rlm@1: cheatsAddGSACode(code, desc, true); rlm@1: } rlm@1: part1.Empty(); rlm@1: } rlm@1: rlm@1: t = st.next(); rlm@1: } rlm@1: EndDialog(TRUE); rlm@1: } rlm@1: rlm@1: void AddCBACode::OnCancel() rlm@1: { rlm@1: EndDialog(FALSE); rlm@1: } rlm@1: rlm@1: BOOL AddCBACode::OnInitDialog() rlm@1: { rlm@1: CDialog::OnInitDialog(); rlm@1: rlm@1: m_code.LimitText(1024); rlm@1: m_desc.LimitText(32); rlm@1: CString title = winResLoadString(IDS_ADD_CBA_CODE); rlm@1: SetWindowText(title); rlm@1: CenterWindow(); rlm@1: rlm@1: return TRUE; // return TRUE unless you set the focus to a control rlm@1: // EXCEPTION: OCX Property Pages should return FALSE rlm@1: } rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // AddCheatCode dialog rlm@1: rlm@1: AddCheatCode::AddCheatCode(CWnd*pParent /*=NULL*/) rlm@1: : CDialog(AddCheatCode::IDD, pParent) rlm@1: { rlm@1: //{{AFX_DATA_INIT(AddCheatCode) rlm@1: // NOTE: the ClassWizard will add member initialization here rlm@1: //}}AFX_DATA_INIT rlm@1: } rlm@1: rlm@1: void AddCheatCode::DoDataExchange(CDataExchange*pDX) rlm@1: { rlm@1: CDialog::DoDataExchange(pDX); rlm@1: //{{AFX_DATA_MAP(AddCheatCode) rlm@1: DDX_Control(pDX, IDC_DESC, m_desc); rlm@1: DDX_Control(pDX, IDC_CODE, m_code); rlm@1: //}}AFX_DATA_MAP rlm@1: } rlm@1: rlm@1: BEGIN_MESSAGE_MAP(AddCheatCode, CDialog) rlm@1: //{{AFX_MSG_MAP(AddCheatCode) rlm@1: ON_BN_CLICKED(ID_OK, OnOk) rlm@1: ON_BN_CLICKED(ID_CANCEL, OnCancel) rlm@1: //}}AFX_MSG_MAP rlm@1: END_MESSAGE_MAP() rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // AddCheatCode message handlers rlm@1: rlm@1: void AddCheatCode::OnOk() rlm@1: { rlm@1: CString desc; rlm@1: CString buffer; rlm@1: CString token; rlm@1: rlm@1: m_code.GetWindowText(buffer); rlm@1: m_desc.GetWindowText(desc); rlm@1: rlm@1: StringTokenizer st(buffer, " \t\n\r"); rlm@1: const char * t = st.next(); rlm@1: while (t) rlm@1: { rlm@1: token = t; rlm@1: token.MakeUpper(); rlm@1: cheatsAddCheatCode(token, desc); rlm@1: t = st.next(); rlm@1: } rlm@1: EndDialog(TRUE); rlm@1: } rlm@1: rlm@1: void AddCheatCode::OnCancel() rlm@1: { rlm@1: EndDialog(FALSE); rlm@1: } rlm@1: rlm@1: BOOL AddCheatCode::OnInitDialog() rlm@1: { rlm@1: CDialog::OnInitDialog(); rlm@1: rlm@1: m_code.LimitText(1024); rlm@1: m_desc.LimitText(32); rlm@1: CString title = winResLoadString(IDS_ADD_CHEAT_CODE); rlm@1: SetWindowText(title); rlm@1: CenterWindow(); rlm@1: rlm@1: return TRUE; // return TRUE unless you set the focus to a control rlm@1: // EXCEPTION: OCX Property Pages should return FALSE rlm@1: } rlm@1: rlm@1: void GBACheatSearch::OnBnClickedCheatrefreshbutton() rlm@1: { rlm@1: addChanges(false); rlm@1: } rlm@1: