diff --git a/win32/rsrc/resource.h b/win32/rsrc/resource.h index 07ec2620..b4398966 100644 --- a/win32/rsrc/resource.h +++ b/win32/rsrc/resource.h @@ -497,13 +497,15 @@ #define ID_DEBUG_APU_TRACE 40173 #define ID_EMULATION_BACKGROUNDINPUT 40174 #define ID_SAVEMEMPACK 40175 +#define ID_FILE_SAVE_FILE 40176 +#define ID_FILE_LOAD_FILE 40177 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 151 -#define _APS_NEXT_COMMAND_VALUE 40176 +#define _APS_NEXT_COMMAND_VALUE 40178 #define _APS_NEXT_CONTROL_VALUE 3018 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/win32/rsrc/snes9x.rc b/win32/rsrc/snes9x.rc index 76377484..474a6089 100644 --- a/win32/rsrc/snes9x.rc +++ b/win32/rsrc/snes9x.rc @@ -28,6 +28,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US IDC_CURSOR_SCOPE CURSOR "nodrop.cur" + ///////////////////////////////////////////////////////////////////////////// // // Accelerator @@ -802,6 +803,7 @@ BEGIN MENUITEM "Slot #&7", ID_FILE_SAVE7 MENUITEM "Slot #&8", ID_FILE_SAVE8 MENUITEM "Slot #&9", ID_FILE_SAVE9 + MENUITEM "&Select File", ID_FILE_SAVE_FILE END POPUP "&Load Game Position" BEGIN @@ -815,6 +817,7 @@ BEGIN MENUITEM "Slot #&7", ID_FILE_LOAD7 MENUITEM "Slot #&8", ID_FILE_LOAD8 MENUITEM "Slot #&9", ID_FILE_LOAD9 + MENUITEM "&Select File", ID_FILE_LOAD_FILE END MENUITEM "Load MultiCart...", ID_FILE_LOADMULTICART MENUITEM SEPARATOR diff --git a/win32/wsnes9x.cpp b/win32/wsnes9x.cpp index 2758f4c1..bbcf34f8 100644 --- a/win32/wsnes9x.cpp +++ b/win32/wsnes9x.cpp @@ -638,7 +638,9 @@ void DoAVIOpen(const TCHAR* filename); void DoAVIClose(int reason); void RestoreGUIDisplay (); void RestoreSNESDisplay (); -void FreezeUnfreeze (int slot, bool8 freeze); +void FreezeUnfreezeDialog(bool8 freeze); +void FreezeUnfreezeSlot(int slot, bool8 freeze); +void FreezeUnfreeze (const char *filename, bool8 freeze); void CheckDirectoryIsWritable (const char *filename); static void CheckMenuStates (); static void ResetFrameTimer (); @@ -984,13 +986,13 @@ int HandleKeyMessage(WPARAM wParam, LPARAM lParam) if(wParam == CustomKeys.Save[i].key && modifiers == CustomKeys.Save[i].modifiers) { - FreezeUnfreeze (i, true); + FreezeUnfreezeSlot (i, true); hitHotKey = true; } if(wParam == CustomKeys.Load[i].key && modifiers == CustomKeys.Load[i].modifiers) { - FreezeUnfreeze (i, false); + FreezeUnfreezeSlot (i, false); hitHotKey = true; } } @@ -998,13 +1000,13 @@ int HandleKeyMessage(WPARAM wParam, LPARAM lParam) if(wParam == CustomKeys.SlotSave.key && modifiers == CustomKeys.SlotSave.modifiers) { - FreezeUnfreeze (GUI.CurrentSaveSlot, true); + FreezeUnfreezeSlot (GUI.CurrentSaveSlot, true); hitHotKey = true; } if(wParam == CustomKeys.SlotLoad.key && modifiers == CustomKeys.SlotLoad.modifiers) { - FreezeUnfreeze (GUI.CurrentSaveSlot, false); + FreezeUnfreezeSlot (GUI.CurrentSaveSlot, false); hitHotKey = true; } if(wParam == CustomKeys.SlotPlus.key @@ -2287,65 +2289,71 @@ LRESULT CALLBACK WinProc( GUI.FrameAdvanceJustPressed = 0; break; case ID_FILE_LOAD0: - FreezeUnfreeze (0, FALSE); + FreezeUnfreezeSlot (0, FALSE); break; case ID_FILE_LOAD1: - FreezeUnfreeze (1, FALSE); + FreezeUnfreezeSlot (1, FALSE); break; case ID_FILE_LOAD2: - FreezeUnfreeze (2, FALSE); + FreezeUnfreezeSlot (2, FALSE); break; case ID_FILE_LOAD3: - FreezeUnfreeze (3, FALSE); + FreezeUnfreezeSlot (3, FALSE); break; case ID_FILE_LOAD4: - FreezeUnfreeze (4, FALSE); + FreezeUnfreezeSlot (4, FALSE); break; case ID_FILE_LOAD5: - FreezeUnfreeze (5, FALSE); + FreezeUnfreezeSlot (5, FALSE); break; case ID_FILE_LOAD6: - FreezeUnfreeze (6, FALSE); + FreezeUnfreezeSlot (6, FALSE); break; case ID_FILE_LOAD7: - FreezeUnfreeze (7, FALSE); + FreezeUnfreezeSlot (7, FALSE); break; case ID_FILE_LOAD8: - FreezeUnfreeze (8, FALSE); + FreezeUnfreezeSlot (8, FALSE); break; case ID_FILE_LOAD9: - FreezeUnfreeze (9, FALSE); + FreezeUnfreezeSlot (9, FALSE); break; + case ID_FILE_LOAD_FILE: + FreezeUnfreezeDialog(FALSE); + break; case ID_FILE_SAVE0: - FreezeUnfreeze (0, TRUE); + FreezeUnfreezeSlot (0, TRUE); break; case ID_FILE_SAVE1: - FreezeUnfreeze (1, TRUE); + FreezeUnfreezeSlot (1, TRUE); break; case ID_FILE_SAVE2: - FreezeUnfreeze (2, TRUE); + FreezeUnfreezeSlot (2, TRUE); break; case ID_FILE_SAVE3: - FreezeUnfreeze (3, TRUE); + FreezeUnfreezeSlot (3, TRUE); break; case ID_FILE_SAVE4: - FreezeUnfreeze (4, TRUE); + FreezeUnfreezeSlot (4, TRUE); break; case ID_FILE_SAVE5: - FreezeUnfreeze (5, TRUE); + FreezeUnfreezeSlot (5, TRUE); break; case ID_FILE_SAVE6: - FreezeUnfreeze (6, TRUE); + FreezeUnfreezeSlot (6, TRUE); break; case ID_FILE_SAVE7: - FreezeUnfreeze (7, TRUE); + FreezeUnfreezeSlot (7, TRUE); break; case ID_FILE_SAVE8: - FreezeUnfreeze (8, TRUE); + FreezeUnfreezeSlot (8, TRUE); break; case ID_FILE_SAVE9: - FreezeUnfreeze (9, TRUE); + FreezeUnfreezeSlot (9, TRUE); break; + case ID_FILE_SAVE_FILE: + FreezeUnfreezeDialog(TRUE); + break; case ID_CHEAT_ENTER: RestoreGUIDisplay (); S9xRemoveCheats (); @@ -3704,11 +3712,49 @@ loop_exit: return msg.wParam; } -void FreezeUnfreeze (int slot, bool8 freeze) +void FreezeUnfreezeDialog(bool8 freeze) { - char filename[_MAX_PATH +1]; - char ext [_MAX_EXT + 1]; + TCHAR filename[MAX_PATH]; + OPENFILENAME ofn; + *filename = TEXT('\0'); + memset((LPVOID)&ofn, 0, sizeof(OPENFILENAME)); + + ofn.lStructSize = sizeof(OPENFILENAME); + ofn.hwndOwner = GUI.hWnd; + ofn.lpstrFilter = TEXT("State files\0*.state;*.frz;*.0*\0All Files\0*.*\0\0"); + ofn.lpstrFile = filename; + ofn.lpstrInitialDir = S9xGetDirectoryT(SNAPSHOT_DIR); + ofn.lpstrTitle = TEXT("Select State"); + ofn.lpstrDefExt = TEXT("state"); + ofn.nMaxFile = MAX_PATH; + + if (freeze) { + ofn.Flags = OFN_OVERWRITEPROMPT; + if (GetSaveFileName(&ofn)) { + FreezeUnfreeze(_tToChar(ofn.lpstrFile), freeze); + } + } else { + ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; + if (GetOpenFileName(&ofn)) { + FreezeUnfreeze(_tToChar(ofn.lpstrFile), freeze); + } + } +} + +void FreezeUnfreezeSlot(int slot, bool8 freeze) +{ + char filename[_MAX_PATH + 1]; + char ext[_MAX_EXT + 1]; + + snprintf(ext, _MAX_EXT, ".%03d", slot); + strcpy(filename, S9xGetFilename(ext, SNAPSHOT_DIR)); + + FreezeUnfreeze(filename, freeze); +} + +void FreezeUnfreeze (const char *filename, bool8 freeze) +{ #ifdef NETPLAY_SUPPORT if (!freeze && Settings.NetPlay && !Settings.NetPlayServer) { @@ -3718,9 +3764,6 @@ void FreezeUnfreeze (int slot, bool8 freeze) } #endif - snprintf(ext, _MAX_EXT, ".%03d", slot); - strcpy(filename, S9xGetFilename(ext, SNAPSHOT_DIR)); - S9xSetPause (PAUSE_FREEZE_FILE); if (freeze)