* Taseditor: Markers aren't bound to Input by default, Markers are always restored when deploying Bookmarks
* Taseditor: Lua registermanual allows changing the "Run function" button caption * Taseditor: fixed bug with rejecting movies starting from savestate
This commit is contained in:
parent
b8edb6e17e
commit
a40e4c655a
|
@ -8,7 +8,7 @@
|
|||
---------------------------------------------------------------------------
|
||||
-- Usage:
|
||||
-- Run the script, unpause emulation (or simply Frame Advance once).
|
||||
-- Now you can press "Run function" button to invert current Selection.
|
||||
-- Now you can press "Invert Selection" button to invert current Selection.
|
||||
-- Previously selected frames become deselected, all other frames become selected.
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
|
@ -51,5 +51,5 @@ function invert_selection()
|
|||
end
|
||||
|
||||
taseditor.registerauto(display_selection);
|
||||
taseditor.registermanual(invert_selection);
|
||||
taseditor.registermanual(invert_selection, "Invert Selection");
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
-- Use the script when you want to exchange recorded input between joypads.
|
||||
-- Run the script, unpause emulation (or simply Frame Advance once).
|
||||
-- Now you can select several frames of input data and then
|
||||
-- press "Run function" button to swap inputs of 1P and 2P.
|
||||
-- press "Swap 1P/2P" button to swap Input of 1P and 2P in selected frames.
|
||||
-- You can easily modify the script to swap any other joypads.
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
|
@ -32,16 +32,6 @@ function swap()
|
|||
end
|
||||
end
|
||||
|
||||
taseditor.registermanual(swap);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
taseditor.registermanual(swap, "Swap 1P/2P");
|
||||
|
||||
|
||||
|
|
|
@ -108,8 +108,10 @@ bool EnterTasEditor()
|
|||
history.init();
|
||||
taseditor_lua.init();
|
||||
// either start new movie or use current movie
|
||||
if (FCEUMOV_Mode(MOVIEMODE_INACTIVE))
|
||||
if (FCEUMOV_Mode(MOVIEMODE_INACTIVE) || currMovieData.savestate.size() != 0)
|
||||
{
|
||||
if (currMovieData.savestate.size() != 0)
|
||||
FCEUD_PrintError("This version of TAS Editor doesn't work with movies starting from savestate.");
|
||||
// create new movie
|
||||
FCEUI_StopMovie();
|
||||
movieMode = MOVIEMODE_TASEDITOR;
|
||||
|
@ -118,12 +120,6 @@ bool EnterTasEditor()
|
|||
} else
|
||||
{
|
||||
// use current movie to create a new project
|
||||
if (currMovieData.savestate.size() != 0)
|
||||
{
|
||||
FCEUD_PrintError("This version of TAS Editor doesn't work with movies starting from savestate.");
|
||||
// delete savestate, but preserve Input anyway
|
||||
currMovieData.savestate.clear();
|
||||
}
|
||||
FCEUI_StopMovie();
|
||||
movieMode = MOVIEMODE_TASEDITOR;
|
||||
}
|
||||
|
@ -781,7 +777,7 @@ void ApplyMovieInputConfig()
|
|||
// this getter contains formula to decide whether to record or replay movie
|
||||
bool TaseditorIsRecording()
|
||||
{
|
||||
if (movie_readonly || playback.GetPauseFrame() > currFrameCounter)
|
||||
if (movie_readonly || playback.GetPauseFrame() >= 0)
|
||||
return false; // replay
|
||||
return true; // record
|
||||
}
|
||||
|
|
|
@ -391,7 +391,6 @@ void BOOKMARKS::jump(int slot)
|
|||
{
|
||||
int frame = bookmarks_array[slot].snapshot.jump_frame;
|
||||
playback.jump(frame);
|
||||
if (playback.GetPauseFrame())
|
||||
piano_roll.FollowPauseframe();
|
||||
bookmarks_array[slot].jumped();
|
||||
}
|
||||
|
@ -410,7 +409,7 @@ void BOOKMARKS::deploy(int slot)
|
|||
int jump_frame = bookmarks_array[slot].snapshot.jump_frame;
|
||||
bool markers_changed = false;
|
||||
// revert Markers to the Bookmarked state
|
||||
if (taseditor_config.bind_markers)
|
||||
//if (taseditor_config.bind_markers)
|
||||
{
|
||||
if (bookmarks_array[slot].snapshot.MarkersDifferFromCurrent())
|
||||
{
|
||||
|
|
|
@ -98,20 +98,20 @@ void GREENZONE::CollectCurrentState()
|
|||
lag_history.erase(lag_history.begin() + (currFrameCounter - 1));
|
||||
editor.AdjustUp(currFrameCounter - 1);
|
||||
// since AdjustUp didn't restore Playback cursor, we must rewind here
|
||||
int pause_frame = playback.GetPauseFrame();
|
||||
int saved_pause_frame = playback.GetPauseFrame();
|
||||
playback.jump(currFrameCounter - 1); // rewind
|
||||
if (pause_frame)
|
||||
playback.SeekingStart(pause_frame);
|
||||
if (saved_pause_frame >= 0)
|
||||
playback.SeekingStart(saved_pause_frame);
|
||||
} else if (!old_lagFlag && lagFlag)
|
||||
{
|
||||
// there's new lag on previous frame - shift Input down
|
||||
lag_history.insert(lag_history.begin() + (currFrameCounter - 1), 1);
|
||||
editor.AdjustDown(currFrameCounter - 1);
|
||||
// since AdjustDown didn't restore Playback cursor, we must rewind here
|
||||
int pause_frame = playback.GetPauseFrame();
|
||||
int saved_pause_frame = playback.GetPauseFrame();
|
||||
playback.jump(currFrameCounter - 1); // rewind
|
||||
if (pause_frame)
|
||||
playback.SeekingStart(pause_frame);
|
||||
if (saved_pause_frame >= 0)
|
||||
playback.SeekingStart(saved_pause_frame);
|
||||
}
|
||||
} else
|
||||
{
|
||||
|
@ -445,12 +445,14 @@ void GREENZONE::InvalidateAndCheck(int after)
|
|||
{
|
||||
if (playback.GetFixedPauseFrame())
|
||||
{
|
||||
playback.jump(playback.GetPauseFrame() - 1);
|
||||
// continue seeking
|
||||
playback.jump(playback.GetPauseFrame());
|
||||
} else
|
||||
{
|
||||
playback.SetLostPosition(currFrameCounter);
|
||||
if (taseditor_config.restore_position)
|
||||
playback.jump(currFrameCounter);
|
||||
// start seeking
|
||||
playback.jump(playback.GetLostPosition());
|
||||
else
|
||||
playback.jump(greenZoneCount - 1);
|
||||
}
|
||||
|
@ -461,7 +463,7 @@ void GREENZONE::InvalidateAndCheck(int after)
|
|||
piano_roll.RedrawList();
|
||||
bookmarks.RedrawBookmarksList();
|
||||
}
|
||||
// This version doesn't restore playback, may be used only by Branching, Recording and Adjusting functions!
|
||||
// This version doesn't restore playback, may be used only by Branching, Recording and AdjustLag functions!
|
||||
void GREENZONE::Invalidate(int after)
|
||||
{
|
||||
if (after >= 0)
|
||||
|
|
|
@ -540,7 +540,7 @@ void PIANO_ROLL::update()
|
|||
{
|
||||
case DRAG_MODE_PLAYBACK:
|
||||
{
|
||||
if (!playback.GetPauseFrame() || can_drag_when_seeking)
|
||||
if (playback.GetPauseFrame() < 0 || can_drag_when_seeking)
|
||||
{
|
||||
DragPlaybackCursor();
|
||||
// after first seeking is finished (if there was any seeking), it now becomes possible to drag when seeking
|
||||
|
@ -963,8 +963,8 @@ void PIANO_ROLL::FollowSelection()
|
|||
}
|
||||
void PIANO_ROLL::FollowPauseframe()
|
||||
{
|
||||
if (playback.GetPauseFrame() > 0)
|
||||
CenterListAt(playback.GetPauseFrame() - 1);
|
||||
if (playback.GetPauseFrame() >= 0)
|
||||
CenterListAt(playback.GetPauseFrame());
|
||||
}
|
||||
void PIANO_ROLL::FollowMarker(int marker_id)
|
||||
{
|
||||
|
|
|
@ -141,7 +141,7 @@ void PLAYBACK::update()
|
|||
// pause when seeking hits pause_frame
|
||||
if (pause_frame && currFrameCounter + 1 >= pause_frame)
|
||||
SeekingStop();
|
||||
else if (currFrameCounter + 1 > lost_position_frame && currFrameCounter >= currMovieData.getNumRecords()-1 && autopause_at_the_end && taseditor_config.autopause_at_finish)
|
||||
else if (currFrameCounter >= GetLostPosition() && currFrameCounter >= currMovieData.getNumRecords() - 1 && autopause_at_the_end && taseditor_config.autopause_at_finish)
|
||||
// pause at the end of the movie
|
||||
PauseEmulation();
|
||||
|
||||
|
@ -269,10 +269,10 @@ void PLAYBACK::UnpauseEmulation()
|
|||
}
|
||||
void PLAYBACK::RestorePosition()
|
||||
{
|
||||
if (lost_position_frame > currFrameCounter + 1)
|
||||
if (GetLostPosition() > currFrameCounter)
|
||||
{
|
||||
if (emu_paused)
|
||||
SeekingStart(lost_position_frame);
|
||||
SeekingStart(GetLostPosition());
|
||||
else
|
||||
PauseEmulation();
|
||||
}
|
||||
|
@ -293,23 +293,23 @@ void PLAYBACK::MiddleButtonClick()
|
|||
for (; target_frame <= last_frame; ++target_frame)
|
||||
if (markers_manager.GetMarker(target_frame)) break;
|
||||
if (target_frame <= last_frame)
|
||||
SeekingStart(target_frame + 1);
|
||||
SeekingStart(target_frame);
|
||||
} else if (GetAsyncKeyState(VK_CONTROL) < 0)
|
||||
{
|
||||
// if Ctrl is held, seek to Selection cursor or replay from Selection cursor
|
||||
int selection_beginning = selection.GetCurrentSelectionBeginning();
|
||||
if (selection_beginning > currFrameCounter)
|
||||
{
|
||||
SeekingStart(selection_beginning + 1);
|
||||
SeekingStart(selection_beginning);
|
||||
} else if (selection_beginning < currFrameCounter)
|
||||
{
|
||||
int saved_currFrameCounter = currFrameCounter;
|
||||
if (selection_beginning < 0)
|
||||
selection_beginning = 0;
|
||||
jump(selection_beginning);
|
||||
SeekingStart(saved_currFrameCounter + 1);
|
||||
SeekingStart(saved_currFrameCounter);
|
||||
}
|
||||
} else if (lost_position_frame > currFrameCounter + 1)
|
||||
} else if (GetLostPosition() > currFrameCounter)
|
||||
{
|
||||
RestorePosition();
|
||||
} else
|
||||
|
@ -325,10 +325,10 @@ void PLAYBACK::MiddleButtonClick()
|
|||
|
||||
void PLAYBACK::SeekingStart(int finish_frame)
|
||||
{
|
||||
if (pause_frame != finish_frame)
|
||||
if ((pause_frame - 1) != finish_frame)
|
||||
{
|
||||
seeking_start_frame = currFrameCounter;
|
||||
pause_frame = finish_frame;
|
||||
pause_frame = finish_frame + 1;
|
||||
}
|
||||
pause_frame_must_be_fixed = true;
|
||||
if (taseditor_config.turbo_seek)
|
||||
|
@ -456,7 +456,7 @@ bool PLAYBACK::JumpToFrame(int index)
|
|||
// make jump outside Greenzone
|
||||
if (currFrameCounter == greenzone.GetSize() - 1 || JumpToFrame(greenzone.GetSize() - 1))
|
||||
// seek there from the end of greenzone
|
||||
SeekingStart(index+1);
|
||||
SeekingStart(index);
|
||||
return false;
|
||||
}
|
||||
// make jump inside greenzone
|
||||
|
@ -476,13 +476,13 @@ bool PLAYBACK::JumpToFrame(int index)
|
|||
StartFromZero(); // couldn't find a savestate
|
||||
// continue from the frame
|
||||
if (index != currFrameCounter)
|
||||
SeekingStart(index + 1);
|
||||
SeekingStart(index);
|
||||
return true;
|
||||
}
|
||||
|
||||
void PLAYBACK::SetLostPosition(int frame)
|
||||
{
|
||||
if ((lost_position_frame < frame + 1) || (lost_position_frame > frame + 1 && !lost_position_must_be_fixed))
|
||||
if ((lost_position_frame - 1 < frame) || (lost_position_frame - 1 > frame && !lost_position_must_be_fixed))
|
||||
{
|
||||
if (lost_position_frame)
|
||||
piano_roll.RedrawRow(lost_position_frame - 1);
|
||||
|
@ -497,7 +497,7 @@ int PLAYBACK::GetLostPosition()
|
|||
|
||||
int PLAYBACK::GetPauseFrame()
|
||||
{
|
||||
return pause_frame;
|
||||
return pause_frame - 1;
|
||||
}
|
||||
int PLAYBACK::GetFlashingPauseFrame()
|
||||
{
|
||||
|
|
|
@ -12,7 +12,7 @@ Popup display - Manager of popup windows
|
|||
|
||||
* implements all operations with popup windows: initialization, redrawing, centering, screenshot decompression and conversion
|
||||
* regularly inspects changes of Bookmarks Manager and shows/updates/hides popup windows
|
||||
* on demend: updates contents of popup windows
|
||||
* on demand: updates contents of popup windows
|
||||
* stores resources: coordinates and appearance of popup windows, timings of fade in/out
|
||||
------------------------------------------------------------------------------------ */
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
|
|||
Recorder - Tool for Input recording
|
||||
[Singleton]
|
||||
|
||||
* at the moment of recording movie Input (at the beginning of a frame) by emulator's call the Recorder intercepts Input data and applies its filters (multitracking/etc), then reflects Input changes into History and Greenzone
|
||||
* at the moment of recording movie Input (at the very end of a frame) by emulator's call the Recorder intercepts Input data and applies its filters (multitracking/etc), then reflects Input changes into History and Greenzone
|
||||
* regularly tracks virtual joypad buttonpresses and provides data for Piano Roll List Header lights. Also reacts on external changes of Recording status, and updates GUI (Recorder panel and Bookmarks/Branches caption)
|
||||
* implements Input editing in Read-only mode (ColumnSet by pressing buttons on virtual joypad)
|
||||
* stores resources: ids and names of multitracking modes, suffixes for TAS Editor window caption
|
||||
|
|
|
@ -40,7 +40,7 @@ TASEDITOR_CONFIG::TASEDITOR_CONFIG()
|
|||
enable_hot_changes = true;
|
||||
jump_to_undo = true;
|
||||
follow_note_context = true;
|
||||
bind_markers = true;
|
||||
bind_markers = false;
|
||||
empty_marker_notes = true;
|
||||
combine_consecutive = false;
|
||||
use_1p_rec = true;
|
||||
|
|
|
@ -12,8 +12,8 @@ Lua - Manager of Lua features
|
|||
|
||||
* implements logic of all functions of "taseditor" Lua library
|
||||
* stores the list of pending Input changes
|
||||
* on demend: (from FCEUX Lua engine) updates GUI items on "Lua" panel of TAS Editor window
|
||||
* stores resources: ids of joypads for Input changes, max length of a name for applychanges()
|
||||
* on demand: (from FCEUX Lua engine) updates "Run function" button
|
||||
* stores resources: ids of joypads for Input changes, max length of a name for applychanges(), default caption for "Run function" button
|
||||
------------------------------------------------------------------------------------ */
|
||||
|
||||
#include "taseditor_project.h"
|
||||
|
@ -30,7 +30,9 @@ extern GREENZONE greenzone;
|
|||
extern PIANO_ROLL piano_roll;
|
||||
extern SELECTION selection;
|
||||
|
||||
extern void TaseditorUpdateManualFunctionStatus();
|
||||
extern void TaseditorDisableManualFunctionIfNeeded();
|
||||
|
||||
const char defaultRunFunctionCaption[] = "Run function";
|
||||
|
||||
TASEDITOR_LUA::TASEDITOR_LUA()
|
||||
{
|
||||
|
@ -44,19 +46,24 @@ void TASEDITOR_LUA::init()
|
|||
}
|
||||
void TASEDITOR_LUA::reset()
|
||||
{
|
||||
TaseditorUpdateManualFunctionStatus();
|
||||
TaseditorDisableManualFunctionIfNeeded();
|
||||
}
|
||||
void TASEDITOR_LUA::update()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void TASEDITOR_LUA::EnableRunFunction()
|
||||
void TASEDITOR_LUA::EnableRunFunction(const char* caption)
|
||||
{
|
||||
if (caption)
|
||||
SetWindowText(hwndRunFunction, caption);
|
||||
else
|
||||
SetWindowText(hwndRunFunction, defaultRunFunctionCaption);
|
||||
EnableWindow(hwndRunFunction, true);
|
||||
}
|
||||
void TASEDITOR_LUA::DisableRunFunction()
|
||||
{
|
||||
SetWindowText(hwndRunFunction, defaultRunFunctionCaption);
|
||||
EnableWindow(hwndRunFunction, false);
|
||||
}
|
||||
|
||||
|
@ -227,7 +234,7 @@ int TASEDITOR_LUA::getlostplayback()
|
|||
int TASEDITOR_LUA::getplaybacktarget()
|
||||
{
|
||||
if (FCEUMOV_Mode(MOVIEMODE_TASEDITOR))
|
||||
return playback.GetPauseFrame() - 1;
|
||||
return playback.GetPauseFrame();
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
|
|
@ -34,7 +34,7 @@ public:
|
|||
void reset();
|
||||
void update();
|
||||
|
||||
void EnableRunFunction();
|
||||
void EnableRunFunction(const char* caption = NULL);
|
||||
void DisableRunFunction();
|
||||
|
||||
void InsertDelete_rows_to_Snaphot(SNAPSHOT& snapshot);
|
||||
|
|
|
@ -363,7 +363,7 @@ void TASEDITOR_WINDOW::update()
|
|||
case DRAG_MODE_PLAYBACK:
|
||||
{
|
||||
// user is dragging Playback cursor - show either normal arrow or arrow+wait
|
||||
if (playback.GetPauseFrame())
|
||||
if (playback.GetPauseFrame() >= 0)
|
||||
cursor_icon = IDC_APPSTARTING;
|
||||
break;
|
||||
}
|
||||
|
@ -1011,7 +1011,7 @@ BOOL CALLBACK WndprocTasEditor(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPara
|
|||
taseditor_config.turbo_seek ^= 1;
|
||||
taseditor_window.UpdateCheckedItems();
|
||||
// if currently seeking, apply this option immediately
|
||||
if (playback.GetPauseFrame())
|
||||
if (playback.GetPauseFrame() >= 0)
|
||||
turbo = taseditor_config.turbo_seek;
|
||||
break;
|
||||
case ID_VIEW_SHOWBRANCHSCREENSHOTS:
|
||||
|
|
|
@ -127,7 +127,7 @@ extern INT_PTR CALLBACK DlgLuaScriptDialog(HWND hDlg, UINT msg, WPARAM wParam, L
|
|||
extern void PrintToWindowConsole(int hDlgAsInt, const char* str);
|
||||
extern void WinLuaOnStart(int hDlgAsInt);
|
||||
extern void WinLuaOnStop(int hDlgAsInt);
|
||||
void TaseditorUpdateManualFunctionStatus();
|
||||
void TaseditorDisableManualFunctionIfNeeded();
|
||||
#endif
|
||||
|
||||
static lua_State *L;
|
||||
|
@ -243,7 +243,7 @@ static void FCEU_LuaOnStop() {
|
|||
turbo = false;
|
||||
//FCEUD_TurboOff();
|
||||
#ifdef WIN32
|
||||
TaseditorUpdateManualFunctionStatus();
|
||||
TaseditorDisableManualFunctionIfNeeded();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -1886,15 +1886,13 @@ void TaseditorManualFunction()
|
|||
}
|
||||
|
||||
#ifdef WIN32
|
||||
void TaseditorUpdateManualFunctionStatus()
|
||||
void TaseditorDisableManualFunctionIfNeeded()
|
||||
{
|
||||
if (L)
|
||||
{
|
||||
// check if LUACALL_TASEDITOR_MANUAL function is not nil
|
||||
lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_TASEDITOR_MANUAL]);
|
||||
if (lua_isfunction(L, -1))
|
||||
taseditor_lua.EnableRunFunction();
|
||||
else
|
||||
if (!lua_isfunction(L, -1))
|
||||
taseditor_lua.DisableRunFunction();
|
||||
lua_pop(L, 1);
|
||||
} else taseditor_lua.DisableRunFunction();
|
||||
|
@ -4316,17 +4314,22 @@ static int taseditor_registerauto(lua_State *L)
|
|||
return 1;
|
||||
}
|
||||
|
||||
// bool taseditor.registermanual()
|
||||
// bool taseditor.registermanual(string caption)
|
||||
static int taseditor_registermanual(lua_State *L)
|
||||
{
|
||||
if (!lua_isnil(L,1))
|
||||
luaL_checktype(L, 1, LUA_TFUNCTION);
|
||||
|
||||
const char* caption = NULL;
|
||||
if (!lua_isnil(L, 2))
|
||||
caption = lua_tostring(L, 2);
|
||||
|
||||
lua_settop(L,1);
|
||||
lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_TASEDITOR_MANUAL]);
|
||||
lua_insert(L,1);
|
||||
lua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_TASEDITOR_MANUAL]);
|
||||
#ifdef WIN32
|
||||
TaseditorUpdateManualFunctionStatus();
|
||||
taseditor_lua.EnableRunFunction(caption);
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue