1 /* FCE Ultra - NES/Famicom Emulator
\r
3 * Copyright notice for this file:
\r
4 * Copyright (C) 2002 Ben Parnell
\r
6 * This program is free software; you can redistribute it and/or modify
\r
7 * it under the terms of the GNU General Public License as published by
\r
8 * the Free Software Foundation; either version 2 of the License, or
\r
9 * (at your option) any later version.
\r
11 * This program is distributed in the hope that it will be useful,
\r
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
14 * GNU General Public License for more details.
\r
16 * You should have received a copy of the GNU General Public License
\r
17 * along with this program; if not, write to the Free Software
\r
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\r
25 static int selcheat;
\r
26 static int scheatmethod=0;
\r
27 static uint8 cheatval1=0;
\r
28 static uint8 cheatval2=0;
\r
30 static void ConfigAddCheat(HWND wnd);
\r
33 static uint16 StrToU16(char *s)
\r
36 sscanf(s,"%4x",&ret);
\r
40 static uint8 StrToU8(char *s)
\r
43 sscanf(s,"%d",&ret);
\r
48 /* Need to be careful where these functions are used. */
\r
49 static char *U16ToStr(uint16 a)
\r
51 static char TempArray[16];
\r
52 sprintf(TempArray,"%04X",a);
\r
56 static char *U8ToStr(uint8 a)
\r
58 static char TempArray[16];
\r
59 sprintf(TempArray,"%03d",a);
\r
64 static HWND RedoCheatsWND;
\r
65 static int RedoCheatsCallB(char *name, uint32 a, uint8 v, int s)
\r
67 SendDlgItemMessage(RedoCheatsWND,101,LB_ADDSTRING,0,(LPARAM)(LPSTR)name);
\r
71 static void RedoCheatsLB(HWND hwndDlg)
\r
73 SendDlgItemMessage(hwndDlg,101,LB_RESETCONTENT,0,0);
\r
74 RedoCheatsWND=hwndDlg;
\r
75 FCEUI_ListCheats(RedoCheatsCallB);
\r
79 BOOL CALLBACK CheatsConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
\r
83 case WM_INITDIALOG:
\r
84 RedoCheatsLB(hwndDlg);
\r
87 case WM_QUIT: goto gornk;
\r
89 switch(HIWORD(wParam))
\r
94 if(LOWORD(wParam)==107)
\r
95 FCEUI_SetCheat(selcheat,0,-1,-1,1);
\r
96 else if(LOWORD(wParam)==108)
\r
97 FCEUI_SetCheat(selcheat,0,-1,-1,0);
\r
103 char TempArray[256];
\r
106 GetDlgItemText(hwndDlg,LOWORD(wParam),TempArray,256);
\r
107 switch(LOWORD(wParam))
\r
109 case 102:FCEUI_SetCheat(selcheat,TempArray,-1,-1,-1);
\r
110 SendDlgItemMessage(hwndDlg,101,LB_INSERTSTRING,selcheat,(LPARAM)(LPCTSTR)TempArray);
\r
111 SendDlgItemMessage(hwndDlg,101,LB_DELETESTRING,selcheat+1,0);
\r
112 SendDlgItemMessage(hwndDlg,101,LB_SETCURSEL,selcheat,0);
\r
114 case 103:t=StrToU16(TempArray);
\r
115 FCEUI_SetCheat(selcheat,0,t,-1,-1);
\r
117 case 104:t=StrToU8(TempArray);
\r
118 FCEUI_SetCheat(selcheat,0,-1,t,-1);
\r
125 switch(LOWORD(wParam))
\r
128 if(HIWORD(wParam)==LBN_SELCHANGE)
\r
135 selcheat=SendDlgItemMessage(hwndDlg,101,LB_GETCURSEL,0,(LPARAM)(LPSTR)0);
\r
136 if(selcheat<0) break;
\r
138 FCEUI_GetCheat(selcheat,&s,&a,&b,&status);
\r
139 SetDlgItemText(hwndDlg,102,(LPTSTR)s);
\r
140 SetDlgItemText(hwndDlg,103,(LPTSTR)U16ToStr(a));
\r
141 SetDlgItemText(hwndDlg,104,(LPTSTR)U8ToStr(b));
\r
143 CheckRadioButton(hwndDlg,107,108,status?107:108);
\r
149 switch(wParam&0xFFFF)
\r
154 FCEUI_DelCheat(selcheat);
\r
155 SendDlgItemMessage(hwndDlg,101,LB_DELETESTRING,selcheat,0);
\r
157 SetDlgItemText(hwndDlg,102,(LPTSTR)"");
\r
158 SetDlgItemText(hwndDlg,103,(LPTSTR)"");
\r
159 SetDlgItemText(hwndDlg,104,(LPTSTR)"");
\r
160 CheckRadioButton(hwndDlg,107,108,0); // Is this correct?
\r
164 ConfigAddCheat(hwndDlg);
\r
165 RedoCheatsLB(hwndDlg);
\r
169 EndDialog(hwndDlg,0);
\r
177 void ConfigCheats(HWND hParent)
\r
181 FCEUD_PrintError("You must have a game loaded before you can manipulate cheats.");
\r
185 if(GI->type==GIT_NSF)
\r
187 FCEUD_PrintError("Sorry, you can't cheat with NSFs.");
\r
192 DialogBox(fceu_hInstance,"CHEATS",hParent,CheatsConCallB);
\r
202 int cfcallb(uint32 a, uint8 last, uint8 current)
\r
206 sprintf(temp,"%04X:%03d:%03d",(unsigned int)a,last,current);
\r
207 SendDlgItemMessage(cfcallbw,108,LB_ADDSTRING,0,(LPARAM)(LPSTR)temp);
\r
211 static int scrollindex;
\r
212 static int scrollnum;
\r
213 static int scrollmax;
\r
215 int cfcallbinsert(uint32 a, uint8 last, uint8 current)
\r
219 sprintf(temp,"%04X:%03d:%03d",(unsigned int)a,last,current);
\r
220 SendDlgItemMessage(cfcallbw,108,LB_INSERTSTRING,13,(LPARAM)(LPSTR)temp);
\r
224 int cfcallbinsertt(uint32 a, uint8 last, uint8 current)
\r
228 sprintf(temp,"%04X:%03d:%03d",(unsigned int)a,last,current);
\r
229 SendDlgItemMessage(cfcallbw,108,LB_INSERTSTRING,0,(LPARAM)(LPSTR)temp);
\r
234 void AddTheThing(HWND hwndDlg, char *s, int a, int v)
\r
236 if(FCEUI_AddCheat(s,a,v))
\r
237 MessageBox(hwndDlg,"Cheat Added","Cheat Added",MB_OK);
\r
241 static void DoGet(void)
\r
243 int n=FCEUI_CheatSearchGetCount();
\r
246 scrollindex=-32768;
\r
248 SendDlgItemMessage(cfcallbw,108,LB_RESETCONTENT,0,0);
\r
249 FCEUI_CheatSearchGetRange(0,13,cfcallb);
\r
255 SendDlgItemMessage(cfcallbw,120,SBM_SETRANGE,-32768,t);
\r
256 SendDlgItemMessage(cfcallbw,120,SBM_SETPOS,-32768,1);
\r
260 BOOL CALLBACK AddCheatCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
\r
262 static int lbfocus;
\r
263 static HWND hwndLB;
\r
272 switch((int)LOWORD(wParam))
\r
275 scrollindex=-32768;
\r
276 SendDlgItemMessage(hwndDlg,120,SBM_SETPOS,scrollindex,1);
\r
277 SendDlgItemMessage(hwndDlg,108,LB_RESETCONTENT,13,0);
\r
278 FCEUI_CheatSearchGetRange(scrollindex+32768,scrollindex+32768+13,cfcallb);
\r
281 scrollindex=scrollmax;
\r
282 SendDlgItemMessage(hwndDlg,120,SBM_SETPOS,scrollindex,1);
\r
283 SendDlgItemMessage(hwndDlg,108,LB_RESETCONTENT,13,0);
\r
284 FCEUI_CheatSearchGetRange(scrollindex+32768,scrollindex+32768+13,cfcallb);
\r
287 if(scrollindex>-32768)
\r
290 SendDlgItemMessage(hwndDlg,120,SBM_SETPOS,scrollindex,1);
\r
291 SendDlgItemMessage(hwndDlg,108,LB_DELETESTRING,13,0);
\r
292 FCEUI_CheatSearchGetRange(scrollindex+32768,scrollindex+32768,cfcallbinsertt);
\r
298 if(scrollindex<-32768) scrollindex=-32768;
\r
299 SendDlgItemMessage(hwndDlg,120,SBM_SETPOS,scrollindex,1);
\r
300 SendDlgItemMessage(hwndDlg,108,LB_RESETCONTENT,13,0);
\r
301 FCEUI_CheatSearchGetRange(scrollindex+32768,scrollindex+32768+13,cfcallb);
\r
305 if(scrollindex<scrollmax)
\r
308 SendDlgItemMessage(hwndDlg,120,SBM_SETPOS,scrollindex,1);
\r
309 SendDlgItemMessage(hwndDlg,108,LB_DELETESTRING,0,0);
\r
310 FCEUI_CheatSearchGetRange(scrollindex+32768+13,scrollindex+32768+13,cfcallbinsert);
\r
316 if(scrollindex>scrollmax)
\r
317 scrollindex=scrollmax;
\r
318 SendDlgItemMessage(hwndDlg,120,SBM_SETPOS,scrollindex,1);
\r
319 SendDlgItemMessage(hwndDlg,108,LB_RESETCONTENT,0,0);
\r
320 FCEUI_CheatSearchGetRange(scrollindex+32768,scrollindex+32768+13,cfcallb);
\r
323 case SB_THUMBPOSITION:
\r
324 case SB_THUMBTRACK:
\r
325 scrollindex=(short int)HIWORD(wParam);
\r
326 SendDlgItemMessage(hwndDlg,120,SBM_SETPOS,scrollindex,1);
\r
327 SendDlgItemMessage(hwndDlg,108,LB_RESETCONTENT,0,0);
\r
328 FCEUI_CheatSearchGetRange(32768+scrollindex,32768+scrollindex+13,cfcallb);
\r
335 case WM_INITDIALOG:
\r
336 SetDlgItemText(hwndDlg,110,(LPTSTR)U8ToStr(cheatval1));
\r
337 SetDlgItemText(hwndDlg,111,(LPTSTR)U8ToStr(cheatval2));
\r
339 CheckRadioButton(hwndDlg,115,118,scheatmethod+115);
\r
344 case WM_VKEYTOITEM:
\r
349 real=SendDlgItemMessage(hwndDlg,108,LB_GETCURSEL,0,(LPARAM)(LPSTR)0);
\r
350 switch((int)LOWORD(wParam))
\r
353 /* mmmm....recursive goodness */
\r
355 SendMessage(hwndDlg,WM_VSCROLL,SB_LINEUP,0);
\r
360 SendMessage(hwndDlg,WM_VSCROLL,SB_LINEDOWN,0);
\r
364 SendMessage(hwndDlg,WM_VSCROLL,SB_PAGEUP,0);
\r
367 SendMessage(hwndDlg,WM_VSCROLL,SB_PAGEDOWN,0);
\r
370 SendMessage(hwndDlg,WM_VSCROLL,SB_TOP,0);
\r
373 SendMessage(hwndDlg,WM_VSCROLL,SB_BOTTOM,0);
\r
381 case WM_QUIT: goto gornk;
\r
383 switch(LOWORD(wParam))
\r
386 switch(HIWORD(wParam))
\r
388 case LBN_SELCHANGE:
\r
390 char TempArray[32];
\r
391 SendDlgItemMessage(hwndDlg,108,LB_GETTEXT,SendDlgItemMessage(hwndDlg,108,LB_GETCURSEL,0,(LPARAM)(LPSTR)0),(LPARAM)(LPCTSTR)TempArray);
\r
393 SetDlgItemText(hwndDlg,201,(LPTSTR)TempArray);
\r
399 case LBN_KILLFOCUS:
\r
406 switch(HIWORD(wParam))
\r
409 if(LOWORD(wParam)>=115 && LOWORD(wParam)<=118)
\r
410 scheatmethod=LOWORD(wParam)-115;
\r
414 char TempArray[256];
\r
415 GetDlgItemText(hwndDlg,LOWORD(wParam),TempArray,256);
\r
416 switch(LOWORD(wParam))
\r
418 case 110:cheatval1=StrToU8(TempArray);break;
\r
419 case 111:cheatval2=StrToU8(TempArray);break;
\r
427 switch(wParam&0xFFFF)
\r
430 FCEUI_CheatSearchBegin();
\r
434 FCEUI_CheatSearchEnd(scheatmethod,cheatval1,cheatval2);
\r
438 FCEUI_CheatSearchSetCurrentAsOriginal();
\r
442 FCEUI_CheatSearchShowExcluded();
\r
450 GetDlgItemText(hwndDlg,201,temp,4+1);
\r
452 GetDlgItemText(hwndDlg,202,temp,3+1);
\r
455 GetDlgItemText(hwndDlg,200,temp,256);
\r
456 AddTheThing(hwndDlg,temp,a,v);
\r
461 EndDialog(hwndDlg,0);
\r
468 static void ConfigAddCheat(HWND wnd)
\r
470 DialogBox(fceu_hInstance,"ADDCHEAT",wnd,AddCheatCallB);
\r