1. Experimental limit the input characters for some edit control.

2. Separated cheat code and game genie in Cheat window.
3. Don't show a game genie code when affected address is under 0x8000.
4. Detail: set font for some edit control, replaced some static global variable.
5. Other details.

By the way, why there're so many useless brackets in some functions?
This commit is contained in:
owomomo 2019-06-19 00:56:27 +08:00
parent cc31ee1a37
commit 56f0db87fa
9 changed files with 550 additions and 307 deletions

View File

@ -64,19 +64,18 @@ int lbfocus = 0;
int searchdone;
static int knownvalue = 0;
int GGaddr, GGcomp, GGval;
char GGcode[10];
// int GGaddr, GGcomp, GGval;
// char GGcode[10];
int GGlist[GGLISTSIZE];
static int dontupdateGG; //this eliminates recursive crashing
static char* ggLets = "APZLGITYEOXUKSVN";
char* GameGenieLetters = "APZLGITYEOXUKSVN";
// bool dodecode;
HWND hGGConv;
WNDPROC DefaultGGConvWndProc;
void EncodeGG(char *str, int a, int v, int c);
void ListGGAddresses();
void ListGGAddresses(HWND hwndDlg);
uint16 StrToU16(char *s)
{
@ -317,11 +316,7 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
CheckDlgButton(hwndDlg, IDC_CHEAT_AUTOLOADSAVE, disableAutoLSCheats == 2 ? BST_UNCHECKED : disableAutoLSCheats == 1 ? BST_INDETERMINATE : BST_CHECKED);
//setup font
hFont = (HFONT)SendMessage(hwndDlg, WM_GETFONT, 0, 0);
LOGFONT lf;
GetObject(hFont, sizeof(LOGFONT), &lf);
strcpy(lf.lfFaceName, "Courier New");
hNewFont = CreateFontIndirect(&lf);
SetupCheatFont(hwndDlg);
SendDlgItemMessage(hwndDlg, IDC_CHEAT_ADDR, WM_SETFONT, (WPARAM)hNewFont, FALSE);
SendDlgItemMessage(hwndDlg, IDC_CHEAT_VAL, WM_SETFONT, (WPARAM)hNewFont, FALSE);
@ -343,6 +338,22 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
SendDlgItemMessage(hwndDlg, IDC_CHEAT_VAL_GT_BY, EM_SETLIMITTEXT, 2, 0);
SendDlgItemMessage(hwndDlg, IDC_CHEAT_VAL_LT_BY, EM_SETLIMITTEXT, 2, 0);
SendDlgItemMessage(hwndDlg, IDC_CHEAT_TEXT, EM_SETLIMITTEXT, 10, 0);
SendDlgItemMessage(hwndDlg, IDC_CHEAT_GAME_GENIE_TEXT, EM_SETLIMITTEXT, 8, 0);
// limit their characters
DefaultEditCtrlProc = (WNDPROC)SetWindowLong(GetDlgItem(hwndDlg, IDC_CHEAT_ADDR), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
SetWindowLong(GetDlgItem(hwndDlg, IDC_CHEAT_ADDR), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
SetWindowLong(GetDlgItem(hwndDlg, IDC_CHEAT_VAL), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
SetWindowLong(GetDlgItem(hwndDlg, IDC_CHEAT_COM), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
SetWindowLong(GetDlgItem(hwndDlg, IDC_CHEAT_NAME), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
SetWindowLong(GetDlgItem(hwndDlg, IDC_CHEAT_VAL_KNOWN), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
SetWindowLong(GetDlgItem(hwndDlg, IDC_CHEAT_VAL_NE_BY), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
SetWindowLong(GetDlgItem(hwndDlg, IDC_CHEAT_VAL_GT_BY), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
SetWindowLong(GetDlgItem(hwndDlg, IDC_CHEAT_VAL_LT_BY), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
SetWindowLong(GetDlgItem(hwndDlg, IDC_CHEAT_TEXT), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
SetWindowLong(GetDlgItem(hwndDlg, IDC_CHEAT_GAME_GENIE_TEXT), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
possiTotalCount = 0;
possiItemCount = SendDlgItemMessage(hwndDlg, IDC_CHEAT_LIST_POSSIBILITIES, LVM_GETCOUNTPERPAGE, 0, 0);
@ -356,7 +367,7 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
//misc setup
searchdone = 0;
SetDlgItemText(hwndDlg, IDC_CHEAT_VAL_KNOWN, (LPTSTR)U8ToStr(knownvalue));
SetDlgItemText(hwndDlg, IDC_CHEAT_VAL_KNOWN, (LPCSTR)U8ToStr(knownvalue));
// Enable Context Sub-Menus
hCheatcontext = LoadMenu(fceu_hInstance, "CHEATCONTEXTMENUS");
@ -374,7 +385,6 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
wasPausedByCheats = true;
FCEU_printf("Emulation paused: %d\n", EmulationPaused);
}
}
if (CheatStyle && possiTotalCount) {
if ((!wParam) && searchdone) {
@ -384,6 +394,7 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
ShowResults(hwndDlg);
}
break;
case WM_QUIT:
case WM_CLOSE:
if (CheatStyle)
DestroyWindow(hwndDlg);
@ -393,8 +404,7 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
case WM_DESTROY:
CheatWindow = 0;
hCheat = NULL;
DeleteObject(hFont);
DeleteObject(hNewFont);
DeleteCheatFont();
if (searchdone)
FCEUI_CheatSearchSetCurrentAsOriginal();
possiList.clear();
@ -638,12 +648,12 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
RedoCheatsCallB(name, a, v, c, s, 1, &selcheat);
SendDlgItemMessage(hwndDlg, IDC_LIST_CHEATS, LVM_SETSELECTIONMARK, 0, selcheat);
SetDlgItemText(hwndDlg, IDC_CHEAT_ADDR, (LPTSTR)U16ToStr(a));
SetDlgItemText(hwndDlg, IDC_CHEAT_VAL, (LPTSTR)U8ToStr(v));
SetDlgItemText(hwndDlg, IDC_CHEAT_ADDR, (LPCSTR)U16ToStr(a));
SetDlgItemText(hwndDlg, IDC_CHEAT_VAL, (LPCSTR)U8ToStr(v));
if (c == -1)
SetDlgItemText(hwndDlg, IDC_CHEAT_COM, (LPTSTR)"");
SetDlgItemText(hwndDlg, IDC_CHEAT_COM, (LPCSTR)"");
else
SetDlgItemText(hwndDlg, IDC_CHEAT_COM, (LPTSTR)U8ToStr(c));
SetDlgItemText(hwndDlg, IDC_CHEAT_COM, (LPCSTR)U8ToStr(c));
UpdateCheatRelatedWindow();
UpdateCheatListGroupBoxUI();
// UpdateCheatAdded();
@ -742,7 +752,7 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
else
{
disableAutoLSCheats = 0;
CheckDlgButton(hwndDlg, IDC_CHEAT_AUTOLOADSAVE, BST_INDETERMINATE);
CheckDlgButton(hwndDlg, IDC_CHEAT_AUTOLOADSAVE, BST_CHECKED);
}
}
}
@ -754,6 +764,7 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
case IDC_CHEAT_VAL:
case IDC_CHEAT_COM: editMode = 0; break;
case IDC_CHEAT_TEXT: editMode = 1; break;
case IDC_CHEAT_GAME_GENIE_TEXT: editMode = 2; break;
}
break;
case EN_UPDATE:
@ -767,8 +778,13 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
{
char buf[16]; uint32 a; uint8 v; int c;
GetUICheatInfo(hwndDlg, NULL, &a, &v, &c);
GetCheatStr(buf, a, v, c);
buf[0] = 0;
GetCheatCodeStr(buf, a, v, c);
SetDlgItemText(hwndDlg, IDC_CHEAT_TEXT, buf);
buf[0] = 0;
if (a > 0x7FFF && v != -1)
EncodeGG(buf, a, v, c);
SetDlgItemText(hwndDlg, IDC_CHEAT_GAME_GENIE_TEXT, buf);
}
}
break;
@ -778,7 +794,7 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
{
char buf[16];
GetDlgItemText(hwndDlg, IDC_CHEAT_TEXT, buf, 16);
int a = -1, v = -1; int c = -1;
int a = -1, v = -1, c = -1;
if (strchr(buf, ':'))
{
if (strchr(buf, '?'))
@ -786,12 +802,35 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
else
sscanf(buf, "%X:%X", &a, &v);
}
else if (strlen(buf) == 6 || strlen(buf) == 8)
SetDlgItemText(hwndDlg, IDC_CHEAT_ADDR, (LPCSTR)(a == -1 ? "" : U16ToStr(a)));
SetDlgItemText(hwndDlg, IDC_CHEAT_VAL, (LPCSTR)(v == -1 ? "" : U8ToStr(v)));
SetDlgItemText(hwndDlg, IDC_CHEAT_COM, (LPCSTR)(c == -1 ? "" : U8ToStr(c)));
buf[0] = 0;
if (a > 0x7FFF && v != -1)
EncodeGG(buf, a, v, c);
SetDlgItemText(hwndDlg, IDC_CHEAT_GAME_GENIE_TEXT, buf);
}
}
break;
case IDC_CHEAT_GAME_GENIE_TEXT:
{
if (editMode == 2)
{
char buf[16];
GetDlgItemText(hwndDlg, IDC_CHEAT_GAME_GENIE_TEXT, buf, 16);
int a = -1, v = -1, c = -1;
if (strlen(buf) == 6 || strlen(buf) == 8)
FCEUI_DecodeGG(buf, &a, &v, &c);
SetDlgItemText(hwndDlg, IDC_CHEAT_ADDR, (LPTSTR)(a == -1 ? "" : U16ToStr(a)));
SetDlgItemText(hwndDlg, IDC_CHEAT_VAL, (LPTSTR)(v == -1 ? "" : U8ToStr(v)));
SetDlgItemText(hwndDlg, IDC_CHEAT_COM, (LPTSTR)(c == -1 ? "" : U8ToStr(c)));
SetDlgItemText(hwndDlg, IDC_CHEAT_ADDR, (LPCSTR)(a == -1 ? "" : U16ToStr(a)));
SetDlgItemText(hwndDlg, IDC_CHEAT_VAL, (LPCSTR)(v == -1 ? "" : U8ToStr(v)));
SetDlgItemText(hwndDlg, IDC_CHEAT_COM, (LPCSTR)(c == -1 ? "" : U8ToStr(c)));
buf[0] = 0;
if (a != -1 && v != -1)
GetCheatCodeStr(buf, a, v, c);
SetDlgItemText(hwndDlg, IDC_CHEAT_TEXT, buf);
}
}
}
@ -820,15 +859,20 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
{
char* name = ""; uint32 a; uint8 v; int s; int c;
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));
SetDlgItemText(hwndDlg, IDC_CHEAT_COM, (LPTSTR)(c == -1 ? "" : U8ToStr(c)));
SetDlgItemText(hwndDlg, IDC_CHEAT_NAME, (LPCSTR)name);
SetDlgItemText(hwndDlg, IDC_CHEAT_ADDR, (LPCSTR)U16ToStr(a));
SetDlgItemText(hwndDlg, IDC_CHEAT_VAL, (LPCSTR)U8ToStr(v));
SetDlgItemText(hwndDlg, IDC_CHEAT_COM, (LPCSTR)(c == -1 ? "" : U8ToStr(c)));
char code[32];
GetCheatStr(code, a, v, c);
code[0] = 0;
GetCheatCodeStr(code, a, v, c);
SetDlgItemText(hwndDlg, IDC_CHEAT_TEXT, code);
code[0] = 0;
if (a > 0x7FFF && v != -1)
EncodeGG(code, a, v, c);
SetDlgItemText(hwndDlg, IDC_CHEAT_GAME_GENIE_TEXT, code);
}
EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_CHEAT_DEL), selcheatcount > 0);
@ -884,10 +928,10 @@ BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
SEARCHPOSSIBLE& possible = possiList[pNMListView->iItem];
char str[16];
sprintf(str, "%04X", possible.addr);
SetDlgItemText(hwndDlg, IDC_CHEAT_ADDR, (LPCTSTR)str);
SetDlgItemText(hwndDlg, IDC_CHEAT_ADDR, (LPCSTR)str);
sprintf(str, "%02X", possible.current);
SetDlgItemText(hwndDlg, IDC_CHEAT_VAL, (LPCTSTR)str);
SetDlgItemText(hwndDlg, IDC_CHEAT_COM, (LPTSTR)"");
SetDlgItemText(hwndDlg, IDC_CHEAT_VAL, (LPCSTR)str);
SetDlgItemText(hwndDlg, IDC_CHEAT_COM, (LPCSTR)"");
}
}
break;
@ -1003,8 +1047,8 @@ void UpdateCheatsAdded()
BOOL CALLBACK GGConvCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
char str[100];
int i;
// int i;
extern void GetUIGGInfo(HWND hwndDlg, uint32* a, uint8* v, int* c);
switch(uMsg) {
case WM_MOVE: {
@ -1021,73 +1065,85 @@ BOOL CALLBACK GGConvCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
break;
};
case WM_INITDIALOG:
//todo: set text limits
if (GGConv_wndx == -32000)
GGConv_wndx = 0; //Just in case
if (GGConv_wndy == -32000)
GGConv_wndy = 0;
SetWindowPos(hwndDlg, 0, GGConv_wndx, GGConv_wndy, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER);
{
POINT pt;
if (GGConv_wndx != 0 && GGConv_wndy != 0)
{
pt.x = GGConv_wndx;
pt.y = GGConv_wndy;
pt = CalcSubWindowPos(hwndDlg, &pt);
}
else
pt = CalcSubWindowPos(hwndDlg, NULL);
GGConv_wndx = pt.x;
GGConv_wndy = pt.y;
// text limits;
SendDlgItemMessage(hwndDlg, IDC_GAME_GENIE_CODE, EM_SETLIMITTEXT, 8, 0);
SendDlgItemMessage(hwndDlg, IDC_GAME_GENIE_ADDR, EM_SETLIMITTEXT, 4, 0);
SendDlgItemMessage(hwndDlg, IDC_GAME_GENIE_COMP, EM_SETLIMITTEXT, 2, 0);
SendDlgItemMessage(hwndDlg, IDC_GAME_GENIE_VAL, EM_SETLIMITTEXT, 2, 0);
DefaultGGConvWndProc = (WNDPROC)SetWindowLong(GetDlgItem(hwndDlg, IDC_GAME_GENIE_CODE), GWL_WNDPROC, (LONG)GGConvCustomWndProc);
// setup font
SetupCheatFont(hwndDlg);
break;
SendDlgItemMessage(hwndDlg, IDC_GAME_GENIE_ADDR, WM_SETFONT, (WPARAM)hNewFont, FALSE);
SendDlgItemMessage(hwndDlg, IDC_GAME_GENIE_COMP, WM_SETFONT, (WPARAM)hNewFont, FALSE);
SendDlgItemMessage(hwndDlg, IDC_GAME_GENIE_VAL, WM_SETFONT, (WPARAM)hNewFont, FALSE);
// limit their characters
DefaultEditCtrlProc = (WNDPROC)SetWindowLong(GetDlgItem(hwndDlg, IDC_GAME_GENIE_CODE), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
SetWindowLong(GetDlgItem(hwndDlg, IDC_GAME_GENIE_ADDR), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
SetWindowLong(GetDlgItem(hwndDlg, IDC_GAME_GENIE_COMP), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
SetWindowLong(GetDlgItem(hwndDlg, IDC_GAME_GENIE_VAL), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
}
break;
case WM_CLOSE:
case WM_QUIT:
DestroyWindow(hGGConv);
hGGConv = 0;
break;
case WM_DESTROY:
hGGConv = NULL;
DeleteCheatFont();
case WM_COMMAND:
switch(HIWORD(wParam)) {
case EN_UPDATE:
if(dontupdateGG)break;
dontupdateGG = 1;
switch(LOWORD(wParam)){ //lets find out what edit control got changed
switch(LOWORD(wParam))
{
//lets find out what edit control got changed
case IDC_GAME_GENIE_CODE: //The Game Genie Code - in this case decode it.
GetDlgItemText(hGGConv,IDC_GAME_GENIE_CODE,GGcode,9);
if((strlen(GGcode) != 8) && (strlen(GGcode) != 6))break;
{
char buf[9];
GetDlgItemText(hGGConv, IDC_GAME_GENIE_CODE, buf, 9);
FCEUI_DecodeGG(GGcode, &GGaddr, &GGval, &GGcomp);
int a = -1, v = -1, c = -1;
if (strlen(buf) == 6 || strlen(buf) == 8)
FCEUI_DecodeGG(buf, &a, &v, &c);
sprintf(str,"%04X",GGaddr);
SetDlgItemText(hGGConv,IDC_GAME_GENIE_ADDR,str);
if(GGcomp != -1)
sprintf(str,"%02X",GGcomp);
else str[0] = 0;
SetDlgItemText(hGGConv,IDC_GAME_GENIE_COMP,str);
sprintf(str,"%02X",GGval);
SetDlgItemText(hGGConv,IDC_GAME_GENIE_VAL,str);
//ListGGAddresses();
SetDlgItemText(hwndDlg, IDC_GAME_GENIE_ADDR, a == -1 ? "" : U16ToStr(a));
SetDlgItemText(hwndDlg, IDC_GAME_GENIE_COMP, c == -1 ? "" : U8ToStr(c));
SetDlgItemText(hwndDlg, IDC_GAME_GENIE_VAL, v == -1 ? "" : U8ToStr(v));
}
break;
case IDC_GAME_GENIE_ADDR:
case IDC_GAME_GENIE_COMP:
case IDC_GAME_GENIE_VAL:
GetDlgItemText(hGGConv,IDC_GAME_GENIE_ADDR,str,5);
if(strlen(str) != 4) break;
GetDlgItemText(hGGConv,IDC_GAME_GENIE_VAL,str,5);
if(strlen(str) != 2) {GGval = -1; break;}
GGaddr = GetEditHex(hGGConv,IDC_GAME_GENIE_ADDR);
GGval = GetEditHex(hGGConv,IDC_GAME_GENIE_VAL);
GetDlgItemText(hGGConv,IDC_GAME_GENIE_COMP,str,5);
if(strlen(str) != 2) GGcomp = -1;
else GGcomp = GetEditHex(hGGConv,IDC_GAME_GENIE_COMP);
EncodeGG(GGcode, GGaddr, GGval, GGcomp);
SetDlgItemText(hGGConv,IDC_GAME_GENIE_CODE,GGcode);
uint32 a = -1; uint8 v = -1; int c = -1;
GetUIGGInfo(hwndDlg, &a, &v, &c);
char buf[9] = { 0 };
if (a > 0x7FFF && v != -1)
EncodeGG(buf, a, v, c);
SetDlgItemText(hwndDlg, IDC_GAME_GENIE_CODE, buf);
//ListGGAddresses();
break;
}
ListGGAddresses();
ListGGAddresses(hwndDlg);
dontupdateGG = 0;
break;
case BN_CLICKED:
@ -1095,20 +1151,22 @@ BOOL CALLBACK GGConvCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
case IDC_BTN_ADD_TO_CHEATS:
//ConfigCheats(fceu_hInstance);
if(GGaddr < 0x8000)GGaddr += 0x8000;
char buf[9];
uint32 a = -1; uint8 v = -1; int c = -1;
GetUIGGInfo(hwndDlg, &a, &v, &c);
GetDlgItemText(hwndDlg, IDC_GAME_GENIE_CODE, buf, 9);
if (FCEUI_AddCheat(GGcode, GGaddr, GGval, GGcomp, 1) && hCheat) {
RedoCheatsCallB(GGcode, GGaddr, GGval, GGcomp, 1, 1, NULL);
if(a < 0x8000) a += 0x8000;
if (FCEUI_AddCheat(buf, a, v, c, 1) && hCheat) {
RedoCheatsCallB(buf, a, v, c, 1, 1, NULL);
int newselcheat = SendDlgItemMessage(hCheat, IDC_LIST_CHEATS, LVM_GETITEMCOUNT, 0, 0) - 1;
ListView_MoveSelectionMark(GetDlgItem(hCheat, IDC_LIST_CHEATS), selcheat, newselcheat);
selcheat = newselcheat;
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));
SetDlgItemText(hCheat, IDC_CHEAT_ADDR, (LPCSTR)U16ToStr(a));
SetDlgItemText(hCheat, IDC_CHEAT_VAL, (LPCSTR)U8ToStr(v));
SetDlgItemText(hCheat, IDC_CHEAT_COM, (LPCSTR)(c == -1 ? "" : U8ToStr(c)));
EnableWindow(GetDlgItem(hCheat, IDC_BTN_CHEAT_DEL), TRUE);
EnableWindow(GetDlgItem(hCheat, IDC_BTN_CHEAT_UPD), TRUE);
@ -1121,8 +1179,7 @@ BOOL CALLBACK GGConvCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
case LBN_DBLCLK:
switch (LOWORD(wParam)) {
case IDC_LIST_GGADDRESSES:
i = SendDlgItemMessage(hwndDlg,IDC_LIST_GGADDRESSES,LB_GETCURSEL,0,0);
ChangeMemViewFocus(3,GGlist[i],-1);
ChangeMemViewFocus(3,GGlist[SendDlgItemMessage(hwndDlg, IDC_LIST_GGADDRESSES, LB_GETCURSEL, 0, 0)],-1);
break;
}
break;
@ -1132,105 +1189,6 @@ BOOL CALLBACK GGConvCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
return FALSE;
}
LRESULT APIENTRY GGConvCustomWndProc(HWND hDlg, UINT msg, WPARAM wP, LPARAM lP)
{
bool through = true;
LRESULT result = 0;
switch (msg)
{
case WM_PASTE:
{
switch (GetDlgCtrlID(GetFocus()))
{
case IDC_GAME_GENIE_CODE:
printf("PASTE\n");
if (OpenClipboard(hDlg))
{
HANDLE handle = GetClipboardData(CF_TEXT);
if (handle)
{
// copy the original clipboard string
char* clipStr = (char*)GlobalLock(handle);
char* original = (char*)calloc(1, strlen(clipStr) + 1);
strcpy(original, clipStr);
GlobalUnlock(handle);
// filter it out
char filtered[9] = { 0 };
int filteredIndex = 0, origIndex = 0;
while (clipStr[origIndex] && filteredIndex < 9)
{
for (int i = 0; ggLets[i]; ++i)
{
if (toupper(clipStr[origIndex]) == ggLets[i])
{
filtered[filteredIndex] = clipStr[origIndex];
++filteredIndex;
}
}
++origIndex;
}
// copy filtered str to clipboard
EmptyClipboard();
HANDLE hNewStr = GlobalAlloc(GMEM_MOVEABLE, 9);
char* newStr = (char*)GlobalLock(hNewStr);
strcpy(newStr, filtered);
GlobalUnlock(hNewStr);
SetClipboardData(CF_TEXT, hNewStr);
// end
CloseClipboard();
result = CallWindowProc(DefaultGGConvWndProc, hDlg, msg, wP, lP);
through = false;
// set it back to normal
if (OpenClipboard(hDlg))
{
handle = GetClipboardData(CF_TEXT);
if (handle)
{
EmptyClipboard();
HANDLE hOldStr = GlobalAlloc(GMEM_MOVEABLE, strlen(original) + 1);
char* oldStr = (char*)GlobalLock(hOldStr);
strcpy(oldStr, original);
GlobalUnlock(hOldStr);
SetClipboardData(CF_TEXT, hOldStr);
}
CloseClipboard();
}
// end
free(original);
}
}
}
}
break;
case WM_CHAR:
{
switch (GetDlgCtrlID(GetFocus()))
{
case IDC_GAME_GENIE_CODE:
{
through = wP == VK_BACK || GetKeyState(VK_CONTROL) & 0x8000;
if (!through)
for (int i = 0; ggLets[i]; ++i)
if (toupper(wP) == ggLets[i])
{
through = true;
break;
}
}
}
}
}
return through ? CallWindowProc(DefaultGGConvWndProc, hDlg, msg, wP, lP) : result;
}
//The code in this function is a modified version
//of Chris Covell's work - I'd just like to point that out
@ -1250,69 +1208,78 @@ void EncodeGG(char *str, int a, int v, int c)
if (c == -1){
num[5]+=v&8;
for(i = 0;i < 6;i++)str[i] = ggLets[num[i]];
for(i = 0;i < 6;i++)str[i] = GameGenieLetters[num[i]];
str[6] = 0;
} else {
num[2]+=8;
num[5]+=c&8;
num[6]=(c&7)+((c>>4)&8);
num[7]=((c>>4)&7)+(v&8);
for(i = 0;i < 8;i++)str[i] = ggLets[num[i]];
for(i = 0;i < 8;i++)str[i] = GameGenieLetters[num[i]];
str[8] = 0;
}
return;
}
void ListGGAddresses()
void ListGGAddresses(HWND hwndDlg)
{
uint32 i, j = 0; //mbg merge 7/18/06 changed from int
char str[20];
SendDlgItemMessage(hGGConv,IDC_LIST_GGADDRESSES,LB_RESETCONTENT,0,0);
char str[20], code[9];
SendDlgItemMessage(hwndDlg, IDC_LIST_GGADDRESSES, LB_RESETCONTENT,0,0);
//also enable/disable the add GG button here
GetDlgItemText(hGGConv,IDC_GAME_GENIE_CODE,GGcode,9);
uint32 a = -1; uint8 v = -1; int c = -1;
extern void GetUIGGInfo(HWND hwnd, uint32* a, uint8* v, int* c);
GetUIGGInfo(hwndDlg, &a, &v, &c);
if((GGaddr < 0) || ((strlen(GGcode) != 8) && (strlen(GGcode) != 6)))EnableWindow(GetDlgItem(hGGConv,IDC_BTN_ADD_TO_CHEATS),FALSE);
else EnableWindow(GetDlgItem(hGGConv,IDC_BTN_ADD_TO_CHEATS),TRUE);
// also enable/disable the add GG button here
GetDlgItemText(hwndDlg, IDC_GAME_GENIE_CODE, code, 9);
EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_ADD_TO_CHEATS), a >= 0 && (strlen(code) == 6 || strlen(code) == 8));
for(i = 0;i < PRGsize[0];i+=0x2000){
if((PRGptr[0][i+(GGaddr&0x1FFF)] == GGcomp) || (GGcomp == -1)){
GGlist[j] = i+(GGaddr&0x1FFF)+0x10;
if(++j > GGLISTSIZE)return;
sprintf(str,"%06X",i+(GGaddr&0x1FFF)+0x10);
SendDlgItemMessage(hGGConv,IDC_LIST_GGADDRESSES,LB_ADDSTRING,0,(LPARAM)(LPSTR)str);
}
}
if (a != -1 && v != -1)
for(i = 0; i < PRGsize[0]; i += 0x2000)
if(c == -1 || PRGptr[0][i + (a & 0x1FFF)] == c){
GGlist[j] = i + (a & 0x1FFF) + 0x10;
if(++j > GGLISTSIZE)
return;
sprintf(str, "%06X", i + (a & 0x1FFF) + 0x10);
SendDlgItemMessage(hwndDlg, IDC_LIST_GGADDRESSES, LB_ADDSTRING, 0, (LPARAM)str);
}
}
//A different model for this could be to have everything
//set in the INITDIALOG message based on the internal
//variables, and have this simply call that.
void SetGGConvFocus(int address,int compare)
void SetGGConvFocus(int address, int compare)
{
char str[10];
if(!hGGConv)DoGGConv();
GGaddr = address;
GGcomp = compare;
if(!hGGConv)
DoGGConv();
// GGaddr = address;
// GGcomp = compare;
dontupdateGG = 1; //little hack to fix a nasty bug
sprintf(str,"%04X",address);
SetDlgItemText(hGGConv,IDC_GAME_GENIE_ADDR,str);
sprintf(str, "%04X", address);
SetDlgItemText(hGGConv, IDC_GAME_GENIE_ADDR, str);
dontupdateGG = 0;
sprintf(str,"%02X",GGcomp);
SetDlgItemText(hGGConv,IDC_GAME_GENIE_COMP,str);
sprintf(str, "%02X", compare);
SetDlgItemText(hGGConv, IDC_GAME_GENIE_COMP, str);
GetDlgItemText(hGGConv, IDC_GAME_GENIE_VAL, str, 3);
uint8 val = StrToU8(str);
if(GGval < 0)SetDlgItemText(hGGConv,IDC_GAME_GENIE_CODE,"");
if(val < 0)
SetDlgItemText(hGGConv, IDC_GAME_GENIE_CODE, "");
else {
EncodeGG(GGcode, GGaddr, GGval, GGcomp);
SetDlgItemText(hGGConv,IDC_GAME_GENIE_CODE,GGcode);
str[0] = 0;
if (val > 0x7FFF)
EncodeGG(str, address, val, compare);
SetDlgItemText(hGGConv, IDC_GAME_GENIE_CODE, str);
}
SetFocus(GetDlgItem(hGGConv,IDC_GAME_GENIE_VAL));
SetFocus(GetDlgItem(hGGConv, IDC_GAME_GENIE_VAL));
return;
}
@ -1329,15 +1296,19 @@ void DoGGConv()
inline void GetCheatStr(char* buf, int a, int v, int c)
{
if (a >= 0x8000)
if (a > 0x7FFF)
EncodeGG(buf, a, v, c);
else {
if (c == -1)
sprintf(buf, "%04X:%02X", (int)a, (int)v);
else
sprintf(buf, "%04X?%02X:%02X", (int)a, (int)c, (int)v);
GetCheatCodeStr(buf, a, v, c);
}
}
inline void GetCheatCodeStr(char* buf, int a, int v, int c)
{
if (c == -1)
sprintf(buf, "%04X:%02X", a, v);
else
sprintf(buf, "%04X?%02X:%02X", a, c, v);
}
void GetUICheatInfo(HWND hwndDlg, char* name, uint32* a, uint8* v, int* c)
@ -1353,6 +1324,17 @@ void GetUICheatInfo(HWND hwndDlg, char* name, uint32* a, uint8* v, int* c)
GetDlgItemText(hwndDlg, IDC_CHEAT_NAME, name, 256);
}
void GetUIGGInfo(HWND hwndDlg, uint32* a, uint8* v, int* c)
{
char buf[16];
GetDlgItemText(hwndDlg, IDC_GAME_GENIE_ADDR, buf, 5);
*a = StrToU16(buf);
GetDlgItemText(hwndDlg, IDC_GAME_GENIE_VAL, buf, 3);
*v = StrToU8(buf);
GetDlgItemText(hwndDlg, IDC_GAME_GENIE_COMP, buf, 3);
*c = (buf[0] == 0 ? -1 : StrToU8(buf));
}
void DisableAllCheats()
{
if(FCEU_DisableAllCheats() && hCheat){
@ -1479,4 +1461,27 @@ void SaveCheatAs(HWND hwnd, bool flush)
MessageBox(hwnd, "Error saving cheats!", "Cheat Console", MB_OK | MB_ICONERROR);
}
}
}
void SetupCheatFont(HWND hwnd)
{
if (!hCheat && !hGGConv)
{
hFont = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0);
LOGFONT lf;
GetObject(hFont, sizeof(LOGFONT), &lf);
strcpy(lf.lfFaceName, "Courier New");
hNewFont = CreateFontIndirect(&lf);
}
}
void DeleteCheatFont()
{
if (!hCheat && !hGGConv)
{
DeleteObject(hFont);
DeleteObject(hNewFont);
hFont = NULL;
hNewFont = NULL;
}
}

View File

@ -13,18 +13,20 @@ typedef unsigned int HWAddressType;
void ConfigCheats(HWND hParent);
void DoGGConv();
void SetGGConvFocus(int address,int compare);
void SetGGConvFocus(int address, int compare);
void UpdateCheatList();
void UpdateCheatListGroupBoxUI();
void UpdateCheatsAdded();
void ToggleCheatInputMode(HWND hwndDlg, int modeId);
void GetUICheatInfo(HWND hwndDlg, char* name, uint32* a, uint8* v, int* c);
inline void GetCheatStr(char* buf, int a, int v, int c);
inline void GetCheatCodeStr(char* buf, int a, int v, int c);
extern unsigned int FrozenAddressCount;
extern std::vector<uint16> FrozenAddresses;
//void ConfigAddCheat(HWND wnd); //bbit edited:commented out this line
extern struct CHEATF* cheats;
extern char* GameGenieLetters;
void DisableAllCheats();
bool ShowCheatFileBox(HWND hwnd, char* buf, bool save = false);
@ -32,11 +34,13 @@ void AskSaveCheat();
void SaveCheatAs(HWND hwnd, bool flush = false);
void UpdateCheatRelatedWindow();
void SetupCheatFont(HWND hDlg);
void DeleteCheatFont();
extern POINT CalcSubWindowPos(HWND hDlg, POINT* conf);
extern BOOL CALLBACK GGConvCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
extern WNDPROC DefaultGGConvWndProc;
extern LRESULT APIENTRY GGConvCustomWndProc(HWND hDlg, UINT msg, WPARAM wP, LPARAM lP);
extern LRESULT APIENTRY FilterEditCtrlProc(HWND hDlg, UINT msg, WPARAM wP, LPARAM lP);
extern WNDPROC DefaultEditCtrlProc;
// deselect the old one and select the new one
@ -47,10 +51,11 @@ SendMessage(hwnd, LVM_SETITEMSTATE, newIndex, (LPARAM)&(lvi.state = LVIS_SELECTE
SendMessage(hwnd, LVM_SETSELECTIONMARK, 0, newIndex)
#define ClearCheatListText(hwnd) \
(SetDlgItemText(hwnd, IDC_CHEAT_ADDR, (LPTSTR)"") & \
SetDlgItemText(hwnd, IDC_CHEAT_VAL, (LPTSTR)"") & \
SetDlgItemText(hwnd, IDC_CHEAT_COM, (LPTSTR)"") & \
SetDlgItemText(hwnd, IDC_CHEAT_NAME, (LPTSTR)"") & \
SetDlgItemText(hwnd, IDC_CHEAT_TEXT, (LPTSTR)""))
(SetDlgItemText(hwnd, IDC_CHEAT_ADDR, (LPCSTR)"") & \
SetDlgItemText(hwnd, IDC_CHEAT_VAL, (LPCSTR)"") & \
SetDlgItemText(hwnd, IDC_CHEAT_COM, (LPCSTR)"") & \
SetDlgItemText(hwnd, IDC_CHEAT_NAME, (LPCSTR)"") & \
SetDlgItemText(hwnd, IDC_CHEAT_TEXT, (LPCSTR)"") & \
SetDlgItemText(hwnd, IDC_CHEAT_GAME_GENIE_TEXT, (LPCSTR)""))
#endif

View File

@ -271,11 +271,50 @@ HWND InitHeaderEditDialog(HWND hwnd, iNES_HEADER* header)
// Playchoice-10 will be finally determined in ToggleUnofficialPropertiesEnabled()
// EnableWindow(GetDlgItem(hwnd, IDC_RADIO_SYSTEM_PLAYCHOICE10), TRUE);
ToggleINES20(hwnd, IsDlgButtonChecked(hwnd, IDC_RADIO_VERSION_INES20) == BST_CHECKED);
// Limit text
// Sub Mapper#
SendDlgItemMessage(hwnd, IDC_SUBMAPPER_EDIT, EM_SETLIMITTEXT, 2, 0);
// Misc. ROM(s)
SendDlgItemMessage(hwnd, IDC_MISCELLANEOUS_ROMS_EDIT, EM_SETLIMITTEXT, 1, 0);
// Assign ID to the sub edit control in these comboboxes
// PRG ROM
SetWindowLong(GetWindow(GetDlgItem(hwnd, IDC_PRGROM_COMBO), GW_CHILD), GWL_ID, IDC_PRGROM_EDIT);
// PRG RAM
SetWindowLong(GetWindow(GetDlgItem(hwnd, IDC_PRGRAM_COMBO), GW_CHILD), GWL_ID, IDC_PRGRAM_EDIT);
// PRG NVRAM
SetWindowLong(GetWindow(GetDlgItem(hwnd, IDC_PRGNVRAM_COMBO), GW_CHILD), GWL_ID, IDC_PRGNVRAM_EDIT);
// CHR ROM
SetWindowLong(GetWindow(GetDlgItem(hwnd, IDC_CHRROM_COMBO), GW_CHILD), GWL_ID, IDC_CHRROM_EDIT);
// CHR RAM
SetWindowLong(GetWindow(GetDlgItem(hwnd, IDC_CHRRAM_COMBO), GW_CHILD), GWL_ID, IDC_CHRRAM_EDIT);
// CHR NVRAM
SetWindowLong(GetWindow(GetDlgItem(hwnd, IDC_CHRNVRAM_COMBO), GW_CHILD), GWL_ID, IDC_CHRNVRAM_EDIT);
// Change the default wndproc of these control to limit their text
// PRG ROM
DefaultEditCtrlProc = (WNDPROC)SetWindowLong(GetDlgItem(GetDlgItem(hwnd, IDC_PRGROM_COMBO), IDC_PRGROM_EDIT), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
// PRG RAM
SetWindowLong(GetDlgItem(GetDlgItem(hwnd, IDC_PRGRAM_COMBO), IDC_PRGRAM_EDIT), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
// PRG NVRAM
SetWindowLong(GetDlgItem(GetDlgItem(hwnd, IDC_PRGNVRAM_COMBO), IDC_PRGNVRAM_EDIT), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
// CHR ROM
SetWindowLong(GetDlgItem(GetDlgItem(hwnd, IDC_CHRROM_COMBO), IDC_CHRROM_EDIT), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
// CHR RAM
SetWindowLong(GetDlgItem(GetDlgItem(hwnd, IDC_CHRRAM_COMBO), IDC_CHRRAM_EDIT), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
// CHR NVRAM
SetWindowLong(GetDlgItem(GetDlgItem(hwnd, IDC_CHRNVRAM_COMBO), IDC_CHRNVRAM_EDIT), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
// Sub Mapper#
SetWindowLong(GetDlgItem(hwnd, IDC_SUBMAPPER_EDIT), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
// Misc. ROM(s)
SetWindowLong(GetDlgItem(hwnd, IDC_MISCELLANEOUS_ROMS_EDIT), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
ToggleINES20(hwnd, IsDlgButtonChecked(hwnd, IDC_RADIO_VERSION_INES20) == BST_CHECKED);
char buf[256];
for (int i = 0; dropDownIdList[i]; ++i)
for (int j = 0; dropDownList[i][j]; ++j)
@ -293,7 +332,7 @@ HWND InitHeaderEditDialog(HWND hwnd, iNES_HEADER* header)
}
// add usually used size strings
strcpy(buf, "N/A");
strcpy(buf, "0B");
SendDlgItemMessage(hwnd, IDC_PRGROM_COMBO, CB_SETITEMDATA, SendDlgItemMessage(hwnd, IDC_PRGROM_COMBO, CB_ADDSTRING, 0, (LPARAM)buf), 0);
SendDlgItemMessage(hwnd, IDC_CHRROM_COMBO, CB_SETITEMDATA, SendDlgItemMessage(hwnd, IDC_CHRROM_COMBO, CB_ADDSTRING, 0, (LPARAM)buf), 0);
SendDlgItemMessage(hwnd, IDC_PRGRAM_COMBO, CB_SETITEMDATA, SendDlgItemMessage(hwnd, IDC_PRGRAM_COMBO, CB_ADDSTRING, 0, (LPARAM)buf), 0);
@ -603,7 +642,7 @@ void SetHeaderData(HWND hwnd, iNES_HEADER* header) {
SetDlgItemText(hwnd, IDC_SUBMAPPER_EDIT, buf);
// PRG ROM
strcpy(buf, "N/A");
strcpy(buf, "0B");
int prg_rom = header->ROM_size;
if (ines20) {
if ((header->Upper_ROM_VROM_size & 0xF) == 0xF)
@ -625,7 +664,7 @@ void SetHeaderData(HWND hwnd, iNES_HEADER* header) {
SetDlgItemText(hwnd, IDC_PRGROM_COMBO, buf);
// PRG RAM
strcpy(buf, "N/A");
strcpy(buf, "0B");
if (ines20)
{
int shift = header->RAM_size & 0xF;
@ -646,7 +685,7 @@ void SetHeaderData(HWND hwnd, iNES_HEADER* header) {
SetDlgItemText(hwnd, IDC_PRGRAM_COMBO, buf);
// PRG NVRAM
strcpy(buf, "N/A");
strcpy(buf, "0B");
if (ines20)
{
int shift = header->RAM_size >> 4;
@ -666,7 +705,7 @@ void SetHeaderData(HWND hwnd, iNES_HEADER* header) {
// CHR ROM
strcpy(buf, "N/A");
strcpy(buf, "0B");
int chr_rom = header->VROM_size;
if (ines20)
{
@ -689,7 +728,7 @@ void SetHeaderData(HWND hwnd, iNES_HEADER* header) {
SetDlgItemText(hwnd, IDC_CHRROM_COMBO, buf);
// CHR RAM
sprintf(buf, "N/A");
sprintf(buf, "0B");
if (ines20)
{
int shift = header->VRAM_size & 0xF;
@ -705,7 +744,7 @@ void SetHeaderData(HWND hwnd, iNES_HEADER* header) {
SetDlgItemText(hwnd, IDC_CHRRAM_COMBO, buf);
// CHR NVRAM
sprintf(buf, "N/A");
sprintf(buf, "0B");
if (ines20)
{
int shift = header->VRAM_size >> 4;
@ -1374,13 +1413,13 @@ bool WriteHeaderData(HWND hwnd, iNES_HEADER* header)
printf("%02X ", _header.ROM_type);
printf("%02X ", _header.ROM_type2);
printf("%02X ", _header.ROM_type3);
printf("%02X ", _header.Upper_ROM_VROM_size);
printf("%02X ", _header.RAM_size);
printf("%02X ", _header.VRAM_size);
printf("%02X ", _header.TV_system);
printf("%02X ", _header.VS_hardware);
printf("%02X ", _header.reserved[0]);
printf("%02X\n", _header.reserved[1]);
printf("%02X ", _header.Upper_ROM_VROM_size);
printf("%02X ", _header.RAM_size);
printf("%02X ", _header.VRAM_size);
printf("%02X ", _header.TV_system);
printf("%02X ", _header.VS_hardware);
printf("%02X ", _header.reserved[0]);
printf("%02X\n", _header.reserved[1]);
#endif
return true;

View File

@ -1,9 +1,11 @@
#ifndef HEADEREDITOR_H
#define HEADEREDITOR_H
extern HWND hHeadEditor;
struct iNES_HEADER;
extern HWND hHeadEditor;
void DoHeadEdit();
HWND InitHeaderEditDialog(HWND hwnd, iNES_HEADER* header);
bool ShowINESFileBox(HWND parent, char* buf = NULL, bool save = false);
void ToggleINES20(HWND hwnd, bool ines20);
@ -19,7 +21,11 @@ int GetComboBoxByteSize(HWND hwnd, UINT id, int* value);
bool SearchByString(HWND hwnd, UINT id, int* value, char* buf);
bool GetComboBoxListItemData(HWND hwnd, UINT id, int* value, char* buf, bool exact = false);
bool SaveINESFile(HWND hwnd, char* path, iNES_HEADER* header);
LRESULT CALLBACK HeaderEditorProc(HWND hDlg, UINT uMsg, WPARAM wP, LPARAM lP);
void DoHeadEdit();
extern WNDPROC DefaultEditCtrlProc;
extern LRESULT APIENTRY FilterEditCtrlProc(HWND hwnd, UINT msg, WPARAM wP, LPARAM lP);
extern POINT CalcSubWindowPos(HWND hDlg, POINT* conf);
#endif

View File

@ -1245,7 +1245,6 @@ LRESULT CustomDraw (LPARAM lParam)
{
case CDDS_PREPAINT :
return CDRF_NOTIFYITEMDRAW;
case CDDS_ITEMPREPAINT:
{
int rv = CDRF_DODEFAULT;

View File

@ -12,11 +12,35 @@
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// ·ÇÌØ¶¨ÓïÑÔ resources
// English(U.S) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
3 TEXTINCLUDE
BEGIN
"\r\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\0"
END
#endif // APSTUDIO_INVOKED
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU)
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
#pragma code_page(936)
/////////////////////////////////////////////////////////////////////////////
//
@ -1489,30 +1513,30 @@ BEGIN
CONTROL "Log Bank number",IDC_CHECK_LOG_BANK_NUMBER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,211,121,100,10
END
ADDBP DIALOGEX 66, 83, 196, 130
ADDBP DIALOGEX 66, 83, 197, 125
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Add Breakpoint..."
FONT 8, "Tahoma", 0, 0, 0x0
BEGIN
LTEXT "Address:",-1,14,5,30,10
CTEXT "-",65534,78,5,8,8
LTEXT "&Address:",-1,14,6,30,10
EDITTEXT IDC_ADDBP_ADDR_START,48,4,30,12,ES_UPPERCASE | ES_WANTRETURN
EDITTEXT IDC_ADDBP_ADDR_END,83,4,30,12,ES_UPPERCASE | ES_WANTRETURN
CONTROL "Read",IDC_ADDBP_MODE_R,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,25,35,12
CONTROL "Write",IDC_ADDBP_MODE_W,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,49,25,35,12
CONTROL "Execute",IDC_ADDBP_MODE_X,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,86,25,40,12
DEFPUSHBUTTON "&OK",IDOK,99,113,42,13
PUSHBUTTON "&Cancel",IDCANCEL,147,114,42,13
GROUPBOX "Memory",108,9,39,174,24,WS_TABSTOP
CONTROL "CPU Mem",IDC_ADDBP_MEM_CPU,"Button",BS_AUTORADIOBUTTON | WS_GROUP,13,49,50,10
CONTROL "PPU Mem",IDC_ADDBP_MEM_PPU,"Button",BS_AUTORADIOBUTTON,68,49,50,10
CONTROL "Sprite Mem",IDC_ADDBP_MEM_SPR,"Button",BS_AUTORADIOBUTTON,124,49,50,10
EDITTEXT IDC_ADDBP_CONDITION,43,72,136,14,ES_AUTOHSCROLL
LTEXT "Condition",65533,7,74,30,8
LTEXT "Name",65532,8,92,20,8
EDITTEXT IDC_ADDBP_NAME,43,89,136,14,ES_AUTOHSCROLL
CONTROL "Forbid",IDC_ADDBP_MODE_F,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,145,6,40,12
CTEXT "-",65534,78,6,8,8
EDITTEXT IDC_ADDBP_ADDR_END,87,4,30,12,ES_UPPERCASE | ES_WANTRETURN
CONTROL "&Forbid",IDC_ADDBP_MODE_F,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,154,6,33,12
GROUPBOX "",112,3,18,185,50,WS_TABSTOP
CONTROL "&Read",IDC_ADDBP_MODE_R,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,25,35,12
CONTROL "&Write",IDC_ADDBP_MODE_W,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,49,25,35,12
CONTROL "&Execute",IDC_ADDBP_MODE_X,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,86,25,40,12
GROUPBOX "Memory",108,9,39,174,24,WS_TABSTOP
CONTROL "&CPU Mem",IDC_ADDBP_MEM_CPU,"Button",BS_AUTORADIOBUTTON | WS_GROUP,13,49,50,10
CONTROL "&PPU Mem",IDC_ADDBP_MEM_PPU,"Button",BS_AUTORADIOBUTTON,68,49,50,10
CONTROL "&Sprite Mem",IDC_ADDBP_MEM_SPR,"Button",BS_AUTORADIOBUTTON,124,49,50,10
LTEXT "C&ondition:",65533,7,74,34,8
EDITTEXT IDC_ADDBP_CONDITION,43,72,136,14,ES_AUTOHSCROLL
LTEXT "&Name:",65532,8,92,20,8
EDITTEXT IDC_ADDBP_NAME,43,89,136,14,ES_AUTOHSCROLL
DEFPUSHBUTTON "OK",IDOK,99,110,42,13
PUSHBUTTON "Cancel",IDCANCEL,147,110,42,13
END
NTVIEW DIALOGEX 44, 38, 352, 350
@ -1568,18 +1592,18 @@ STYLE DS_SYSMODAL | DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_MINIMIZEBOX | WS
CAPTION "Game Genie Encoder/Decoder Tool"
FONT 8, "Tahoma", 0, 0, 0x0
BEGIN
EDITTEXT IDC_GAME_GENIE_CODE,115,22,53,14,ES_UPPERCASE | ES_AUTOHSCROLL
GROUPBOX "Game Genie Code",-1,107,5,69,42
EDITTEXT IDC_GAME_GENIE_CODE,115,22,53,14,ES_UPPERCASE | ES_AUTOHSCROLL
PUSHBUTTON "Add To Cheat List",IDC_BTN_ADD_TO_CHEATS,108,58,68,14,WS_DISABLED
GROUPBOX "Address/Compare/Value",65534,9,5,91,75
LTEXT "Address:",65533,18,24,35,8
EDITTEXT IDC_GAME_GENIE_ADDR,50,21,36,14,ES_AUTOHSCROLL
EDITTEXT IDC_GAME_GENIE_COMP,64,38,22,14,ES_AUTOHSCROLL
EDITTEXT IDC_GAME_GENIE_VAL,64,56,22,14,ES_AUTOHSCROLL
EDITTEXT IDC_GAME_GENIE_ADDR,50,21,36,14,ES_UPPERCASE | ES_AUTOHSCROLL
LTEXT "Compare:",65532,17,41,37,8
EDITTEXT IDC_GAME_GENIE_COMP,64,38,22,14,ES_UPPERCASE | ES_AUTOHSCROLL
LTEXT "Value:",65531,18,58,32,8
EDITTEXT IDC_GAME_GENIE_VAL,64,56,22,14,ES_UPPERCASE | ES_AUTOHSCROLL
GROUPBOX "Possible Affected Rom File Addresses",65530,8,83,169,58
LISTBOX IDC_LIST_GGADDRESSES,67,95,54,40,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Add To Cheat List",IDC_BTN_ADD_TO_CHEATS,108,58,68,14,WS_DISABLED
END
MONITOR DIALOGEX 0, 0, 316, 343
@ -1996,8 +2020,10 @@ BEGIN
EDITTEXT IDC_CHEAT_VAL,97,174,16,12,ES_UPPERCASE | ES_WANTRETURN
LTEXT "Compare:",IDC_CHEAT_COM_LABEL,117,176,34,8
EDITTEXT IDC_CHEAT_COM,152,174,16,12,ES_UPPERCASE | ES_WANTRETURN
LTEXT "Cheat code / Game Genie:",IDC_CHEAT_CODE_GG_LABEL,11,190,87,8
EDITTEXT IDC_CHEAT_TEXT,105,188,63,12,ES_UPPERCASE | ES_AUTOHSCROLL
LTEXT "Cheat Code:",IDC_CHEAT_CODE_LABEL,12,190,42,8
EDITTEXT IDC_CHEAT_TEXT,55,188,47,12,ES_UPPERCASE | ES_AUTOHSCROLL
LTEXT "GG:",IDC_GAME_GENIE_LABEL,106,191,13,8
EDITTEXT IDC_CHEAT_GAME_GENIE_TEXT,120,188,47,12,ES_UPPERCASE | ES_AUTOHSCROLL
DEFPUSHBUTTON "Add",IDC_BTN_CHEAT_ADD,7,202,30,16
PUSHBUTTON "Delete",IDC_BTN_CHEAT_DEL,37,202,30,16
PUSHBUTTON "Update",IDC_BTN_CHEAT_UPD,67,202,30,16
@ -2429,8 +2455,8 @@ BEGIN
"ADDBP", DIALOG
BEGIN
RIGHTMARGIN, 185
BOTTOMMARGIN, 121
RIGHTMARGIN, 195
BOTTOMMARGIN, 123
END
"NTVIEW", DIALOG
@ -2606,6 +2632,11 @@ BEGIN
0
END
ADDBP AFX_DIALOG_LAYOUT
BEGIN
0
END
/////////////////////////////////////////////////////////////////////////////
//
@ -2777,31 +2808,7 @@ IDB_BITMAP_SELECTED17 BITMAP "res\\te_17_selected.bmp"
IDB_BITMAP_SELECTED18 BITMAP "res\\te_18_selected.bmp"
IDB_BITMAP_SELECTED19 BITMAP "res\\te_19_selected.bmp"
IDB_BRANCH_SPRITESHEET BITMAP "res\\branch_spritesheet.bmp"
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
3 TEXTINCLUDE
BEGIN
"\r\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\0"
END
#endif // APSTUDIO_INVOKED
#endif // ·ÇÌØ¶¨ÓïÑÔ resources
#endif // English(U.S.) resources
/////////////////////////////////////////////////////////////////////////////

View File

@ -1,6 +1,6 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by res.rc
// Microsoft Visual C++ generated include file
// for res.rc
//
#define CLOSE_BUTTON 1
#define BUTTON_CLOSE 1
@ -553,16 +553,26 @@
#define IDC_BUTTON1 1094
#define IDC_CHEAT_SWITCH 1096
#define IDC_CHEAT_GLOBAL_SWITCH 1096
#define IDC_GAME_GENIE_LABEL 1097
#define IDC_CHEAT_GAME_GENIE_TEXT 1098
#define IDC_CHECK2 1099
#define IDC_SHOW_GG 1099
#define BTN_ALLOW_LRUD 1117
#define IDC_PRGROM_EDIT 1118
#define IDC_CHRROM_EDIT 1119
#define BTN_PRESET_SET1 1119
#define BTN_PRESET_SET2 1120
#define BTN_PRESET_SET3 1121
#define BTN_PRESET_IMPORT1 1122
#define BTN_PRESET_IMPORT2 1123
#define BTN_PRESET_IMPORT3 1124
#define IDC_PRGRAM_EDIT 1125
#define BTN_PRESET_EXPORT1 1125
#define BTN_PRESET_EXPORT2 1126
#define BTN_PRESET_EXPORT3 1127
#define IDC_CHRRAM_EDIT 1128
#define IDC_PRGNVRAM_EDIT 1129
#define IDC_CHRNVRAM_EDIT 1130
#define IDC_LIST1 1130
#define IDC_BUTTON_METADATA 1132
#define MEMW_EXPANDCOLLAPSE 1133
@ -764,7 +774,7 @@
#define IDC_EXTRA_SCANLINES_TEXT 1309
#define IDC_DATASIZE_GROUPBOX 1310
#define IDC_DATATYPE_GROUPBOX 1311
#define IDC_CHEAT_CODE_GG_LABEL 1312
#define IDC_CHEAT_CODE_LABEL 1312
#define IDC_CHEAT_ADDRESS_LABEL 1313
#define IDC_CHEAT_VAL_LABEL 1314
#define IDC_CHEAT_COM_LABEL 1315
@ -1065,7 +1075,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 305
#define _APS_NEXT_COMMAND_VALUE 40002
#define _APS_NEXT_CONTROL_VALUE 1097
#define _APS_NEXT_CONTROL_VALUE 1100
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View File

@ -182,6 +182,7 @@ const unsigned int MAX_NUMBER_OF_MOVIE_RECENT_FILES = sizeof(recent_movie)/sizeo
int EnableBackgroundInput = 0;
int ismaximized = 0;
WNDPROC DefaultEditCtrlProc;
//Help Menu subtopics
string moviehelp = "MovieRecording"; //Movie Recording
@ -3259,4 +3260,162 @@ POINT CalcSubWindowPos(HWND hDlg, POINT* conf)
// return the calculated point, maybe the caller can use it for further.
return pt;
}
LRESULT APIENTRY FilterEditCtrlProc(HWND hwnd, UINT msg, WPARAM wP, LPARAM lP)
{
bool through = true;
LRESULT result = 0;
switch (msg)
{
case WM_PASTE:
{
bool(*IsLetterLegal)(char) = GetIsLetterLegal(GetDlgCtrlID(hwnd));
if (IsLetterLegal)
{
if (OpenClipboard(hwnd))
{
HANDLE handle = GetClipboardData(CF_TEXT);
if (handle)
{
// copy the original clipboard string
char* clipStr = (char*)GlobalLock(handle);
char* original = (char*)calloc(1, strlen(clipStr) + 1);
strcpy(original, clipStr);
GlobalUnlock(handle);
// filter it out
int lmt = SendMessage(hwnd, EM_GETLIMITTEXT, 0, 0);
char* filtered = (char*)calloc(1, lmt + 1);
int filteredIndex = 0, origIndex = 0;
while (clipStr[origIndex] && filteredIndex < lmt + 1)
{
if (IsLetterLegal(clipStr[origIndex]))
{
filtered[filteredIndex] = clipStr[origIndex];
++filteredIndex;
}
++origIndex;
}
// copy filtered str to clipboard
EmptyClipboard();
HANDLE hNewStr = GlobalAlloc(GMEM_MOVEABLE, lmt);
char* newStr = (char*)GlobalLock(hNewStr);
strcpy(newStr, filtered);
GlobalUnlock(hNewStr);
SetClipboardData(CF_TEXT, hNewStr);
// end
CloseClipboard();
result = CallWindowProc(DefaultEditCtrlProc, hwnd, msg, wP, lP);
through = false;
free(filtered);
// set it back to normal
if (OpenClipboard(hwnd))
{
handle = GetClipboardData(CF_TEXT);
if (handle)
{
EmptyClipboard();
HANDLE hOldStr = GlobalAlloc(GMEM_MOVEABLE, strlen(original) + 1);
char* oldStr = (char*)GlobalLock(hOldStr);
strcpy(oldStr, original);
GlobalUnlock(hOldStr);
SetClipboardData(CF_TEXT, hOldStr);
}
CloseClipboard();
}
// end
free(original);
}
}
}
}
break;
case WM_CHAR:
through = IsInputLegal(GetDlgCtrlID(GetFocus()), wP);
}
return through ? CallWindowProc(DefaultEditCtrlProc, hwnd, msg, wP, lP) : result;
}
bool inline (*GetIsLetterLegal(UINT id))(char letter)
{
switch (id)
{
case IDC_CHEAT_GAME_GENIE_TEXT:
case IDC_GAME_GENIE_CODE:
return IsLetterLegalGG;
case IDC_CHEAT_ADDR:
case IDC_CHEAT_VAL:
case IDC_CHEAT_COM:
case IDC_CHEAT_NAME:
case IDC_CHEAT_VAL_KNOWN:
case IDC_CHEAT_VAL_NE_BY:
case IDC_CHEAT_VAL_GT_BY:
case IDC_CHEAT_VAL_LT_BY:
case IDC_GAME_GENIE_ADDR:
case IDC_GAME_GENIE_COMP:
case IDC_GAME_GENIE_VAL:
return IsLetterLegalHex;
case IDC_CHEAT_TEXT:
return IsLetterLegalCheat;
case IDC_PRGROM_EDIT:
case IDC_PRGRAM_EDIT:
case IDC_PRGNVRAM_EDIT:
case IDC_CHRROM_EDIT:
case IDC_CHRRAM_EDIT:
case IDC_CHRNVRAM_EDIT:
return IsLetterLegalSize;
case IDC_SUBMAPPER_EDIT:
case IDC_MISCELLANEOUS_ROMS_EDIT:
return IsLetterLegalPosDec;
}
return NULL;
}
bool inline IsInputLegal(UINT id, char letter)
{
bool(*IsLetterLegal)(char) = GetIsLetterLegal(id);
return !IsLetterLegal || letter == VK_BACK || GetKeyState(VK_CONTROL) & 0x8000 || IsLetterLegal(letter);
}
bool inline IsLetterLegalGG(char letter)
{
char ch = toupper(letter);
for (int i = 0; GameGenieLetters[i]; ++i)
if (GameGenieLetters[i] == ch)
return true;
return false;
}
bool inline IsLetterLegalHex(char letter)
{
return letter >= '0' && letter <= '9' || letter >= 'A' && letter <= 'F' || letter >= 'a' && letter <= 'f';
}
bool inline IsLetterLegalCheat(char letter)
{
return letter >= '0' && letter <= ':' || letter >= 'A' && letter <= 'F' || letter >= 'a' && letter <= 'f' || letter == '?';
}
bool inline IsLetterLegalSize(char letter)
{
return letter >= '0' && letter <= '9' || letter == 'm' || letter == 'M' || letter == 'k' || letter == 'K' || letter == 'b' || letter == 'B';
}
bool inline IsLetterLegalPosDec(char letter)
{
return letter >= '0' && letter <= '9';
}
bool inline IsLetterLegalDec(char letter)
{
return letter >= '0' && letter <= '9' || letter == '-';
}

View File

@ -127,4 +127,17 @@ struct HOTKEYMENUINDEX {
void UpdateMenuHotkeys(FCEUMENU_INDEX index);
int GetCurrentContextIndex();
bool inline (*GetIsLetterLegal(UINT id))(char letter);
bool inline IsInputLegal(UINT id, char letter);
bool inline IsLetterLegalGG(char letter);
bool inline IsLetterLegalHex(char letter);
bool inline IsLetterLegalCheat(char letter);
bool inline IsLetterLegalDec(char letter);
bool inline IsLetterLegalPosDec(char letter);
bool inline IsLetterLegalSize(char letter);
extern WNDPROC DefaultEditCtrlProc;
extern LRESULT APIENTRY FilterEditCtrlProc(HWND hDlg, UINT msg, WPARAM wP, LPARAM lP);
#endif