pcsxr-1.9.92
[pcsx_rearmed.git] / win32 / gui / CheatDlg.c
CommitLineData
ef79bbde
P
1/* Cheat Support for PCSX-Reloaded\r
2 * Copyright (C) 2009, Wei Mingzhi <whistler_wmz@users.sf.net>.\r
3 *\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
8 *\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
13 *\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
17 */\r
18\r
19#include <windows.h>\r
20#include <windowsx.h>\r
21#ifndef _WIN32_IE\r
22#define _WIN32_IE 0x0400\r
23#endif\r
24#include <commctrl.h>\r
25#include <stdio.h>\r
26#include "psxcommon.h"\r
27#include "psxmem.h"\r
28#include "cheat.h"\r
29#include "resource.h"\r
30#include "Win32.h"\r
31\r
32static void UpdateCheatDlg(HWND hW) {\r
33 HWND List;\r
34 LV_ITEM item;\r
35 int i;\r
36\r
37 List = GetDlgItem(hW, IDC_CODELIST);\r
38\r
39 ListView_DeleteAllItems(List);\r
40\r
41 for (i = 0; i < NumCheats; i++) {\r
42 memset(&item, 0, sizeof(item));\r
43\r
44 item.mask = LVIF_TEXT;\r
45 item.iItem = i;\r
46 item.pszText = Cheats[i].Descr;\r
47 item.iSubItem = 0;\r
48\r
49 SendMessage(List, LVM_INSERTITEM, 0, (LPARAM)&item);\r
50\r
51 item.pszText = (Cheats[i].Enabled ? _("Yes") : _("No"));\r
52 item.iSubItem = 1;\r
53\r
54 SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item);\r
55 }\r
56}\r
57\r
58static int iEditItem = -1;\r
59static char szDescr[256], szCode[1024];\r
60\r
61static LRESULT WINAPI CheatEditDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {\r
62 int i;\r
63\r
64 switch (uMsg) {\r
65 case WM_INITDIALOG:\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
71\r
72 assert(iEditItem != -1 && iEditItem < NumCheats);\r
73\r
74 Edit_SetText(GetDlgItem(hW, IDC_DESCR), Cheats[iEditItem].Descr);\r
75\r
76 szCode[0] = '\0';\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
80 }\r
81 Edit_SetText(GetDlgItem(hW, IDC_CODE), szCode);\r
82 break;\r
83\r
84 case WM_COMMAND:\r
85 switch (LOWORD(wParam)) {\r
86 case IDOK:\r
87 Edit_GetText(GetDlgItem(hW, IDC_DESCR), szDescr, 256);\r
88 Edit_GetText(GetDlgItem(hW, IDC_CODE), szCode, 1024);\r
89\r
90 if (EditCheat(iEditItem, szDescr, szCode) != 0) {\r
91 SysMessage(_("Invalid cheat code!"));\r
92 }\r
93 else {\r
94 EndDialog(hW, TRUE);\r
95 return TRUE;\r
96 }\r
97 break;\r
98\r
99 case IDCANCEL:\r
100 EndDialog(hW, FALSE);\r
101 return TRUE;\r
102 }\r
103 break;\r
104\r
105 case WM_CLOSE:\r
106 EndDialog(hW, FALSE);\r
107 return TRUE;\r
108 }\r
109\r
110 return FALSE;\r
111}\r
112\r
113static LRESULT WINAPI CheatAddDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {\r
114 switch (uMsg) {\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
123 break;\r
124\r
125 case WM_COMMAND:\r
126 switch (LOWORD(wParam)) {\r
127 case IDOK:\r
128 Edit_GetText(GetDlgItem(hW, IDC_DESCR), szDescr, 256);\r
129 Edit_GetText(GetDlgItem(hW, IDC_CODE), szCode, 1024);\r
130\r
131 if (AddCheat(szDescr, szCode) != 0) {\r
132 SysMessage(_("Invalid cheat code!"));\r
133 }\r
134 else {\r
135 EndDialog(hW, TRUE);\r
136 return TRUE;\r
137 }\r
138 break;\r
139\r
140 case IDCANCEL:\r
141 EndDialog(hW, FALSE);\r
142 return TRUE;\r
143 }\r
144 break;\r
145\r
146 case WM_CLOSE:\r
147 EndDialog(hW, FALSE);\r
148 return TRUE;\r
149 }\r
150\r
151 return FALSE;\r
152}\r
153\r
154LRESULT WINAPI CheatDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {\r
155 HWND List;\r
156 LV_COLUMN col;\r
157 LV_ITEM item;\r
158 int i;\r
159 OPENFILENAME ofn;\r
160 char szFileName[256];\r
161 char szFileTitle[256];\r
162 char szFilter[256];\r
163\r
164 switch (uMsg) {\r
165 case WM_INITDIALOG:\r
166 SetWindowText(hW, _("Edit Cheat Codes"));\r
167\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
175\r
176 List = GetDlgItem(hW, IDC_CODELIST);\r
177\r
178 SendMessage(List, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);\r
179\r
180 memset(&col, 0, sizeof(col));\r
181\r
182 col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;\r
183 col.fmt = LVCFMT_LEFT;\r
184\r
185 col.pszText = _("Description");\r
186 col.cx = 400;\r
187\r
188 SendMessage(List, LVM_INSERTCOLUMN, 0, (LPARAM)&col);\r
189\r
190 col.pszText = _("Enabled");\r
191 col.cx = 55;\r
192\r
193 SendMessage(List, LVM_INSERTCOLUMN, 1, (LPARAM)&col);\r
194\r
195 UpdateCheatDlg(hW);\r
196 break;\r
197\r
198 case WM_COMMAND:\r
199 switch (LOWORD(wParam)) {\r
200 case IDCANCEL:\r
201 EndDialog(hW, FALSE);\r
202 return TRUE;\r
203\r
204 case IDC_ADDCODE:\r
205 i = NumCheats;\r
206 szDescr[0] = '\0';\r
207 szCode[0] = '\0';\r
208\r
209 DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATEDIT), hW, (DLGPROC)CheatAddDlgProc);\r
210\r
211 if (NumCheats > i) {\r
212 // new cheat added\r
213 List = GetDlgItem(hW, IDC_CODELIST);\r
214 memset(&item, 0, sizeof(item));\r
215\r
216 item.mask = LVIF_TEXT;\r
217 item.iItem = i;\r
218 item.pszText = Cheats[i].Descr;\r
219 item.iSubItem = 0;\r
220\r
221 SendMessage(List, LVM_INSERTITEM, 0, (LPARAM)&item);\r
222\r
223 item.pszText = (Cheats[i].Enabled ? _("Yes") : _("No"));\r
224 item.iSubItem = 1;\r
225\r
226 SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item);\r
227 }\r
228 break;\r
229\r
230 case IDC_EDITCODE:\r
231 List = GetDlgItem(hW, IDC_CODELIST);\r
232 iEditItem = ListView_GetSelectionMark(List);\r
233\r
234 if (iEditItem != -1) {\r
235 DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATEDIT), hW, (DLGPROC)CheatEditDlgProc);\r
236\r
237 memset(&item, 0, sizeof(item));\r
238\r
239 item.mask = LVIF_TEXT;\r
240 item.iItem = iEditItem;\r
241 item.pszText = Cheats[iEditItem].Descr;\r
242 item.iSubItem = 0;\r
243\r
244 SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item);\r
245 }\r
246 break;\r
247\r
248 case IDC_REMOVECODE:\r
249 List = GetDlgItem(hW, IDC_CODELIST);\r
250 i = ListView_GetSelectionMark(List);\r
251\r
252 if (i != -1) {\r
253 RemoveCheat(i);\r
254 ListView_DeleteItem(List, i);\r
255 ListView_SetSelectionMark(List, -1);\r
256 }\r
257 break;\r
258\r
259 case IDC_TOGGLECODE:\r
260 List = GetDlgItem(hW, IDC_CODELIST);\r
261 i = ListView_GetSelectionMark(List);\r
262\r
263 if (i != -1) {\r
264 Cheats[i].Enabled ^= 1;\r
265\r
266 memset(&item, 0, sizeof(item));\r
267\r
268 item.mask = LVIF_TEXT;\r
269 item.iItem = i;\r
270 item.pszText = (Cheats[i].Enabled ? _("Yes") : _("No"));\r
271 item.iSubItem = 1;\r
272\r
273 SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item);\r
274 }\r
275 break;\r
276\r
277 case IDC_LOADCODE:\r
278 memset(&szFileName, 0, sizeof(szFileName));\r
279 memset(&szFileTitle, 0, sizeof(szFileTitle));\r
280 memset(&szFilter, 0, sizeof(szFilter));\r
281\r
282 strcpy(szFilter, _("PCSX Cheat Code Files"));\r
283 strcatz(szFilter, "*.*");\r
284\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
299\r
300 if (GetOpenFileName((LPOPENFILENAME)&ofn)) {\r
301 LoadCheats(szFileName);\r
302 UpdateCheatDlg(hW);\r
303 }\r
304 break;\r
305\r
306 case IDC_SAVECODE:\r
307 memset(&szFileName, 0, sizeof(szFileName));\r
308 memset(&szFileTitle, 0, sizeof(szFileTitle));\r
309 memset(&szFilter, 0, sizeof(szFilter));\r
310\r
311 strcpy(szFilter, _("PCSX Cheat Code Files"));\r
312 strcatz(szFilter, "*.*");\r
313\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
328\r
329 if (GetOpenFileName((LPOPENFILENAME)&ofn)) {\r
330 SaveCheats(szFileName);\r
331 }\r
332 break;\r
333 }\r
334 break;\r
335\r
336 case WM_NOTIFY:\r
337 switch (LOWORD(wParam)) {\r
338 case IDC_CODELIST:\r
339 List = GetDlgItem(hW, IDC_CODELIST);\r
340 i = ListView_GetSelectionMark(List);\r
341\r
342 if (i != -1) {\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
346 }\r
347 else {\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
351 }\r
352\r
353 Button_Enable(GetDlgItem(hW, IDC_SAVECODE), (NumCheats > 0));\r
354 break;\r
355 }\r
356 break;\r
357\r
358 case WM_CLOSE:\r
359 EndDialog(hW, FALSE);\r
360 return TRUE;\r
361 }\r
362\r
363 return FALSE;\r
364}\r
365\r
366///////////////////////////////////////////////////////////////////////////////\r
367\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
377\r
378#define SEARCHTYPE_8BIT 0\r
379#define SEARCHTYPE_16BIT 1\r
380#define SEARCHTYPE_32BIT 2\r
381\r
382#define SEARCHBASE_DEC 0\r
383#define SEARCHBASE_HEX 1\r
384\r
385static char current_search = SEARCH_EQUALVAL;\r
386static char current_searchtype = SEARCHTYPE_8BIT;\r
387static char current_searchbase = SEARCHBASE_DEC;\r
388static uint32_t current_valuefrom = 0;\r
389static uint32_t current_valueto = 0;\r
390\r
391static void UpdateCheatSearchDlg(HWND hW) {\r
392 char buf[256];\r
393 int i;\r
394\r
395 SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_RESETCONTENT, 0, 0);\r
396 SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_RESETCONTENT, 0, 0);\r
397\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
401\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
405\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
413\r
414 ComboBox_Enable(GetDlgItem(hW, IDC_DATATYPE), FALSE);\r
415 }\r
416 else {\r
417 ComboBox_Enable(GetDlgItem(hW, IDC_DATATYPE), TRUE);\r
418 }\r
419\r
420 SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_SETCURSEL, (WPARAM)current_search, 0);\r
421\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
425 }\r
426 else {\r
427 ShowWindow(GetDlgItem(hW, IDC_LABEL_TO), SW_HIDE);\r
428 ShowWindow(GetDlgItem(hW, IDC_VALUETO), SW_HIDE);\r
429 }\r
430\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
433\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
439 }\r
440 else {\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
445 }\r
446\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
450 }\r
451 else {\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
455 }\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
459 }\r
460 else {\r
461 for (i = 0; i < NumSearchResults; i++) {\r
462 u32 addr = SearchResults[i];\r
463\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
468 break;\r
469\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
473 break;\r
474\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
478 break;\r
479\r
480 default:\r
481 assert(FALSE); // impossible\r
482 break;\r
483 }\r
484\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
487 }\r
488 EnableWindow(GetDlgItem(hW, IDC_RESLIST), TRUE);\r
489 }\r
490 }\r
491\r
492 sprintf(buf, _("Founded Addresses: %d"), NumSearchResults);\r
493 Static_SetText(GetDlgItem(hW, IDC_LABEL_RESULTSFOUND), buf);\r
494}\r
495\r
496static int iCurItem = 0;\r
497\r
498static LRESULT WINAPI CheatFreezeProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {\r
499 u32 val;\r
500 char buf[256];\r
501\r
502 switch (uMsg) {\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
507\r
508 sprintf(buf, "%.8X", SearchResults[iCurItem]);\r
509 SetWindowText(GetDlgItem(hW, IDC_ADDRESS), buf);\r
510\r
511 switch (current_searchtype) {\r
512 case SEARCHTYPE_8BIT:\r
513 val = PSXMu8(SearchResults[iCurItem]);\r
514 break;\r
515\r
516 case SEARCHTYPE_16BIT:\r
517 val = PSXMu16(SearchResults[iCurItem]);\r
518 break;\r
519\r
520 case SEARCHTYPE_32BIT:\r
521 val = PSXMu32(SearchResults[iCurItem]);\r
522 break;\r
523\r
524 default:\r
525 assert(FALSE); // should not reach here\r
526 break;\r
527 }\r
528\r
529 sprintf(buf, "%u", val);\r
530 SetWindowText(GetDlgItem(hW, IDC_VALUE), buf);\r
531 break;\r
532\r
533 case WM_COMMAND:\r
534 switch (LOWORD(wParam)) {\r
535 case IDOK:\r
536 val = 0;\r
537 GetWindowText(GetDlgItem(hW, IDC_VALUE), buf, 255);\r
538 sscanf(buf, "%u", &val);\r
539\r
540 switch (current_searchtype) {\r
541 case SEARCHTYPE_8BIT:\r
542 if (val > (u32)0xFF) {\r
543 val = 0xFF;\r
544 }\r
545 sprintf(szCode, "%.8X %.4X", (SearchResults[iCurItem] & 0x1FFFFF) | (CHEAT_CONST8 << 24), val);\r
546 break;\r
547\r
548 case SEARCHTYPE_16BIT:\r
549 if (val > (u32)0xFFFF) {\r
550 val = 0xFFFF;\r
551 }\r
552 sprintf(szCode, "%.8X %.4X", (SearchResults[iCurItem] & 0x1FFFFF) | (CHEAT_CONST16 << 24), val);\r
553 break;\r
554\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
559 break;\r
560\r
561 default:\r
562 assert(FALSE); // should not reach here\r
563 break;\r
564 }\r
565\r
566 sprintf(szDescr, _("Freeze %.8X"), SearchResults[iCurItem]);\r
567\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
571 return TRUE;\r
572 }\r
573 break;\r
574\r
575 case IDCANCEL:\r
576 EndDialog(hW, FALSE);\r
577 return TRUE;\r
578 }\r
579 break;\r
580\r
581 case WM_CLOSE:\r
582 EndDialog(hW, FALSE);\r
583 return TRUE;\r
584 }\r
585\r
586 return FALSE;\r
587}\r
588\r
589static LRESULT WINAPI CheatModifyProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {\r
590 u32 val;\r
591 char buf[256];\r
592\r
593 switch (uMsg) {\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
598\r
599 sprintf(buf, "%.8X", SearchResults[iCurItem]);\r
600 SetWindowText(GetDlgItem(hW, IDC_ADDRESS), buf);\r
601\r
602 switch (current_searchtype) {\r
603 case SEARCHTYPE_8BIT:\r
604 val = PSXMu8(SearchResults[iCurItem]);\r
605 break;\r
606\r
607 case SEARCHTYPE_16BIT:\r
608 val = PSXMu16(SearchResults[iCurItem]);\r
609 break;\r
610\r
611 case SEARCHTYPE_32BIT:\r
612 val = PSXMu32(SearchResults[iCurItem]);\r
613 break;\r
614\r
615 default:\r
616 assert(FALSE); // should not reach here\r
617 break;\r
618 }\r
619\r
620 sprintf(buf, "%u", val);\r
621 SetWindowText(GetDlgItem(hW, IDC_VALUE), buf);\r
622 break;\r
623\r
624 case WM_COMMAND:\r
625 switch (LOWORD(wParam)) {\r
626 case IDOK:\r
627 val = 0;\r
628 GetWindowText(GetDlgItem(hW, IDC_VALUE), buf, 255);\r
629 sscanf(buf, "%u", &val);\r
630\r
631 switch (current_searchtype) {\r
632 case SEARCHTYPE_8BIT:\r
633 if (val > 0xFF) {\r
634 val = 0xFF;\r
635 }\r
636 psxMemWrite8(SearchResults[iCurItem], (u8)val);\r
637 break;\r
638\r
639 case SEARCHTYPE_16BIT:\r
640 if (val > 0xFFFF) {\r
641 val = 0xFFFF;\r
642 }\r
643 psxMemWrite16(SearchResults[iCurItem], (u16)val);\r
644 break;\r
645\r
646 case SEARCHTYPE_32BIT:\r
647 psxMemWrite32(SearchResults[iCurItem], (u32)val);\r
648 break;\r
649\r
650 default:\r
651 assert(FALSE); // should not reach here\r
652 break;\r
653 }\r
654\r
655 EndDialog(hW, TRUE);\r
656 return TRUE;\r
657\r
658 case IDCANCEL:\r
659 EndDialog(hW, TRUE);\r
660 return FALSE;\r
661 }\r
662 break;\r
663\r
664 case WM_CLOSE:\r
665 EndDialog(hW, TRUE);\r
666 return FALSE;\r
667 }\r
668\r
669 return FALSE;\r
670}\r
671\r
672LRESULT WINAPI CheatSearchDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {\r
673 char buf[256];\r
674 uint32_t i;\r
675\r
676 switch (uMsg) {\r
677 case WM_INITDIALOG:\r
678 SetWindowText(hW, _("Cheat Search"));\r
679\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
691\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
697\r
698 UpdateCheatSearchDlg(hW);\r
699 break;\r
700\r
701 case WM_COMMAND:\r
702 switch (LOWORD(wParam)) {\r
703 case IDCANCEL:\r
704 EndDialog(hW, FALSE);\r
705 return TRUE;\r
706\r
707 case IDC_FREEZE:\r
708 iCurItem = SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_GETCURSEL, 0, 0);\r
709 DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATVALEDIT), hW, (DLGPROC)CheatFreezeProc);\r
710 break;\r
711\r
712 case IDC_MODIFY:\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
716 break;\r
717\r
718 case IDC_COPY:\r
719 i = SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_GETCURSEL, 0, 0);\r
720 sprintf(buf, "%.8X", SearchResults[i]);\r
721\r
722 if (OpenClipboard(gApp.hWnd)) {\r
723 HGLOBAL hglbCopy = GlobalAlloc(GHND, 256);\r
724 char *p;\r
725\r
726 if (hglbCopy != NULL) {\r
727 p = (char *)GlobalLock(hglbCopy);\r
728 strcpy(p, buf);\r
729 GlobalUnlock(p);\r
730\r
731 EmptyClipboard();\r
732 SetClipboardData(CF_TEXT, (HANDLE)hglbCopy);\r
733 }\r
734\r
735 CloseClipboard();\r
736 }\r
737 break;\r
738\r
739 case IDC_SEARCH:\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
745\r
746 if (current_searchbase == SEARCHBASE_DEC) {\r
747 GetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPTSTR)buf, 255);\r
748 sscanf(buf, "%u", &current_valuefrom);\r
749 GetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPTSTR)buf, 255);\r
750 sscanf(buf, "%u", &current_valueto);\r
751 }\r
752 else {\r
753 GetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPTSTR)buf, 255);\r
754 sscanf(buf, "%x", &current_valuefrom);\r
755 GetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPTSTR)buf, 255);\r
756 sscanf(buf, "%x", &current_valueto);\r
757 }\r
758\r
759 switch (current_searchtype) {\r
760 case SEARCHTYPE_8BIT:\r
761 if (current_valuefrom > (u32)0xFF) {\r
762 current_valuefrom = 0xFF;\r
763 }\r
764 if (current_valueto > (u32)0xFF) {\r
765 current_valueto = 0xFF;\r
766 }\r
767 break;\r
768\r
769 case SEARCHTYPE_16BIT:\r
770 if (current_valuefrom > (u32)0xFFFF) {\r
771 current_valuefrom = 0xFFFF;\r
772 }\r
773 if (current_valueto > (u32)0xFFFF) {\r
774 current_valueto = 0xFFFF;\r
775 }\r
776 break;\r
777 }\r
778\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
783 }\r
784\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
790 break;\r
791\r
792 case SEARCHTYPE_16BIT:\r
793 CheatSearchEqual16((u16)current_valuefrom);\r
794 break;\r
795\r
796 case SEARCHTYPE_32BIT:\r
797 CheatSearchEqual32((u32)current_valuefrom);\r
798 break;\r
799 }\r
800 break;\r
801\r
802 case SEARCH_NOTEQUALVAL:\r
803 switch (current_searchtype) {\r
804 case SEARCHTYPE_8BIT:\r
805 CheatSearchNotEqual8((u8)current_valuefrom);\r
806 break;\r
807\r
808 case SEARCHTYPE_16BIT:\r
809 CheatSearchNotEqual16((u16)current_valuefrom);\r
810 break;\r
811\r
812 case SEARCHTYPE_32BIT:\r
813 CheatSearchNotEqual32((u32)current_valuefrom);\r
814 break;\r
815 }\r
816 break;\r
817\r
818 case SEARCH_RANGE:\r
819 switch (current_searchtype) {\r
820 case SEARCHTYPE_8BIT:\r
821 CheatSearchRange8((u8)current_valuefrom, (u8)current_valueto);\r
822 break;\r
823\r
824 case SEARCHTYPE_16BIT:\r
825 CheatSearchRange16((u16)current_valuefrom, (u16)current_valueto);\r
826 break;\r
827\r
828 case SEARCHTYPE_32BIT:\r
829 CheatSearchRange32((u32)current_valuefrom, (u32)current_valueto);\r
830 break;\r
831 }\r
832 break;\r
833\r
834 case SEARCH_INCBY:\r
835 switch (current_searchtype) {\r
836 case SEARCHTYPE_8BIT:\r
837 CheatSearchIncreasedBy8((u8)current_valuefrom);\r
838 break;\r
839\r
840 case SEARCHTYPE_16BIT:\r
841 CheatSearchIncreasedBy16((u16)current_valuefrom);\r
842 break;\r
843\r
844 case SEARCHTYPE_32BIT:\r
845 CheatSearchIncreasedBy32((u32)current_valuefrom);\r
846 break;\r
847 }\r
848 break;\r
849\r
850 case SEARCH_DECBY:\r
851 switch (current_searchtype) {\r
852 case SEARCHTYPE_8BIT:\r
853 CheatSearchDecreasedBy8((u8)current_valuefrom);\r
854 break;\r
855\r
856 case SEARCHTYPE_16BIT:\r
857 CheatSearchDecreasedBy16((u16)current_valuefrom);\r
858 break;\r
859\r
860 case SEARCHTYPE_32BIT:\r
861 CheatSearchDecreasedBy32((u32)current_valuefrom);\r
862 break;\r
863 }\r
864 break;\r
865\r
866 case SEARCH_INC:\r
867 switch (current_searchtype) {\r
868 case SEARCHTYPE_8BIT:\r
869 CheatSearchIncreased8();\r
870 break;\r
871\r
872 case SEARCHTYPE_16BIT:\r
873 CheatSearchIncreased16();\r
874 break;\r
875\r
876 case SEARCHTYPE_32BIT:\r
877 CheatSearchIncreased32();\r
878 break;\r
879 }\r
880 break;\r
881\r
882 case SEARCH_DEC:\r
883 switch (current_searchtype) {\r
884 case SEARCHTYPE_8BIT:\r
885 CheatSearchDecreased8();\r
886 break;\r
887\r
888 case SEARCHTYPE_16BIT:\r
889 CheatSearchDecreased16();\r
890 break;\r
891\r
892 case SEARCHTYPE_32BIT:\r
893 CheatSearchDecreased32();\r
894 break;\r
895 }\r
896 break;\r
897\r
898 case SEARCH_DIFFERENT:\r
899 switch (current_searchtype) {\r
900 case SEARCHTYPE_8BIT:\r
901 CheatSearchDifferent8();\r
902 break;\r
903\r
904 case SEARCHTYPE_16BIT:\r
905 CheatSearchDifferent16();\r
906 break;\r
907\r
908 case SEARCHTYPE_32BIT:\r
909 CheatSearchDifferent32();\r
910 break;\r
911 }\r
912 break;\r
913\r
914 case SEARCH_NOCHANGE:\r
915 switch (current_searchtype) {\r
916 case SEARCHTYPE_8BIT:\r
917 CheatSearchNoChange8();\r
918 break;\r
919\r
920 case SEARCHTYPE_16BIT:\r
921 CheatSearchNoChange16();\r
922 break;\r
923\r
924 case SEARCHTYPE_32BIT:\r
925 CheatSearchNoChange32();\r
926 break;\r
927 }\r
928 break;\r
929\r
930 default:\r
931 assert(FALSE); // not possible\r
932 break;\r
933 }\r
934\r
935 UpdateCheatSearchDlg(hW);\r
936 break;\r
937\r
938 case IDC_NEWSEARCH:\r
939 FreeCheatSearchMem();\r
940 FreeCheatSearchResults();\r
941\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
947\r
948 UpdateCheatSearchDlg(hW);\r
949 EnableWindow(GetDlgItem(hW, IDC_VALUEFROM), TRUE);\r
950 break;\r
951\r
952 case IDC_SEARCHFOR:\r
953 EnableWindow(GetDlgItem(hW, IDC_VALUEFROM), TRUE);\r
954\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
958 }\r
959 else {\r
960 ShowWindow(GetDlgItem(hW, IDC_LABEL_TO), SW_HIDE);\r
961 ShowWindow(GetDlgItem(hW, IDC_VALUETO), SW_HIDE);\r
962\r
963 if (SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_GETCURSEL, 0, 0) >= SEARCH_INC) {\r
964 EnableWindow(GetDlgItem(hW, IDC_VALUEFROM), FALSE);\r
965 }\r
966 }\r
967 break;\r
968\r
969 case IDC_DATABASE:\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
976\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
981 }\r
982 }\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
988\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
993 }\r
994 current_searchbase = SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_GETCURSEL, 0, 0);\r
995 break;\r
996\r
997 case IDC_RESLIST:\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
1003 break;\r
1004\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
1009 break;\r
1010 }\r
1011 break;\r
1012 }\r
1013 break;\r
1014\r
1015 case WM_CLOSE:\r
1016 EndDialog(hW, FALSE);\r
1017 return TRUE;\r
1018 }\r
1019\r
1020 return FALSE;\r
1021}\r