rlm@1: #include "stdafx.h" rlm@1: #include "resource.h" rlm@1: #include "MainWnd.h" rlm@1: #include "ExportGSASnapshot.h" rlm@1: #include "FileDlg.h" rlm@1: #include "GSACodeSelect.h" rlm@1: #include "RomInfo.h" rlm@1: #include "Reg.h" rlm@1: #include "WinResUtil.h" rlm@1: #include "WinMiscUtil.h" rlm@1: #include "LuaOpenDialog.h" rlm@1: #include "ram_search.h" rlm@1: #include "ramwatch.h" rlm@1: #include "Sound.h" rlm@1: #include "VBA.h" rlm@1: rlm@1: #include "../NLS.h" rlm@1: #include "../version.h" rlm@1: #include "../gba/GBA.h" rlm@1: #include "../gba/GBAGlobals.h" rlm@1: #include "../gba/EEprom.h" rlm@1: #include "../gba/GBASound.h" rlm@1: #include "../gb/GB.h" rlm@1: #include "../gb/gbGlobals.h" rlm@1: #include "../common/movie.h" rlm@1: #include "../common/vbalua.h" rlm@1: rlm@1: void MainWnd::OnFileOpen() rlm@1: { rlm@1: theApp.winCheckFullscreen(); rlm@1: if (winFileOpenSelect(0)) rlm@1: { rlm@1: winFileRun(); rlm@1: } rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileOpenGBx() rlm@1: { rlm@1: theApp.winCheckFullscreen(); rlm@1: if (winFileOpenSelect(1)) rlm@1: { rlm@1: winFileRun(); rlm@1: } rlm@1: } rlm@1: rlm@1: void MainWnd::OnFilePause() rlm@1: { rlm@1: systemSetPause(!theApp.paused); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFilePause(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->SetCheck(theApp.paused); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileReset() rlm@1: { rlm@1: if (emulating) rlm@1: { rlm@1: if (VBAMovieGetState() == MOVIE_STATE_PLAY) rlm@1: { rlm@1: OnToolsPlayRestart(); // HACK: shortcut rlm@1: } rlm@1: else rlm@1: { rlm@1: theApp.emulator.emuReset(true); rlm@1: systemScreenMessage(winResLoadString(IDS_RESET)); rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileReset(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->Enable(emulating); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileRecentFreeze() rlm@1: { rlm@1: theApp.recentFreeze = !theApp.recentFreeze; rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileRecentFreeze(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->SetCheck(theApp.recentFreeze); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileRecentReset() rlm@1: { rlm@1: theApp.winCheckFullscreen(); rlm@1: systemSoundClearBuffer(); rlm@1: if (MessageBox("Really clear your recent ROMs list?", //winResLoadString(IDS_REALLY_CLEAR), rlm@1: winResLoadString(IDS_CONFIRM_ACTION), rlm@1: MB_YESNO | MB_DEFBUTTON2) == IDNO) rlm@1: return; rlm@1: rlm@1: for (int i = 0; i < 10; ++i) rlm@1: theApp.recentFiles[i] = ""; rlm@1: } rlm@1: rlm@1: BOOL MainWnd::OnFileRecentFile(UINT nID) rlm@1: { rlm@1: if (theApp.recentFiles[(nID & 0xFFFF) - ID_FILE_MRU_FILE1].GetLength()) rlm@1: { rlm@1: theApp.romFilename = theApp.recentFiles[(nID & 0xFFFF) - ID_FILE_MRU_FILE1]; rlm@1: winFileRun(); rlm@1: } rlm@1: return TRUE; rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileRecentFile(CCmdUI *pCmdUI) rlm@1: { rlm@1: int fileID = pCmdUI->m_nID - ID_FILE_MRU_FILE1; rlm@1: rlm@1: bool bExist = !theApp.recentFiles[fileID].IsEmpty(); rlm@1: rlm@1: if (pCmdUI->m_pMenu != NULL) rlm@1: { rlm@1: CString p = theApp.recentFiles[fileID]; rlm@1: rlm@1: int index = max(p.ReverseFind('/'), max(p.ReverseFind('\\'), p.ReverseFind('|'))); rlm@1: rlm@1: if (index != -1) rlm@1: { rlm@1: p.Delete(0, index + 1); rlm@1: } rlm@1: rlm@1: p.Replace("&", "&&"); rlm@1: rlm@1: CString number("1&0 - "); rlm@1: if (fileID < 9) rlm@1: number.Format("&%d - ", fileID + 1); rlm@1: rlm@1: if (p.IsEmpty()) rlm@1: { rlm@1: p = "No Recent ROM"; rlm@1: bExist = false; rlm@1: } rlm@1: rlm@1: pCmdUI->SetText(number + p); rlm@1: theApp.winAccelMgr.UpdateMenu(pCmdUI->m_pMenu->GetSafeHmenu()); rlm@1: } rlm@1: rlm@1: pCmdUI->Enable(bExist); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileExit() rlm@1: { rlm@1: if (AskSave()) rlm@1: SendMessage(WM_CLOSE); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileClose() rlm@1: { rlm@1: // save battery file before we change the filename... rlm@1: CloseRamWindows(); rlm@1: winFileClose(); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileClose(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->Enable(emulating); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileLoad() rlm@1: { rlm@1: theApp.winCheckFullscreen(); rlm@1: rlm@1: LPCTSTR exts[] = { ".sgm", NULL }; rlm@1: CString filter = winResLoadFilter(IDS_FILTER_SGM); rlm@1: CString title = winResLoadString(IDS_SELECT_SAVE_GAME_NAME); rlm@1: rlm@1: CString saveName = winGetDestFilename(theApp.gameFilename, IDS_SAVE_DIR, exts[0]); rlm@1: CString saveDir = winGetDestDir(IDS_SAVE_DIR); rlm@1: rlm@1: FileDlg dlg(this, saveName, filter, 0, "SGM", exts, saveDir, title, false, true); rlm@1: rlm@1: if (dlg.DoModal() == IDOK) rlm@1: { rlm@1: bool res = winReadSaveGame(dlg.GetPathName()); rlm@1: rlm@1: theApp.rewindCount = 0; rlm@1: theApp.rewindCounter = 0; rlm@1: theApp.rewindSaveNeeded = false; rlm@1: rlm@1: if (res) rlm@1: { rlm@1: if (VBAMovieActive() && !VBAMovieReadOnly()) rlm@1: { rlm@1: VBAMovieSwitchToRecording(); rlm@1: } rlm@1: systemScreenMessage(winResLoadString(IDS_LOADED_STATE)); rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileLoad(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->Enable(emulating); rlm@1: } rlm@1: rlm@1: BOOL MainWnd::OnFileLoadSlot(UINT nID) rlm@1: { rlm@1: nID = nID + 1 - ID_FILE_LOADGAME_SLOT1; rlm@1: rlm@1: CString filename = winGetSavestateFilename(theApp.gameFilename, nID); rlm@1: rlm@1: bool res = winReadSaveGame(filename); rlm@1: rlm@1: // deleting rewinds because you loaded a save state is stupid rlm@1: /// theApp.rewindCount = 0; rlm@1: /// theApp.rewindCounter = 0; rlm@1: /// theApp.rewindSaveNeeded = false; rlm@1: rlm@1: if (res) rlm@1: { rlm@1: CString format; rlm@1: if (VBAMovieActive()) rlm@1: { rlm@1: if (VBAMovieReadOnly()) rlm@1: { rlm@1: format = winResLoadString(IDS_REPLAYED_STATE_N); rlm@1: } rlm@1: else rlm@1: { rlm@1: VBAMovieSwitchToRecording(); rlm@1: format = winResLoadString(IDS_RERECORDED_STATE_N); rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: format = winResLoadString(IDS_LOADED_STATE_N); rlm@1: } rlm@1: rlm@1: CString buffer; rlm@1: buffer.Format(format, nID); rlm@1: systemScreenMessage(buffer); rlm@1: rlm@1: int lastSlot = theApp.currentSlot; rlm@1: rlm@1: if (theApp.loadMakesRecent) rlm@1: { rlm@1: // to update the file's modification date rlm@1: SYSTEMTIME st; rlm@1: FILETIME ft; rlm@1: GetSystemTime(&st); rlm@1: SystemTimeToFileTime(&st, &ft); rlm@1: HANDLE fh = CreateFile(filename, rlm@1: GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, rlm@1: NULL, rlm@1: OPEN_EXISTING, rlm@1: 0, rlm@1: NULL); rlm@1: if (fh != INVALID_HANDLE_VALUE) rlm@1: SetFileTime(fh, NULL, NULL, &ft); rlm@1: CloseHandle(fh); rlm@1: } rlm@1: rlm@1: if (theApp.loadMakesCurrent) rlm@1: theApp.currentSlot = nID - 1; rlm@1: else rlm@1: theApp.currentSlot = lastSlot; // restore value in case the call to OnFileSaveSlot changed it rlm@1: rlm@1: theApp.frameSearching = false; rlm@1: theApp.frameSearchSkipping = false; rlm@1: } rlm@1: rlm@1: return res; rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileSave() rlm@1: { rlm@1: theApp.winCheckFullscreen(); rlm@1: rlm@1: LPCTSTR exts[] = { ".sgm", NULL }; rlm@1: CString filter = winResLoadFilter(IDS_FILTER_SGM); rlm@1: CString title = winResLoadString(IDS_SELECT_SAVE_GAME_NAME); rlm@1: rlm@1: CString saveName = winGetDestFilename(theApp.gameFilename, IDS_SAVE_DIR, exts[0]); rlm@1: CString saveDir = winGetDestDir(IDS_SAVE_DIR); rlm@1: rlm@1: FileDlg dlg(this, saveName, filter, 0, "SGM", exts, saveDir, title, true); rlm@1: rlm@1: if (dlg.DoModal() == IDOK) rlm@1: { rlm@1: bool res = winWriteSaveGame(dlg.GetPathName()); rlm@1: if (res) rlm@1: systemScreenMessage(winResLoadString(IDS_WROTE_STATE)); rlm@1: } rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileSave(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->Enable(emulating); rlm@1: } rlm@1: rlm@1: BOOL MainWnd::OnFileSaveSlot(UINT nID) rlm@1: { rlm@1: nID = nID + 1 - ID_FILE_SAVEGAME_SLOT1; rlm@1: rlm@1: if (theApp.saveMakesCurrent) rlm@1: theApp.currentSlot = nID - 1; rlm@1: rlm@1: CString filename = winGetSavestateFilename(theApp.gameFilename, nID); rlm@1: rlm@1: bool res = winWriteSaveGame(filename); rlm@1: rlm@1: CString format = winResLoadString(IDS_WROTE_STATE_N); rlm@1: CString buffer; rlm@1: buffer.Format(format, nID); rlm@1: rlm@1: systemScreenMessage(buffer); rlm@1: rlm@1: return res; rlm@1: } rlm@1: rlm@1: BOOL MainWnd::OnSelectSlot(UINT nID) rlm@1: { rlm@1: nID -= ID_SELECT_SLOT1; rlm@1: theApp.currentSlot = nID; rlm@1: rlm@1: CString buffer; rlm@1: buffer.Format("Slot %d selected", nID + 1); rlm@1: systemScreenMessage(buffer, 0); rlm@1: rlm@1: return true; rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileImportBatteryfile() rlm@1: { rlm@1: theApp.winCheckFullscreen(); rlm@1: rlm@1: LPCTSTR exts[] = { ".sav", NULL }; rlm@1: CString filter = winResLoadFilter(IDS_FILTER_SAV); rlm@1: CString title = winResLoadString(IDS_SELECT_BATTERY_FILE); rlm@1: rlm@1: CString batteryName = winGetDestFilename(theApp.gameFilename, IDS_BATTERY_DIR, exts[0]); rlm@1: CString batteryDir = winGetDestDir(IDS_BATTERY_DIR); rlm@1: rlm@1: FileDlg dlg(this, batteryName, filter, 0, "SAV", exts, batteryDir, title, false, true); rlm@1: rlm@1: if (dlg.DoModal() == IDCANCEL) rlm@1: return; rlm@1: rlm@1: CString str1 = winResLoadString(IDS_SAVE_WILL_BE_LOST); rlm@1: CString str2 = winResLoadString(IDS_CONFIRM_ACTION); rlm@1: rlm@1: systemSoundClearBuffer(); rlm@1: if (MessageBox(str1, rlm@1: str2, rlm@1: MB_OKCANCEL) == IDCANCEL) rlm@1: return; rlm@1: rlm@1: bool res = false; rlm@1: rlm@1: res = theApp.emulator.emuReadBattery(dlg.GetPathName()); rlm@1: rlm@1: if (!res) rlm@1: systemMessage(MSG_CANNOT_OPEN_FILE, "Cannot open file %s", dlg.GetPathName()); rlm@1: else rlm@1: { rlm@1: theApp.emulator.emuReset(true); rlm@1: } rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileImportBatteryfile(CCmdUI *pCmdUI) rlm@1: { rlm@1: // we allow this as we allow using cheats during recording rlm@1: pCmdUI->Enable(emulating /*&& !VBAMovieActive()*/); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileImportGamesharkcodefile() rlm@1: { rlm@1: theApp.winCheckFullscreen(); rlm@1: rlm@1: LPCTSTR exts[] = { NULL }; rlm@1: CString filter = systemCartridgeType == 0 ? winResLoadFilter(IDS_FILTER_SPC) : winResLoadFilter(IDS_FILTER_GCF); rlm@1: CString title = winResLoadString(IDS_SELECT_CODE_FILE); rlm@1: rlm@1: FileDlg dlg(this, "", filter, 0, "", exts, "", title, false, true); rlm@1: rlm@1: if (dlg.DoModal() == IDCANCEL) rlm@1: return; rlm@1: rlm@1: CString str1 = winResLoadString(IDS_CODES_WILL_BE_LOST); rlm@1: CString str2 = winResLoadString(IDS_CONFIRM_ACTION); rlm@1: rlm@1: systemSoundClearBuffer(); rlm@1: if (MessageBox(str1, rlm@1: str2, rlm@1: MB_OKCANCEL) == IDCANCEL) rlm@1: return; rlm@1: rlm@1: CString file = dlg.GetPathName(); rlm@1: bool res = winImportGSACodeFile(file); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileImportGamesharkcodefile(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->Enable(emulating /*&& !VBAMovieActive()*/); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileImportGamesharksnapshot() rlm@1: { rlm@1: theApp.winCheckFullscreen(); rlm@1: rlm@1: LPCTSTR exts[] = { NULL }; rlm@1: CString filter = systemCartridgeType == 1 ? winResLoadFilter(IDS_FILTER_GBS) : winResLoadFilter(IDS_FILTER_SPS); rlm@1: CString title = winResLoadString(IDS_SELECT_SNAPSHOT_FILE); rlm@1: rlm@1: FileDlg dlg(this, "", filter, 0, "", exts, "", title, false, true); rlm@1: rlm@1: if (dlg.DoModal() == IDCANCEL) rlm@1: return; rlm@1: rlm@1: CString str1 = winResLoadString(IDS_SAVE_WILL_BE_LOST); rlm@1: CString str2 = winResLoadString(IDS_CONFIRM_ACTION); rlm@1: rlm@1: systemSoundClearBuffer(); rlm@1: if (MessageBox(str1, rlm@1: str2, rlm@1: MB_OKCANCEL) == IDCANCEL) rlm@1: return; rlm@1: rlm@1: if (systemCartridgeType == 1) rlm@1: gbReadGSASnapshot(dlg.GetPathName()); rlm@1: else rlm@1: CPUReadGSASnapshot(dlg.GetPathName()); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileImportGamesharksnapshot(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->Enable(emulating /*&& !VBAMovieActive()*/); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileExportBatteryfile() rlm@1: { rlm@1: theApp.winCheckFullscreen(); rlm@1: rlm@1: LPCTSTR exts[] = { ".sav", ".dat", NULL }; rlm@1: CString filter = winResLoadFilter(IDS_FILTER_SAV); rlm@1: CString title = winResLoadString(IDS_SELECT_BATTERY_FILE); rlm@1: rlm@1: CString batteryName = winGetDestFilename(theApp.gameFilename, IDS_BATTERY_DIR, exts[0]); rlm@1: CString batteryDir = winGetDestDir(IDS_BATTERY_DIR); rlm@1: rlm@1: FileDlg dlg(this, batteryName, filter, 1, "SAV", exts, batteryDir, title, true); rlm@1: rlm@1: if (dlg.DoModal() == IDCANCEL) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: bool result = false; rlm@1: rlm@1: if (systemCartridgeType == 1) rlm@1: { rlm@1: result = gbWriteBatteryFile(dlg.GetPathName(), false); rlm@1: } rlm@1: else rlm@1: result = theApp.emulator.emuWriteBattery(dlg.GetPathName()); rlm@1: rlm@1: if (!result) rlm@1: systemMessage(MSG_ERROR_CREATING_FILE, "Error creating file %s", rlm@1: dlg.GetPathName()); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileExportBatteryfile(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->Enable(emulating); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileExportGamesharksnapshot() rlm@1: { rlm@1: theApp.winCheckFullscreen(); rlm@1: if (eepromInUse) rlm@1: { rlm@1: systemMessage(IDS_EEPROM_NOT_SUPPORTED, "EEPROM saves cannot be exported"); rlm@1: return; rlm@1: } rlm@1: rlm@1: LPCTSTR exts[] = { ".sps", NULL }; rlm@1: rlm@1: CString filter = winResLoadFilter(IDS_FILTER_SPS); rlm@1: CString title = winResLoadString(IDS_SELECT_SNAPSHOT_FILE); rlm@1: rlm@1: CString name = winGetDestFilename(theApp.gameFilename, CString(), exts[0]); rlm@1: rlm@1: FileDlg dlg(this, name, filter, 1, "SPS", exts, "", title, true); rlm@1: rlm@1: if (dlg.DoModal() == IDCANCEL) rlm@1: return; rlm@1: rlm@1: char buffer[16]; rlm@1: strncpy(buffer, (const char *)&rom[0xa0], 12); rlm@1: buffer[12] = 0; rlm@1: rlm@1: ExportGSASnapshot dlg2(dlg.GetPathName(), buffer, this); rlm@1: dlg2.DoModal(); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileExportGamesharksnapshot(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->Enable(emulating && systemCartridgeType == 0); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileQuickScreencapture() rlm@1: { rlm@1: extern int32 captureNumber; // GBAGlobals.cpp rlm@1: captureNumber = winScreenCapture(captureNumber); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileScreencapture() rlm@1: { rlm@1: theApp.winCheckFullscreen(); rlm@1: rlm@1: LPCTSTR exts[] = { ".png", ".bmp", NULL }; rlm@1: rlm@1: CString filter = winResLoadFilter(IDS_FILTER_PNG); rlm@1: CString title = winResLoadString(IDS_SELECT_CAPTURE_NAME); rlm@1: rlm@1: CString ext; rlm@1: rlm@1: if (theApp.captureFormat != 0) rlm@1: ext.Format(".bmp"); rlm@1: else rlm@1: ext.Format(".png"); rlm@1: rlm@1: CString captureName = winGetDestFilename(theApp.gameFilename, IDS_CAPTURE_DIR, ext); rlm@1: CString captureDir = winGetDestDir(IDS_CAPTURE_DIR); rlm@1: rlm@1: FileDlg dlg(this, rlm@1: captureName, rlm@1: filter, rlm@1: theApp.captureFormat ? 2 : 1, rlm@1: theApp.captureFormat ? "BMP" : "PNG", rlm@1: exts, rlm@1: captureDir, rlm@1: title, rlm@1: true); rlm@1: rlm@1: if (dlg.DoModal() == IDCANCEL) rlm@1: return; rlm@1: rlm@1: if (dlg.getFilterIndex() == 2) rlm@1: theApp.emulator.emuWriteBMP(dlg.GetPathName()); rlm@1: else rlm@1: theApp.emulator.emuWritePNG(dlg.GetPathName()); rlm@1: rlm@1: systemScreenMessage(winResLoadString(IDS_SCREEN_CAPTURE)); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileScreencapture(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->Enable(emulating); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileRominformation() rlm@1: { rlm@1: theApp.winCheckFullscreen(); rlm@1: if (systemCartridgeType == 0) rlm@1: { rlm@1: RomInfoGBA dlg(rom); rlm@1: dlg.DoModal(); rlm@1: } rlm@1: else rlm@1: { rlm@1: RomInfoGB dlg(gbRom); rlm@1: dlg.DoModal(); rlm@1: } rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileRominformation(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->Enable(emulating); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileTogglemenu() rlm@1: { rlm@1: theApp.menuToggle = !theApp.menuToggle; rlm@1: rlm@1: if (theApp.menuToggle) rlm@1: { rlm@1: SetMenu(&theApp.m_menu); rlm@1: if (theApp.tripleBuffering) rlm@1: { rlm@1: if (theApp.display) rlm@1: theApp.display->renderMenu(); rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: SetMenu(NULL); rlm@1: } rlm@1: rlm@1: theApp.adjustDestRect(); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileTogglemenu(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->Enable(theApp.videoOption > VIDEO_4X); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileSavegameOldestslot() rlm@1: { rlm@1: if (!emulating) rlm@1: return; rlm@1: rlm@1: CFileStatus status; rlm@1: CString str; rlm@1: time_t time = -1; rlm@1: int found = -1; rlm@1: rlm@1: for (int i = 0; i < 10; i++) rlm@1: { rlm@1: if (CFile::GetStatus(winGetSavestateFilename(theApp.gameFilename, i + 1), status)) rlm@1: { rlm@1: if (time - status.m_mtime.GetTime() > 0 || time == -1) rlm@1: { rlm@1: time = (time_t)status.m_mtime.GetTime(); rlm@1: found = i; rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: found = i; rlm@1: break; rlm@1: } rlm@1: } rlm@1: rlm@1: OnFileSaveSlot(ID_FILE_SAVEGAME_SLOT1 + found); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileSavegameOldestslot(CCmdUI *pCmdUI) rlm@1: { rlm@1: bool enabled = emulating; rlm@1: if (pCmdUI->m_pMenu != NULL) rlm@1: { rlm@1: CFileStatus status; rlm@1: time_t time = -1; rlm@1: int found = -1; rlm@1: rlm@1: if (emulating) rlm@1: { rlm@1: for (int i = 0; i < 10; i++) rlm@1: { rlm@1: if (CFile::GetStatus(winGetSavestateFilename(theApp.gameFilename, i + 1), status)) rlm@1: { rlm@1: if (time - status.m_mtime.GetTime() > 0 || time == -1) rlm@1: { rlm@1: time = (time_t)status.m_mtime.GetTime(); rlm@1: found = i; rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: found = i; rlm@1: break; rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: CString str; rlm@1: enabled = (found != -1); rlm@1: if (enabled) rlm@1: str.Format("&Oldest Slot (#%d)", found + 1); rlm@1: else rlm@1: str.Format("&Oldest Slot", found + 1); rlm@1: rlm@1: pCmdUI->SetText(str); rlm@1: rlm@1: theApp.winAccelMgr.UpdateMenu(pCmdUI->m_pMenu->GetSafeHmenu()); rlm@1: } rlm@1: rlm@1: pCmdUI->Enable(enabled); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileLoadgameMostrecent() rlm@1: { rlm@1: if (!emulating) rlm@1: return; rlm@1: rlm@1: CFileStatus status; rlm@1: CString str; rlm@1: time_t time = 0; rlm@1: int found = -1; rlm@1: rlm@1: for (int i = 0; i < 10; i++) rlm@1: { rlm@1: if (CFile::GetStatus(winGetSavestateFilename(theApp.gameFilename, i + 1), status)) rlm@1: { rlm@1: if (status.m_mtime.GetTime() > time) rlm@1: { rlm@1: time = (time_t)status.m_mtime.GetTime(); rlm@1: found = i; rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: if (found != -1) rlm@1: { rlm@1: OnFileLoadSlot(ID_FILE_LOADGAME_SLOT1 + found); rlm@1: } rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileLoadgameMostrecent(CCmdUI *pCmdUI) rlm@1: { rlm@1: bool enabled = emulating; rlm@1: if (pCmdUI->m_pMenu != NULL) rlm@1: { rlm@1: CFileStatus status; rlm@1: int found = -1; rlm@1: rlm@1: time_t time = 0; rlm@1: if (emulating) rlm@1: { rlm@1: for (int i = 0; i < 10; i++) rlm@1: { rlm@1: if (CFile::GetStatus(winGetSavestateFilename(theApp.gameFilename, i + 1), status)) rlm@1: { rlm@1: if (status.m_mtime.GetTime() > time) rlm@1: { rlm@1: time = (time_t)status.m_mtime.GetTime(); rlm@1: found = i; rlm@1: } rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: CString str; rlm@1: enabled = (found != -1); rlm@1: if (enabled) rlm@1: str.Format("Most &Recent Slot (#%d)", found + 1); rlm@1: else rlm@1: str.Format("Most &Recent Slot", found + 1); rlm@1: rlm@1: pCmdUI->SetText(str); rlm@1: rlm@1: theApp.winAccelMgr.UpdateMenu(pCmdUI->m_pMenu->GetSafeHmenu()); rlm@1: } rlm@1: rlm@1: pCmdUI->Enable(enabled); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileLoadSlot(CCmdUI *pCmdUI) rlm@1: { rlm@1: int slotID = pCmdUI->m_nID - ID_FILE_LOADGAME_SLOT1 + 1; rlm@1: rlm@1: if (pCmdUI->m_pMenu != NULL) rlm@1: { rlm@1: pCmdUI->SetText(winGetSavestateMenuString(theApp.gameFilename, slotID)); rlm@1: rlm@1: theApp.winAccelMgr.UpdateMenu(pCmdUI->m_pMenu->GetSafeHmenu()); rlm@1: } rlm@1: rlm@1: pCmdUI->Enable(emulating && winFileExists(winGetSavestateFilename(theApp.gameFilename, slotID))); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileSaveSlot(CCmdUI *pCmdUI) rlm@1: { rlm@1: if (pCmdUI->m_pMenu != NULL) rlm@1: { rlm@1: int slotID = pCmdUI->m_nID - ID_FILE_SAVEGAME_SLOT1 + 1; rlm@1: rlm@1: pCmdUI->SetText(winGetSavestateMenuString(theApp.gameFilename, slotID)); rlm@1: rlm@1: theApp.winAccelMgr.UpdateMenu(pCmdUI->m_pMenu->GetSafeHmenu()); rlm@1: } rlm@1: rlm@1: pCmdUI->Enable(emulating); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateSelectSlot(CCmdUI *pCmdUI) rlm@1: { rlm@1: if (pCmdUI->m_pMenu != NULL) rlm@1: { rlm@1: int slot = pCmdUI->m_nID - ID_SELECT_SLOT1; rlm@1: rlm@1: pCmdUI->SetText(winGetSavestateMenuString(theApp.gameFilename, slot + 1)); rlm@1: rlm@1: theApp.winAccelMgr.UpdateMenu(pCmdUI->m_pMenu->GetSafeHmenu()); rlm@1: rlm@1: pCmdUI->SetCheck(slot == theApp.currentSlot); rlm@1: } rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileLoadgameAutoloadmostrecent() rlm@1: { rlm@1: theApp.autoLoadMostRecent = !theApp.autoLoadMostRecent; rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileLoadgameAutoloadmostrecent(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->SetCheck(theApp.autoLoadMostRecent); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileLoadgameMakeRecent() rlm@1: { rlm@1: theApp.loadMakesRecent = !theApp.loadMakesRecent; rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileLoadgameMakeRecent(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->SetCheck(theApp.loadMakesRecent); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileSavegameCurrent() rlm@1: { rlm@1: OnFileSaveSlot(ID_FILE_SAVEGAME_SLOT1 + theApp.currentSlot); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileSavegameCurrent(CCmdUI *pCmdUI) rlm@1: { rlm@1: if (pCmdUI->m_pMenu != NULL) rlm@1: { rlm@1: int slotID = theApp.currentSlot + 1; rlm@1: rlm@1: CString str; rlm@1: str.Format("&Current Slot (#%d)", slotID); rlm@1: rlm@1: pCmdUI->SetText(str); rlm@1: rlm@1: theApp.winAccelMgr.UpdateMenu(pCmdUI->m_pMenu->GetSafeHmenu()); rlm@1: } rlm@1: rlm@1: pCmdUI->Enable(emulating); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileLoadgameCurrent() rlm@1: { rlm@1: OnFileLoadSlot(ID_FILE_LOADGAME_SLOT1 + theApp.currentSlot); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileLoadgameCurrent(CCmdUI *pCmdUI) rlm@1: { rlm@1: int slotID = theApp.currentSlot + 1; rlm@1: rlm@1: if (pCmdUI->m_pMenu != NULL) rlm@1: { rlm@1: CString str; rlm@1: str.Format("&Current Slot (#%d)", slotID); rlm@1: rlm@1: pCmdUI->SetText(str); rlm@1: rlm@1: theApp.winAccelMgr.UpdateMenu(pCmdUI->m_pMenu->GetSafeHmenu()); rlm@1: } rlm@1: rlm@1: CFileStatus status; rlm@1: pCmdUI->Enable(emulating && CFile::GetStatus(winGetSavestateFilename(theApp.gameFilename, slotID), status)); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileLoadgameMakeCurrent() rlm@1: { rlm@1: theApp.loadMakesCurrent = !theApp.loadMakesCurrent; rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileLoadgameMakeCurrent(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->SetCheck(theApp.loadMakesCurrent); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileSavegameMakeCurrent() rlm@1: { rlm@1: theApp.saveMakesCurrent = !theApp.saveMakesCurrent; rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileSavegameMakeCurrent(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->SetCheck(theApp.saveMakesCurrent); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileSavegameIncrementSlot() rlm@1: { rlm@1: theApp.currentSlot = (theApp.currentSlot + 1) % 10; rlm@1: rlm@1: char str [32]; rlm@1: sprintf(str, "Current Slot: %d", theApp.currentSlot + 1); rlm@1: systemScreenMessage(str, 0); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileSavegameIncrementSlot(CCmdUI *pCmdUI) rlm@1: { rlm@1: if (pCmdUI->m_pMenu != NULL) rlm@1: { rlm@1: int slotID = theApp.currentSlot + 1; rlm@1: rlm@1: CString str; rlm@1: str.Format("&Increase Current Slot (#%d -> #%d)", slotID, slotID % 10 + 1); rlm@1: rlm@1: pCmdUI->SetText(str); rlm@1: rlm@1: theApp.winAccelMgr.UpdateMenu(pCmdUI->m_pMenu->GetSafeHmenu()); rlm@1: } rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileSavegameDecrementSlot() rlm@1: { rlm@1: theApp.currentSlot = (theApp.currentSlot + 9) % 10; rlm@1: rlm@1: char str [32]; rlm@1: sprintf(str, "Current Slot: %d", theApp.currentSlot + 1); rlm@1: systemScreenMessage(str, 0); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileSavegameDecrementSlot(CCmdUI *pCmdUI) rlm@1: { rlm@1: if (pCmdUI->m_pMenu != NULL) rlm@1: { rlm@1: int slotID = theApp.currentSlot + 1; rlm@1: rlm@1: CString str; rlm@1: str.Format("&Decrease Current Slot (#%d -> #%d)", slotID, (slotID + 8) % 10 + 1); rlm@1: rlm@1: pCmdUI->SetText(str); rlm@1: rlm@1: theApp.winAccelMgr.UpdateMenu(pCmdUI->m_pMenu->GetSafeHmenu()); rlm@1: } rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileSlotDisplayModificationTime() rlm@1: { rlm@1: theApp.showSlotTime = !theApp.showSlotTime; rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileSlotDisplayModificationTime(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->SetCheck(theApp.showSlotTime); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileLuaOpen() rlm@1: { rlm@1: theApp.winCheckFullscreen(); rlm@1: rlm@1: if (!LuaConsoleHWnd) rlm@1: { rlm@1: LuaConsoleHWnd = ::CreateDialog(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDD_LUA), AfxGetMainWnd()->GetSafeHwnd(), (DLGPROC) DlgLuaScriptDialog); rlm@1: } rlm@1: else rlm@1: ::SetForegroundWindow(LuaConsoleHWnd); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileLuaOpen(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->SetCheck(LuaConsoleHWnd != NULL); rlm@1: pCmdUI->Enable(true); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileLuaCloseAll() rlm@1: { rlm@1: if (LuaConsoleHWnd) rlm@1: ::PostMessage(LuaConsoleHWnd, WM_CLOSE, 0, 0); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileLuaReload() rlm@1: { rlm@1: VBAReloadLuaCode(); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileLuaStop() rlm@1: { rlm@1: VBALuaStop(); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileRamSearch() rlm@1: { rlm@1: theApp.winCheckFullscreen(); rlm@1: rlm@1: if (!RamSearchHWnd) rlm@1: { rlm@1: reset_address_info(); rlm@1: LRESULT CALLBACK RamSearchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); rlm@1: ::CreateDialog(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDD_RAMSEARCH), AfxGetMainWnd()->GetSafeHwnd(), (DLGPROC) RamSearchProc); rlm@1: } rlm@1: else rlm@1: ::SetForegroundWindow(RamSearchHWnd); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileRamSearch(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->Enable(TRUE); rlm@1: } rlm@1: rlm@1: void MainWnd::OnFileRamWatch() rlm@1: { rlm@1: theApp.winCheckFullscreen(); rlm@1: rlm@1: if (!RamWatchHWnd) rlm@1: { rlm@1: LRESULT CALLBACK RamWatchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); rlm@1: RamWatchHWnd = ::CreateDialog(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDD_RAMWATCH), AfxGetMainWnd()->GetSafeHwnd(), (DLGPROC) RamWatchProc); rlm@1: } rlm@1: else rlm@1: ::SetForegroundWindow(RamWatchHWnd); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileRamWatch(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->Enable(TRUE); rlm@1: } rlm@1: rlm@1: void MainWnd::OnUpdateFileLuaCloseAll(CCmdUI *pCmdUI) rlm@1: { rlm@1: pCmdUI->Enable(LuaConsoleHWnd != NULL); rlm@1: } rlm@1: