diff --git a/src/drivers/win/cheat.cpp b/src/drivers/win/cheat.cpp index 4348241a..7629da5e 100644 --- a/src/drivers/win/cheat.cpp +++ b/src/drivers/win/cheat.cpp @@ -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; + } } \ No newline at end of file diff --git a/src/drivers/win/cheat.h b/src/drivers/win/cheat.h index ee5a818c..28acc9e2 100644 --- a/src/drivers/win/cheat.h +++ b/src/drivers/win/cheat.h @@ -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 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 \ No newline at end of file diff --git a/src/drivers/win/header_editor.cpp b/src/drivers/win/header_editor.cpp index 7548d8c3..3ff4f14a 100644 --- a/src/drivers/win/header_editor.cpp +++ b/src/drivers/win/header_editor.cpp @@ -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; diff --git a/src/drivers/win/header_editor.h b/src/drivers/win/header_editor.h index ac62e9ae..6548f35a 100644 --- a/src/drivers/win/header_editor.h +++ b/src/drivers/win/header_editor.h @@ -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 diff --git a/src/drivers/win/ram_search.cpp b/src/drivers/win/ram_search.cpp index 1cff7fd0..a9fd503d 100644 --- a/src/drivers/win/ram_search.cpp +++ b/src/drivers/win/ram_search.cpp @@ -1245,7 +1245,6 @@ LRESULT CustomDraw (LPARAM lParam) { case CDDS_PREPAINT : return CDRF_NOTIFYITEMDRAW; - case CDDS_ITEMPREPAINT: { int rv = CDRF_DODEFAULT; diff --git a/src/drivers/win/res.rc b/src/drivers/win/res.rc index ab93e342..dabbb4a8 100644 --- a/src/drivers/win/res.rc +++ b/src/drivers/win/res.rc @@ -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 ///////////////////////////////////////////////////////////////////////////// diff --git a/src/drivers/win/resource.h b/src/drivers/win/resource.h index 31385be4..c7775678 100644 --- a/src/drivers/win/resource.h +++ b/src/drivers/win/resource.h @@ -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 diff --git a/src/drivers/win/window.cpp b/src/drivers/win/window.cpp index 52edc646..ae54a9ba 100644 --- a/src/drivers/win/window.cpp +++ b/src/drivers/win/window.cpp @@ -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 == '-'; } \ No newline at end of file diff --git a/src/drivers/win/window.h b/src/drivers/win/window.h index e17ba51f..a8c8b1a0 100644 --- a/src/drivers/win/window.h +++ b/src/drivers/win/window.h @@ -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