MOHAWK: RIVEN: Save the options to ConfMan when the game is not started

That way changes made while on the main menu with no game started are
persisted across sessions. When a game is started, the options are saved
to the savegame as previously.
This commit is contained in:
Bastien Bouclet 2019-10-29 21:23:09 +01:00
parent 9a7f2c8374
commit 998bd303c6
5 changed files with 77 additions and 11 deletions

View File

@ -296,20 +296,33 @@ RivenOptionsDialog::RivenOptionsDialog(MohawkEngine_Riven* vm) :
RivenOptionsDialog::~RivenOptionsDialog() {
}
void RivenOptionsDialog::open() {
MohawkOptionsDialog::open();
bool RivenOptionsDialog::getZipMode() const {
return _zipModeCheckbox->getState();
}
_zipModeCheckbox->setState(_vm->_vars["azip"] != 0);
_waterEffectCheckbox->setState(_vm->_vars["waterenabled"] != 0);
_transitionModePopUp->setSelectedTag(_vm->_vars["transitionmode"]);
void RivenOptionsDialog::setZipMode(bool enabled) {
_zipModeCheckbox->setState(enabled);
}
bool RivenOptionsDialog::getWaterEffect() const {
return _waterEffectCheckbox->getState();
}
void RivenOptionsDialog::setWaterEffect(bool enabled) {
_waterEffectCheckbox->setState(enabled);
}
uint32 RivenOptionsDialog::getTransitions() const {
return _transitionModePopUp->getSelectedTag();
}
void RivenOptionsDialog::setTransitions(uint32 mode) {
_transitionModePopUp->setSelectedTag(mode);
}
void RivenOptionsDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) {
switch (cmd) {
case GUI::kOKCmd:
_vm->_vars["azip"] = _zipModeCheckbox->getState() ? 1 : 0;
_vm->_vars["waterenabled"] = _waterEffectCheckbox->getState() ? 1 : 0;
_vm->_vars["transitionmode"] = _transitionModePopUp->getSelectedTag();
setResult(1);
close();
break;

View File

@ -80,6 +80,7 @@ public:
~MohawkOptionsDialog() override;
void reflowLayout() override;
int getResult() const { return GUI::Dialog::getResult(); }
void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) override;
};
@ -153,9 +154,14 @@ public:
explicit RivenOptionsDialog(MohawkEngine_Riven *vm);
~RivenOptionsDialog() override;
void open() override;
void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) override;
bool getZipMode() const;
void setZipMode(bool enabled);
bool getWaterEffect() const;
void setWaterEffect(bool enabled);
uint32 getTransitions() const;
void setTransitions(uint32 mode);
private:
MohawkEngine_Riven *_vm;

View File

@ -122,6 +122,10 @@ Common::Error MohawkEngine_Riven::run() {
return Common::kAudioDeviceInitFailed;
}
ConfMan.registerDefault("zip_mode", false);
ConfMan.registerDefault("water_effects", true);
ConfMan.registerDefault("transition_mode", kRivenTransitionModeFastest);
// Let's try to open the installer file (it holds extras.mhk)
// Though, we set a low priority to prefer the extracted version
if (_installerArchive.open("arcriven.z"))
@ -387,6 +391,17 @@ void MohawkEngine_Riven::pauseEngineIntern(bool pause) {
}
}
uint32 MohawkEngine_Riven::sanitizeTransitionMode(uint32 mode) {
if (mode != kRivenTransitionModeDisabled
&& mode != kRivenTransitionModeFastest
&& mode != kRivenTransitionModeNormal
&& mode != kRivenTransitionModeBest) {
return kRivenTransitionModeFastest;
}
return mode;
}
// Stack/Card-Related Functions
void MohawkEngine_Riven::changeToStack(uint16 stackId) {
@ -666,6 +681,8 @@ void MohawkEngine_Riven::startNewGame() {
_zipModeData.clear();
_gfx->setTransitionMode((RivenTransitionMode) _vars["transitionmode"]);
setTotalPlayTime(0);
}
@ -820,8 +837,33 @@ void MohawkEngine_Riven::setGameEnded() {
}
void MohawkEngine_Riven::runOptionsDialog() {
if (isGameStarted()) {
_optionsDialog->setZipMode(_vars["azip"] != 0);
_optionsDialog->setWaterEffect(_vars["waterenabled"] != 0);
_optionsDialog->setTransitions(_vars["transitionmode"]);
} else {
_optionsDialog->setZipMode(ConfMan.getBool("zip_mode"));
_optionsDialog->setWaterEffect(ConfMan.getBool("water_effects"));
uint32 transitions = ConfMan.getInt("transition_mode");
_optionsDialog->setTransitions(sanitizeTransitionMode(transitions));
}
runDialog(*_optionsDialog);
if (_optionsDialog->getResult() > 0) {
if (isGameStarted()) {
_vars["azip"] = _optionsDialog->getZipMode() ? 1 : 0;
_vars["waterenabled"] = _optionsDialog->getWaterEffect() ? 1 : 0;
_vars["transitionmode"] = _optionsDialog->getTransitions();
} else {
ConfMan.setBool("zip_mode", _optionsDialog->getZipMode());
ConfMan.setBool("water_effects", _optionsDialog->getWaterEffect());
ConfMan.setInt("transition_mode", _optionsDialog->getTransitions());
ConfMan.flushToDisk();
}
}
if (hasGameEnded()) {
// Attempt to autosave before exiting
tryAutoSaving();

View File

@ -135,6 +135,7 @@ private:
void initVars();
void pauseEngineIntern(bool) override;
uint32 sanitizeTransitionMode(uint32 mode);
public:
// Stack/card/script funtions
RivenStack *constructStackById(uint16 id);

View File

@ -21,6 +21,7 @@
*/
#include "common/str.h"
#include "common/config-manager.h"
#include "mohawk/riven.h"
#include "mohawk/riven_stack.h"
@ -302,7 +303,8 @@ void MohawkEngine_Riven::initVars() {
_vars["blabpage"] = 1;
_vars["bidvlv"] = 1;
_vars["bvise"] = 1;
_vars["waterenabled"] = 1;
_vars["azip"] = ConfMan.getBool("zip_mode");
_vars["waterenabled"] = ConfMan.getBool("water_effects");
_vars["ogehnpage"] = 1;
_vars["bblrsw"] = 1;
_vars["ocage"] = 1;
@ -319,9 +321,11 @@ void MohawkEngine_Riven::initVars() {
_vars["gpinpos"] = 1;
_vars["grviewmpos"] = 1617;
_vars["omusicplayer"] = 1;
_vars["transitionmode"] = kRivenTransitionModeFastest;
_vars["tdomeelev"] = 1;
uint32 transitions = ConfMan.getInt("transition_mode");
_vars["transitionmode"] = sanitizeTransitionMode(transitions);
// Randomize the telescope combination
uint32 &teleCombo = _vars["tcorrectorder"];
for (byte i = 0; i < 5; i++) {