void PlayMovie(HWND hWnd){ char szChoice[MAX_PATH]={0}; OPENFILENAME ofn; soundDriver->pause(); // browse button ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hWnd; ofn.lpstrFilter = "Movie File (*.mc2, *.mcm)\0*.mc2;*.mcm\0All files(*.*)\0*.*\0\0"; ofn.lpstrFile = (LPSTR)szChoice; ofn.lpstrTitle = "Play a movie"; ofn.lpstrDefExt = "mc2"; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; if(GetOpenFileName(&ofn)) { if(toupper(strright(szChoice,4)) == ".MC2") FCEUI_LoadMovie(szChoice, 1, 0, 0); else if(toupper(strright(szChoice,4)) == ".MCM") LoadMCM(szChoice, true); } pcejin.tempUnPause(); }
//Show the play movie dialog and play a movie void Replay_LoadMovie() { char* fn = (char*)DialogBoxParam(hAppInst, "IDD_REPLAYINP", GetMainHWND(), ReplayDialogProc, false); if(fn) { FCEUI_LoadMovie(fn, movie_readonly, false, 100000); free(fn); } }
void CommandLine::process_movieCommands() { if(play_movie_file != "") { FCEUI_LoadMovie(play_movie_file.c_str(),true,false,-1); } else if(record_movie_file != "") { FCEUI_SaveMovie(record_movie_file.c_str(), L"", START_BLANK, NULL, FCEUI_MovieGetRTCDefault()); } }
void CommandLine::process_movieCommands() { if(play_movie_file != "") { FCEUI_LoadMovie(play_movie_file.c_str(),true,false,-1); } else if(record_movie_file != "") { FCEUI_SaveMovie(record_movie_file.c_str(), L"", 0, NULL); } }
std::string LoadMCM(const char* path, bool load) { std::string mc2; mc2 = noExtension(std::string(path)); mc2 += ".mc2"; mcmdump(path, mc2); if(load) FCEUI_LoadMovie(mc2.c_str(), 1, 0, 0); return mc2; }
//Show the play movie dialog and play a movie void Replay_LoadMovie() { char* fn = (char*)DialogBoxParam(hAppInst, "IDD_REPLAYINP", MainWindow->getHWnd(), ReplayDialogProc, false); if(fn) { FCEUI_LoadMovie(fn, movie_readonly, false, -1); free(fn); } }
//Replay movie dialog BOOL CALLBACK ReplayDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { OPENFILENAME ofn; char szChoice[MAX_PATH]={0}; char filename[MAX_PATH] = ""; switch(uMsg) { case WM_INITDIALOG: SendDlgItemMessage(hwndDlg, IDC_CHECK_READONLY, BM_SETCHECK, replayreadonly?BST_CHECKED:BST_UNCHECKED, 0); return FALSE; case WM_COMMAND: int wID = LOWORD(wParam); switch(wID) { case ID_BROWSE: ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = MainWindow->getHWnd(); ofn.lpstrFilter = "Desmume Movie File (*.dsm)\0*.dsm\0All files(*.*)\0*.*\0\0"; ofn.nFilterIndex = 1; ofn.lpstrFile = filename; ofn.lpstrTitle = "Replay Movie from File"; ofn.nMaxFile = MAX_PATH; ofn.lpstrDefExt = "dsm"; GetOpenFileName(&ofn); strcpy(playfilename, filename); SetDlgItemText(hwndDlg, PM_FILENAME, playfilename); return true; case IDC_CHECK_READONLY: replayreadonly ^= 1; return true; case IDOK: FCEUI_LoadMovie(playfilename, replayreadonly, false, 80000); ZeroMemory(&playfilename, sizeof(playfilename)); EndDialog(hwndDlg, 0); return true; case IDCANCEL: ZeroMemory(&playfilename, sizeof(playfilename)); EndDialog(hwndDlg, 0); return true; } } return false; }
void Replay_LoadMovie() { if (suggestReadOnlyReplay) replayReadOnlySetting = true; else replayReadOnlySetting = FCEUI_GetMovieToggleReadOnly(); char* fn = (char*)DialogBoxParam(fceu_hInstance, "IDD_REPLAYINP", hAppWnd, ReplayDialogProc, 0); if(fn) { FCEUI_LoadMovie(fn, replayReadOnlySetting, replayStopFrameSetting); free(fn); //mbg 6/21/08 - i think this stuff has to get updated in case the movie changed the pal emulation flag pal_emulation = FCEUI_GetCurrentVidSystem(0,0); UpdateCheckedMenuItems(); SetMainWindowStuff(); RefreshThrottleFPS(); } }
static void KeyboardCommands(void) { int is_shift, is_alt; keys=GetKeyboard(); if(InputType[2]==SIFC_FKB) // Family Keyboard (FKB) { if(keyonly(SCROLLLOCK)) { cidisabled^=1; FCEUI_DispMessage("Family Keyboard %sabled.",cidisabled?"en":"dis"); } #ifdef SDL SDL_WM_GrabInput( cidisabled? SDL_GRAB_ON: SDL_GRAB_OFF ); #endif if(cidisabled) return; } is_shift = KEY(LEFTSHIFT) | KEY(RIGHTSHIFT); is_alt = KEY(LEFTALT) | KEY(RIGHTALT); #ifdef SDL if(keyonly(F4)) { if(is_shift) FCEUI_SetRenderDisable(-1, 2); else FCEUI_SetRenderDisable(2, -1); } #endif #if defined(SDL) && !defined(FLASH) if(keyonly(ENTER) && is_alt) ToggleFS(); #endif // Disable most keyboard shortcuts in Flash #ifndef FLASH NoWaiting &=~ 1; if(KEY(GRAVE)) { NoWaiting|=1; } if(gametype==GIT_FDS) { if(keyonly(F6)) FCEUI_FDSSelect(); if(keyonly(F8)) FCEUI_FDSInsert(0); } if(keyonly(F9)) { FCEUI_SaveSnapshot(); } if(gametype!=GIT_NSF) { #ifndef EXTGUI if(keyonly(F2)) { DoCheatSeq(); } #endif if(keyonly(F5)) { if(is_shift) FCEUI_SaveMovie(NULL); else FCEUI_SaveState(NULL); } if(keyonly(F7)) { if(is_shift) FCEUI_LoadMovie(NULL); else FCEUI_LoadState(NULL); } } if(keyonly(F1)) FCEUI_ToggleTileView(); if(keyonly(F10)) FCEUI_ResetNES(); if(keyonly(F11)) FCEUI_PowerNES(); #ifdef EXTGUI if(keyonly(F3)) GUI_Hide(-1); if(KEY(F12)) GUI_RequestExit(); if(KEY(ESCAPE)) CloseGame(); #else if(KEY(F12) || KEY(ESCAPE)) CloseGame(); #endif if(gametype==GIT_VSUNI) { if(keyonly(F8)) FCEUI_VSUniCoin(); if(keyonly(F6)) { DIPS^=1; FCEUI_VSUniToggleDIPView(); } if(!(DIPS&1)) goto DIPSless; if(keyonly(1)) FCEUI_VSUniToggleDIP(0); if(keyonly(2)) FCEUI_VSUniToggleDIP(1); if(keyonly(3)) FCEUI_VSUniToggleDIP(2); if(keyonly(4)) FCEUI_VSUniToggleDIP(3); if(keyonly(5)) FCEUI_VSUniToggleDIP(4); if(keyonly(6)) FCEUI_VSUniToggleDIP(5); if(keyonly(7)) FCEUI_VSUniToggleDIP(6); if(keyonly(8)) FCEUI_VSUniToggleDIP(7); } else { static uint8 bbuf[32]; static int bbuft; static int barcoder = 0; if(keyonly(H)) FCEUI_NTSCSELHUE(); if(keyonly(T)) FCEUI_NTSCSELTINT(); if(KEY(KP_MINUS) || KEY(MINUS)) FCEUI_NTSCDEC(); if(KEY(KP_PLUS) || KEY(EQUAL)) FCEUI_NTSCINC(); if((InputType[2] == SIFC_BWORLD) || (cspec == SIS_DATACH)) { if(keyonly(F8)) { barcoder ^= 1; if(!barcoder) { if(InputType[2] == SIFC_BWORLD) { strcpy(&BWorldData[1],bbuf); BWorldData[0]=1; } else FCEUI_DatachSet(bbuf); FCEUI_DispMessage("Barcode Entered"); } else { bbuft = 0; FCEUI_DispMessage("Enter Barcode");} } } else barcoder = 0; #define SSM(x) \ { if(barcoder) { if(bbuft < 13) {bbuf[bbuft++] = '0' + x; bbuf[bbuft] = 0;} FCEUI_DispMessage("Barcode: %s",bbuf);} \ else { \ if(is_shift) FCEUI_SelectMovie(x); \ else FCEUI_SelectState(x); \ } } DIPSless: if(keyonly(0)) SSM(0); if(keyonly(1)) SSM(1); if(keyonly(2)) SSM(2); if(keyonly(3)) SSM(3); if(keyonly(4)) SSM(4); if(keyonly(5)) SSM(5); if(keyonly(6)) SSM(6); if(keyonly(7)) SSM(7); if(keyonly(8)) SSM(8); if(keyonly(9)) SSM(9); #undef SSM } #endif }
static void KeyboardCommands(void) { int is_shift, is_alt; keys = GetKeyboard(); if ((InputType[2] == SIFC_FKB) || (InputType[2] == SIFC_SUBORKB) || (InputType[2] == SIFC_PEC586KB)) { if (cidisabled) return; } is_shift = KEY(LEFTSHIFT) | KEY(RIGHTSHIFT); is_alt = KEY(LEFTALT) | KEY(RIGHTALT); if (keyonly(F4)) { if (is_shift) FCEUI_SetRenderDisable(-1, 2); else FCEUI_SetRenderDisable(2, -1); } { static int nocount = 0; NoWaiting &= ~1; if (KEY(GRAVE)) //&& nocount) NoWaiting |= 1; nocount = (nocount + 1) & 3; } if (gametype == GIT_FDS) { if (keyonly(F6)) FCEUI_FDSSelect(); if (keyonly(F8)) FCEUI_FDSInsert(0); } if (keyonly(F9)) FCEUI_SaveSnapshot(); if (gametype != GIT_NSF) { if (keyonly(F5)) { if (is_shift) FCEUI_SaveMovie(NULL); else FCEUI_SaveState(NULL); } if (keyonly(F7)) { if (is_shift) FCEUI_LoadMovie(NULL); else FCEUI_LoadState(NULL); } } // if(keyonly(F1)) FCEUI_ToggleTileView(); if (gametype == GIT_VSUNI) { if (keyonly(F8)) FCEUI_VSUniCoin(); if (keyonly(F6)) { DIPS ^= 1; FCEUI_VSUniToggleDIPView(); } if (!(DIPS & 1)) goto DIPSless; if (keyonly(1)) FCEUI_VSUniToggleDIP(0); if (keyonly(2)) FCEUI_VSUniToggleDIP(1); if (keyonly(3)) FCEUI_VSUniToggleDIP(2); if (keyonly(4)) FCEUI_VSUniToggleDIP(3); if (keyonly(5)) FCEUI_VSUniToggleDIP(4); if (keyonly(6)) FCEUI_VSUniToggleDIP(5); if (keyonly(7)) FCEUI_VSUniToggleDIP(6); if (keyonly(8)) FCEUI_VSUniToggleDIP(7); } else { static uint8 bbuf[32]; static int bbuft; static int barcoder = 0; if (keyonly(H)) FCEUI_NTSCSELHUE(); if (keyonly(T)) FCEUI_NTSCSELTINT(); if (KEY(KP_MINUS) || KEY(MINUS)) FCEUI_NTSCDEC(); if (KEY(KP_PLUS) || KEY(EQUAL)) FCEUI_NTSCINC(); if ((InputType[2] == SIFC_BWORLD) || (cspec == SIS_DATACH)) { if (keyonly(F8)) { barcoder ^= 1; if (!barcoder) { if (InputType[2] == SIFC_BWORLD) { strcpy(&BWorldData[1], bbuf); BWorldData[0] = 1; } else FCEUI_DatachSet(bbuf); FCEUI_DispMessage("Barcode Entered"); } else { bbuft = 0; FCEUI_DispMessage("Enter Barcode"); } } } else barcoder = 0; #define SSM(x) \ { if (barcoder) { if (bbuft < 13) { bbuf[bbuft++] = '0' + x; bbuf[bbuft] = 0; } FCEUI_DispMessage("Barcode: %s", bbuf); } \ else { \ if (is_shift) FCEUI_SelectMovie(x); \ else FCEUI_SelectState(x); \ } \ } DIPSless: if (keyonly(0)) SSM(0); if (keyonly(1)) SSM(1); if (keyonly(2)) SSM(2); if (keyonly(3)) SSM(3); if (keyonly(4)) SSM(4); if (keyonly(5)) SSM(5); if (keyonly(6)) SSM(6); if (keyonly(7)) SSM(7); if (keyonly(8)) SSM(8); if (keyonly(9)) SSM(9); #undef SSM } }
LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; switch(Message) { case WM_INITMENU: recentromsmenu = LoadMenu(g_hInstance, "RECENTROMS"); GetRecentRoms(); break; case WM_KEYDOWN: if(wParam != VK_PAUSE) break; // case WM_SYSKEYDOWN: case WM_CUSTKEYDOWN: { int modifiers = GetModifiers(wParam); if(!HandleKeyMessage(wParam,lParam, modifiers)) return 0; break; } case WM_KEYUP: if(wParam != VK_PAUSE) break; case WM_SYSKEYUP: case WM_CUSTKEYUP: { int modifiers = GetModifiers(wParam); HandleKeyUp(wParam, lParam, modifiers); } break; case WM_SIZE: switch(wParam) { case SIZE_MINIMIZED: break; case SIZE_MAXIMIZED: pcejin.maximized = true; break; case SIZE_RESTORED: pcejin.maximized = false; break; default: break; } return 0; case WM_MOVE: RECT rect; GetWindowRect(hWnd,&rect); WndX = rect.left; WndY = rect.top; return 0; case WM_DROPFILES: { char filename[MAX_PATH] = ""; DragQueryFile((HDROP)wParam,0,filename,MAX_PATH); DragFinish((HDROP)wParam); std::string fileDropped = filename; //------------------------------------------------------- //Check if Movie file //------------------------------------------------------- if (!(fileDropped.find(".mc2") == std::string::npos) && (fileDropped.find(".mc2") == fileDropped.length()-4)) { if (!pcejin.romLoaded) //If no ROM is loaded, prompt for one { soundDriver->pause(); LoadGame(); pcejin.tempUnPause(); } if (pcejin.romLoaded && !(fileDropped.find(".mc2") == std::string::npos)) FCEUI_LoadMovie(fileDropped.c_str(), 1, false, false); } //------------------------------------------------------- //Check if Savestate file //------------------------------------------------------- else if (!(fileDropped.find(".mc") == std::string::npos)) //Note: potential clash, mc2 will be loaded a movie file first { if (fileDropped.find(".mc") == fileDropped.length()-4) { if ((fileDropped[fileDropped.length()-1] >= '0' && fileDropped[fileDropped.length()-1] <= '9')) { extern int MDFNSS_Load(const char *fname, const char *suffix); MDFNSS_Load(filename, NULL); ClearDirectDrawOutput(); UpdateToolWindows(); } } } //------------------------------------------------------- //Check if Lua script file //------------------------------------------------------- else if (!(fileDropped.find(".lua") == std::string::npos) && (fileDropped.find(".lua") == fileDropped.length()-4)) //ROM is already loaded and .dsm in filename { if(LuaScriptHWnds.size() < 16) { char temp [1024]; strcpy(temp, fileDropped.c_str()); HWND IsScriptFileOpen(const char* Path); if(!IsScriptFileOpen(temp)) { HWND hDlg = CreateDialog(g_hInstance, MAKEINTRESOURCE(IDD_LUA), hWnd, (DLGPROC) LuaScriptProc); SendDlgItemMessage(hDlg,IDC_EDIT_LUAPATH,WM_SETTEXT,0,(LPARAM)temp); } } } //------------------------------------------------------- //Check if watchlist file //------------------------------------------------------- else if (!(fileDropped.find(".wch") == std::string::npos) && (fileDropped.find(".wch") == fileDropped.length()-4)) //ROM is already loaded and .dsm in filename { if(!RamWatchHWnd) { RamWatchHWnd = CreateDialog(g_hInstance, MAKEINTRESOURCE(IDD_RAMWATCH), hWnd, (DLGPROC) RamWatchProc); } else SetForegroundWindow(RamWatchHWnd); Load_Watches(true, fileDropped.c_str()); } //------------------------------------------------------- //Else load it as a ROM //------------------------------------------------------- else if(MDFNI_LoadGame(NULL,filename)) { pcejin.romLoaded = true; pcejin.started = true; //TODO: adelikat: This code is copied directly from the LoadGame() function, it should be come a separate function and called in both places //////////////////////////////// if (AutoRWLoad) { //Open Ram Watch if its auto-load setting is checked OpenRWRecentFile(0); RamWatchHWnd = CreateDialog(winClass.hInstance, MAKEINTRESOURCE(IDD_RAMWATCH), g_hWnd, (DLGPROC) RamWatchProc); } UpdateRecentRoms(filename); //////////////////////////////// } } return 0; case WM_ENTERMENULOOP: soundDriver->pause(); EnableMenuItem(GetMenu(hWnd), IDM_RECORD_MOVIE, MF_BYCOMMAND | (movieMode == MOVIEMODE_INACTIVE && pcejin.romLoaded) ? MF_ENABLED : MF_GRAYED); EnableMenuItem(GetMenu(hWnd), ID_RAM_WATCH, MF_BYCOMMAND | (movieMode == MOVIEMODE_INACTIVE && pcejin.romLoaded) ? MF_ENABLED : MF_GRAYED); EnableMenuItem(GetMenu(hWnd), ID_RAM_SEARCH, MF_BYCOMMAND | (movieMode == MOVIEMODE_INACTIVE && pcejin.romLoaded) ? MF_ENABLED : MF_GRAYED); EnableMenuItem(GetMenu(hWnd), IDM_MEMORY, MF_BYCOMMAND | (movieMode == MOVIEMODE_INACTIVE && pcejin.romLoaded) ? MF_ENABLED : MF_GRAYED); EnableMenuItem(GetMenu(hWnd), IDM_PLAY_MOVIE, MF_BYCOMMAND | (movieMode == MOVIEMODE_INACTIVE && pcejin.romLoaded) ? MF_ENABLED : MF_GRAYED); EnableMenuItem(GetMenu(hWnd), IDM_STOPMOVIE, MF_BYCOMMAND | (movieMode != MOVIEMODE_INACTIVE) ? MF_ENABLED : MF_GRAYED); EnableMenuItem(GetMenu(hWnd), IDM_FILE_STOPAVI, MF_BYCOMMAND | (DRV_AviIsRecording()) ? MF_ENABLED : MF_GRAYED); EnableMenuItem(GetMenu(hWnd), IDM_FILE_RECORDAVI, MF_BYCOMMAND | (!DRV_AviIsRecording()) ? MF_ENABLED : MF_GRAYED); EnableMenuItem(GetMenu(hWnd), IDM_FILE_STOPWAV, MF_BYCOMMAND | (DRV_WaveRecordActive()) ? MF_ENABLED : MF_GRAYED); EnableMenuItem(GetMenu(hWnd), IDM_FILE_RECORDWAV, MF_BYCOMMAND | (!DRV_WaveRecordActive()) ? MF_ENABLED : MF_GRAYED); //Window Size checkMenu(IDC_WINDOW1X, ((pcejin.windowSize==1))); checkMenu(IDC_WINDOW15X, ((pcejin.windowSize==65535))); checkMenu(IDC_WINDOW2X, ((pcejin.windowSize==2))); checkMenu(IDC_WINDOW25X, ((pcejin.windowSize==65534))); checkMenu(IDC_WINDOW3X, ((pcejin.windowSize==3))); checkMenu(IDC_WINDOW4X, ((pcejin.windowSize==4))); checkMenu(IDC_ASPECT, ((pcejin.aspectRatio))); checkMenu(ID_VIEW_MIXLEFTRIGHT,MixVideoOutput); checkMenu(ID_COLOR_MODE_REDBLUE, ((MDFN_IEN_VB::GetColorMode()==0))); checkMenu(ID_COLOR_MODE_REDCYAN, ((MDFN_IEN_VB::GetColorMode()==1))); checkMenu(ID_COLOR_MODE_REDELECTRICCYAN, ((MDFN_IEN_VB::GetColorMode()==2))); checkMenu(ID_COLOR_MODE_REDGREEN, ((MDFN_IEN_VB::GetColorMode()==3))); checkMenu(ID_COLOR_MODE_GREENMAGENTA, ((MDFN_IEN_VB::GetColorMode()==4))); checkMenu(ID_COLOR_MODE_YELLOWBLUE, ((MDFN_IEN_VB::GetColorMode()==5))); checkMenu(ID_COLOR_MODE_GREYSCALE, ((MDFN_IEN_VB::GetColorMode()==6))); checkMenu(ID_SPLIT_MODE_ANAGLYPH, ((MDFN_IEN_VB::GetSplitMode()==MDFN_IEN_VB::VB3DMODE_ANAGLYPH))); checkMenu(ID_SPLIT_MODE_CSCOPE, ((MDFN_IEN_VB::GetSplitMode()==MDFN_IEN_VB::VB3DMODE_CSCOPE))); checkMenu(ID_SPLIT_MODE_SIDEBYSIDE, ((MDFN_IEN_VB::GetSplitMode()==MDFN_IEN_VB::VB3DMODE_SIDEBYSIDE))); checkMenu(ID_SPLIT_MODE_PBARRIER, ((MDFN_IEN_VB::GetSplitMode()==MDFN_IEN_VB::VB3DMODE_PBARRIER))); checkMenu(ID_VIEW_DISP_BOTH, ((DisplayLeftRightOutput==0))); checkMenu(ID_VIEW_DISP_LEFT, ((DisplayLeftRightOutput==1))); checkMenu(ID_VIEW_DISP_RIGHT, ((DisplayLeftRightOutput==2))); checkMenu(ID_VIEW_DISP_DISABLE, ((DisplayLeftRightOutput==3))); checkMenu(ID_VIEW_FRAMECOUNTER,Hud.FrameCounterDisplay); checkMenu(ID_VIEW_DISPLAYINPUT,Hud.ShowInputDisplay); checkMenu(ID_VIEW_OPENCONSOLE,OpenConsoleWindow); checkMenu(ID_VIEW_DISPLAYSTATESLOTS,Hud.DisplayStateSlots); checkMenu(ID_VIEW_DISPLAYLAG,Hud.ShowLagFrameCounter); checkMenu(IDM_MUTE,soundDriver->userMute); break; case WM_EXITMENULOOP: pcejin.tempUnPause(); break; case WM_CLOSE: { SaveIniSettings(); PostQuitMessage(0); } case WM_DESTROY: { PostQuitMessage(0); } // HANDLE_MSG(hWnd, WM_DESTROY, OnDestroy); // HANDLE_MSG(hWnd, WM_PAINT, OnPaint); // HANDLE_MSG(hwnd, WM_COMMAND, OnCommand); case WM_COMMAND: if(wParam >= baseid && wParam <= baseid + MAX_RECENT_ROMS - 1) { int x = wParam - baseid; soundDriver->resume(); OpenRecentROM(x); } else if(wParam == clearid) { /* Clear all the recent ROMs */ if(IDOK == MessageBox(g_hWnd, "OK to clear recent ROMs list?","VBJin",MB_OKCANCEL)) ClearRecentRoms(); } wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case IDC_WINDOW1X: pcejin.windowSize=1; ScaleScreen((float)pcejin.windowSize); break; case IDC_WINDOW15X: pcejin.windowSize=65535; ScaleScreen((float)pcejin.windowSize); break; case IDC_WINDOW2X: pcejin.windowSize=2; ScaleScreen((float)pcejin.windowSize); break; case IDC_WINDOW25X: pcejin.windowSize=65534; ScaleScreen((float)pcejin.windowSize); break; case IDC_WINDOW3X: pcejin.windowSize=3; ScaleScreen((float)pcejin.windowSize); break; case IDC_WINDOW4X: pcejin.windowSize=4; ScaleScreen((float)pcejin.windowSize); break; case IDC_ASPECT: pcejin.aspectRatio ^= 1; ScaleScreen((float)pcejin.windowSize); break; case IDM_EXIT: SaveIniSettings(); PostQuitMessage(0); break; case IDM_RESET: //NEWTODO PCE_Power(); OpenRecentROM(0); break; case IDM_OPEN_ROM: soundDriver->pause(); LoadGame(); pcejin.tempUnPause(); break; case IDM_RECORD_MOVIE: soundDriver->pause(); MovieRecordTo(); pcejin.tempUnPause(); return 0; case IDM_PLAY_MOVIE: soundDriver->pause(); Replay_LoadMovie(); pcejin.tempUnPause(); return 0; case IDM_INPUT_CONFIG: soundDriver->pause(); DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_INPUTCONFIG), hWnd, DlgInputConfig); pcejin.tempUnPause(); // RunInputConfig(); break; case IDM_HOTKEY_CONFIG: { soundDriver->pause(); DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_KEYCUSTOM), hWnd, DlgHotkeyConfig); pcejin.tempUnPause(); } break; case ID_VIEW_MIXLEFTRIGHT: MixVideoOutput ^= true; MDFN_IEN_VB::SetMixVideoOutput(MixVideoOutput); WritePrivateProfileBool("Display", "MixLeftRight", MixVideoOutput, IniName); return 0; case ID_SPLIT_MODE_ANAGLYPH: MDFN_IEN_VB::SetSplitMode(MDFN_IEN_VB::VB3DMODE_ANAGLYPH); WritePrivateProfileInt("Display", "SplitMode", MDFN_IEN_VB::VB3DMODE_ANAGLYPH, IniName); break; case ID_SPLIT_MODE_CSCOPE: MDFN_IEN_VB::SetSplitMode(MDFN_IEN_VB::VB3DMODE_CSCOPE); WritePrivateProfileInt("Display", "SplitMode", MDFN_IEN_VB::VB3DMODE_CSCOPE, IniName); //Clear the DirectDraw buffers ClearDirectDrawOutput(); break; case ID_SPLIT_MODE_SIDEBYSIDE: MDFN_IEN_VB::SetSplitMode(MDFN_IEN_VB::VB3DMODE_SIDEBYSIDE); WritePrivateProfileInt("Display", "SplitMode", MDFN_IEN_VB::VB3DMODE_SIDEBYSIDE, IniName); //Clear the DirectDraw buffers ClearDirectDrawOutput(); break; case ID_SPLIT_MODE_PBARRIER: MDFN_IEN_VB::SetSplitMode(MDFN_IEN_VB::VB3DMODE_PBARRIER); WritePrivateProfileInt("Display", "SplitMode", MDFN_IEN_VB::VB3DMODE_PBARRIER, IniName); break; case ID_PIXEL_SEP_16: SideBySidePixels = 16; MDFN_IEN_VB::SetSideBySidePixels(SideBySidePixels); ClearDirectDrawOutput(); WritePrivateProfileInt("Display", "SideBySidePixels", SideBySidePixels, IniName); break; case ID_PIXEL_SEP_32: SideBySidePixels = 32; MDFN_IEN_VB::SetSideBySidePixels(SideBySidePixels); ClearDirectDrawOutput(); WritePrivateProfileInt("Display", "SideBySidePixels", SideBySidePixels, IniName); break; case ID_PIXEL_SEP_48: SideBySidePixels = 48; MDFN_IEN_VB::SetSideBySidePixels(SideBySidePixels); ClearDirectDrawOutput(); WritePrivateProfileInt("Display", "SideBySidePixels", SideBySidePixels, IniName); break; case ID_PIXEL_SEP_64: SideBySidePixels = 64; MDFN_IEN_VB::SetSideBySidePixels(SideBySidePixels); ClearDirectDrawOutput(); WritePrivateProfileInt("Display", "SideBySidePixels", SideBySidePixels, IniName); break; case ID_PIXEL_SEP_80: SideBySidePixels = 80; MDFN_IEN_VB::SetSideBySidePixels(SideBySidePixels); ClearDirectDrawOutput(); WritePrivateProfileInt("Display", "SideBySidePixels", SideBySidePixels, IniName); break; case ID_PIXEL_SEP_96: SideBySidePixels = 96; MDFN_IEN_VB::SetSideBySidePixels(SideBySidePixels); ClearDirectDrawOutput(); WritePrivateProfileInt("Display", "SideBySidePixels", SideBySidePixels, IniName); break; case ID_COLOR_MODE_REDBLUE: MDFN_IEN_VB::SetColorMode(0); WritePrivateProfileInt("Display", "ColorMode", 0, IniName); break; case ID_COLOR_MODE_REDCYAN: MDFN_IEN_VB::SetColorMode(1); WritePrivateProfileInt("Display", "ColorMode", 1, IniName); break; case ID_COLOR_MODE_REDELECTRICCYAN: MDFN_IEN_VB::SetColorMode(2); WritePrivateProfileInt("Display", "ColorMode", 2, IniName); break; case ID_COLOR_MODE_REDGREEN: MDFN_IEN_VB::SetColorMode(3); WritePrivateProfileInt("Display", "ColorMode", 3, IniName); break; case ID_COLOR_MODE_GREENMAGENTA: MDFN_IEN_VB::SetColorMode(4); WritePrivateProfileInt("Display", "ColorMode", 4, IniName); break; case ID_COLOR_MODE_YELLOWBLUE: MDFN_IEN_VB::SetColorMode(5); WritePrivateProfileInt("Display", "ColorMode", 5, IniName); break; case ID_COLOR_MODE_GREYSCALE: MDFN_IEN_VB::SetColorMode(6); WritePrivateProfileInt("Display", "ColorMode", 6, IniName); break; case ID_VIEW_DISP_BOTH: DisplayLeftRightOutput = 0; MDFN_IEN_VB::SetViewDisp(DisplayLeftRightOutput); WritePrivateProfileInt("Display", "ViewDisplay", DisplayLeftRightOutput, IniName); return 0; case ID_VIEW_DISP_LEFT: DisplayLeftRightOutput = 1; MDFN_IEN_VB::SetViewDisp(DisplayLeftRightOutput); WritePrivateProfileInt("Display", "ViewDisplay", DisplayLeftRightOutput, IniName); return 0; case ID_VIEW_DISP_RIGHT: DisplayLeftRightOutput = 2; MDFN_IEN_VB::SetViewDisp(DisplayLeftRightOutput); WritePrivateProfileInt("Display", "ViewDisplay", DisplayLeftRightOutput, IniName); return 0; case ID_VIEW_DISP_DISABLE: DisplayLeftRightOutput = 3; MDFN_IEN_VB::SetViewDisp(DisplayLeftRightOutput); // We're not saving this. Too many people would set it and forget it, then compain. // Someone can still set it manually in the ini file though. return 0; case ID_VIEW_FRAMECOUNTER: Hud.FrameCounterDisplay ^= true; WritePrivateProfileBool("Display", "FrameCounter", Hud.FrameCounterDisplay, IniName); return 0; case ID_VIEW_DISPLAYINPUT: Hud.ShowInputDisplay ^= true; WritePrivateProfileBool("Display", "Display Input", Hud.ShowInputDisplay, IniName); osd->clear(); return 0; case ID_VIEW_OPENCONSOLE: OpenConsoleWindow ^= true; WritePrivateProfileBool("Display", "OpenConsoleWindow", OpenConsoleWindow, IniName); return 0; case ID_VIEW_DISPLAYSTATESLOTS: Hud.DisplayStateSlots ^= true; WritePrivateProfileBool("Display", "Display State Slots", Hud.DisplayStateSlots, IniName); osd->clear(); return 0; case ID_VIEW_DISPLAYLAG: Hud.ShowLagFrameCounter ^= true; WritePrivateProfileBool("Display", "Display Lag Counter", Hud.ShowLagFrameCounter, IniName); osd->clear(); return 0; case IDC_NEW_LUA_SCRIPT: if(LuaScriptHWnds.size() < 16) { CreateDialog(g_hInstance, MAKEINTRESOURCE(IDD_LUA), g_hWnd, (DLGPROC) LuaScriptProc); } break; break; case IDM_MUTE: soundDriver->doUserMute(); break; case IDM_STOPMOVIE: FCEUI_StopMovie(); return 0; break; case ID_RAM_SEARCH: if(!RamSearchHWnd) { if (pcejin.romLoaded) { InitRamSearch(false); RamSearchHWnd = CreateDialog(winClass.hInstance, MAKEINTRESOURCE(IDD_RAMSEARCH), hWnd, (DLGPROC) RamSearchProc); } } else SetForegroundWindow(RamSearchHWnd); break; case ID_RAM_WATCH: if(!RamWatchHWnd) { if(pcejin.romLoaded) RamWatchHWnd = CreateDialog(winClass.hInstance, MAKEINTRESOURCE(IDD_RAMWATCH), hWnd, (DLGPROC) RamWatchProc); } else SetForegroundWindow(RamWatchHWnd); return 0; case IDM_MEMORY: if (!RegWndClass("MemView_ViewBox", MemView_ViewBoxProc, 0, sizeof(CMemView*))) return 0; OpenToolWindow(new CMemView()); return 0; case IDM_ABOUT: soundDriver->pause(); DialogBox(winClass.hInstance, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); pcejin.tempUnPause(); break; case IDM_FILE_RECORDAVI: soundDriver->pause(); RecordAvi(); pcejin.tempUnPause(); break; case IDM_FILE_STOPAVI: StopAvi(); break; case IDM_FILE_RECORDWAV: soundDriver->pause(); CreateSoundSave(); pcejin.tempUnPause(); break; case IDM_FILE_STOPWAV: DRV_EndWaveRecord(); break; } break; } return DefWindowProc(hWnd, Message, wParam, lParam); }
//Replay movie dialog INT_PTR CALLBACK ReplayDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { OPENFILENAME ofn; char szChoice[MAX_PATH]={0}; char filename[MAX_PATH] = ""; switch(uMsg) { case WM_INITDIALOG: { SendDlgItemMessage(hwndDlg, IDC_CHECK_READONLY, BM_SETCHECK, replayreadonly?BST_CHECKED:BST_UNCHECKED, 0); //Clear fields SetWindowText(GetDlgItem(hwndDlg, IDC_MLENGTH), ""); SetWindowText(GetDlgItem(hwndDlg, IDC_MFRAMES), ""); SetWindowText(GetDlgItem(hwndDlg, IDC_MRERECORDCOUNT), ""); SetWindowText(GetDlgItem(hwndDlg, IDC_MROM), ""); extern char curMovieFilename[512]; strncpy(playfilename, curMovieFilename, MAX_PATH); playfilename[MAX_PATH-1] = '\0'; SetWindowText(GetDlgItem(hwndDlg, PM_FILENAME), playfilename); SetFocus(GetDlgItem(hwndDlg, PM_FILENAME)); SendMessage(GetDlgItem(hwndDlg, PM_FILENAME), EM_SETSEL, 0, -1); // select all } return FALSE; case WM_COMMAND: int wID = LOWORD(wParam); switch(wID) { case ID_BROWSE: ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwndDlg; ofn.lpstrFilter = "Desmume Movie File (*.dsm)\0*.dsm\0All files(*.*)\0*.*\0\0"; ofn.nFilterIndex = 1; ofn.lpstrFile = filename; ofn.lpstrTitle = "Replay Movie from File"; ofn.nMaxFile = MAX_PATH; ofn.lpstrDefExt = "dsm"; ofn.Flags = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST; if(GetOpenFileName(&ofn)) SetDlgItemText(hwndDlg, PM_FILENAME, filename); return true; case IDC_CHECK_READONLY: replayreadonly = IsDlgButtonChecked(hwndDlg, IDC_CHECK_READONLY) != 0; return true; case IDOK: FCEUI_LoadMovie(playfilename, replayreadonly, false, 80000); ZeroMemory(&playfilename, sizeof(playfilename)); EndDialog(hwndDlg, 0); return true; case IDCANCEL: ZeroMemory(&playfilename, sizeof(playfilename)); EndDialog(hwndDlg, 0); return true; case PM_FILENAME: switch(HIWORD(wParam)) { case EN_CHANGE: { FixRelativeMovieFilename(hwndDlg, PM_FILENAME); // disable the OK button if we can't read the file char filename [MAX_PATH]; GetDlgItemText(hwndDlg,PM_FILENAME,filename,MAX_PATH); EnableWindow(GetDlgItem(hwndDlg, IDOK), IsFileReadable(filename)); strcpy(playfilename, filename); Describe(hwndDlg); // force read-only to be checked if we can't write the file if(!IsFileWritable(filename)) { CheckDlgButton(hwndDlg, IDC_CHECK_READONLY, BST_CHECKED); EnableWindow(GetDlgItem(hwndDlg, IDC_CHECK_READONLY), FALSE); } else { EnableWindow(GetDlgItem(hwndDlg, IDC_CHECK_READONLY), TRUE); } } break; } break; } } return false; }
/** * The main loop for the SDL. */ int main(int argc, char *argv[]) { // this is a hackish check for the --help arguemnts // these are normally processed by the config parser, but SDL_Init // must be run before the config parser: so if even SDL_Init fails, // these six lines will still print the help output if(argc > 1) { if(!strcmp(argv[1], "--help") || !strcmp(argv[1],"-h")) { ShowUsage(argv[0]); return 0; } } int error, frameskip; FCEUD_Message("Starting " FCEU_NAME_AND_VERSION "...\n"); #ifdef WIN32 /* Taken from win32 sdl_main.c */ SDL_SetModuleHandle(GetModuleHandle(NULL)); #endif /* SDL_INIT_VIDEO Needed for (joystick config) event processing? */ if(SDL_Init(SDL_INIT_VIDEO)) { printf("Could not initialize SDL: %s.\n", SDL_GetError()); return(-1); } #ifdef OPENGL SDL_GL_LoadLibrary(0); #endif // Initialize the configuration system g_config = InitConfig(); if(!g_config) { SDL_Quit(); return -1; } // initialize the infrastructure error = FCEUI_Initialize(); if(error != 1) { ShowUsage(argv[0]); SDL_Quit(); return -1; } // check for --help or -h and display usage; also check for --nogui for(int i=0; i<argc;i++) { if(strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-h") == 0) { ShowUsage(argv[0]); SDL_Quit(); return 0; } #ifdef _GTK else if(strcmp(argv[i], "--nogui") == 0) { noGui = 1; argv[i] = ""; } #endif } int romIndex = g_config->parse(argc, argv); // This is here so that a default fceux.cfg will be created on first // run, even without a valid ROM to play. // Unless, of course, there's actually --no-config given // mbg 8/23/2008 - this is also here so that the inputcfg routines can have // a chance to dump the new inputcfg to the fceux.cfg in case you didnt // specify a rom filename g_config->getOption("SDL.NoConfig", &noconfig); if (!noconfig) g_config->save(); std::string s; g_config->getOption("SDL.InputCfg", &s); if(s.size() != 0) { InitVideo(GameInfo); InputCfg(s); } // set the FAMICOM PAD 2 Mic thing { int t; g_config->getOption("SDL.Input.FamicomPad2.EnableMic", &t); if(t) replaceP2StartWithMicrophone = t; } // update the input devices UpdateInput(g_config); // check for a .fcm file to convert to .fm2 g_config->getOption ("SDL.FCMConvert", &s); g_config->setOption ("SDL.FCMConvert", ""); if (!s.empty()) { int okcount = 0; std::string infname = s.c_str(); // produce output filename std::string outname; size_t dot = infname.find_last_of ("."); if (dot == std::string::npos) outname = infname + ".fm2"; else outname = infname.substr(0,dot) + ".fm2"; MovieData md; EFCM_CONVERTRESULT result = convert_fcm (md, infname); if (result == FCM_CONVERTRESULT_SUCCESS) { okcount++; // *outf = new EMUFILE; EMUFILE_FILE* outf = FCEUD_UTF8_fstream (outname, "wb"); md.dump (outf,false); delete outf; FCEUD_Message ("Your file has been converted to FM2.\n"); } else { FCEUD_Message ("Something went wrong while converting your file...\n"); } DriverKill(); SDL_Quit(); return 0; } // If x/y res set to 0, store current display res in SDL.LastX/YRes int yres, xres; g_config->getOption("SDL.XResolution", &xres); g_config->getOption("SDL.YResolution", &yres); #if SDL_VERSION_ATLEAST(2, 0, 0) // TODO _ SDL 2.0 #else const SDL_VideoInfo* vid_info = SDL_GetVideoInfo(); if(xres == 0) { if(vid_info != NULL) { g_config->setOption("SDL.LastXRes", vid_info->current_w); } else { g_config->setOption("SDL.LastXRes", 512); } } else { g_config->setOption("SDL.LastXRes", xres); } if(yres == 0) { if(vid_info != NULL) { g_config->setOption("SDL.LastYRes", vid_info->current_h); } else { g_config->setOption("SDL.LastYRes", 448); } } else { g_config->setOption("SDL.LastYRes", yres); } #endif int autoResume; g_config->getOption("SDL.AutoResume", &autoResume); if(autoResume) { AutoResumePlay = true; } else { AutoResumePlay = false; } // check to see if recording HUD to AVI is enabled int rh; g_config->getOption("SDL.RecordHUD", &rh); if( rh == 0) FCEUI_SetAviEnableHUDrecording(true); else FCEUI_SetAviEnableHUDrecording(false); // check to see if movie messages are disabled int mm; g_config->getOption("SDL.MovieMsg", &mm); if( mm == 0) FCEUI_SetAviDisableMovieMessages(true); else FCEUI_SetAviDisableMovieMessages(false); // check for a .fm2 file to rip the subtitles g_config->getOption("SDL.RipSubs", &s); g_config->setOption("SDL.RipSubs", ""); if (!s.empty()) { MovieData md; std::string infname; infname = s.c_str(); FCEUFILE *fp = FCEU_fopen(s.c_str(), 0, "rb", 0); // load the movie and and subtitles extern bool LoadFM2(MovieData&, EMUFILE*, int, bool); LoadFM2(md, fp->stream, INT_MAX, false); LoadSubtitles(md); // fill subtitleFrames and subtitleMessages delete fp; // produce .srt file's name and open it for writing std::string outname; size_t dot = infname.find_last_of ("."); if (dot == std::string::npos) outname = infname + ".srt"; else outname = infname.substr(0,dot) + ".srt"; FILE *srtfile; srtfile = fopen(outname.c_str(), "w"); if (srtfile != NULL) { extern std::vector<int> subtitleFrames; extern std::vector<std::string> subtitleMessages; float fps = (md.palFlag == 0 ? 60.0988 : 50.0069); // NTSC vs PAL float subduration = 3; // seconds for the subtitles to be displayed for (int i = 0; i < subtitleFrames.size(); i++) { fprintf(srtfile, "%i\n", i+1); // starts with 1, not 0 double seconds, ms, endseconds, endms; seconds = subtitleFrames[i]/fps; if (i+1 < subtitleFrames.size()) // there's another subtitle coming after this one { if (subtitleFrames[i+1]-subtitleFrames[i] < subduration*fps) // avoid two subtitles at the same time { endseconds = (subtitleFrames[i+1]-1)/fps; // frame x: subtitle1; frame x+1 subtitle2 } else { endseconds = seconds+subduration; } } else { endseconds = seconds+subduration; } ms = modf(seconds, &seconds); endms = modf(endseconds, &endseconds); // this is just beyond ugly, don't show it to your kids fprintf(srtfile, "%02.0f:%02d:%02d,%03d --> %02.0f:%02d:%02d,%03d\n", // hh:mm:ss,ms --> hh:mm:ss,ms floor(seconds/3600), (int)floor(seconds/60 ) % 60, (int)floor(seconds) % 60, (int)(ms*1000), floor(endseconds/3600), (int)floor(endseconds/60) % 60, (int)floor(endseconds) % 60, (int)(endms*1000)); fprintf(srtfile, "%s\n\n", subtitleMessages[i].c_str()); // new line for every subtitle } fclose(srtfile); printf("%d subtitles have been ripped.\n", (int)subtitleFrames.size()); } else { FCEUD_Message("Couldn't create output srt file...\n"); } DriverKill(); SDL_Quit(); return 0; } // if we're not compiling w/ the gui, exit if a rom isn't specified #ifndef _GTK if(romIndex <= 0) { ShowUsage(argv[0]); FCEUD_Message("\nError parsing command line arguments\n"); SDL_Quit(); return -1; } #endif // update the emu core UpdateEMUCore(g_config); #ifdef CREATE_AVI g_config->getOption("SDL.VideoLog", &s); g_config->setOption("SDL.VideoLog", ""); if(!s.empty()) { NESVideoSetVideoCmd(s.c_str()); LoggingEnabled = 1; g_config->getOption("SDL.MuteCapture", &mutecapture); } else { mutecapture = 0; } #endif { int id; g_config->getOption("SDL.InputDisplay", &id); extern int input_display; input_display = id; // not exactly an id as an true/false switch; still better than creating another int for that g_config->getOption("SDL.SubtitleDisplay", &id); extern int movieSubtitles; movieSubtitles = id; } // load the hotkeys from the config life setHotKeys(); #ifdef _GTK if(noGui == 0) { gtk_init(&argc, &argv); InitGTKSubsystem(argc, argv); while(gtk_events_pending()) gtk_main_iteration_do(FALSE); } #endif if(romIndex >= 0) { // load the specified game error = LoadGame(argv[romIndex]); if(error != 1) { DriverKill(); SDL_Quit(); return -1; } g_config->setOption("SDL.LastOpenFile", argv[romIndex]); g_config->save(); } // movie playback g_config->getOption("SDL.Movie", &s); g_config->setOption("SDL.Movie", ""); if (s != "") { if(s.find(".fm2") != std::string::npos || s.find(".fm3") != std::string::npos) { static int pauseframe; g_config->getOption("SDL.PauseFrame", &pauseframe); g_config->setOption("SDL.PauseFrame", 0); FCEUI_printf("Playing back movie located at %s\n", s.c_str()); FCEUI_LoadMovie(s.c_str(), false, pauseframe ? pauseframe : false); } else { FCEUI_printf("Sorry, I don't know how to play back %s\n", s.c_str()); } } int periodic_saves; int save_state; g_config->getOption("SDL.PeriodicSaves", &periodic_saves); g_config->getOption("SDL.AutoSaveState", &save_state); if(periodic_saves && save_state < 10 && save_state >= 0){ FCEUI_SelectState(save_state, 0); } else { periodic_saves = 0; } #ifdef _S9XLUA_H // load lua script if option passed g_config->getOption("SDL.LuaScript", &s); g_config->setOption("SDL.LuaScript", ""); if (s != "") { FCEU_LoadLuaCode(s.c_str()); } #endif { int id; g_config->getOption("SDL.NewPPU", &id); if (id) newppu = 1; } g_config->getOption("SDL.Frameskip", &frameskip); // loop playing the game #ifdef _GTK if(noGui == 0) { while(1) { if(GameInfo) DoFun(frameskip, periodic_saves); else SDL_Delay(1); while(gtk_events_pending()) gtk_main_iteration_do(FALSE); } } else { while(GameInfo) DoFun(frameskip, periodic_saves); } #else while(GameInfo) { DoFun(frameskip, periodic_saves); } #endif CloseGame(); // exit the infrastructure FCEUI_Kill(); SDL_Quit(); return 0; }