/* FCE Ultra - NES/Famicom Emulator * * Copyright notice for this file: * Copyright (C) 2002 Ben Parnell * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "common.h" #include "cheat.h" #include "memview.h" #include "debugger.h" #include "..\..\fceu.h" #include "..\..\cart.h" HWND hCheat; //mbg merge 7/19/06 had to add int CheatWindow,CheatStyle; //mbg merge 7/19/06 had to add #define GGLISTSIZE 128 //hopefully this is enough for all cases int selcheat; int ChtPosX,ChtPosY; static HFONT hFont,hNewFont; static int scrollindex; static int scrollnum; static int scrollmax; int lbfocus=0; int searchdone; static int knownvalue=0; int GGaddr, GGcomp, GGval; char GGcode[10]; int GGlist[GGLISTSIZE]; static int dontupdateGG; //this eliminates recursive crashing HWND hGGConv; void EncodeGG(char *str, int a, int v, int c); void ListGGAddresses(); uint16 StrToU16(char *s) { unsigned int ret=0; sscanf(s,"%4x",&ret); return ret; } uint8 StrToU8(char *s) { unsigned int ret=0; sscanf(s,"%2x",&ret); return ret; } char *U16ToStr(uint16 a) { static char str[5]; sprintf(str,"%04X",a); return str; } char *U8ToStr(uint8 a) { static char str[3]; sprintf(str,"%02X",a); return str; } 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) { 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); SendDlgItemMessage(hwndLB,101,LB_ADDSTRING,0,(LPARAM)(LPSTR)str); return 1; } void RedoCheatsLB(HWND hwndDlg) { SendDlgItemMessage(hwndDlg,101,LB_RESETCONTENT,0,0); hwndLB=hwndDlg; FCEUI_ListCheats(RedoCheatsCallB,0); } int ShowResultsCallB(uint32 a, uint8 last, uint8 current) { char temp[16]; sprintf(temp,"$%04X: %02X | %02X",(unsigned int)a,last,current); SendDlgItemMessage(hwndLB,106,LB_ADDSTRING,0,(LPARAM)(LPSTR)temp); return 1; } void ShowResults(HWND hwndDlg) { int n=FCEUI_CheatSearchGetCount(); int t; char str[20]; scrollnum=n; scrollindex=-32768; hwndLB=hwndDlg; SendDlgItemMessage(hwndDlg,106,LB_RESETCONTENT,0,0); FCEUI_CheatSearchGetRange(0,16,ShowResultsCallB); t=-32768+n-17; if (t<-32768) t=-32768; scrollmax=t; SendDlgItemMessage(hwndDlg,107,SBM_SETRANGE,-32768,t); SendDlgItemMessage(hwndDlg,107,SBM_SETPOS,-32768,1); sprintf(str,"%d Possibilities",n); SetDlgItemText(hwndDlg,203,str); } void EnableCheatButtons(HWND hwndDlg, int enable) { EnableWindow(GetDlgItem(hwndDlg,105),enable); EnableWindow(GetDlgItem(hwndDlg,305),enable); EnableWindow(GetDlgItem(hwndDlg,306),enable); EnableWindow(GetDlgItem(hwndDlg,307),enable); EnableWindow(GetDlgItem(hwndDlg,308),enable); EnableWindow(GetDlgItem(hwndDlg,309),enable); } extern void StopSound(void); BOOL CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { LOGFONT lf; RECT wrect; char str[259] = { 0 },str2[259] = { 0 }; char *name; uint32 a; uint8 v; int s; switch (uMsg) { case WM_INITDIALOG: StopSound(); SetWindowPos(hwndDlg,0,ChtPosX,ChtPosY,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER); //setup font hFont = (HFONT)SendMessage(hwndDlg, WM_GETFONT, 0, 0); GetObject(hFont, sizeof(LOGFONT), &lf); strcpy(lf.lfFaceName,"Courier"); hNewFont = CreateFontIndirect(&lf); SendDlgItemMessage(hwndDlg,102,WM_SETFONT,(WPARAM)hNewFont,FALSE); SendDlgItemMessage(hwndDlg,103,WM_SETFONT,(WPARAM)hNewFont,FALSE); SendDlgItemMessage(hwndDlg,105,WM_SETFONT,(WPARAM)hNewFont,FALSE); SendDlgItemMessage(hwndDlg,106,WM_SETFONT,(WPARAM)hNewFont,FALSE); SendDlgItemMessage(hwndDlg,108,WM_SETFONT,(WPARAM)hNewFont,FALSE); SendDlgItemMessage(hwndDlg,109,WM_SETFONT,(WPARAM)hNewFont,FALSE); SendDlgItemMessage(hwndDlg,110,WM_SETFONT,(WPARAM)hNewFont,FALSE); //text limits SendDlgItemMessage(hwndDlg,102,EM_SETLIMITTEXT,4,0); SendDlgItemMessage(hwndDlg,103,EM_SETLIMITTEXT,2,0); SendDlgItemMessage(hwndDlg,104,EM_SETLIMITTEXT,256,0); SendDlgItemMessage(hwndDlg,105,EM_SETLIMITTEXT,2,0); SendDlgItemMessage(hwndDlg,108,EM_SETLIMITTEXT,2,0); SendDlgItemMessage(hwndDlg,109,EM_SETLIMITTEXT,2,0); SendDlgItemMessage(hwndDlg,110,EM_SETLIMITTEXT,2,0); //disable or enable buttons EnableWindow(GetDlgItem(hwndDlg,105),FALSE); EnableWindow(GetDlgItem(hwndDlg,302),FALSE); EnableWindow(GetDlgItem(hwndDlg,303),FALSE); if (scrollnum) { EnableCheatButtons(hwndDlg,TRUE); ShowResults(hwndDlg); sprintf(str,"%d Possibilities",(int)FCEUI_CheatSearchGetCount()); SetDlgItemText(hwndDlg,203,str); } else EnableCheatButtons(hwndDlg,FALSE); //misc setup RedoCheatsLB(hwndDlg); searchdone=0; SetDlgItemText(hwndDlg,105,(LPTSTR)U8ToStr(knownvalue)); break; case WM_NCACTIVATE: if ((CheatStyle) && (scrollnum)) { if ((!wParam) && (searchdone)) { searchdone=0; FCEUI_CheatSearchSetCurrentAsOriginal(); } ShowResults(hwndDlg); } break; case WM_CLOSE: case WM_QUIT: CheatWindow=0; hCheat = 0; if (CheatStyle) DestroyWindow(hwndDlg); else EndDialog(hwndDlg,0); DeleteObject(hFont); DeleteObject(hNewFont); if (searchdone) FCEUI_CheatSearchSetCurrentAsOriginal(); break; case WM_MOVE: GetWindowRect(hwndDlg,&wrect); ChtPosX = wrect.left; ChtPosY = wrect.top; break; case WM_VSCROLL: if (scrollnum > 16) { StopSound(); switch (LOWORD(wParam)) { case SB_TOP: scrollindex=-32768; SendDlgItemMessage(hwndDlg,107,SBM_SETPOS,scrollindex,1); SendDlgItemMessage(hwndDlg,106,LB_RESETCONTENT,16,0); FCEUI_CheatSearchGetRange(scrollindex+32768,scrollindex+32768+16,ShowResultsCallB); break; case SB_BOTTOM: scrollindex=scrollmax; SendDlgItemMessage(hwndDlg,107,SBM_SETPOS,scrollindex,1); SendDlgItemMessage(hwndDlg,106,LB_RESETCONTENT,16,0); FCEUI_CheatSearchGetRange(scrollindex+32768,scrollindex+32768+16,ShowResultsCallB); break; case SB_LINEUP: if (scrollindex > -32768) { scrollindex--; SendDlgItemMessage(hwndDlg,107,SBM_SETPOS,scrollindex,1); SendDlgItemMessage(hwndDlg,106,LB_RESETCONTENT,16,0); FCEUI_CheatSearchGetRange(scrollindex+32768,scrollindex+32768+16,ShowResultsCallB); } break; case SB_PAGEUP: scrollindex-=17; if(scrollindex<-32768) scrollindex=-32768; SendDlgItemMessage(hwndDlg,107,SBM_SETPOS,scrollindex,1); SendDlgItemMessage(hwndDlg,106,LB_RESETCONTENT,16,0); FCEUI_CheatSearchGetRange(scrollindex+32768,scrollindex+32768+16,ShowResultsCallB); break; case SB_LINEDOWN: if (scrollindexscrollmax) scrollindex=scrollmax; SendDlgItemMessage(hwndDlg,107,SBM_SETPOS,scrollindex,1); SendDlgItemMessage(hwndDlg,106,LB_RESETCONTENT,0,0); FCEUI_CheatSearchGetRange(scrollindex+32768,scrollindex+32768+16,ShowResultsCallB); break; case SB_THUMBPOSITION: case SB_THUMBTRACK: scrollindex=(short int)HIWORD(wParam); SendDlgItemMessage(hwndDlg,107,SBM_SETPOS,scrollindex,1); SendDlgItemMessage(hwndDlg,106,LB_RESETCONTENT,0,0); FCEUI_CheatSearchGetRange(32768+scrollindex,32768+scrollindex+16,ShowResultsCallB); break; } } break; case WM_VKEYTOITEM: if (lbfocus) { int real; real=SendDlgItemMessage(hwndDlg,106,LB_GETCURSEL,0,0); switch (LOWORD(wParam)) { case VK_UP: // mmmm....recursive goodness if (real == 0) SendMessage(hwndDlg,WM_VSCROLL,SB_LINEUP,0); return -1; break; case VK_DOWN: if (real == 16) { SendMessage(hwndDlg,WM_VSCROLL,SB_LINEDOWN,0); SendDlgItemMessage(hwndDlg,106,LB_SETCURSEL,real,0); } return -1; break; case VK_PRIOR: SendMessage(hwndDlg,WM_VSCROLL,SB_PAGEUP,0); break; case VK_NEXT: SendMessage(hwndDlg,WM_VSCROLL,SB_PAGEDOWN,0); break; case VK_HOME: SendMessage(hwndDlg,WM_VSCROLL,SB_TOP,0); break; case VK_END: SendMessage(hwndDlg,WM_VSCROLL,SB_BOTTOM,0); break; } return -2; } break; case WM_COMMAND: switch (HIWORD(wParam)) { case BN_CLICKED: switch (LOWORD(wParam)) { case 301: //Add GetDlgItemText(hwndDlg,102,str,5); a=StrToU16(str); GetDlgItemText(hwndDlg,103,str,3); v=StrToU8(str); GetDlgItemText(hwndDlg,104,str,256); // 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 strcpy(str2,"* "); strcat(str2,str); SendDlgItemMessage(hwndDlg,101,LB_ADDSTRING,0,(LPARAM)(LPSTR)str2); selcheat = (SendDlgItemMessage(hwndDlg,101,LB_GETCOUNT,0,0) - 1); SendDlgItemMessage(hwndDlg,101,LB_SETCURSEL,selcheat,0); SetDlgItemText(hwndDlg,102,(LPTSTR)U16ToStr(a)); SetDlgItemText(hwndDlg,103,(LPTSTR)U8ToStr(v)); EnableWindow(GetDlgItem(hwndDlg,302),TRUE); EnableWindow(GetDlgItem(hwndDlg,303),TRUE); } if(hMemView)UpdateColorTable(); //if the memory viewer is open then update any blue freeze locations in it as well break; case 302: //Delete if (selcheat >= 0) { FCEUI_DelCheat(selcheat); SendDlgItemMessage(hwndDlg,101,LB_DELETESTRING,selcheat,0); selcheat=-1; SetDlgItemText(hwndDlg,102,(LPTSTR)""); SetDlgItemText(hwndDlg,103,(LPTSTR)""); SetDlgItemText(hwndDlg,104,(LPTSTR)""); } EnableWindow(GetDlgItem(hwndDlg,302),FALSE); EnableWindow(GetDlgItem(hwndDlg,303),FALSE); if(hMemView)UpdateColorTable(); //if the memory viewer is open then update any blue freeze locations in it as well break; case 303: //Update if (selcheat < 0) break; GetDlgItemText(hwndDlg,102,str,5); a=StrToU16(str); GetDlgItemText(hwndDlg,103,str,3); v=StrToU8(str); GetDlgItemText(hwndDlg,104,str,256); // 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_GetCheat(selcheat,&name,&a,&v,&s); //bbit edited: replaced this with the line below FCEUI_GetCheat(selcheat,&name,&a,&v,NULL,&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 strcat(str2,str); SendDlgItemMessage(hwndDlg,101,LB_DELETESTRING,selcheat,0); SendDlgItemMessage(hwndDlg,101,LB_INSERTSTRING,selcheat,(LPARAM)(LPSTR)str2); SendDlgItemMessage(hwndDlg,101,LB_SETCURSEL,selcheat,0); SetDlgItemText(hwndDlg,102,(LPTSTR)U16ToStr(a)); SetDlgItemText(hwndDlg,103,(LPTSTR)U8ToStr(v)); if(hMemView)UpdateColorTable(); //if the memory viewer is open then update any blue freeze locations in it as well break; case 304: //Reset FCEUI_CheatSearchBegin(); ShowResults(hwndDlg); EnableCheatButtons(hwndDlg,TRUE); break; case 305: //Known Value searchdone=1; GetDlgItemText(hwndDlg,105,str,3); knownvalue=StrToU8(str); FCEUI_CheatSearchEnd(4,knownvalue,0); ShowResults(hwndDlg); break; case 306: //Equal searchdone=1; FCEUI_CheatSearchEnd(2,0,0); ShowResults(hwndDlg); break; case 307: //Not Equal searchdone=1; if (IsDlgButtonChecked(hwndDlg,401) == BST_CHECKED) { GetDlgItemText(hwndDlg,108,str,3); FCEUI_CheatSearchEnd(2,0,StrToU8(str)); } else FCEUI_CheatSearchEnd(3,0,0); ShowResults(hwndDlg); break; case 308: //Greater Than searchdone=1; if (IsDlgButtonChecked(hwndDlg,402) == BST_CHECKED) { GetDlgItemText(hwndDlg,109,str,3); FCEUI_CheatSearchEnd(7,0,StrToU8(str)); } else FCEUI_CheatSearchEnd(5,0,0); ShowResults(hwndDlg); break; case 309: //Less Than searchdone=1; if (IsDlgButtonChecked(hwndDlg,403) == BST_CHECKED) { GetDlgItemText(hwndDlg,110,str,3); FCEUI_CheatSearchEnd(8,0,StrToU8(str)); } else FCEUI_CheatSearchEnd(6,0,0); ShowResults(hwndDlg); break; } break; case LBN_DBLCLK: switch (LOWORD(wParam)) { //disable/enable cheat case 101: // 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_SetCheat(selcheat,0,-1,-1,s^=1);//bbit edited: replaced this with the line below FCEUI_SetCheat(selcheat,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); SendDlgItemMessage(hwndDlg,101,LB_DELETESTRING,selcheat,0); SendDlgItemMessage(hwndDlg,101,LB_INSERTSTRING,selcheat,(LPARAM)(LPSTR)str); SendDlgItemMessage(hwndDlg,101,LB_SETCURSEL,selcheat,0); UpdateColorTable(); break; } break; case LBN_SELCHANGE: switch (LOWORD(wParam)) { case 101: selcheat = SendDlgItemMessage(hwndDlg,101,LB_GETCURSEL,0,0); if (selcheat < 0) break; FCEUI_GetCheat(selcheat,&name,&a,&v,NULL,&s,NULL); SetDlgItemText(hwndDlg,104,(LPTSTR)name); SetDlgItemText(hwndDlg,102,(LPTSTR)U16ToStr(a)); SetDlgItemText(hwndDlg,103,(LPTSTR)U8ToStr(v)); EnableWindow(GetDlgItem(hwndDlg,302),TRUE); EnableWindow(GetDlgItem(hwndDlg,303),TRUE); break; case 106: lbfocus=1; SendDlgItemMessage(hwndDlg,106,LB_GETTEXT,SendDlgItemMessage(hwndDlg,106,LB_GETCURSEL,0,0),(LPARAM)(LPCTSTR)str); strcpy(str2,str+1); str2[4] = 0; SetDlgItemText(hwndDlg,102,(LPTSTR)str2); strcpy(str2,str+13); SetDlgItemText(hwndDlg,103,(LPTSTR)str2); break; } break; case LBN_SELCANCEL: switch(LOWORD(wParam)) { case 101: EnableWindow(GetDlgItem(hwndDlg,302),FALSE); EnableWindow(GetDlgItem(hwndDlg,303),FALSE); break; case 106: lbfocus=0; break; } break; } break; } return 0; } void ConfigCheats(HWND hParent) { if (!GI) { FCEUD_PrintError("You must have a game loaded before you can manipulate cheats."); return; } if (GI->type==GIT_NSF) { FCEUD_PrintError("Sorry, you can't cheat with NSFs."); return; } if (!CheatWindow) { selcheat=-1; CheatWindow=1; if (CheatStyle) hCheat = CreateDialog(fceu_hInstance,"CHEATCONSOLE",NULL,CheatConsoleCallB); else DialogBox(fceu_hInstance,"CHEATCONSOLE",hParent,CheatConsoleCallB); } } BOOL CALLBACK GGConvCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { char str[100]; int i; switch(uMsg) { case WM_INITDIALOG: //todo: set text limits break; case WM_CREATE: break; case WM_PAINT: break; case WM_CLOSE: case WM_QUIT: DestroyWindow(hGGConv); hGGConv = 0; break; 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 case 1000: //The Game Genie Code - in this case decode it. GetDlgItemText(hGGConv,1000,GGcode,9); if((strlen(GGcode) != 8) && (strlen(GGcode) != 6))break; FCEUI_DecodeGG(GGcode, (uint16 *)&GGaddr, (uint8 *)&GGval, &GGcomp); sprintf(str,"%04X",GGaddr); SetDlgItemText(hGGConv,1001,str); if(GGcomp != -1) sprintf(str,"%02X",GGcomp); else str[0] = 0; SetDlgItemText(hGGConv,1002,str); sprintf(str,"%02X",GGval); SetDlgItemText(hGGConv,1003,str); //ListGGAddresses(); break; case 1001: case 1002: case 1003: GetDlgItemText(hGGConv,1001,str,5); if(strlen(str) != 4) break; GetDlgItemText(hGGConv,1003,str,5); if(strlen(str) != 2) {GGval = -1; break;} GGaddr = GetEditHex(hGGConv,1001); GGval = GetEditHex(hGGConv,1003); GetDlgItemText(hGGConv,1002,str,5); if(strlen(str) != 2) GGcomp = -1; else GGcomp = GetEditHex(hGGConv,1002); EncodeGG(GGcode, GGaddr, GGval, GGcomp); SetDlgItemText(hGGConv,1000,GGcode); //ListGGAddresses(); break; } ListGGAddresses(); dontupdateGG = 0; break; case BN_CLICKED: switch (LOWORD(wParam)) { case 1005: //Add Cheat //ConfigCheats(fceu_hInstance); if(GGaddr < 0x8000)GGaddr += 0x8000; if (FCEUI_AddCheat(GGcode,GGaddr,GGval,GGcomp,1) && (hCheat != 0)) { strcpy(str,"* "); strcat(str,GGcode); SendDlgItemMessage(hCheat,101,LB_ADDSTRING,0,(LPARAM)(LPSTR)str); selcheat = (SendDlgItemMessage(hCheat,101,LB_GETCOUNT,0,0) - 1); SendDlgItemMessage(hCheat,101,LB_SETCURSEL,selcheat,0); SetDlgItemText(hCheat,102,(LPTSTR)U16ToStr(GGaddr)); SetDlgItemText(hCheat,103,(LPTSTR)U8ToStr(GGval)); EnableWindow(GetDlgItem(hCheat,302),TRUE); EnableWindow(GetDlgItem(hCheat,303),TRUE); } } break; case LBN_DBLCLK: switch (LOWORD(wParam)) { case 1004: i = SendDlgItemMessage(hwndDlg,1004,LB_GETCURSEL,0,0); ChangeMemViewFocus(2,GGlist[i],-1); break; } break; } break; case WM_MOUSEMOVE: break; case WM_HSCROLL: break; } return FALSE; } //The code in this function is a modified version //of Chris Covell's work - I'd just like to point that out void EncodeGG(char *str, int a, int v, int c){ uint8 num[8]; static char lets[16]={'A','P','Z','L','G','I','T','Y','E','O','X','U','K','S','V','N'}; int i; if(a > 0x8000)a-=0x8000; num[0]=(v&7)+((v>>4)&8); num[1]=((v>>4)&7)+((a>>4)&8); num[2]=((a>>4)&7); num[3]=(a>>12)+(a&8); num[4]=(a&7)+((a>>8)&8); num[5]=((a>>8)&7); if (c == -1){ num[5]+=v&8; for(i = 0;i < 6;i++)str[i] = lets[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] = lets[num[i]]; str[8] = 0; } return; } void ListGGAddresses(){ uint32 i, j = 0; //mbg merge 7/18/06 changed from int char str[20]; SendDlgItemMessage(hGGConv,1004,LB_RESETCONTENT,0,0); //also enable/disable the add GG button here GetDlgItemText(hGGConv,1000,GGcode,9); if((GGaddr < 0) || ((strlen(GGcode) != 8) && (strlen(GGcode) != 6)))EnableWindow(GetDlgItem(hGGConv,1005),FALSE); else EnableWindow(GetDlgItem(hGGConv,1005),TRUE); 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,1004,LB_ADDSTRING,0,(LPARAM)(LPSTR)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){ char str[10]; if(!hGGConv)DoGGConv(); GGaddr = address; GGcomp = compare; dontupdateGG = 1; //little hack to fix a nasty bug sprintf(str,"%04X",address); SetDlgItemText(hGGConv,1001,str); dontupdateGG = 0; sprintf(str,"%02X",GGcomp); SetDlgItemText(hGGConv,1002,str); if(GGval < 0)SetDlgItemText(hGGConv,1000,""); else { EncodeGG(GGcode, GGaddr, GGval, GGcomp); SetDlgItemText(hGGConv,1000,GGcode); } SetFocus(GetDlgItem(hGGConv,1003)); return; } void DoGGConv(){ if(hGGConv)return; hGGConv = CreateDialog(fceu_hInstance,"GGCONV",NULL,GGConvCallB); return; }