From ec6348894a6b246d6cdb8486a722baa7eb66ec77 Mon Sep 17 00:00:00 2001 From: thrust26 Date: Sat, 25 Jan 2020 20:06:04 +0100 Subject: [PATCH] make automatic TM saving load the states on enter too --- Changes.txt | 3 ++- .../options_developer_timemachine.png | Bin 4632 -> 4782 bytes docs/index.html | 10 ++++++---- src/emucore/EventHandler.cxx | 17 +++++++++++++---- src/emucore/OSystem.cxx | 7 +++++++ src/gui/DeveloperDialog.cxx | 6 +++--- 6 files changed, 31 insertions(+), 12 deletions(-) diff --git a/Changes.txt b/Changes.txt index 9573b1389..369fda381 100644 --- a/Changes.txt +++ b/Changes.txt @@ -97,7 +97,8 @@ * Added option to save and load all TimeMachine states at once. - * Added option to automatically save states when exiting emulation. + * Added option to automatically load/save states when entering/exiting + emulation. * Added option to change pitch of Pitfall II music. diff --git a/docs/graphics/options_developer_timemachine.png b/docs/graphics/options_developer_timemachine.png index ff0e2178ad4cc57680c9b067a97c15bbbb9825d8..ddb58f28e654942d25b01309383ff6b3317efe2e 100644 GIT binary patch delta 4680 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 C8(=U1 delta 4529 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 LqIsF=&4~X4gO?18 diff --git a/docs/index.html b/docs/index.html index b2ab9f1b5..4efd03786 100644 --- a/docs/index.html +++ b/docs/index.html @@ -2256,7 +2256,8 @@
-saveonexit <none|current|all>
- Automatically save no, current or all states when exiting emulation. + Automatically save no, current or all states when exiting emulation. The latter + also loads all states when entering emulation. @@ -3402,11 +3403,12 @@ -plr.tm.horizon
-dev.tm.horizon - When exiting emulation: + When entering/exiting emulation: Automatically save no, current or all Time Machine states when exiting emulation.
- When saving is enabled, you can always continue your game session - from where you exited it. Even including the Time Machine buffer! + The latter also loads all states when entering emulation. When this is enabled, you + can always continue your game session from where you exited it. Even including the + Time Machine buffer! -saveonexit diff --git a/src/emucore/EventHandler.cxx b/src/emucore/EventHandler.cxx index eb7500259..823b3d9d7 100644 --- a/src/emucore/EventHandler.cxx +++ b/src/emucore/EventHandler.cxx @@ -745,11 +745,17 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if (myOSystem.settings().getBool("confirmexit")) { StringList msg; + string saveOnExit = myOSystem.settings().getString("saveonexit"); + bool activeTM = myOSystem.settings().getBool( + myOSystem.settings().getBool("dev.settings") ? "dev.timemachine" : "plr.timemachine"); + msg.push_back("Do you really want to exit emulation?"); - msg.push_back(""); - msg.push_back("You will lose all your progress."); - + if (saveOnExit != "all" || !activeTM) + { + msg.push_back(""); + msg.push_back("You will lose all your progress."); + } myOSystem.messageMenu().setMessage("Exit Emulation", msg, true); enterMenuMode(EventHandlerState::MESSAGEMENU); } @@ -1775,8 +1781,11 @@ void EventHandler::setState(EventHandlerState state) void EventHandler::exitEmulation(bool checkLauncher) { string saveOnExit = myOSystem.settings().getString("saveonexit"); + bool activeTM = myOSystem.settings().getBool( + myOSystem.settings().getBool("dev.settings") ? "dev.timemachine" : "plr.timemachine"); - if (saveOnExit == "all") + + if (saveOnExit == "all" && activeTM) handleEvent(Event::SaveAllStates); else if (saveOnExit == "current") handleEvent(Event::SaveState); diff --git a/src/emucore/OSystem.cxx b/src/emucore/OSystem.cxx index dfc87e9e3..70f738f1f 100644 --- a/src/emucore/OSystem.cxx +++ b/src/emucore/OSystem.cxx @@ -410,6 +410,13 @@ string OSystem::createConsole(const FilesystemNode& rom, const string& md5sum, } myConsole->initializeAudio(); + string saveOnExit = settings().getString("saveonexit"); + bool activeTM = settings().getBool( + settings().getBool("dev.settings") ? "dev.timemachine" : "plr.timemachine"); + + if (saveOnExit == "all" && activeTM) + myEventHandler->handleEvent(Event::LoadAllStates); + if(showmessage) { const string& id = myConsole->cartridge().multiCartID(); diff --git a/src/gui/DeveloperDialog.cxx b/src/gui/DeveloperDialog.cxx index bc79a2d40..4d6924f11 100644 --- a/src/gui/DeveloperDialog.cxx +++ b/src/gui/DeveloperDialog.cxx @@ -478,11 +478,11 @@ void DeveloperDialog::addTimeMachineTab(const GUI::Font& font) ypos += lineHeight + VGAP * 2; new StaticTextWidget(myTab, font, HBORDER, ypos + 1, - "When exiting emulation:"); + "When entering/exiting emulation:"); ypos += lineHeight + VGAP; mySaveOnExitGroup = new RadioButtonGroup(); r = new RadioButtonWidget(myTab, font, HBORDER + INDENT, ypos + 1, - "Save nothing", mySaveOnExitGroup); + "Do nothing", mySaveOnExitGroup); wid.push_back(r); ypos += lineHeight + VGAP; r = new RadioButtonWidget(myTab, font, HBORDER + INDENT, ypos + 1, @@ -490,7 +490,7 @@ void DeveloperDialog::addTimeMachineTab(const GUI::Font& font) wid.push_back(r); ypos += lineHeight + VGAP; r = new RadioButtonWidget(myTab, font, HBORDER + INDENT, ypos + 1, - "Save all Time Machine states", mySaveOnExitGroup); + "Load/save all Time Machine states", mySaveOnExitGroup); wid.push_back(r); ypos += lineHeight + VGAP;