1 /* Cheat Support for PCSX-Reloaded
\r
2 * Copyright (C) 2009, Wei Mingzhi <whistler_wmz@users.sf.net>.
\r
4 * This program is free software; you can redistribute it and/or modify
\r
5 * it under the terms of the GNU General Public License as published by
\r
6 * the Free Software Foundation; either version 2 of the License, or
\r
7 * (at your option) any later version.
\r
9 * This program is distributed in the hope that it will be useful,
\r
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
12 * GNU General Public License for more details.
\r
14 * You should have received a copy of the GNU General Public License
\r
15 * along with this program; if not, write to the Free Software
\r
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA
\r
19 #include <windows.h>
\r
20 #include <windowsx.h>
\r
22 #define _WIN32_IE 0x0400
\r
24 #include <commctrl.h>
\r
26 #include "psxcommon.h"
\r
29 #include "resource.h"
\r
32 static void UpdateCheatDlg(HWND hW) {
\r
37 List = GetDlgItem(hW, IDC_CODELIST);
\r
39 ListView_DeleteAllItems(List);
\r
41 for (i = 0; i < NumCheats; i++) {
\r
42 memset(&item, 0, sizeof(item));
\r
44 item.mask = LVIF_TEXT;
\r
46 item.pszText = Cheats[i].Descr;
\r
49 SendMessage(List, LVM_INSERTITEM, 0, (LPARAM)&item);
\r
51 item.pszText = (Cheats[i].Enabled ? _("Yes") : _("No"));
\r
54 SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item);
\r
58 static int iEditItem = -1;
\r
59 static char szDescr[256], szCode[1024];
\r
61 static LRESULT WINAPI CheatEditDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
\r
66 SetWindowText(hW, _("Edit Cheat"));
\r
67 Static_SetText(GetDlgItem(hW, IDC_LABEL_DESCR), _("Description:"));
\r
68 Static_SetText(GetDlgItem(hW, IDC_LABEL_CODE), _("Cheat Code:"));
\r
69 Button_SetText(GetDlgItem(hW, IDOK), _("OK"));
\r
70 Button_SetText(GetDlgItem(hW, IDCANCEL), _("Cancel"));
\r
72 assert(iEditItem != -1 && iEditItem < NumCheats);
\r
74 Edit_SetText(GetDlgItem(hW, IDC_DESCR), Cheats[iEditItem].Descr);
\r
77 for (i = Cheats[iEditItem].First; i < Cheats[iEditItem].First + Cheats[iEditItem].n; i++) {
\r
78 sprintf(szDescr, "%.8X %.4X\r\n", CheatCodes[i].Addr, CheatCodes[i].Val);
\r
79 strcat(szCode, szDescr);
\r
81 Edit_SetText(GetDlgItem(hW, IDC_CODE), szCode);
\r
85 switch (LOWORD(wParam)) {
\r
87 Edit_GetText(GetDlgItem(hW, IDC_DESCR), szDescr, 256);
\r
88 Edit_GetText(GetDlgItem(hW, IDC_CODE), szCode, 1024);
\r
90 if (EditCheat(iEditItem, szDescr, szCode) != 0) {
\r
91 SysMessage(_("Invalid cheat code!"));
\r
94 EndDialog(hW, TRUE);
\r
100 EndDialog(hW, FALSE);
\r
106 EndDialog(hW, FALSE);
\r
113 static LRESULT WINAPI CheatAddDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
\r
115 case WM_INITDIALOG:
\r
116 SetWindowText(hW, _("Add New Cheat"));
\r
117 Static_SetText(GetDlgItem(hW, IDC_LABEL_DESCR), _("Description:"));
\r
118 Static_SetText(GetDlgItem(hW, IDC_LABEL_CODE), _("Cheat Code:"));
\r
119 Button_SetText(GetDlgItem(hW, IDOK), _("OK"));
\r
120 Button_SetText(GetDlgItem(hW, IDCANCEL), _("Cancel"));
\r
121 Edit_SetText(GetDlgItem(hW, IDC_DESCR), szDescr);
\r
122 Edit_SetText(GetDlgItem(hW, IDC_CODE), szCode);
\r
126 switch (LOWORD(wParam)) {
\r
128 Edit_GetText(GetDlgItem(hW, IDC_DESCR), szDescr, 256);
\r
129 Edit_GetText(GetDlgItem(hW, IDC_CODE), szCode, 1024);
\r
131 if (AddCheat(szDescr, szCode) != 0) {
\r
132 SysMessage(_("Invalid cheat code!"));
\r
135 EndDialog(hW, TRUE);
\r
141 EndDialog(hW, FALSE);
\r
147 EndDialog(hW, FALSE);
\r
154 LRESULT WINAPI CheatDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
\r
160 char szFileName[256];
\r
161 char szFileTitle[256];
\r
162 char szFilter[256];
\r
165 case WM_INITDIALOG:
\r
166 SetWindowText(hW, _("Edit Cheat Codes"));
\r
168 Button_SetText(GetDlgItem(hW, IDC_ADDCODE), _("&Add Code"));
\r
169 Button_SetText(GetDlgItem(hW, IDC_EDITCODE), _("&Edit Code"));
\r
170 Button_SetText(GetDlgItem(hW, IDC_REMOVECODE), _("&Remove Code"));
\r
171 Button_SetText(GetDlgItem(hW, IDC_TOGGLECODE), _("&Enable/Disable"));
\r
172 Button_SetText(GetDlgItem(hW, IDC_LOADCODE), _("&Load..."));
\r
173 Button_SetText(GetDlgItem(hW, IDC_SAVECODE), _("&Save As..."));
\r
174 Button_SetText(GetDlgItem(hW, IDCANCEL), _("&Close"));
\r
176 List = GetDlgItem(hW, IDC_CODELIST);
\r
178 SendMessage(List, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);
\r
180 memset(&col, 0, sizeof(col));
\r
182 col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
\r
183 col.fmt = LVCFMT_LEFT;
\r
185 col.pszText = _("Description");
\r
188 SendMessage(List, LVM_INSERTCOLUMN, 0, (LPARAM)&col);
\r
190 col.pszText = _("Enabled");
\r
193 SendMessage(List, LVM_INSERTCOLUMN, 1, (LPARAM)&col);
\r
195 UpdateCheatDlg(hW);
\r
199 switch (LOWORD(wParam)) {
\r
201 EndDialog(hW, FALSE);
\r
209 DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATEDIT), hW, (DLGPROC)CheatAddDlgProc);
\r
211 if (NumCheats > i) {
\r
213 List = GetDlgItem(hW, IDC_CODELIST);
\r
214 memset(&item, 0, sizeof(item));
\r
216 item.mask = LVIF_TEXT;
\r
218 item.pszText = Cheats[i].Descr;
\r
221 SendMessage(List, LVM_INSERTITEM, 0, (LPARAM)&item);
\r
223 item.pszText = (Cheats[i].Enabled ? _("Yes") : _("No"));
\r
226 SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item);
\r
231 List = GetDlgItem(hW, IDC_CODELIST);
\r
232 iEditItem = ListView_GetSelectionMark(List);
\r
234 if (iEditItem != -1) {
\r
235 DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATEDIT), hW, (DLGPROC)CheatEditDlgProc);
\r
237 memset(&item, 0, sizeof(item));
\r
239 item.mask = LVIF_TEXT;
\r
240 item.iItem = iEditItem;
\r
241 item.pszText = Cheats[iEditItem].Descr;
\r
244 SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item);
\r
248 case IDC_REMOVECODE:
\r
249 List = GetDlgItem(hW, IDC_CODELIST);
\r
250 i = ListView_GetSelectionMark(List);
\r
254 ListView_DeleteItem(List, i);
\r
255 ListView_SetSelectionMark(List, -1);
\r
259 case IDC_TOGGLECODE:
\r
260 List = GetDlgItem(hW, IDC_CODELIST);
\r
261 i = ListView_GetSelectionMark(List);
\r
264 Cheats[i].Enabled ^= 1;
\r
266 memset(&item, 0, sizeof(item));
\r
268 item.mask = LVIF_TEXT;
\r
270 item.pszText = (Cheats[i].Enabled ? _("Yes") : _("No"));
\r
273 SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item);
\r
278 memset(&szFileName, 0, sizeof(szFileName));
\r
279 memset(&szFileTitle, 0, sizeof(szFileTitle));
\r
280 memset(&szFilter, 0, sizeof(szFilter));
\r
282 strcpy(szFilter, _("PCSX Cheat Code Files"));
\r
283 strcatz(szFilter, "*.*");
\r
285 ofn.lStructSize = sizeof(OPENFILENAME);
\r
286 ofn.hwndOwner = hW;
\r
287 ofn.lpstrFilter = szFilter;
\r
288 ofn.lpstrCustomFilter = NULL;
\r
289 ofn.nMaxCustFilter = 0;
\r
290 ofn.nFilterIndex = 1;
\r
291 ofn.lpstrFile = szFileName;
\r
292 ofn.nMaxFile = 256;
\r
293 ofn.lpstrInitialDir = ".\\Cheats";
\r
294 ofn.lpstrFileTitle = szFileTitle;
\r
295 ofn.nMaxFileTitle = 256;
\r
296 ofn.lpstrTitle = NULL;
\r
297 ofn.lpstrDefExt = "CHT";
\r
298 ofn.Flags = OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
\r
300 if (GetOpenFileName((LPOPENFILENAME)&ofn)) {
\r
301 LoadCheats(szFileName);
\r
302 UpdateCheatDlg(hW);
\r
307 memset(&szFileName, 0, sizeof(szFileName));
\r
308 memset(&szFileTitle, 0, sizeof(szFileTitle));
\r
309 memset(&szFilter, 0, sizeof(szFilter));
\r
311 strcpy(szFilter, _("PCSX Cheat Code Files"));
\r
312 strcatz(szFilter, "*.*");
\r
314 ofn.lStructSize = sizeof(OPENFILENAME);
\r
315 ofn.hwndOwner = hW;
\r
316 ofn.lpstrFilter = szFilter;
\r
317 ofn.lpstrCustomFilter = NULL;
\r
318 ofn.nMaxCustFilter = 0;
\r
319 ofn.nFilterIndex = 1;
\r
320 ofn.lpstrFile = szFileName;
\r
321 ofn.nMaxFile = 256;
\r
322 ofn.lpstrInitialDir = ".\\Cheats";
\r
323 ofn.lpstrFileTitle = szFileTitle;
\r
324 ofn.nMaxFileTitle = 256;
\r
325 ofn.lpstrTitle = NULL;
\r
326 ofn.lpstrDefExt = "CHT";
\r
327 ofn.Flags = OFN_HIDEREADONLY | OFN_NOCHANGEDIR | OFN_OVERWRITEPROMPT;
\r
329 if (GetOpenFileName((LPOPENFILENAME)&ofn)) {
\r
330 SaveCheats(szFileName);
\r
337 switch (LOWORD(wParam)) {
\r
339 List = GetDlgItem(hW, IDC_CODELIST);
\r
340 i = ListView_GetSelectionMark(List);
\r
343 Button_Enable(GetDlgItem(hW, IDC_EDITCODE), TRUE);
\r
344 Button_Enable(GetDlgItem(hW, IDC_REMOVECODE), TRUE);
\r
345 Button_Enable(GetDlgItem(hW, IDC_TOGGLECODE), TRUE);
\r
348 Button_Enable(GetDlgItem(hW, IDC_EDITCODE), FALSE);
\r
349 Button_Enable(GetDlgItem(hW, IDC_REMOVECODE), FALSE);
\r
350 Button_Enable(GetDlgItem(hW, IDC_TOGGLECODE), FALSE);
\r
353 Button_Enable(GetDlgItem(hW, IDC_SAVECODE), (NumCheats > 0));
\r
359 EndDialog(hW, FALSE);
\r
366 ///////////////////////////////////////////////////////////////////////////////
\r
368 #define SEARCH_EQUALVAL 0
\r
369 #define SEARCH_NOTEQUALVAL 1
\r
370 #define SEARCH_RANGE 2
\r
371 #define SEARCH_INCBY 3
\r
372 #define SEARCH_DECBY 4
\r
373 #define SEARCH_INC 5
\r
374 #define SEARCH_DEC 6
\r
375 #define SEARCH_DIFFERENT 7
\r
376 #define SEARCH_NOCHANGE 8
\r
378 #define SEARCHTYPE_8BIT 0
\r
379 #define SEARCHTYPE_16BIT 1
\r
380 #define SEARCHTYPE_32BIT 2
\r
382 #define SEARCHBASE_DEC 0
\r
383 #define SEARCHBASE_HEX 1
\r
385 static char current_search = SEARCH_EQUALVAL;
\r
386 static char current_searchtype = SEARCHTYPE_8BIT;
\r
387 static char current_searchbase = SEARCHBASE_DEC;
\r
388 static uint32_t current_valuefrom = 0;
\r
389 static uint32_t current_valueto = 0;
\r
391 static void UpdateCheatSearchDlg(HWND hW) {
\r
395 SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_RESETCONTENT, 0, 0);
\r
396 SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_RESETCONTENT, 0, 0);
\r
398 Button_Enable(GetDlgItem(hW, IDC_FREEZE), FALSE);
\r
399 Button_Enable(GetDlgItem(hW, IDC_MODIFY), FALSE);
\r
400 Button_Enable(GetDlgItem(hW, IDC_COPY), FALSE);
\r
402 SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Equal Value"));
\r
403 SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Not Equal Value"));
\r
404 SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Range"));
\r
406 if (prevM != NULL) {
\r
407 SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Increased By"));
\r
408 SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Decreased By"));
\r
409 SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Increased"));
\r
410 SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Decreased"));
\r
411 SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Different"));
\r
412 SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("No Change"));
\r
414 ComboBox_Enable(GetDlgItem(hW, IDC_DATATYPE), FALSE);
\r
417 ComboBox_Enable(GetDlgItem(hW, IDC_DATATYPE), TRUE);
\r
420 SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_SETCURSEL, (WPARAM)current_search, 0);
\r
422 if (current_search == SEARCH_RANGE) {
\r
423 ShowWindow(GetDlgItem(hW, IDC_LABEL_TO), SW_SHOW);
\r
424 ShowWindow(GetDlgItem(hW, IDC_VALUETO), SW_SHOW);
\r
427 ShowWindow(GetDlgItem(hW, IDC_LABEL_TO), SW_HIDE);
\r
428 ShowWindow(GetDlgItem(hW, IDC_VALUETO), SW_HIDE);
\r
431 SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_SETCURSEL, (WPARAM)current_searchtype, 0);
\r
432 SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_SETCURSEL, (WPARAM)current_searchbase, 0);
\r
434 if (current_searchbase == SEARCHBASE_HEX) {
\r
435 sprintf(buf, "%X", current_valuefrom);
\r
436 SetWindowText(GetDlgItem(hW, IDC_VALUEFROM), buf);
\r
437 sprintf(buf, "%X", current_valueto);
\r
438 SetWindowText(GetDlgItem(hW, IDC_VALUETO), buf);
\r
441 sprintf(buf, "%u", current_valuefrom);
\r
442 SetWindowText(GetDlgItem(hW, IDC_VALUEFROM), buf);
\r
443 sprintf(buf, "%u", current_valueto);
\r
444 SetWindowText(GetDlgItem(hW, IDC_VALUETO), buf);
\r
447 if (prevM == NULL) {
\r
448 SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_ADDSTRING, (WPARAM)0, (LPARAM)_("Enter the values and start your search."));
\r
449 EnableWindow(GetDlgItem(hW, IDC_RESLIST), FALSE);
\r
452 if (NumSearchResults == 0) {
\r
453 SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_ADDSTRING, (WPARAM)0, (LPARAM)_("No addresses found."));
\r
454 EnableWindow(GetDlgItem(hW, IDC_RESLIST), FALSE);
\r
456 else if (NumSearchResults > 100) {
\r
457 SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_ADDSTRING, (WPARAM)0, (LPARAM)_("Too many addresses found."));
\r
458 EnableWindow(GetDlgItem(hW, IDC_RESLIST), FALSE);
\r
461 for (i = 0; i < NumSearchResults; i++) {
\r
462 u32 addr = SearchResults[i];
\r
464 switch (current_searchtype) {
\r
465 case SEARCHTYPE_8BIT:
\r
466 sprintf(buf, _("%.8X Current: %u (%.2X), Previous: %u (%.2X)"),
\r
467 addr, PSXMu8(addr), PSXMu8(addr), PrevMu8(addr), PrevMu8(addr));
\r
470 case SEARCHTYPE_16BIT:
\r
471 sprintf(buf, _("%.8X Current: %u (%.4X), Previous: %u (%.4X)"),
\r
472 addr, PSXMu16(addr), PSXMu16(addr), PrevMu16(addr), PrevMu16(addr));
\r
475 case SEARCHTYPE_32BIT:
\r
476 sprintf(buf, _("%.8X Current: %u (%.8X), Previous: %u (%.8X)"),
\r
477 addr, PSXMu32(addr), PSXMu32(addr), PrevMu32(addr), PrevMu32(addr));
\r
481 assert(FALSE); // impossible
\r
485 SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_ADDSTRING, (WPARAM)0, (LPARAM)buf);
\r
486 SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_SETITEMDATA, i, (LPARAM)i);
\r
488 EnableWindow(GetDlgItem(hW, IDC_RESLIST), TRUE);
\r
492 sprintf(buf, _("Founded Addresses: %d"), NumSearchResults);
\r
493 Static_SetText(GetDlgItem(hW, IDC_LABEL_RESULTSFOUND), buf);
\r
496 static int iCurItem = 0;
\r
498 static LRESULT WINAPI CheatFreezeProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
\r
503 case WM_INITDIALOG:
\r
504 SetWindowText(hW, _("Freeze"));
\r
505 Static_SetText(GetDlgItem(hW, IDC_LABEL_ADDRESS), _("Address:"));
\r
506 Static_SetText(GetDlgItem(hW, IDC_LABEL_VALUE), _("Value:"));
\r
508 sprintf(buf, "%.8X", SearchResults[iCurItem]);
\r
509 SetWindowText(GetDlgItem(hW, IDC_ADDRESS), buf);
\r
511 switch (current_searchtype) {
\r
512 case SEARCHTYPE_8BIT:
\r
513 val = PSXMu8(SearchResults[iCurItem]);
\r
516 case SEARCHTYPE_16BIT:
\r
517 val = PSXMu16(SearchResults[iCurItem]);
\r
520 case SEARCHTYPE_32BIT:
\r
521 val = PSXMu32(SearchResults[iCurItem]);
\r
525 assert(FALSE); // should not reach here
\r
529 sprintf(buf, "%u", val);
\r
530 SetWindowText(GetDlgItem(hW, IDC_VALUE), buf);
\r
534 switch (LOWORD(wParam)) {
\r
537 GetWindowText(GetDlgItem(hW, IDC_VALUE), buf, 255);
\r
538 sscanf(buf, "%u", &val);
\r
540 switch (current_searchtype) {
\r
541 case SEARCHTYPE_8BIT:
\r
542 if (val > (u32)0xFF) {
\r
545 sprintf(szCode, "%.8X %.4X", (SearchResults[iCurItem] & 0x1FFFFF) | (CHEAT_CONST8 << 24), val);
\r
548 case SEARCHTYPE_16BIT:
\r
549 if (val > (u32)0xFFFF) {
\r
552 sprintf(szCode, "%.8X %.4X", (SearchResults[iCurItem] & 0x1FFFFF) | (CHEAT_CONST16 << 24), val);
\r
555 case SEARCHTYPE_32BIT:
\r
556 sprintf(szCode, "%.8X %.4X\n%.8X %.4X",
\r
557 (SearchResults[iCurItem] & 0x1FFFFF) | (CHEAT_CONST16 << 24), val & 0xFFFF,
\r
558 ((SearchResults[iCurItem] + 2) & 0x1FFFFF) | (CHEAT_CONST16 << 24), ((val & 0xFFFF0000) >> 16) & 0xFFFF);
\r
562 assert(FALSE); // should not reach here
\r
566 sprintf(szDescr, _("Freeze %.8X"), SearchResults[iCurItem]);
\r
568 if (DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATEDIT), hW, (DLGPROC)CheatAddDlgProc)) {
\r
569 Cheats[NumCheats - 1].Enabled = 1;
\r
570 EndDialog(hW, TRUE);
\r
576 EndDialog(hW, FALSE);
\r
582 EndDialog(hW, FALSE);
\r
589 static LRESULT WINAPI CheatModifyProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
\r
594 case WM_INITDIALOG:
\r
595 SetWindowText(hW, _("Modify"));
\r
596 Static_SetText(GetDlgItem(hW, IDC_LABEL_ADDRESS), _("Address:"));
\r
597 Static_SetText(GetDlgItem(hW, IDC_LABEL_VALUE), _("Value:"));
\r
599 sprintf(buf, "%.8X", SearchResults[iCurItem]);
\r
600 SetWindowText(GetDlgItem(hW, IDC_ADDRESS), buf);
\r
602 switch (current_searchtype) {
\r
603 case SEARCHTYPE_8BIT:
\r
604 val = PSXMu8(SearchResults[iCurItem]);
\r
607 case SEARCHTYPE_16BIT:
\r
608 val = PSXMu16(SearchResults[iCurItem]);
\r
611 case SEARCHTYPE_32BIT:
\r
612 val = PSXMu32(SearchResults[iCurItem]);
\r
616 assert(FALSE); // should not reach here
\r
620 sprintf(buf, "%u", val);
\r
621 SetWindowText(GetDlgItem(hW, IDC_VALUE), buf);
\r
625 switch (LOWORD(wParam)) {
\r
628 GetWindowText(GetDlgItem(hW, IDC_VALUE), buf, 255);
\r
629 sscanf(buf, "%u", &val);
\r
631 switch (current_searchtype) {
\r
632 case SEARCHTYPE_8BIT:
\r
636 psxMemWrite8(SearchResults[iCurItem], (u8)val);
\r
639 case SEARCHTYPE_16BIT:
\r
640 if (val > 0xFFFF) {
\r
643 psxMemWrite16(SearchResults[iCurItem], (u16)val);
\r
646 case SEARCHTYPE_32BIT:
\r
647 psxMemWrite32(SearchResults[iCurItem], (u32)val);
\r
651 assert(FALSE); // should not reach here
\r
655 EndDialog(hW, TRUE);
\r
659 EndDialog(hW, TRUE);
\r
665 EndDialog(hW, TRUE);
\r
672 LRESULT WINAPI CheatSearchDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
\r
677 case WM_INITDIALOG:
\r
678 SetWindowText(hW, _("Cheat Search"));
\r
680 Static_SetText(GetDlgItem(hW, IDC_LABEL_SEARCHFOR), _("Search For:"));
\r
681 Static_SetText(GetDlgItem(hW, IDC_LABEL_DATATYPE), _("Data Type:"));
\r
682 Static_SetText(GetDlgItem(hW, IDC_LABEL_VALUE), _("Value:"));
\r
683 Static_SetText(GetDlgItem(hW, IDC_LABEL_DATABASE), _("Data Base:"));
\r
684 Static_SetText(GetDlgItem(hW, IDC_LABEL_TO), _("To:"));
\r
685 Button_SetText(GetDlgItem(hW, IDC_FREEZE), _("&Freeze"));
\r
686 Button_SetText(GetDlgItem(hW, IDC_MODIFY), _("&Modify"));
\r
687 Button_SetText(GetDlgItem(hW, IDC_COPY), _("&Copy"));
\r
688 Button_SetText(GetDlgItem(hW, IDC_SEARCH), _("&Search"));
\r
689 Button_SetText(GetDlgItem(hW, IDC_NEWSEARCH), _("&New Search"));
\r
690 Button_SetText(GetDlgItem(hW, IDCANCEL), _("C&lose"));
\r
692 SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_ADDSTRING, 0, (LPARAM)_("8-bit"));
\r
693 SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_ADDSTRING, 0, (LPARAM)_("16-bit"));
\r
694 SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_ADDSTRING, 0, (LPARAM)_("32-bit"));
\r
695 SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_ADDSTRING, 0, (LPARAM)_("Decimal"));
\r
696 SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_ADDSTRING, 0, (LPARAM)_("Hexadecimal"));
\r
698 UpdateCheatSearchDlg(hW);
\r
702 switch (LOWORD(wParam)) {
\r
704 EndDialog(hW, FALSE);
\r
708 iCurItem = SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_GETCURSEL, 0, 0);
\r
709 DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATVALEDIT), hW, (DLGPROC)CheatFreezeProc);
\r
713 iCurItem = SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_GETCURSEL, 0, 0);
\r
714 DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATVALEDIT), hW, (DLGPROC)CheatModifyProc);
\r
715 UpdateCheatSearchDlg(hW);
\r
719 i = SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_GETCURSEL, 0, 0);
\r
720 sprintf(buf, "%.8X", SearchResults[i]);
\r
722 if (OpenClipboard(gApp.hWnd)) {
\r
723 HGLOBAL hglbCopy = GlobalAlloc(GHND, 256);
\r
726 if (hglbCopy != NULL) {
\r
727 p = (char *)GlobalLock(hglbCopy);
\r
732 SetClipboardData(CF_TEXT, (HANDLE)hglbCopy);
\r
740 current_search = SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_GETCURSEL, 0, 0);
\r
741 current_searchtype = SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_GETCURSEL, 0, 0);
\r
742 current_searchbase = SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_GETCURSEL, 0, 0);
\r
743 current_valuefrom = 0;
\r
744 current_valueto = 0;
\r
746 if (current_searchbase == SEARCHBASE_DEC) {
\r
747 GetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPTSTR)buf, 255);
\r
748 sscanf(buf, "%u", ¤t_valuefrom);
\r
749 GetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPTSTR)buf, 255);
\r
750 sscanf(buf, "%u", ¤t_valueto);
\r
753 GetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPTSTR)buf, 255);
\r
754 sscanf(buf, "%x", ¤t_valuefrom);
\r
755 GetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPTSTR)buf, 255);
\r
756 sscanf(buf, "%x", ¤t_valueto);
\r
759 switch (current_searchtype) {
\r
760 case SEARCHTYPE_8BIT:
\r
761 if (current_valuefrom > (u32)0xFF) {
\r
762 current_valuefrom = 0xFF;
\r
764 if (current_valueto > (u32)0xFF) {
\r
765 current_valueto = 0xFF;
\r
769 case SEARCHTYPE_16BIT:
\r
770 if (current_valuefrom > (u32)0xFFFF) {
\r
771 current_valuefrom = 0xFFFF;
\r
773 if (current_valueto > (u32)0xFFFF) {
\r
774 current_valueto = 0xFFFF;
\r
779 if (current_search == SEARCH_RANGE && current_valuefrom > current_valueto) {
\r
780 u32 t = current_valuefrom;
\r
781 current_valuefrom = current_valueto;
\r
782 current_valueto = t;
\r
785 switch (current_search) {
\r
786 case SEARCH_EQUALVAL:
\r
787 switch (current_searchtype) {
\r
788 case SEARCHTYPE_8BIT:
\r
789 CheatSearchEqual8((u8)current_valuefrom);
\r
792 case SEARCHTYPE_16BIT:
\r
793 CheatSearchEqual16((u16)current_valuefrom);
\r
796 case SEARCHTYPE_32BIT:
\r
797 CheatSearchEqual32((u32)current_valuefrom);
\r
802 case SEARCH_NOTEQUALVAL:
\r
803 switch (current_searchtype) {
\r
804 case SEARCHTYPE_8BIT:
\r
805 CheatSearchNotEqual8((u8)current_valuefrom);
\r
808 case SEARCHTYPE_16BIT:
\r
809 CheatSearchNotEqual16((u16)current_valuefrom);
\r
812 case SEARCHTYPE_32BIT:
\r
813 CheatSearchNotEqual32((u32)current_valuefrom);
\r
819 switch (current_searchtype) {
\r
820 case SEARCHTYPE_8BIT:
\r
821 CheatSearchRange8((u8)current_valuefrom, (u8)current_valueto);
\r
824 case SEARCHTYPE_16BIT:
\r
825 CheatSearchRange16((u16)current_valuefrom, (u16)current_valueto);
\r
828 case SEARCHTYPE_32BIT:
\r
829 CheatSearchRange32((u32)current_valuefrom, (u32)current_valueto);
\r
835 switch (current_searchtype) {
\r
836 case SEARCHTYPE_8BIT:
\r
837 CheatSearchIncreasedBy8((u8)current_valuefrom);
\r
840 case SEARCHTYPE_16BIT:
\r
841 CheatSearchIncreasedBy16((u16)current_valuefrom);
\r
844 case SEARCHTYPE_32BIT:
\r
845 CheatSearchIncreasedBy32((u32)current_valuefrom);
\r
851 switch (current_searchtype) {
\r
852 case SEARCHTYPE_8BIT:
\r
853 CheatSearchDecreasedBy8((u8)current_valuefrom);
\r
856 case SEARCHTYPE_16BIT:
\r
857 CheatSearchDecreasedBy16((u16)current_valuefrom);
\r
860 case SEARCHTYPE_32BIT:
\r
861 CheatSearchDecreasedBy32((u32)current_valuefrom);
\r
867 switch (current_searchtype) {
\r
868 case SEARCHTYPE_8BIT:
\r
869 CheatSearchIncreased8();
\r
872 case SEARCHTYPE_16BIT:
\r
873 CheatSearchIncreased16();
\r
876 case SEARCHTYPE_32BIT:
\r
877 CheatSearchIncreased32();
\r
883 switch (current_searchtype) {
\r
884 case SEARCHTYPE_8BIT:
\r
885 CheatSearchDecreased8();
\r
888 case SEARCHTYPE_16BIT:
\r
889 CheatSearchDecreased16();
\r
892 case SEARCHTYPE_32BIT:
\r
893 CheatSearchDecreased32();
\r
898 case SEARCH_DIFFERENT:
\r
899 switch (current_searchtype) {
\r
900 case SEARCHTYPE_8BIT:
\r
901 CheatSearchDifferent8();
\r
904 case SEARCHTYPE_16BIT:
\r
905 CheatSearchDifferent16();
\r
908 case SEARCHTYPE_32BIT:
\r
909 CheatSearchDifferent32();
\r
914 case SEARCH_NOCHANGE:
\r
915 switch (current_searchtype) {
\r
916 case SEARCHTYPE_8BIT:
\r
917 CheatSearchNoChange8();
\r
920 case SEARCHTYPE_16BIT:
\r
921 CheatSearchNoChange16();
\r
924 case SEARCHTYPE_32BIT:
\r
925 CheatSearchNoChange32();
\r
931 assert(FALSE); // not possible
\r
935 UpdateCheatSearchDlg(hW);
\r
938 case IDC_NEWSEARCH:
\r
939 FreeCheatSearchMem();
\r
940 FreeCheatSearchResults();
\r
942 current_search = SEARCH_EQUALVAL;
\r
943 current_searchtype = SEARCHTYPE_8BIT;
\r
944 current_searchbase = SEARCHBASE_DEC;
\r
945 current_valuefrom = 0;
\r
946 current_valueto = 0;
\r
948 UpdateCheatSearchDlg(hW);
\r
949 EnableWindow(GetDlgItem(hW, IDC_VALUEFROM), TRUE);
\r
952 case IDC_SEARCHFOR:
\r
953 EnableWindow(GetDlgItem(hW, IDC_VALUEFROM), TRUE);
\r
955 if (SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_GETCURSEL, 0, 0) == SEARCH_RANGE) {
\r
956 ShowWindow(GetDlgItem(hW, IDC_LABEL_TO), SW_SHOW);
\r
957 ShowWindow(GetDlgItem(hW, IDC_VALUETO), SW_SHOW);
\r
960 ShowWindow(GetDlgItem(hW, IDC_LABEL_TO), SW_HIDE);
\r
961 ShowWindow(GetDlgItem(hW, IDC_VALUETO), SW_HIDE);
\r
963 if (SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_GETCURSEL, 0, 0) >= SEARCH_INC) {
\r
964 EnableWindow(GetDlgItem(hW, IDC_VALUEFROM), FALSE);
\r
970 if (SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_GETCURSEL, 0, 0) == SEARCHBASE_DEC) {
\r
971 if (current_searchbase == SEARCHBASE_HEX) {
\r
972 GetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPTSTR)buf, 255);
\r
973 sscanf(buf, "%x", &i);
\r
974 sprintf(buf, "%u", i);
\r
975 SetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPCTSTR)buf);
\r
977 GetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPTSTR)buf, 255);
\r
978 sscanf(buf, "%x", &i);
\r
979 sprintf(buf, "%u", i);
\r
980 SetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPCTSTR)buf);
\r
983 else if (current_searchbase == SEARCHBASE_DEC){
\r
984 GetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPTSTR)buf, 255);
\r
985 sscanf(buf, "%u", &i);
\r
986 sprintf(buf, "%X", i);
\r
987 SetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPCTSTR)buf);
\r
989 GetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPTSTR)buf, 255);
\r
990 sscanf(buf, "%u", &i);
\r
991 sprintf(buf, "%X", i);
\r
992 SetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPCTSTR)buf);
\r
994 current_searchbase = SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_GETCURSEL, 0, 0);
\r
998 switch (HIWORD(wParam)) {
\r
999 case LBN_SELCHANGE:
\r
1000 Button_Enable(GetDlgItem(hW, IDC_FREEZE), TRUE);
\r
1001 Button_Enable(GetDlgItem(hW, IDC_MODIFY), TRUE);
\r
1002 Button_Enable(GetDlgItem(hW, IDC_COPY), TRUE);
\r
1005 case LBN_SELCANCEL:
\r
1006 Button_Enable(GetDlgItem(hW, IDC_FREEZE), FALSE);
\r
1007 Button_Enable(GetDlgItem(hW, IDC_MODIFY), FALSE);
\r
1008 Button_Enable(GetDlgItem(hW, IDC_COPY), FALSE);
\r
1016 EndDialog(hW, FALSE);
\r