// invalidate and restore playback void GREENZONE::invalidateAndUpdatePlayback(int after) { if (after >= 0) { if (after >= currMovieData.getNumRecords()) after = currMovieData.getNumRecords() - 1; // clear all savestates that became irrelevant for (int i = savestates.size() - 1; i > after; i--) clearSavestateOfFrame(i); if (greenzoneSize > after + 1 || currFrameCounter > after) { greenzoneSize = after + 1; FCEUMOV_IncrementRerecordCount(); // either set Playback cursor to be inside the Greenzone or run seeking to restore Playback cursor position if (currFrameCounter >= greenzoneSize) { if (playback.getPauseFrame() >= 0 && !FCEUI_EmulationPaused()) { // emulator was running, so continue seeking, but don't follow the Playback cursor playback.jump(playback.getPauseFrame(), false, true, false); } else { playback.setLastPosition(currFrameCounter); if (taseditorConfig.autoRestoreLastPlaybackPosition) // start seeking to the green arrow, but don't follow the Playback cursor playback.jump(playback.getLastPosition(), false, true, false); else playback.ensurePlaybackIsInsideGreenzone(); } } } } // redraw Piano Roll even if Greenzone didn't change pianoRoll.redraw(); bookmarks.redrawBookmarksList(); }
// this gate handles some FCEUX hotkeys (EMUCMD) void handleEmuCmdByTaseditor(int command) { switch (command) { case EMUCMD_SAVE_SLOT_0: case EMUCMD_SAVE_SLOT_1: case EMUCMD_SAVE_SLOT_2: case EMUCMD_SAVE_SLOT_3: case EMUCMD_SAVE_SLOT_4: case EMUCMD_SAVE_SLOT_5: case EMUCMD_SAVE_SLOT_6: case EMUCMD_SAVE_SLOT_7: case EMUCMD_SAVE_SLOT_8: case EMUCMD_SAVE_SLOT_9: { if (taseditorConfig.oldControlSchemeForBranching) bookmarks.command(COMMAND_SELECT, command - EMUCMD_SAVE_SLOT_0); else bookmarks.command(COMMAND_JUMP, command - EMUCMD_SAVE_SLOT_0); break; } case EMUCMD_SAVE_SLOT_NEXT: { int slot = bookmarks.getSelectedSlot() + 1; if (slot >= TOTAL_BOOKMARKS) slot = 0; bookmarks.command(COMMAND_SELECT, slot); break; } case EMUCMD_SAVE_SLOT_PREV: { int slot = bookmarks.getSelectedSlot() - 1; if (slot < 0) slot = TOTAL_BOOKMARKS - 1; bookmarks.command(COMMAND_SELECT, slot); break; } case EMUCMD_SAVE_STATE: bookmarks.command(COMMAND_SET); break; case EMUCMD_SAVE_STATE_SLOT_0: case EMUCMD_SAVE_STATE_SLOT_1: case EMUCMD_SAVE_STATE_SLOT_2: case EMUCMD_SAVE_STATE_SLOT_3: case EMUCMD_SAVE_STATE_SLOT_4: case EMUCMD_SAVE_STATE_SLOT_5: case EMUCMD_SAVE_STATE_SLOT_6: case EMUCMD_SAVE_STATE_SLOT_7: case EMUCMD_SAVE_STATE_SLOT_8: case EMUCMD_SAVE_STATE_SLOT_9: bookmarks.command(COMMAND_SET, command - EMUCMD_SAVE_STATE_SLOT_0); break; case EMUCMD_LOAD_STATE: bookmarks.command(COMMAND_DEPLOY); break; case EMUCMD_LOAD_STATE_SLOT_0: case EMUCMD_LOAD_STATE_SLOT_1: case EMUCMD_LOAD_STATE_SLOT_2: case EMUCMD_LOAD_STATE_SLOT_3: case EMUCMD_LOAD_STATE_SLOT_4: case EMUCMD_LOAD_STATE_SLOT_5: case EMUCMD_LOAD_STATE_SLOT_6: case EMUCMD_LOAD_STATE_SLOT_7: case EMUCMD_LOAD_STATE_SLOT_8: case EMUCMD_LOAD_STATE_SLOT_9: bookmarks.command(COMMAND_DEPLOY, command - EMUCMD_LOAD_STATE_SLOT_0); break; case EMUCMD_MOVIE_PLAY_FROM_BEGINNING: movie_readonly = true; playback.jump(0); break; case EMUCMD_RELOAD: taseditorWindow.loadRecentProject(0); break; case EMUCMD_TASEDITOR_RESTORE_PLAYBACK: playback.restoreLastPosition(); break; case EMUCMD_TASEDITOR_CANCEL_SEEKING: playback.cancelSeeking(); break; case EMUCMD_TASEDITOR_SWITCH_AUTORESTORING: taseditorConfig.autoRestoreLastPlaybackPosition ^= 1; taseditorWindow.updateCheckedItems(); break; case EMUCMD_TASEDITOR_SWITCH_MULTITRACKING: recorder.multitrackRecordingJoypadNumber++; if (recorder.multitrackRecordingJoypadNumber > joysticksPerFrame[getInputType(currMovieData)]) recorder.multitrackRecordingJoypadNumber = 0; break; case EMUCMD_TASEDITOR_RUN_MANUAL_LUA: // the function will be called in next window update mustCallManualLuaFunction = true; break; } }