From 3acb751ea4a8a24eab3da6e0e197bcb9b22fcdf1 Mon Sep 17 00:00:00 2001 From: zeromus Date: Sun, 30 Sep 2012 18:43:15 +0000 Subject: [PATCH] commit cheat perks patch from rimsky82 [ https://sourceforge.net/p/fceultra/bugs/512/ ] --- src/boards/fk23c.cpp | 3 +- src/cheat.cpp | 9 ++-- src/drivers/win/cheat.cpp | 106 ++++++++++++++++++++++++++++++------- src/drivers/win/res.rc | 12 +++-- src/drivers/win/resource.h | 2 + 5 files changed, 100 insertions(+), 32 deletions(-) diff --git a/src/boards/fk23c.cpp b/src/boards/fk23c.cpp index c869680e..daeb7a74 100644 --- a/src/boards/fk23c.cpp +++ b/src/boards/fk23c.cpp @@ -217,7 +217,6 @@ static void BMCFK23CPower(void) GenMMC3Power(); EXPREGS[0]=EXPREGS[1]=EXPREGS[2]=EXPREGS[3]=0; EXPREGS[4]=EXPREGS[5]=EXPREGS[6]=EXPREGS[7]=0xFF; - GenMMC3Power(); SetWriteHandler(0x5000,0x5fff,BMCFK23CWrite); SetWriteHandler(0x8000,0xFFFF,BMCFK23CHiWrite); FixMMC3PRG(MMC3_cmd); @@ -226,8 +225,8 @@ static void BMCFK23CPower(void) static void BMCFK23CAPower(void) { - GenMMC3Power(); dipswitch = 0; + GenMMC3Power(); EXPREGS[0]=EXPREGS[1]=EXPREGS[2]=EXPREGS[3]=0; EXPREGS[4]=EXPREGS[5]=EXPREGS[6]=EXPREGS[7]=0xFF; SetWriteHandler(0x5000,0x5fff,BMCFK23CWrite); diff --git a/src/cheat.cpp b/src/cheat.cpp index ac35bad5..cb78fe5f 100644 --- a/src/cheat.cpp +++ b/src/cheat.cpp @@ -596,7 +596,7 @@ int FCEUI_DecodePAR(const char *str, int *a, int *v, int *c, int *type) /* name can be NULL if the name isn't going to be changed. */ /* same goes for a, v, and s(except the values of each one must be <0) */ -int FCEUI_SetCheat(uint32 which, const char *name, int32 a, int32 v, int compare,int s, int type) +int FCEUI_SetCheat(uint32 which, const char *name, int32 a, int32 v, int c, int s, int type) { struct CHEATF *next=cheats; uint32 x=0; @@ -608,8 +608,7 @@ int FCEUI_SetCheat(uint32 which, const char *name, int32 a, int32 v, int compare if(name) { char *t; - - if((t=(char *)realloc(next->name,strlen(name)+1))) + if((t=(char *)realloc(next->name, strlen(name)+1))) { next->name=t; strcpy(next->name,name); @@ -623,8 +622,8 @@ int FCEUI_SetCheat(uint32 which, const char *name, int32 a, int32 v, int compare next->val=v; if(s>=0) next->status=s; - if(compare>=0) - next->compare=compare; + if(c>=-1) + next->compare=c; next->type=type; savecheats=1; diff --git a/src/drivers/win/cheat.cpp b/src/drivers/win/cheat.cpp index e1facd14..7e903696 100644 --- a/src/drivers/win/cheat.cpp +++ b/src/drivers/win/cheat.cpp @@ -60,6 +60,8 @@ char GGcode[10]; int GGlist[GGLISTSIZE]; static int dontupdateGG; //this eliminates recursive crashing +bool dodecode; + HWND hGGConv; void EncodeGG(char *str, int a, int v, int c); @@ -91,13 +93,19 @@ char *U8ToStr(uint8 a) { static HWND hwndLB; //int RedoCheatsCallB(char *name, uint32 a, uint8 v, int s) { //bbit edited: this commented out line was changed to the below for the new fceud -int RedoCheatsCallB(char *name, uint32 a, uint8 v, int compare,int s,int type,void*data) { +int RedoCheatsCallB(char *name, uint32 a, uint8 v, int c, int s, int type, void*data) { char str[259] = { 0 }; - //strcpy(str,(s?"* ":" ")); - //strcat(str,name); - if(name[0] == 0)sprintf(str,"%s%04X=%02X",s?"* ":" ",(int)a,(int)v); - else sprintf(str,"%s%s",s?"* ":" ",name); + strcpy(str,(s?"* ":" ")); + if(name[0] == 0) { + if(a >= 0x8000) { + EncodeGG(str+2, a, v, c); + } else { + if(c == -1) sprintf(str+2,"%04X:%02X",(int)a,(int)v); + else sprintf(str+2,"%04X?%02X:%02X",(int)a,(int)c,(int)v); + } + } + else strcat(str,name); SendDlgItemMessage(hwndLB,IDC_LIST_CHEATS,LB_ADDSTRING,0,(LPARAM)(LPSTR)str); return 1; @@ -157,6 +165,7 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l char *name; uint32 a; uint8 v; + int c; int s; switch (uMsg) { @@ -175,6 +184,7 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l SendDlgItemMessage(hwndDlg,IDC_CHEAT_ADDR,WM_SETFONT,(WPARAM)hNewFont,FALSE); SendDlgItemMessage(hwndDlg,IDC_CHEAT_VAL,WM_SETFONT,(WPARAM)hNewFont,FALSE); + SendDlgItemMessage(hwndDlg,IDC_CHEAT_COM,WM_SETFONT,(WPARAM)hNewFont,FALSE); SendDlgItemMessage(hwndDlg,IDC_CHEAT_VAL_KNOWN,WM_SETFONT,(WPARAM)hNewFont,FALSE); SendDlgItemMessage(hwndDlg,IDC_CHEAT_LIST_POSSIBILITIES,WM_SETFONT,(WPARAM)hNewFont,FALSE); SendDlgItemMessage(hwndDlg,IDC_CHEAT_VAL_NE_BY,WM_SETFONT,(WPARAM)hNewFont,FALSE); @@ -184,6 +194,7 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l //text limits SendDlgItemMessage(hwndDlg,IDC_CHEAT_ADDR,EM_SETLIMITTEXT,4,0); SendDlgItemMessage(hwndDlg,IDC_CHEAT_VAL,EM_SETLIMITTEXT,2,0); + SendDlgItemMessage(hwndDlg,IDC_CHEAT_COM,EM_SETLIMITTEXT,2,0); SendDlgItemMessage(hwndDlg,IDC_CHEAT_NAME,EM_SETLIMITTEXT,256,0); SendDlgItemMessage(hwndDlg,IDC_CHEAT_VAL_KNOWN,EM_SETLIMITTEXT,2,0); SendDlgItemMessage(hwndDlg,IDC_CHEAT_VAL_NE_BY,EM_SETLIMITTEXT,2,0); @@ -402,14 +413,34 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l } break; case IDC_BTN_CHEAT_ADD: + dodecode = true; + GetDlgItemText(hwndDlg,IDC_CHEAT_ADDR,str,5); + if(str[0] != 0) dodecode = false; a=StrToU16(str); GetDlgItemText(hwndDlg,IDC_CHEAT_VAL,str,3); + if(str[0] != 0) dodecode = false; v=StrToU8(str); + GetDlgItemText(hwndDlg,IDC_CHEAT_COM,str,3); + if(str[0] != 0) dodecode = false; + c=(str[0] == 0)?-1:StrToU8(str); GetDlgItemText(hwndDlg,IDC_CHEAT_NAME,str,256); + if(dodecode && (strlen(str) == 6 || strlen(str) == 8)) { + if(FCEUI_DecodeGG(str, &GGaddr, &GGval, &GGcomp)) { + a = GGaddr; + v = GGval; + c = GGcomp; + } + } // if (FCEUI_AddCheat(str,a,v)) { //bbit edited: replaced this with the line below - if (FCEUI_AddCheat(str,a,v,-1,1)) { - if(str[0] == 0)sprintf(str,"%04X=%02X",(int)a,(int)v); //bbit edited: added this line to give your cheat a name if you didn't supply one + if (FCEUI_AddCheat(str,a,v,c,1)) { + if(str[0] == 0) { + if(a >= 0x8000) EncodeGG(str, a, v, c); + else { + if(c == -1) sprintf(str,"%04X:%02X",(int)a,(int)v); //bbit edited: added this line to give your cheat a name if you didn't supply one + else sprintf(str,"%04X?%02X:%02X",(int)a,(int)c,(int)v); + } + } strcpy(str2,"* "); strcat(str2,str); SendDlgItemMessage(hwndDlg,IDC_LIST_CHEATS,LB_ADDSTRING,0,(LPARAM)(LPSTR)str2); @@ -417,9 +448,11 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l SendDlgItemMessage(hwndDlg,IDC_LIST_CHEATS,LB_SETCURSEL,selcheat,0); SendDlgItemMessage(hwndDlg,IDC_LIST_CHEATS,LB_SETSEL,(WPARAM)1,selcheat); - SetDlgItemText(hwndDlg,IDC_CHEAT_ADDR,(LPTSTR)U16ToStr(a)); - SetDlgItemText(hwndDlg,IDC_CHEAT_VAL,(LPTSTR)U8ToStr(v)); - + SetDlgItemText(hwndDlg,IDC_CHEAT_ADDR,(LPTSTR)""); + SetDlgItemText(hwndDlg,IDC_CHEAT_VAL,(LPTSTR)""); + SetDlgItemText(hwndDlg,IDC_CHEAT_COM,(LPTSTR)""); + SetDlgItemText(hwndDlg,IDC_CHEAT_NAME,(LPTSTR)""); + EnableWindow(GetDlgItem(hwndDlg,IDC_BTN_CHEAT_DEL),TRUE); EnableWindow(GetDlgItem(hwndDlg,IDC_BTN_CHEAT_UPD),TRUE); } @@ -439,6 +472,7 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l } SetDlgItemText(hwndDlg,IDC_CHEAT_ADDR,(LPTSTR)""); SetDlgItemText(hwndDlg,IDC_CHEAT_VAL,(LPTSTR)""); + SetDlgItemText(hwndDlg,IDC_CHEAT_COM,(LPTSTR)""); SetDlgItemText(hwndDlg,IDC_CHEAT_NAME,(LPTSTR)""); EnableWindow(GetDlgItem(hwndDlg,IDC_BTN_CHEAT_DEL),FALSE); EnableWindow(GetDlgItem(hwndDlg,IDC_BTN_CHEAT_UPD),FALSE); @@ -452,6 +486,7 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l selcheat=-1; SetDlgItemText(hwndDlg,IDC_CHEAT_ADDR,(LPTSTR)""); SetDlgItemText(hwndDlg,IDC_CHEAT_VAL,(LPTSTR)""); + SetDlgItemText(hwndDlg,IDC_CHEAT_COM,(LPTSTR)""); SetDlgItemText(hwndDlg,IDC_CHEAT_NAME,(LPTSTR)""); } EnableWindow(GetDlgItem(hwndDlg,IDC_BTN_CHEAT_DEL),FALSE); @@ -461,19 +496,38 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l } break; case IDC_BTN_CHEAT_UPD: - if (selcheat < 0) break; + dodecode = true; + if (selcheat < 0) break; GetDlgItemText(hwndDlg,IDC_CHEAT_ADDR,str,5); + if(str[0] != 0) dodecode = false; a=StrToU16(str); GetDlgItemText(hwndDlg,IDC_CHEAT_VAL,str,3); + if(str[0] != 0) dodecode = false; v=StrToU8(str); + GetDlgItemText(hwndDlg,IDC_CHEAT_COM,str,3); + if(str[0] != 0) dodecode = false; + c=(str[0] == 0)?-1:StrToU8(str); GetDlgItemText(hwndDlg,IDC_CHEAT_NAME,str,256); + if(dodecode && (strlen(str) == 6 || strlen(str) == 8)) { + if(FCEUI_DecodeGG(str, &GGaddr, &GGval, &GGcomp)) { + a = GGaddr; + v = GGval; + c = GGcomp; + } + } // FCEUI_SetCheat(selcheat,str,a,v,-1); //bbit edited: replaced this with the line below - FCEUI_SetCheat(selcheat,str,a,v,-1,-1,1); + FCEUI_SetCheat(selcheat,str,a,v,c,-1,1); // FCEUI_GetCheat(selcheat,&name,&a,&v,&s); //bbit edited: replaced this with the line below - FCEUI_GetCheat(selcheat,&name,&a,&v,NULL,&s,NULL); + FCEUI_GetCheat(selcheat,&name,&a,&v,&c,&s,NULL); strcpy(str2,(s?"* ":" ")); - if(str[0] == 0)sprintf(str,"%04X=%02X",(int)a,(int)v); //bbit edited: added this line to give your cheat a name if you didn't supply one + if(str[0] == 0) { + if(a >= 0x8000) EncodeGG(str, a, v, c); + else { + if(c == -1) sprintf(str,"%04X:%02X",(int)a,(int)v); //bbit edited: added this line to give your cheat a name if you didn't supply one + else sprintf(str,"%04X?%02X:%02X",(int)a,(int)c,(int)v); + } + } strcat(str2,str); SendDlgItemMessage(hwndDlg,IDC_LIST_CHEATS,LB_DELETESTRING,selcheat,0); @@ -483,6 +537,8 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l SetDlgItemText(hwndDlg,IDC_CHEAT_ADDR,(LPTSTR)U16ToStr(a)); SetDlgItemText(hwndDlg,IDC_CHEAT_VAL,(LPTSTR)U8ToStr(v)); + if(c == -1) SetDlgItemText(hwndDlg,IDC_CHEAT_COM,(LPTSTR)""); + else SetDlgItemText(hwndDlg,IDC_CHEAT_COM,(LPTSTR)U8ToStr(c)); if(hMemView)UpdateColorTable(); //if the memory viewer is open then update any blue freeze locations in it as well break; case IDC_BTN_CHEAT_RESET: @@ -554,13 +610,18 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l for (int selcheattemp=SendDlgItemMessage(hwndDlg,IDC_LIST_CHEATS,LB_GETCOUNT,0,0)-1;selcheattemp>=0;selcheattemp--) { if (SendDlgItemMessage(hwndDlg,IDC_LIST_CHEATS,LB_GETSEL,selcheattemp,0)) { // FCEUI_GetCheat(selcheattemp,&name,&a,&v,&s); //bbit edited: replaced this with the line below - FCEUI_GetCheat(selcheattemp,&name,&a,&v,NULL,&s,NULL); + FCEUI_GetCheat(selcheattemp,&name,&a,&v,&c,&s,NULL); // FCEUI_SetCheat(selcheattemp,0,-1,-1,s^=1);//bbit edited: replaced this with the line below FCEUI_SetCheat(selcheattemp,0,-1,-1,-1,s^=1,1); - if(name[0] == 0)sprintf(str,"%s%04X=%02X",s?"* ":" ",(unsigned int)a,(unsigned int)v); - else sprintf(str,"%s%s",s?"* ":" ",name); - //strcpy(str,(s?"* ":" ")); - //strcat(str,name); + strcpy(str,(s?"* ":" ")); + if(name[0] == 0) { + if(a >= 0x8000) EncodeGG(str+2, a, v, c); + else { + if(c == -1) sprintf(str+2,"%04X:%02X",(int)a,(int)v); //bbit edited: added this line to give your cheat a name if you didn't supply one + else sprintf(str+2,"%04X?%02X:%02X",(int)a,(int)c,(int)v); + } + } + else strcat(str,name); SendDlgItemMessage(hwndDlg,IDC_LIST_CHEATS,LB_DELETESTRING,selcheattemp,0); SendDlgItemMessage(hwndDlg,IDC_LIST_CHEATS,LB_INSERTSTRING,selcheattemp,(LPARAM)(LPSTR)str); } @@ -579,10 +640,12 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l selcheatcount = SendDlgItemMessage(hwndDlg,IDC_LIST_CHEATS,LB_GETSELCOUNT,0,0); if (selcheat < 0) break; - FCEUI_GetCheat(selcheat,&name,&a,&v,NULL,&s,NULL); + FCEUI_GetCheat(selcheat,&name,&a,&v,&c,&s,NULL); SetDlgItemText(hwndDlg,IDC_CHEAT_NAME,(LPTSTR)name); SetDlgItemText(hwndDlg,IDC_CHEAT_ADDR,(LPTSTR)U16ToStr(a)); SetDlgItemText(hwndDlg,IDC_CHEAT_VAL,(LPTSTR)U8ToStr(v)); + if(c == -1) SetDlgItemText(hwndDlg,IDC_CHEAT_COM,(LPTSTR)""); + else SetDlgItemText(hwndDlg,IDC_CHEAT_COM,(LPTSTR)U8ToStr(c)); EnableWindow(GetDlgItem(hwndDlg,IDC_BTN_CHEAT_DEL),TRUE); EnableWindow(GetDlgItem(hwndDlg,IDC_BTN_CHEAT_UPD),TRUE); @@ -601,6 +664,7 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l SetDlgItemText(hwndDlg,IDC_CHEAT_ADDR,(LPTSTR)str2); strcpy(str2,str+13); SetDlgItemText(hwndDlg,IDC_CHEAT_VAL,(LPTSTR)str2); + SetDlgItemText(hwndDlg,IDC_CHEAT_COM,(LPTSTR)""); break; } break; @@ -802,6 +866,8 @@ BOOL CALLBACK GGConvCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) SetDlgItemText(hCheat,IDC_CHEAT_ADDR,(LPTSTR)U16ToStr(GGaddr)); SetDlgItemText(hCheat,IDC_CHEAT_VAL,(LPTSTR)U8ToStr(GGval)); + if(GGcomp == -1) SetDlgItemText(hwndDlg,IDC_CHEAT_COM,(LPTSTR)""); + else SetDlgItemText(hwndDlg,IDC_CHEAT_COM,(LPTSTR)U8ToStr(GGcomp)); EnableWindow(GetDlgItem(hCheat,IDC_BTN_CHEAT_DEL),TRUE); EnableWindow(GetDlgItem(hCheat,IDC_BTN_CHEAT_UPD),TRUE); diff --git a/src/drivers/win/res.rc b/src/drivers/win/res.rc index c8d36397..94e3fdb4 100644 --- a/src/drivers/win/res.rc +++ b/src/drivers/win/res.rc @@ -1667,15 +1667,17 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_ CAPTION "Cheat Search" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - GROUPBOX "Active Cheats",201,3,1,133,168,WS_TABSTOP + GROUPBOX "Active Cheats",201,1,1,133,168,WS_TABSTOP GROUPBOX "Cheat Search",202,139,1,238,168,WS_TABSTOP LISTBOX IDC_LIST_CHEATS,12,14,115,110,LBS_EXTENDEDSEL | WS_VSCROLL LTEXT "Name:",IDC_STATIC,12,118,22,10 - LTEXT "Address:",IDC_STATIC,12,134,28,10 - LTEXT "Value:",IDC_STATIC,85,134,21,10 + LTEXT "A:",IDC_STATIC,12,134,8,10 + LTEXT "V:",IDC_STATIC,59,134,8,10 + LTEXT "C:",IDC_STATIC,96,134,8,10 EDITTEXT IDC_CHEAT_NAME,35,116,92,12,ES_AUTOHSCROLL | ES_WANTRETURN - EDITTEXT IDC_CHEAT_ADDR,42,132,30,12,ES_UPPERCASE | ES_WANTRETURN - EDITTEXT IDC_CHEAT_VAL,107,132,20,12,ES_UPPERCASE | ES_WANTRETURN + EDITTEXT IDC_CHEAT_ADDR,21,132,32,12,ES_UPPERCASE | ES_WANTRETURN + EDITTEXT IDC_CHEAT_VAL,70,132,20,12,ES_UPPERCASE | ES_WANTRETURN + EDITTEXT IDC_CHEAT_COM,107,132,20,12,ES_UPPERCASE | ES_WANTRETURN DEFPUSHBUTTON "Add",IDC_BTN_CHEAT_ADD,12,148,35,16 PUSHBUTTON "Delete",IDC_BTN_CHEAT_DEL,52,148,35,16 PUSHBUTTON "Update",IDC_BTN_CHEAT_UPD,92,148,35,16 diff --git a/src/drivers/win/resource.h b/src/drivers/win/resource.h index 4c2ac0d1..089b4dad 100644 --- a/src/drivers/win/resource.h +++ b/src/drivers/win/resource.h @@ -126,6 +126,8 @@ #define IDC_CHECK_LOG_PROCESSOR_STATUS 111 #define IDC_DEBUGGER_RELOAD_SYMS 111 #define IDC_ROMPATCHER_BTN_SAVE 111 +#define IDC_CHEAT_VAL2 111 +#define IDC_CHEAT_COM 111 #define BTN_AUTO_HOLD 112 #define IDC_BTN_LOG_BROWSE 112 #define IDC_DEBUGGER_BOOKMARK_ADD 112