void HandleScan(HWND hwndDlg, FCEUFILE* file, int& i) { MOVIE_INFO info; bool scanok = FCEUI_MovieGetInfo(file, info, true); if(!scanok) return; //------------ //attempt to match the movie with the rom //first, try matching md5 //then try matching base name char md51 [256]; char md52 [256]; strcpy(md51, md5_asciistr(GameInfo->MD5)); strcpy(md52, md5_asciistr(info.md5_of_rom_used)); if(strcmp(md51, md52)) { unsigned int k, count1=0, count2=0; //mbg merge 7/17/06 changed to uint for(k=0;k<strlen(md51);k++) count1 += md51[k]-'0'; for(k=0;k<strlen(md52);k++) count2 += md52[k]-'0'; if(count1 && count2) return; const char* tlen1=strstr(file->filename.c_str(), " ("); const char* tlen2=strstr(FileBase, " ("); int tlen3=tlen1?(int)(tlen1-file->filename.c_str()):file->filename.size(); int tlen4=tlen2?(int)(tlen2-FileBase):strlen(FileBase); int len=MAX(0,MIN(tlen3,tlen4)); if(strnicmp(file->filename.c_str(), FileBase, len)) { char temp[512]; strcpy(temp,FileBase); temp[len]='\0'; if(!strstr(file->filename.c_str(), temp)) return; } } //------------- //if we get here, then we had a match char relative[MAX_PATH]; AbsoluteToRelative(relative, file->fullFilename.c_str(), BaseDirectory.c_str()); SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_INSERTSTRING, i++, (LPARAM)relative); }
int UNIFLoad(const char *name, FCEUFILE *fp) { FCEU_fseek(fp, 0, SEEK_SET); FCEU_fread(&unhead, 1, 4, fp); if (memcmp(&unhead, "UNIF", 4)) return 0; ResetCartMapping(); ResetExState(0, 0); ResetUNIF(); if (!FCEU_read32le(&unhead.info, fp)) goto aborto; if (FCEU_fseek(fp, 0x20, SEEK_SET) < 0) goto aborto; if (!LoadUNIFChunks(fp)) goto aborto; { int x; struct md5_context md5; md5_starts(&md5); for (x = 0; x < 32; x++) if (malloced[x]) { md5_update(&md5, malloced[x], mallocedsizes[x]); } md5_finish(&md5, UNIFCart.MD5); FCEU_printf(" ROM MD5: 0x%s\n", md5_asciistr(UNIFCart.MD5)); memcpy(FCEUGameInfo->MD5, UNIFCart.MD5, sizeof(UNIFCart.MD5)); } if (!InitializeBoard()) goto aborto; FCEU_LoadGameSave(&UNIFCart); GameInterface = UNIFGI; return 1; aborto: FreeUNIF(); ResetUNIF(); return 0; }
char *FCEU_MakeFName(int type, int id1, char *cd1) { char *ret = 0; struct stat tmpstat; switch (type) { #ifndef __LIBRETRO__ case FCEUMKF_NPTEMP: asprintf(&ret, "%s"PSS "m590plqd94fo.tmp", BaseDirectory); break; case FCEUMKF_MOVIE: if (odirs[FCEUIOD_STATE]) asprintf(&ret, "%s"PSS "%s.%d.fcm", odirs[FCEUIOD_STATE], FileBase, id1); else asprintf(&ret, "%s"PSS "fcs"PSS "%s.%d.fcm", BaseDirectory, FileBase, id1); if (stat(ret, &tmpstat) == -1) { if (odirs[FCEUIOD_STATE]) asprintf(&ret, "%s"PSS "%s.%s.%d.fcm", odirs[FCEUIOD_STATE], FileBase, md5_asciistr(FCEUGameInfo->MD5), id1); else asprintf(&ret, "%s"PSS "fcs"PSS "%s.%s.%d.fcm", BaseDirectory, FileBase, md5_asciistr(FCEUGameInfo->MD5), id1); } break; case FCEUMKF_STATE: if (odirs[FCEUIOD_STATE]) asprintf(&ret, "%s"PSS "%s.fc%d", odirs[FCEUIOD_STATE], FileBase, id1); else asprintf(&ret, "%s"PSS "fcs"PSS "%s.fc%d", BaseDirectory, FileBase, id1); if (stat(ret, &tmpstat) == -1) { // if(odirs[FCEUIOD_STATE]) // asprintf(&ret,"%s"PSS"%s.%s.fc%d",odirs[FCEUIOD_STATE],FileBase,md5_asciistr(FCEUGameInfo->MD5),id1); // else // asprintf(&ret,"%s"PSS"fcs"PSS"%s.%s.fc%d",BaseDirectory,FileBase,md5_asciistr(FCEUGameInfo->MD5),id1); if (odirs[FCEUIOD_STATE]) asprintf(&ret, "%s"PSS "%s.fc%d", odirs[FCEUIOD_STATE], FileBase, id1); else asprintf(&ret, "%s"PSS "fcs"PSS "%s.fc%d", BaseDirectory, FileBase, id1); } break; case FCEUMKF_SNAP: if (FSettings.SnapName) { if (odirs[FCEUIOD_SNAPS]) asprintf(&ret, "%s"PSS "%s-%d.%s", odirs[FCEUIOD_SNAPS], FileBase, id1, cd1); else asprintf(&ret, "%s"PSS "snaps"PSS "%s-%d.%s", BaseDirectory, FileBase, id1, cd1); } else { if (odirs[FCEUIOD_SNAPS]) asprintf(&ret, "%s"PSS "%d.%s", odirs[FCEUIOD_SNAPS], id1, cd1); else asprintf(&ret, "%s"PSS "snaps"PSS "%d.%s", BaseDirectory, id1, cd1); } break; case FCEUMKF_FDS: if (odirs[FCEUIOD_NV]) asprintf(&ret, "%s"PSS "%s.%s.fds", odirs[FCEUIOD_NV], FileBase, md5_asciistr(FCEUGameInfo->MD5)); else asprintf(&ret, "%s"PSS "sav"PSS "%s.%s.fds", BaseDirectory, FileBase, md5_asciistr(FCEUGameInfo->MD5)); break; case FCEUMKF_SAV: if (odirs[FCEUIOD_NV]) asprintf(&ret, "%s"PSS "%s.%s", odirs[FCEUIOD_NV], FileBase, cd1); else asprintf(&ret, "%s"PSS "sav"PSS "%s.%s", BaseDirectory, FileBase, cd1); if (stat(ret, &tmpstat) == -1) { if (odirs[FCEUIOD_NV]) asprintf(&ret, "%s"PSS "%s.%s.%s", odirs[FCEUIOD_NV], FileBase, md5_asciistr(FCEUGameInfo->MD5), cd1); else asprintf(&ret, "%s"PSS "sav"PSS "%s.%s.%s", BaseDirectory, FileBase, md5_asciistr(FCEUGameInfo->MD5), cd1); } break; case FCEUMKF_CHEAT: if (odirs[FCEUIOD_CHEATS]) asprintf(&ret, "%s"PSS "%s.cht", odirs[FCEUIOD_CHEATS], FileBase); else asprintf(&ret, "%s"PSS "cheats"PSS "%s.cht", BaseDirectory, FileBase); break; case FCEUMKF_IPS: asprintf(&ret, "%s"PSS "%s%s.ips", FileBaseDirectory, FileBase, FileExt); break; #endif case FCEUMKF_GGROM: asprintf(&ret, "%s"PSS "gg.rom", BaseDirectory); break; case FCEUMKF_FDSROM: asprintf(&ret, "%s"PSS "disksys.rom", BaseDirectory); break; case FCEUMKF_PALETTE: if (odirs[FCEUIOD_MISC]) asprintf(&ret, "%s"PSS "%s.pal", odirs[FCEUIOD_MISC], FileBase); else asprintf(&ret, "%s"PSS "gameinfo"PSS "%s.pal", BaseDirectory, FileBase); break; default: ret=malloc(1); *ret='\0'; } return(ret); }
BOOL CALLBACK ReplayDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_INITDIALOG: { SendDlgItemMessage(hwndDlg, IDC_CHECK_READONLY, BM_SETCHECK, replayReadOnlySetting?BST_CHECKED:BST_UNCHECKED, 0); SendDlgItemMessage(hwndDlg, IDC_CHECK_STOPMOVIE,BM_SETCHECK, BST_UNCHECKED, 0); #define NUM_OF_MOVIEGLOB_PATHS 1 char* findGlob[NUM_OF_MOVIEGLOB_PATHS] = {strdup(FCEU_MakeFName(FCEUMKF_MOVIEGLOB, 0, 0).c_str())}; int items=0; for(int j = 0;j < NUM_OF_MOVIEGLOB_PATHS; j++) { char* temp=0; do { temp=strchr(findGlob[j],'/'); if(temp) *temp = '\\'; } while(temp); // disabled because... apparently something is case sensitive?? // for(i=1;i<strlen(findGlob[j]);i++) // findGlob[j][i] = tolower(findGlob[j][i]); } for(int j = 0;j < NUM_OF_MOVIEGLOB_PATHS; j++) { // if the two directories are the same, only look through one of them to avoid adding everything twice if(j==1 && !strnicmp(findGlob[0],findGlob[1],MAX(strlen(findGlob[0]),strlen(findGlob[1]))-6)) continue; char globBase[512]; strcpy(globBase,findGlob[j]); globBase[strlen(globBase)-5]='\0'; //char szFindPath[512]; //mbg merge 7/17/06 removed WIN32_FIND_DATA wfd; HANDLE hFind; memset(&wfd, 0, sizeof(wfd)); hFind = FindFirstFile(findGlob[j], &wfd); if(hFind != INVALID_HANDLE_VALUE) { do { if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue; //TODO - a big copy/pasted block below. factor out extension extractor or use another one // filter out everything that's not an extension we like (*.fm2 and *.fm3) // (because FindFirstFile is too dumb to do that) { std::string ext = getExtension(wfd.cFileName); if(ext != "fm2") if(ext != "fm3") if(ext != "zip") if(ext != "rar") if(ext != "7z") continue; } char filename [512]; sprintf(filename, "%s%s", globBase, wfd.cFileName); //replay system requires this to stay put. SetCurrentDirectory(BaseDirectory.c_str()); ArchiveScanRecord asr = FCEUD_ScanArchive(filename); if(!asr.isArchive()) { FCEUFILE* fp = FCEU_fopen(filename,0,"rb",0); if(fp) { //fp->stream = fp->stream->memwrap(); - no need to load whole movie to memory! We only need to read movie header! HandleScan(hwndDlg, fp, items); delete fp; } } else { asr.files.FilterByExtension(fm2ext); for(uint32 i=0;i<asr.files.size();i++) { FCEUFILE* fp = FCEU_fopen(filename,0,"rb",0,asr.files[i].index); if(fp) { HandleScan(hwndDlg,fp, items); delete fp; } } } } while(FindNextFile(hFind, &wfd)); FindClose(hFind); } } for(int j = 0; j < NUM_OF_MOVIEGLOB_PATHS; j++) free(findGlob[j]); if(items>0) SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_SETCURSEL, items-1, 0); SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_INSERTSTRING, items++, (LPARAM)"Browse..."); UpdateReplayDialog(hwndDlg); } SetFocus(GetDlgItem(hwndDlg, IDC_COMBO_FILENAME)); return FALSE; case WM_COMMAND: if (HIWORD(wParam) == EN_CHANGE) { if (LOWORD(wParam) == IDC_EDIT_STOPFRAME) // Check if Stop movie at value has changed { if (stopframeWasEditedByUser) { HWND hwnd1 = GetDlgItem(hwndDlg,IDC_CHECK_STOPMOVIE); Button_SetCheck(hwnd1,BST_CHECKED); stopframeWasEditedByUser = true; } else stopframeWasEditedByUser = true; } } if (HIWORD(wParam) == CBN_SELCHANGE) { UpdateReplayDialog(hwndDlg); } else if(HIWORD(wParam) == CBN_CLOSEUP) { LONG lCount = SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_GETCOUNT, 0, 0); LONG lIndex = SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_GETCURSEL, 0, 0); if (lIndex != CB_ERR && lIndex == lCount-1) SendMessage(hwndDlg, WM_COMMAND, (WPARAM)IDOK, 0); // send an OK notification to open the file browser } else { int wID = LOWORD(wParam); switch(wID) { case IDC_BUTTON_METADATA: DialogBoxParam(fceu_hInstance, "IDD_REPLAY_METADATA", hwndDlg, ReplayMetadataDialogProc, (LPARAM)0); break; case IDOK: { LONG lCount = SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_GETCOUNT, 0, 0); LONG lIndex = SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_GETCURSEL, 0, 0); if(lIndex != CB_ERR) { if(lIndex == lCount-1) { // pop open a file browser... char *pn=strdup(FCEU_GetPath(FCEUMKF_MOVIE).c_str()); char szFile[MAX_PATH]={0}; OPENFILENAME ofn; //int nRet; //mbg merge 7/17/06 removed memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwndDlg; ofn.lpstrFilter = "FCEUX Movie Files (*.fm2), TAS Editor Projects (*.fm3)\0*.fm2;*.fm3\0FCEUX Movie Files (*.fm2)\0*.fm2\0Archive Files (*.zip,*.rar,*.7z)\0*.zip;*.rar;*.7z\0All Files (*.*)\0*.*\0\0"; ofn.lpstrFile = szFile; ofn.nMaxFile = sizeof(szFile); ofn.lpstrInitialDir = pn; ofn.Flags = OFN_NOCHANGEDIR | OFN_HIDEREADONLY; ofn.lpstrDefExt = "fm2"; ofn.lpstrTitle = "Play Movie from File"; if(GetOpenFileName(&ofn)) { char relative[MAX_PATH*2]; AbsoluteToRelative(relative, szFile, BaseDirectory.c_str()); //replay system requires this to stay put. SetCurrentDirectory(BaseDirectory.c_str()); ArchiveScanRecord asr = FCEUD_ScanArchive(relative); FCEUFILE* fp = FCEU_fopen(relative,0,"rb",0,-1,fm2ext); if(!fp) goto abort; strcpy(relative,fp->fullFilename.c_str()); delete fp; LONG lOtherIndex = SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_FINDSTRING, (WPARAM)-1, (LPARAM)relative); if(lOtherIndex != CB_ERR) { // select already existing string SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_SETCURSEL, lOtherIndex, 0); UpdateReplayDialog(hwndDlg); } else { SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_INSERTSTRING, lIndex, (LPARAM)relative); SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_SETCURSEL, lIndex, 0); //UpdateReplayDialog(hwndDlg); - this call would be redundant, because the update is always triggered by CBN_SELCHANGE message anyway } // restore focus to the dialog SetFocus(GetDlgItem(hwndDlg, IDC_COMBO_FILENAME)); } abort: free(pn); } else { // user had made their choice // TODO: warn the user when they open a movie made with a different ROM char* fn=GetReplayPath(hwndDlg); //char TempArray[16]; //mbg merge 7/17/06 removed replayReadOnlySetting = (SendDlgItemMessage(hwndDlg, IDC_CHECK_READONLY, BM_GETCHECK, 0, 0) == BST_CHECKED); char offset1Str[32]={0}; SendDlgItemMessage(hwndDlg, IDC_EDIT_STOPFRAME, WM_GETTEXT, (WPARAM)32, (LPARAM)offset1Str); replayStopFrameSetting = (SendDlgItemMessage(hwndDlg, IDC_CHECK_STOPMOVIE, BM_GETCHECK,0,0) == BST_CHECKED)? strtol(offset1Str,0,10):0; EndDialog(hwndDlg, (INT_PTR)fn); } } } return TRUE; case IDCANCEL: EndDialog(hwndDlg, 0); return TRUE; } } return FALSE; case WM_CTLCOLORSTATIC: if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_LABEL_CURRCHECKSUM)) { // draw the md5 sum in red if it's different from the md5 of the rom used in the replay HDC hdcStatic = (HDC)wParam; char szMd5Text[35]; GetDlgItemText(hwndDlg, IDC_LABEL_ROMCHECKSUM, szMd5Text, 35); if (!strlen(szMd5Text) || !strcmp(szMd5Text, "unknown") || !strcmp(szMd5Text, "00000000000000000000000000000000") || !strcmp(szMd5Text, md5_asciistr(GameInfo->MD5))) SetTextColor(hdcStatic, RGB(0,0,0)); // use black color for a match (or no comparison) else SetTextColor(hdcStatic, RGB(255,0,0)); // use red for a mismatch SetBkMode((HDC)wParam,TRANSPARENT); return (BOOL)GetSysColorBrush(COLOR_BTNFACE); } else if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_LABEL_NEWPPUUSED)) { HDC hdcStatic = (HDC)wParam; char szMd5Text[35]; GetDlgItemText(hwndDlg, IDC_LABEL_NEWPPUUSED, szMd5Text, 35); bool want_newppu = (strcmp(szMd5Text, "Off") != 0); extern int newppu; if ((want_newppu && newppu) || (!want_newppu && !newppu)) SetTextColor(hdcStatic, RGB(0,0,0)); // use black color for a match else SetTextColor(hdcStatic, RGB(255,0,0)); // use red for a mismatch SetBkMode((HDC)wParam,TRANSPARENT); return (BOOL)GetSysColorBrush(COLOR_BTNFACE); } else { return FALSE; } } return FALSE; };
void UpdateReplayDialog(HWND hwndDlg) { int doClear=1; char *fn=GetReplayPath(hwndDlg); // remember the previous setting for the read-only checkbox replayReadOnlySetting = (SendDlgItemMessage(hwndDlg, IDC_CHECK_READONLY, BM_GETCHECK, 0, 0) == BST_CHECKED); EnableWindow(GetDlgItem(hwndDlg,IDC_BUTTON_METADATA),FALSE); if(fn) { MOVIE_INFO info; FCEUFILE* fp = FCEU_fopen(fn,0,"rb",0); fp->stream = fp->stream->memwrap(); bool isarchive = FCEU_isFileInArchive(fn); bool ismovie = FCEUI_MovieGetInfo(fp, info, false); delete fp; if(ismovie) { char tmp[256]; double div; sprintf(tmp, "%u", (unsigned)info.num_frames); SetWindowTextA(GetDlgItem(hwndDlg,IDC_LABEL_FRAMES), tmp); // frames SetDlgItemText(hwndDlg,IDC_EDIT_STOPFRAME,tmp); stopframeWasEditedByUser = false; EnableWindow(GetDlgItem(hwndDlg,IDC_CHECK_READONLY),TRUE); div = (FCEUI_GetCurrentVidSystem(0,0)) ? 50.006977968268290849 : 60.098813897440515532; // PAL timing double tempCount = (info.num_frames / div) + 0.005; // +0.005s for rounding int num_seconds = (int)tempCount; int fraction = (int)((tempCount - num_seconds) * 100); int seconds = num_seconds % 60; int minutes = (num_seconds / 60) % 60; int hours = (num_seconds / 60 / 60) % 60; sprintf(tmp, "%02d:%02d:%02d.%02d", hours, minutes, seconds, fraction); SetWindowTextA(GetDlgItem(hwndDlg,IDC_LABEL_LENGTH), tmp); // length sprintf(tmp, "%u", (unsigned)info.rerecord_count); SetWindowTextA(GetDlgItem(hwndDlg,IDC_LABEL_UNDOCOUNT), tmp); // rerecord SendDlgItemMessage(hwndDlg,IDC_CHECK_READONLY,BM_SETCHECK,(replayReadOnlySetting ? BST_CHECKED : BST_UNCHECKED), 0); SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_RECORDEDFROM),info.poweron ? "Power-On" : (info.reset?"Soft-Reset":"Savestate")); if(isarchive) { EnableWindow(GetDlgItem(hwndDlg,IDC_CHECK_READONLY),FALSE); Button_SetCheck(GetDlgItem(hwndDlg,IDC_CHECK_READONLY),BST_CHECKED); } else EnableWindow(GetDlgItem(hwndDlg,IDC_CHECK_READONLY),TRUE); //----------- //mbg 5/26/08 - getting rid of old movie formats //if(info.movie_version > 1) //{ char emuStr[128]; SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMUSED),info.name_of_rom_used.c_str()); SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMCHECKSUM),md5_asciistr(info.md5_of_rom_used)); char boolstring[4] = "On "; if (!info.pal) strcpy(boolstring, "Off"); SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_PALUSED),boolstring); if (info.ppuflag) strcpy(boolstring, "On "); else strcpy(boolstring, "Off"); SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_NEWPPUUSED),boolstring); if(info.emu_version_used < 20000 ) sprintf(emuStr, "FCEU %d.%02d.%02d%s", info.emu_version_used/10000, (info.emu_version_used/100)%100, (info.emu_version_used)%100, info.emu_version_used < 9813 ? " (blip)" : ""); else sprintf(emuStr, "FCEUX %d.%02d.%02d", info.emu_version_used/10000, (info.emu_version_used/100)%100, (info.emu_version_used)%100); //else //{ // if(info.emu_version_used == 1) // strcpy(emuStr, "Famtasia"); // else if(info.emu_version_used == 2) // strcpy(emuStr, "Nintendulator"); // else if(info.emu_version_used == 3) // strcpy(emuStr, "VirtuaNES"); // else // { // strcpy(emuStr, "(unknown)"); // char* dot = strrchr(fn,'.'); // if(dot) // { // if(!stricmp(dot,".fmv")) // strcpy(emuStr, "Famtasia? (unknown version)"); // else if(!stricmp(dot,".nmv")) // strcpy(emuStr, "Nintendulator? (unknown version)"); // else if(!stricmp(dot,".vmv")) // strcpy(emuStr, "VirtuaNES? (unknown version)"); // else if(!stricmp(dot,".fcm")) // strcpy(emuStr, "FCEU? (unknown version)"); // } // } //} SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_EMULATORUSED),emuStr); //} //else //{ // SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMUSED),"unknown"); // SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMCHECKSUM),"unknown"); // SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_EMULATORUSED),"FCEU 0.98.10 (blip)"); //} //-------------------- SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_CURRCHECKSUM),md5_asciistr(GameInfo->MD5)); // enable OK and metadata EnableWindow(GetDlgItem(hwndDlg,IDOK),TRUE); EnableWindow(GetDlgItem(hwndDlg,IDC_BUTTON_METADATA),TRUE); currComments = info.comments; currSubtitles = info.subtitles; doClear = 0; } free(fn); } else { EnableWindow(GetDlgItem(hwndDlg,IDC_EDIT_OFFSET),FALSE); EnableWindow(GetDlgItem(hwndDlg,IDC_EDIT_FROM),FALSE); } if(doClear) { SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_LENGTH),""); SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_FRAMES),""); SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_UNDOCOUNT),""); SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMUSED),""); SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMCHECKSUM),""); SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_RECORDEDFROM),""); SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_EMULATORUSED),""); SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_CURRCHECKSUM),md5_asciistr(GameInfo->MD5)); SetDlgItemText(hwndDlg,IDC_EDIT_STOPFRAME,""); stopframeWasEditedByUser=false; EnableWindow(GetDlgItem(hwndDlg,IDC_CHECK_READONLY),FALSE); EnableWindow(GetDlgItem(hwndDlg,IDOK),FALSE); } }