* Taseditor: fixed bugs with holding Shift+Up/Down and similar situations when the Playback cursor moves more than once within one update
* Taseditor: Changed "Compact save" dialog, added 4 options of Greenzone saving: all frames, every 16th frame, marked frames, don't save * Taseditor: Config->Compact Quicksaving (affects Ctrl+S and Autosave)
This commit is contained in:
parent
07a21643d6
commit
ca82eadedf
|
@ -362,6 +362,7 @@ static CFGSTRUCT fceuconfig[] =
|
|||
AC(taseditor_config.findnote_search_up),
|
||||
AC(taseditor_config.draw_input),
|
||||
AC(taseditor_config.enable_greenzoning),
|
||||
AC(taseditor_config.compact_quicksaving),
|
||||
AC(taseditor_config.silent_autosave),
|
||||
AC(taseditor_config.autopause_at_finish),
|
||||
AC(taseditor_config.tooltips),
|
||||
|
|
|
@ -283,6 +283,8 @@ BEGIN
|
|||
MENUITEM MFT_SEPARATOR
|
||||
MENUITEM "Enable Greenzoning", ID_CONFIG_ENABLEGREENZONING,MFT_STRING,MFS_ENABLED
|
||||
MENUITEM "Silent Autosave", ID_CONFIG_SILENTAUTOSAVE,MFT_STRING,MFS_ENABLED
|
||||
MENUITEM "Compact Quicksaving", ID_CONFIG_COMPACTQUICKSAVING,MFT_STRING,MFS_ENABLED
|
||||
MENUITEM MFT_SEPARATOR
|
||||
MENUITEM "Autofire Pattern skips Lag", ID_CONFIG_PATTERNSKIPSLAG,MFT_STRING,MFS_ENABLED
|
||||
MENUITEM "Auto-adjust Input according to Lag", ID_CONFIG_ADJUSTLAG,MFT_STRING,MFS_ENABLED
|
||||
MENUITEM MFT_SEPARATOR
|
||||
|
@ -1529,20 +1531,24 @@ BEGIN
|
|||
CONTROL " Down",IDC_RADIO_DOWN,"Button",BS_AUTORADIOBUTTON,125,30,32,10
|
||||
END
|
||||
|
||||
IDD_TASEDITOR_SAVECOMPACT DIALOGEX 0, 0, 122, 134
|
||||
IDD_TASEDITOR_SAVECOMPACT DIALOGEX 0, 0, 123, 201
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Save Compact"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
DEFPUSHBUTTON "Save",IDOK,7,114,50,14
|
||||
PUSHBUTTON "Cancel",IDCANCEL,65,114,50,14
|
||||
CONTROL " Binary format of Input",IDC_CHECK_BINARY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,7,87,10
|
||||
CONTROL " Markers",IDC_CHECK_MARKERS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,35,22,67,10
|
||||
CONTROL " Bookmarks",IDC_CHECK_BOOKMARKS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,35,37,67,10
|
||||
CONTROL " Greenzone",IDC_CHECK_GREENZONE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,35,52,67,10
|
||||
CONTROL " History",IDC_CHECK_HISTORY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,35,67,67,10
|
||||
CONTROL " Piano Roll",IDC_CHECK_PIANO_ROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,35,82,67,10
|
||||
CONTROL " Selection",IDC_CHECK_SELECTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,35,97,67,10
|
||||
DEFPUSHBUTTON "Save",IDOK,8,181,50,14
|
||||
PUSHBUTTON "Cancel",IDCANCEL,66,181,50,14
|
||||
CONTROL " Binary format of Input",IDC_CHECK_BINARY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,8,87,10
|
||||
CONTROL " Markers",IDC_CHECK_MARKERS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,33,23,67,10
|
||||
CONTROL " Bookmarks",IDC_CHECK_BOOKMARKS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,33,39,67,10
|
||||
CONTROL " History",IDC_CHECK_HISTORY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,33,55,67,10
|
||||
CONTROL " Piano Roll",IDC_CHECK_PIANO_ROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,33,71,67,10
|
||||
CONTROL " Selection",IDC_CHECK_SELECTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,33,87,67,10
|
||||
GROUPBOX "Greenzone saving options",IDC_STATIC,13,102,97,72
|
||||
CONTROL "all frames",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,34,114,69,10
|
||||
CONTROL "every 16th frame",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,34,128,69,10
|
||||
CONTROL "marked frames",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,34,143,69,10
|
||||
CONTROL "don't save",IDC_RADIO4,"Button",BS_AUTORADIOBUTTON,34,158,69,10
|
||||
END
|
||||
|
||||
ASSEMBLER DIALOGEX 0, 0, 202, 135
|
||||
|
@ -2059,6 +2065,7 @@ BEGIN
|
|||
|
||||
IDD_TASEDITOR_SAVECOMPACT, DIALOG
|
||||
BEGIN
|
||||
BOTTOMMARGIN, 192
|
||||
END
|
||||
|
||||
"ASSEMBLER", DIALOG
|
||||
|
|
|
@ -403,7 +403,6 @@
|
|||
#define MENU_PAL 311
|
||||
#define IDC_DEBUGGER_VAL_SPR 311
|
||||
#define IDC_LABEL_TWEAKCOUNT 311
|
||||
#define IDC_BTN_CHEAT_UPD2 311
|
||||
#define IDC_BTN_CHEAT_ADDFROMFILE 311
|
||||
#define IDC_DEBUGGER_BOOKMARK 312
|
||||
#define IDC_DEBUGGER_CYCLES_EXCEED 313
|
||||
|
@ -1154,6 +1153,7 @@
|
|||
#define ID_EMULATIONSPEED_CUSTOMSPEED 40577
|
||||
#define ID_ENABLE_AUTO 40578
|
||||
#define ID_ENABLE_AUTORESUME 40579
|
||||
#define ID_CONFIG_COMPACTQUICKSAVING 40580
|
||||
#define IDC_DEBUGGER_ICONTRAY 55535
|
||||
#define MW_ValueLabel2 65423
|
||||
#define MW_ValueLabel1 65426
|
||||
|
@ -1164,7 +1164,7 @@
|
|||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 289
|
||||
#define _APS_NEXT_COMMAND_VALUE 40580
|
||||
#define _APS_NEXT_COMMAND_VALUE 40581
|
||||
#define _APS_NEXT_CONTROL_VALUE 1282
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
|
|
|
@ -414,7 +414,7 @@ bool LoadProject(const char* fullname)
|
|||
}
|
||||
|
||||
// Saves current project
|
||||
bool SaveProjectAs()
|
||||
bool SaveProjectAs(bool save_compact)
|
||||
{
|
||||
const char filter[] = "TAS Editor Projects (*.fm3)\0*.fm3\0All Files (*.*)\0*.*\0\0";
|
||||
OPENFILENAME ofn;
|
||||
|
@ -448,58 +448,58 @@ bool SaveProjectAs()
|
|||
if (GetSaveFileName(&ofn)) // if it is a valid filename
|
||||
{
|
||||
project.RenameProject(nameo, true);
|
||||
project.save();
|
||||
if (save_compact)
|
||||
project.save(nameo, taseditor_config.savecompact_binary, taseditor_config.savecompact_markers, taseditor_config.savecompact_bookmarks, taseditor_config.savecompact_greenzone, taseditor_config.savecompact_history, taseditor_config.savecompact_piano_roll, taseditor_config.savecompact_selection);
|
||||
else
|
||||
project.save();
|
||||
taseditor_window.UpdateRecentProjectsArray(nameo);
|
||||
// saved successfully - remove * mark from caption
|
||||
taseditor_window.UpdateCaption();
|
||||
} else return false;
|
||||
return true;
|
||||
}
|
||||
bool SaveProject()
|
||||
bool SaveProject(bool save_compact)
|
||||
{
|
||||
if (project.GetProjectFile().empty())
|
||||
{
|
||||
return SaveProjectAs();
|
||||
return SaveProjectAs(save_compact);
|
||||
} else
|
||||
{
|
||||
project.save();
|
||||
if (save_compact)
|
||||
project.save(0, taseditor_config.savecompact_binary, taseditor_config.savecompact_markers, taseditor_config.savecompact_bookmarks, taseditor_config.savecompact_greenzone, taseditor_config.savecompact_history, taseditor_config.savecompact_piano_roll, taseditor_config.savecompact_selection);
|
||||
else
|
||||
project.save();
|
||||
taseditor_window.UpdateCaption();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void SaveCompact_GetCheckboxes(HWND hwndDlg)
|
||||
void SaveCompact_SetDialogItems(HWND hwndDlg)
|
||||
{
|
||||
CheckDlgButton(hwndDlg, IDC_CHECK_BINARY, taseditor_config.savecompact_binary?MF_CHECKED : MF_UNCHECKED);
|
||||
CheckDlgButton(hwndDlg, IDC_CHECK_MARKERS, taseditor_config.savecompact_markers?MF_CHECKED : MF_UNCHECKED);
|
||||
CheckDlgButton(hwndDlg, IDC_CHECK_BOOKMARKS, taseditor_config.savecompact_bookmarks?MF_CHECKED : MF_UNCHECKED);
|
||||
CheckDlgButton(hwndDlg, IDC_CHECK_HISTORY, taseditor_config.savecompact_history?MF_CHECKED : MF_UNCHECKED);
|
||||
CheckDlgButton(hwndDlg, IDC_CHECK_PIANO_ROLL, taseditor_config.savecompact_piano_roll?MF_CHECKED : MF_UNCHECKED);
|
||||
CheckDlgButton(hwndDlg, IDC_CHECK_SELECTION, taseditor_config.savecompact_selection?MF_CHECKED : MF_UNCHECKED);
|
||||
CheckRadioButton(hwndDlg, IDC_RADIO1, IDC_RADIO4, IDC_RADIO1 + (taseditor_config.savecompact_greenzone % SAVECOMPACT_GREENZONE_TOTAL));
|
||||
}
|
||||
void SaveCompact_GetDialogItems(HWND hwndDlg)
|
||||
{
|
||||
taseditor_config.savecompact_binary = (SendDlgItemMessage(hwndDlg, IDC_CHECK_BINARY, BM_GETCHECK, 0, 0) == BST_CHECKED);
|
||||
taseditor_config.savecompact_markers = (SendDlgItemMessage(hwndDlg, IDC_CHECK_MARKERS, BM_GETCHECK, 0, 0) == BST_CHECKED);
|
||||
taseditor_config.savecompact_bookmarks = (SendDlgItemMessage(hwndDlg, IDC_CHECK_BOOKMARKS, BM_GETCHECK, 0, 0) == BST_CHECKED);
|
||||
taseditor_config.savecompact_greenzone = (SendDlgItemMessage(hwndDlg, IDC_CHECK_GREENZONE, BM_GETCHECK, 0, 0) == BST_CHECKED);
|
||||
taseditor_config.savecompact_history = (SendDlgItemMessage(hwndDlg, IDC_CHECK_HISTORY, BM_GETCHECK, 0, 0) == BST_CHECKED);
|
||||
taseditor_config.savecompact_piano_roll = (SendDlgItemMessage(hwndDlg, IDC_CHECK_PIANO_ROLL, BM_GETCHECK, 0, 0) == BST_CHECKED);
|
||||
taseditor_config.savecompact_selection = (SendDlgItemMessage(hwndDlg, IDC_CHECK_SELECTION, BM_GETCHECK, 0, 0) == BST_CHECKED);
|
||||
}
|
||||
|
||||
BOOL CALLBACK AboutProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (message)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
SendMessage(GetDlgItem(hWnd, IDC_TASEDITOR_NAME), WM_SETFONT, (WPARAM)piano_roll.hTaseditorAboutFont, 0);
|
||||
break;
|
||||
}
|
||||
case WM_COMMAND:
|
||||
{
|
||||
switch (LOWORD(wParam))
|
||||
{
|
||||
case IDCANCEL:
|
||||
EndDialog(hWnd, 0);
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
if (SendDlgItemMessage(hwndDlg, IDC_RADIO1, BM_GETCHECK, 0, 0) == BST_CHECKED)
|
||||
taseditor_config.savecompact_greenzone = SAVECOMPACT_GREENZONE_ALL;
|
||||
else if (SendDlgItemMessage(hwndDlg, IDC_RADIO2, BM_GETCHECK, 0, 0) == BST_CHECKED)
|
||||
taseditor_config.savecompact_greenzone = SAVECOMPACT_GREENZONE_16TH;
|
||||
else if (SendDlgItemMessage(hwndDlg, IDC_RADIO3, BM_GETCHECK, 0, 0) == BST_CHECKED)
|
||||
taseditor_config.savecompact_greenzone = SAVECOMPACT_GREENZONE_MARKED;
|
||||
else
|
||||
taseditor_config.savecompact_greenzone = SAVECOMPACT_GREENZONE_NO;
|
||||
}
|
||||
|
||||
BOOL CALLBACK SaveCompactProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
|
@ -509,13 +509,7 @@ BOOL CALLBACK SaveCompactProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM
|
|||
case WM_INITDIALOG:
|
||||
{
|
||||
SetWindowPos(hwndDlg, 0, taseditor_config.wndx + 100, taseditor_config.wndy + 200, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER);
|
||||
CheckDlgButton(hwndDlg, IDC_CHECK_BINARY, taseditor_config.savecompact_binary?MF_CHECKED : MF_UNCHECKED);
|
||||
CheckDlgButton(hwndDlg, IDC_CHECK_MARKERS, taseditor_config.savecompact_markers?MF_CHECKED : MF_UNCHECKED);
|
||||
CheckDlgButton(hwndDlg, IDC_CHECK_BOOKMARKS, taseditor_config.savecompact_bookmarks?MF_CHECKED : MF_UNCHECKED);
|
||||
CheckDlgButton(hwndDlg, IDC_CHECK_GREENZONE, taseditor_config.savecompact_greenzone?MF_CHECKED : MF_UNCHECKED);
|
||||
CheckDlgButton(hwndDlg, IDC_CHECK_HISTORY, taseditor_config.savecompact_history?MF_CHECKED : MF_UNCHECKED);
|
||||
CheckDlgButton(hwndDlg, IDC_CHECK_PIANO_ROLL, taseditor_config.savecompact_piano_roll?MF_CHECKED : MF_UNCHECKED);
|
||||
CheckDlgButton(hwndDlg, IDC_CHECK_SELECTION, taseditor_config.savecompact_selection?MF_CHECKED : MF_UNCHECKED);
|
||||
SaveCompact_SetDialogItems(hwndDlg);
|
||||
return TRUE;
|
||||
}
|
||||
case WM_COMMAND:
|
||||
|
@ -523,11 +517,11 @@ BOOL CALLBACK SaveCompactProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM
|
|||
switch (LOWORD(wParam))
|
||||
{
|
||||
case IDOK:
|
||||
SaveCompact_GetCheckboxes(hwndDlg);
|
||||
SaveCompact_GetDialogItems(hwndDlg);
|
||||
EndDialog(hwndDlg, 1);
|
||||
return TRUE;
|
||||
case IDCANCEL:
|
||||
SaveCompact_GetCheckboxes(hwndDlg);
|
||||
SaveCompact_GetDialogItems(hwndDlg);
|
||||
EndDialog(hwndDlg, 0);
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -536,7 +530,7 @@ BOOL CALLBACK SaveCompactProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM
|
|||
case WM_CLOSE:
|
||||
case WM_QUIT:
|
||||
{
|
||||
SaveCompact_GetCheckboxes(hwndDlg);
|
||||
SaveCompact_GetDialogItems(hwndDlg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -644,6 +638,29 @@ void Import()
|
|||
}
|
||||
}
|
||||
|
||||
BOOL CALLBACK AboutProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (message)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
SendMessage(GetDlgItem(hWnd, IDC_TASEDITOR_NAME), WM_SETFONT, (WPARAM)piano_roll.hTaseditorAboutFont, 0);
|
||||
break;
|
||||
}
|
||||
case WM_COMMAND:
|
||||
{
|
||||
switch (LOWORD(wParam))
|
||||
{
|
||||
case IDCANCEL:
|
||||
EndDialog(hWnd, 0);
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL CALLBACK ExportProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (message)
|
||||
|
|
|
@ -15,8 +15,8 @@ void UpdateTasEditor();
|
|||
void NewProject();
|
||||
void OpenProject();
|
||||
bool LoadProject(const char* fullname);
|
||||
bool SaveProject();
|
||||
bool SaveProjectAs();
|
||||
bool SaveProject(bool save_compact = false);
|
||||
bool SaveProjectAs(bool save_compact = false);
|
||||
void SaveCompact();
|
||||
bool AskSaveProject();
|
||||
|
||||
|
|
|
@ -224,11 +224,14 @@ void GREENZONE::UnGreenzoneSelectedFrames()
|
|||
}
|
||||
}
|
||||
|
||||
void GREENZONE::save(EMUFILE *os, bool really_save)
|
||||
void GREENZONE::save(EMUFILE *os, int save_type)
|
||||
{
|
||||
if (really_save)
|
||||
if (save_type != SAVECOMPACT_GREENZONE_NO)
|
||||
{
|
||||
CollectCurrentState(); // in case the project is being saved before the greenzone.update() was called within current frame
|
||||
RunGreenzoneCleaning();
|
||||
if (greenZoneCount > (int)savestates.size())
|
||||
greenZoneCount = savestates.size();
|
||||
// write "GREENZONE" string
|
||||
os->fwrite(greenzone_save_id, GREENZONE_ID_LEN);
|
||||
// write LagLog
|
||||
|
@ -237,43 +240,101 @@ void GREENZONE::save(EMUFILE *os, bool really_save)
|
|||
write32le(greenZoneCount, os);
|
||||
// write Playback cursor position
|
||||
write32le(currFrameCounter, os);
|
||||
// write savestates
|
||||
int frame, size;
|
||||
int last_tick = 0;
|
||||
RunGreenzoneCleaning();
|
||||
if (greenZoneCount > (int)savestates.size()) greenZoneCount = savestates.size();
|
||||
for (frame = 0; frame < greenZoneCount; ++frame)
|
||||
{
|
||||
// update TASEditor progressbar from time to time
|
||||
if (frame / PROGRESSBAR_UPDATE_RATE > last_tick)
|
||||
{
|
||||
playback.SetProgressbar(frame, greenZoneCount);
|
||||
last_tick = frame / PROGRESSBAR_UPDATE_RATE;
|
||||
}
|
||||
if (!savestates[frame].size()) continue;
|
||||
write32le(frame, os);
|
||||
// write savestate
|
||||
size = savestates[frame].size();
|
||||
write32le(size, os);
|
||||
os->fwrite(&savestates[frame][0], size);
|
||||
}
|
||||
// write -1 as eof for greenzone
|
||||
write32le(-1, os);
|
||||
} else
|
||||
}
|
||||
int frame, size;
|
||||
int last_tick = 0;
|
||||
|
||||
switch (save_type)
|
||||
{
|
||||
// write "GREENZONX" string
|
||||
os->fwrite(greenzone_skipsave_id, GREENZONE_ID_LEN);
|
||||
// write LagLog
|
||||
laglog.save(os);
|
||||
// write Playback cursor position
|
||||
write32le(currFrameCounter, os);
|
||||
if (currFrameCounter > 0)
|
||||
case SAVECOMPACT_GREENZONE_ALL:
|
||||
{
|
||||
// write ONE savestate for currFrameCounter
|
||||
CollectCurrentState();
|
||||
int size = savestates[currFrameCounter].size();
|
||||
write32le(size, os);
|
||||
os->fwrite(&savestates[currFrameCounter][0], size);
|
||||
// write savestates
|
||||
for (frame = 0; frame < greenZoneCount; ++frame)
|
||||
{
|
||||
// update TASEditor progressbar from time to time
|
||||
if (frame / PROGRESSBAR_UPDATE_RATE > last_tick)
|
||||
{
|
||||
playback.SetProgressbar(frame, greenZoneCount);
|
||||
last_tick = frame / PROGRESSBAR_UPDATE_RATE;
|
||||
}
|
||||
if (!savestates[frame].size()) continue;
|
||||
write32le(frame, os);
|
||||
// write savestate
|
||||
size = savestates[frame].size();
|
||||
write32le(size, os);
|
||||
os->fwrite(&savestates[frame][0], size);
|
||||
}
|
||||
// write -1 as eof for greenzone
|
||||
write32le(-1, os);
|
||||
break;
|
||||
}
|
||||
case SAVECOMPACT_GREENZONE_16TH:
|
||||
{
|
||||
// write savestates
|
||||
for (frame = 0; frame < greenZoneCount; ++frame)
|
||||
{
|
||||
if (!(frame & 0xF) || frame == currFrameCounter)
|
||||
{
|
||||
// update TASEditor progressbar from time to time
|
||||
if (frame / PROGRESSBAR_UPDATE_RATE > last_tick)
|
||||
{
|
||||
playback.SetProgressbar(frame, greenZoneCount);
|
||||
last_tick = frame / PROGRESSBAR_UPDATE_RATE;
|
||||
}
|
||||
if (!savestates[frame].size()) continue;
|
||||
write32le(frame, os);
|
||||
// write savestate
|
||||
size = savestates[frame].size();
|
||||
write32le(size, os);
|
||||
os->fwrite(&savestates[frame][0], size);
|
||||
}
|
||||
}
|
||||
// write -1 as eof for greenzone
|
||||
write32le(-1, os);
|
||||
break;
|
||||
}
|
||||
case SAVECOMPACT_GREENZONE_MARKED:
|
||||
{
|
||||
// write savestates
|
||||
for (frame = 0; frame < greenZoneCount; ++frame)
|
||||
{
|
||||
if (markers_manager.GetMarker(frame) || frame == currFrameCounter)
|
||||
{
|
||||
// update TASEditor progressbar from time to time
|
||||
if (frame / PROGRESSBAR_UPDATE_RATE > last_tick)
|
||||
{
|
||||
playback.SetProgressbar(frame, greenZoneCount);
|
||||
last_tick = frame / PROGRESSBAR_UPDATE_RATE;
|
||||
}
|
||||
if (!savestates[frame].size()) continue;
|
||||
write32le(frame, os);
|
||||
// write savestate
|
||||
size = savestates[frame].size();
|
||||
write32le(size, os);
|
||||
os->fwrite(&savestates[frame][0], size);
|
||||
}
|
||||
}
|
||||
// write -1 as eof for greenzone
|
||||
write32le(-1, os);
|
||||
break;
|
||||
}
|
||||
case SAVECOMPACT_GREENZONE_NO:
|
||||
{
|
||||
// write "GREENZONX" string
|
||||
os->fwrite(greenzone_skipsave_id, GREENZONE_ID_LEN);
|
||||
// write LagLog
|
||||
laglog.save(os);
|
||||
// write Playback cursor position
|
||||
write32le(currFrameCounter, os);
|
||||
if (currFrameCounter > 0)
|
||||
{
|
||||
// write ONE savestate for currFrameCounter
|
||||
CollectCurrentState();
|
||||
int size = savestates[currFrameCounter].size();
|
||||
write32le(size, os);
|
||||
os->fwrite(&savestates[currFrameCounter][0], size);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@ public:
|
|||
void free();
|
||||
void update();
|
||||
|
||||
void save(EMUFILE *os, bool really_save = true);
|
||||
void save(EMUFILE *os, int save_type = SAVECOMPACT_GREENZONE_ALL);
|
||||
bool load(EMUFILE *is, unsigned int offset);
|
||||
|
||||
bool LoadSavestate(unsigned int frame);
|
||||
|
|
|
@ -1109,16 +1109,7 @@ void PIANO_ROLL::DragPlaybackCursor()
|
|||
if (target_frame < 0)
|
||||
target_frame = 0;
|
||||
if (currFrameCounter != target_frame)
|
||||
{
|
||||
int lastCursor = currFrameCounter;
|
||||
playback.jump(target_frame);
|
||||
if (lastCursor != currFrameCounter)
|
||||
{
|
||||
// redraw row where Playback cursor was (in case there's two or more drags before playback.update())
|
||||
RedrawRow(lastCursor);
|
||||
bookmarks.RedrawChangedBookmarks(lastCursor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PIANO_ROLL::FinishDrag()
|
||||
|
@ -1990,14 +1981,7 @@ LRESULT APIENTRY ListWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|||
destination_frame = playback.GetPauseFrame() - delta;
|
||||
if (destination_frame < 0)
|
||||
destination_frame = 0;
|
||||
int lastCursor = currFrameCounter;
|
||||
playback.jump(destination_frame);
|
||||
if (lastCursor != currFrameCounter)
|
||||
{
|
||||
// redraw row where Playback cursor was (in case there's two or more WM_MOUSEWHEEL messages before playback.update())
|
||||
piano_roll.RedrawRow(lastCursor);
|
||||
bookmarks.RedrawChangedBookmarks(lastCursor);
|
||||
}
|
||||
} else if (history.CursorOverHistoryList())
|
||||
{
|
||||
return SendMessage(history.hwndHistoryList, WM_MOUSEWHEEL_RESENT, wParam, lParam);
|
||||
|
|
|
@ -375,17 +375,10 @@ void PLAYBACK::RewindFull(int speed)
|
|||
if (markers_manager.GetMarker(index)) break;
|
||||
speed--;
|
||||
}
|
||||
int lastCursor = currFrameCounter;
|
||||
if (index >= 0)
|
||||
jump(index); // jump to the Marker
|
||||
else
|
||||
jump(0); // jump to the beginning of Piano Roll
|
||||
if (lastCursor != currFrameCounter)
|
||||
{
|
||||
// redraw row where Playback cursor was (in case there's two or more RewindFulls before playback.update())
|
||||
piano_roll.RedrawRow(lastCursor);
|
||||
bookmarks.RedrawChangedBookmarks(lastCursor);
|
||||
}
|
||||
}
|
||||
void PLAYBACK::ForwardFull(int speed)
|
||||
{
|
||||
|
@ -398,17 +391,10 @@ void PLAYBACK::ForwardFull(int speed)
|
|||
if (markers_manager.GetMarker(index)) break;
|
||||
speed--;
|
||||
}
|
||||
int lastCursor = currFrameCounter;
|
||||
if (index <= last_frame)
|
||||
jump(index); // jump to Marker
|
||||
else
|
||||
jump(currMovieData.getNumRecords() - 1); // jump to the end of Piano Roll
|
||||
if (lastCursor != currFrameCounter)
|
||||
{
|
||||
// redraw row where Playback cursor was (in case there's two or more ForwardFulls before playback.update())
|
||||
piano_roll.RedrawRow(lastCursor);
|
||||
bookmarks.RedrawChangedBookmarks(lastCursor);
|
||||
}
|
||||
}
|
||||
|
||||
void PLAYBACK::RedrawMarker()
|
||||
|
@ -458,6 +444,8 @@ void PLAYBACK::jump(int frame, bool force_reload, bool execute_lua, bool follow_
|
|||
{
|
||||
if (frame < 0) return;
|
||||
|
||||
int lastCursor = currFrameCounter;
|
||||
|
||||
// 1 - set the Playback cursor to the frame or at least above the frame
|
||||
if (SetPlaybackAboveOrToFrame(frame, force_reload))
|
||||
{
|
||||
|
@ -479,6 +467,14 @@ void PLAYBACK::jump(int frame, bool force_reload, bool execute_lua, bool follow_
|
|||
if (pause_frame) // if Playback was seeking, pause emulation right here
|
||||
SeekingStop();
|
||||
}
|
||||
|
||||
// redraw respective Piano Roll lines if needed
|
||||
if (lastCursor != currFrameCounter)
|
||||
{
|
||||
// redraw row where Playback cursor was (in case there's two or more drags before playback.update())
|
||||
piano_roll.RedrawRow(lastCursor);
|
||||
bookmarks.RedrawChangedBookmarks(lastCursor);
|
||||
}
|
||||
}
|
||||
|
||||
// returns true if the game state was changed (loaded)
|
||||
|
|
|
@ -60,15 +60,16 @@ TASEDITOR_CONFIG::TASEDITOR_CONFIG()
|
|||
savecompact_binary = true;
|
||||
savecompact_markers = true;
|
||||
savecompact_bookmarks = true;
|
||||
savecompact_greenzone = false;
|
||||
savecompact_history = false;
|
||||
savecompact_piano_roll = true;
|
||||
savecompact_selection = false;
|
||||
savecompact_greenzone = SAVECOMPACT_GREENZONE_NO;
|
||||
findnote_matchcase = false;
|
||||
findnote_search_up = false;
|
||||
enable_auto_function = true;
|
||||
draw_input = true;
|
||||
enable_greenzoning = true;
|
||||
compact_quicksaving = false;
|
||||
silent_autosave = true;
|
||||
autopause_at_finish = true;
|
||||
tooltips = true;
|
||||
|
|
|
@ -12,6 +12,17 @@
|
|||
#define AUTOSAVE_PERIOD_MAX 1440 // 24 hours
|
||||
#define AUTOSAVE_PERIOD_DEFAULT 15 // in minutes
|
||||
|
||||
enum
|
||||
{
|
||||
SAVECOMPACT_GREENZONE_ALL,
|
||||
SAVECOMPACT_GREENZONE_16TH,
|
||||
SAVECOMPACT_GREENZONE_MARKED,
|
||||
SAVECOMPACT_GREENZONE_NO,
|
||||
|
||||
// ...
|
||||
SAVECOMPACT_GREENZONE_TOTAL
|
||||
};
|
||||
|
||||
#define AUTHOR_MAX_LEN 100
|
||||
|
||||
class TASEDITOR_CONFIG
|
||||
|
@ -58,15 +69,16 @@ public:
|
|||
bool savecompact_binary;
|
||||
bool savecompact_markers;
|
||||
bool savecompact_bookmarks;
|
||||
bool savecompact_greenzone;
|
||||
bool savecompact_history;
|
||||
bool savecompact_piano_roll;
|
||||
bool savecompact_selection;
|
||||
int savecompact_greenzone;
|
||||
bool findnote_matchcase;
|
||||
bool findnote_search_up;
|
||||
bool enable_auto_function;
|
||||
bool draw_input;
|
||||
bool enable_greenzoning;
|
||||
bool compact_quicksaving;
|
||||
bool silent_autosave;
|
||||
bool autopause_at_finish;
|
||||
bool tooltips;
|
||||
|
|
|
@ -36,8 +36,8 @@ extern SPLICER splicer;
|
|||
extern FCEUGI *GameInfo;
|
||||
|
||||
extern void FCEU_PrintError(char *format, ...);
|
||||
extern bool SaveProject();
|
||||
extern bool SaveProjectAs();
|
||||
extern bool SaveProject(bool save_compact = false);
|
||||
extern bool SaveProjectAs(bool save_compact = false);
|
||||
extern int GetInputType(MovieData& md);
|
||||
extern void SetInputType(MovieData& md, int new_input_type);
|
||||
|
||||
|
@ -63,15 +63,15 @@ void TASEDITOR_PROJECT::update()
|
|||
if (changed && taseditor_window.TASEditor_focus && taseditor_config.autosave_period && !projectFile.empty() && clock() >= next_save_shedule && piano_roll.drag_mode == DRAG_MODE_NONE)
|
||||
{
|
||||
if (taseditor_config.silent_autosave)
|
||||
SaveProject();
|
||||
SaveProject(taseditor_config.compact_quicksaving);
|
||||
else
|
||||
SaveProjectAs();
|
||||
SaveProjectAs(taseditor_config.compact_quicksaving);
|
||||
// in case user pressed Cancel, postpone saving to next time
|
||||
SheduleNextAutosave();
|
||||
}
|
||||
}
|
||||
|
||||
bool TASEDITOR_PROJECT::save(const char* different_name, bool save_binary, bool save_markers, bool save_bookmarks, bool save_greenzone, bool save_history, bool save_piano_roll, bool save_selection)
|
||||
bool TASEDITOR_PROJECT::save(const char* different_name, bool save_binary, bool save_markers, bool save_bookmarks, int save_greenzone, bool save_history, bool save_piano_roll, bool save_selection)
|
||||
{
|
||||
if (!different_name && GetProjectFile().empty())
|
||||
// no different name specified, and there's no current filename of the project
|
||||
|
@ -134,7 +134,7 @@ bool TASEDITOR_PROJECT::save(const char* different_name, bool save_binary, bool
|
|||
unsigned int saved_stuff_map = 0;
|
||||
if (save_markers) saved_stuff_map |= MARKERS_SAVED;
|
||||
if (save_bookmarks) saved_stuff_map |= BOOKMARKS_SAVED;
|
||||
if (save_greenzone) saved_stuff_map |= GREENZONE_SAVED;
|
||||
if (save_greenzone != SAVECOMPACT_GREENZONE_NO) saved_stuff_map |= GREENZONE_SAVED;
|
||||
if (save_history) saved_stuff_map |= HISTORY_SAVED;
|
||||
if (save_piano_roll) saved_stuff_map |= PIANO_ROLL_SAVED;
|
||||
if (save_selection) saved_stuff_map |= SELECTION_SAVED;
|
||||
|
|
|
@ -51,7 +51,7 @@ public:
|
|||
void reset();
|
||||
void update();
|
||||
|
||||
bool save(const char* different_name = 0, bool save_binary = true, bool save_markers = true, bool save_bookmarks = true, bool save_greenzone = true, bool save_history = true, bool save_piano_roll = true, bool save_selection = true);
|
||||
bool save(const char* different_name = 0, bool save_binary = true, bool save_markers = true, bool save_bookmarks = true, int save_greenzone = SAVECOMPACT_GREENZONE_ALL, bool save_history = true, bool save_piano_roll = true, bool save_selection = true);
|
||||
bool load(const char* fullname);
|
||||
|
||||
void RenameProject(const char* new_fullname, bool filename_is_correct);
|
||||
|
|
|
@ -122,6 +122,7 @@ const unsigned int MAX_NUMBER_OF_RECENT_PROJECTS = sizeof(recent_projects)/sizeo
|
|||
// Patterns Menu
|
||||
const unsigned int MENU_FIRST_PATTERN = MENU_FIRST_RECENT_PROJECT + MAX_NUMBER_OF_RECENT_PROJECTS;
|
||||
|
||||
char temp_buf1[1024] = {0}, temp_buf2[1024] = {0};
|
||||
// resources
|
||||
char windowCaptioBase[] = "TAS Editor";
|
||||
char patterns_menu_prefix[] = "Pattern: ";
|
||||
|
@ -199,6 +200,7 @@ void TASEDITOR_WINDOW::init()
|
|||
// menus and checked items
|
||||
hmenu = GetMenu(hwndTasEditor);
|
||||
UpdateCheckedItems();
|
||||
UpdateMenuCaptions();
|
||||
patterns_menu = GetSubMenu(hmenu, PATTERNS_MENU_POS);
|
||||
// tooltips
|
||||
for (int i = 0; i < TASEDITOR_WINDOW_TOTAL_ITEMS; ++i)
|
||||
|
@ -565,6 +567,7 @@ void TASEDITOR_WINDOW::UpdateCheckedItems()
|
|||
CheckMenuItem(hmenu, ID_VIEW_JUMPWHENMAKINGUNDO, taseditor_config.jump_to_undo?MF_CHECKED : MF_UNCHECKED);
|
||||
CheckMenuItem(hmenu, ID_VIEW_FOLLOWMARKERNOTECONTEXT, taseditor_config.follow_note_context?MF_CHECKED : MF_UNCHECKED);
|
||||
CheckMenuItem(hmenu, ID_CONFIG_ENABLEGREENZONING, taseditor_config.enable_greenzoning?MF_CHECKED : MF_UNCHECKED);
|
||||
CheckMenuItem(hmenu, ID_CONFIG_COMPACTQUICKSAVING, taseditor_config.compact_quicksaving?MF_CHECKED : MF_UNCHECKED);
|
||||
CheckMenuItem(hmenu, ID_CONFIG_SILENTAUTOSAVE, taseditor_config.silent_autosave?MF_CHECKED : MF_UNCHECKED);
|
||||
CheckMenuItem(hmenu, ID_CONFIG_PATTERNSKIPSLAG, taseditor_config.pattern_skips_lag?MF_CHECKED : MF_UNCHECKED);
|
||||
CheckMenuItem(hmenu, ID_CONFIG_ADJUSTLAG, taseditor_config.adjust_input_due_to_lag?MF_CHECKED : MF_UNCHECKED);
|
||||
|
@ -580,6 +583,32 @@ void TASEDITOR_WINDOW::UpdateCheckedItems()
|
|||
CheckMenuItem(hmenu, ID_CONFIG_AUTOPAUSEATTHEENDOFMOVIE, taseditor_config.autopause_at_finish?MF_CHECKED : MF_UNCHECKED);
|
||||
CheckMenuItem(hmenu, ID_HELP_TOOLTIPS, taseditor_config.tooltips?MF_CHECKED : MF_UNCHECKED);
|
||||
}
|
||||
void TASEDITOR_WINDOW::UpdateMenuCaptions()
|
||||
{
|
||||
// change "Save" and "Save Compact" keyboard shortcut hints
|
||||
if (taseditor_config.compact_quicksaving)
|
||||
{
|
||||
strcpy(temp_buf1, "Save");
|
||||
strcpy(temp_buf2, "Save Compact\t~[Ctrl+S]");
|
||||
} else
|
||||
{
|
||||
strcpy(temp_buf1, "Save\tCtrl+S");
|
||||
strcpy(temp_buf2, "Save Compact");
|
||||
}
|
||||
MENUITEMINFO moo;
|
||||
moo.cbSize = sizeof(moo);
|
||||
moo.fMask = MIIM_TYPE;
|
||||
moo.cch = NULL;
|
||||
GetMenuItemInfo(hmenu, ID_FILE_SAVEPROJECT, FALSE, &moo);
|
||||
moo.dwTypeData = (LPSTR)temp_buf1;
|
||||
SetMenuItemInfo(hmenu, ID_FILE_SAVEPROJECT, FALSE, &moo);
|
||||
moo.cbSize = sizeof(moo);
|
||||
moo.fMask = MIIM_TYPE;
|
||||
moo.cch = NULL;
|
||||
GetMenuItemInfo(hmenu, ID_FILE_SAVECOMPACT, FALSE, &moo);
|
||||
moo.dwTypeData = (LPSTR)temp_buf2;
|
||||
SetMenuItemInfo(hmenu, ID_FILE_SAVECOMPACT, FALSE, &moo);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------------------
|
||||
void TASEDITOR_WINDOW::UpdateRecentProjectsMenu()
|
||||
|
@ -893,6 +922,8 @@ BOOL CALLBACK WndprocTasEditor(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPara
|
|||
OpenProject();
|
||||
break;
|
||||
case ACCEL_CTRL_S:
|
||||
SaveProject(taseditor_config.compact_quicksaving);
|
||||
break;
|
||||
case ID_FILE_SAVEPROJECT:
|
||||
SaveProject();
|
||||
break;
|
||||
|
@ -1058,6 +1089,11 @@ BOOL CALLBACK WndprocTasEditor(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPara
|
|||
taseditor_config.enable_greenzoning ^= 1;
|
||||
taseditor_window.UpdateCheckedItems();
|
||||
break;
|
||||
case ID_CONFIG_COMPACTQUICKSAVING:
|
||||
taseditor_config.compact_quicksaving ^= 1;
|
||||
taseditor_window.UpdateCheckedItems();
|
||||
taseditor_window.UpdateMenuCaptions();
|
||||
break;
|
||||
case ID_CONFIG_SILENTAUTOSAVE:
|
||||
taseditor_config.silent_autosave ^= 1;
|
||||
taseditor_window.UpdateCheckedItems();
|
||||
|
|
|
@ -41,6 +41,7 @@ public:
|
|||
void RedrawTaseditor();
|
||||
|
||||
void UpdateCheckedItems();
|
||||
void UpdateMenuCaptions();
|
||||
|
||||
void UpdateRecentProjectsMenu();
|
||||
void UpdateRecentProjectsArray(const char* addString);
|
||||
|
|
Loading…
Reference in New Issue