scummvm/engines/grim/registry.cpp
2020-11-12 10:47:15 +01:00

361 lines
13 KiB
C++

/* ResidualVM - A 3D game interpreter
*
* ResidualVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the AUTHORS
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "engines/grim/registry.h"
#include "audio/mixer.h"
#include "common/config-manager.h"
namespace Grim {
Registry *g_registry = nullptr;
// SpewOnError
// GrimLastSet
// JoystickEnabled
// MovementMode
// SpeechMode
// GammaCorrection, Gamma
// GrimDeveloper
// SfxVolume
// MusicVolume
// VoiceVolume
// TextSpeed
// VoiceEffects
// LastSavedGame
// good_times
void Registry::Value::setString(const Common::String &str) {
_val._str = str;
_type = Registry::String;
}
void Registry::Value::setInt(int num) {
_val._num = num;
_type = Registry::Integer;
}
void Registry::Value::setBool(bool val) {
_val._bool = val;
_type = Registry::Boolean;
}
const Common::String &Registry::Value::getString() const {
assert(_type == Registry::String);
return _val._str;
}
int Registry::Value::getInt() const {
if (_type == Registry::Integer)
return _val._num;
if (_type == Registry::Boolean)
return _val._bool;
return atoi(_val._str.c_str());
}
bool Registry::Value::getBool() const {
if (_type == Registry::Boolean)
return _val._bool;
if (_type == Registry::Integer)
return _val._num;
if (_val._str.equalsIgnoreCase("true"))
return true;
return false;
}
Registry::ValueType Registry::Value::getType() const {
return _type;
}
Registry::Registry() :
_dirty(true) {
// Default settings for GRIM
ConfMan.registerDefault("subtitles", true);
ConfMan.registerDefault("talkspeed", 179);
ConfMan.registerDefault("game_devel_mode", false);
// Read settings
_spewOnError.setString(ConfMan.get("spew_on_error"));
_dataPath.setString(ConfMan.get("path"));
_savePath.setString(ConfMan.get("savepath"));
_develMode.setBool(ConfMan.getBool("game_devel_mode"));
_lastSet.setString(ConfMan.get("last_set"));
_musicVolume.setInt(convertVolumeFromMixer(ConfMan.getInt("music_volume")));
_sfxVolume.setInt(convertVolumeFromMixer(ConfMan.getInt("sfx_volume")));
_voiceVolume.setInt(convertVolumeFromMixer(ConfMan.getInt("speech_volume")));
_lastSavedGame.setString(ConfMan.get("last_saved_game"));
_gamma.setInt(ConfMan.getInt("gamma"));
_textSpeed.setInt(convertTalkSpeedFromGUI(ConfMan.getInt("talkspeed")));
_speechMode.setInt(convertSpeechModeFromGUI(ConfMan.getBool("subtitles"), ConfMan.getBool("speech_mute")));
// These can't be set as bool because the scripts do a check against "TRUE" and "FALSE".
// Right, they do string comparisons. doh!
_voiceEffects.setString(ConfMan.get("voice_effects"));
_movement.setString(ConfMan.get("movement"));
//_joystick.setString(ConfMan.get("joystick"));
_joystick.setString("false");
_transcript.setString(ConfMan.get("transcript"));
// Remastered
_widescreen.setInt(ConfMan.getInt("widescreen"));
_directorsCommentary.setInt(ConfMan.getInt("directors_commentary"));
_directorsCommentaryVolume.setInt(convertVolumeFromMixer(ConfMan.getInt("directors_commentary_volume")));
_language.setInt(ConfMan.getInt("grim_language")); // Avoid overlap with confman
_resolutionScaling.setInt(ConfMan.getInt("resolution_scaling"));
_mouseSpeed.setInt(ConfMan.getInt("mouse_speed"));
_advancedLighting.setInt(ConfMan.getInt("advanced_lighting"));
_renderingMode.setInt(ConfMan.getInt("rendering_mode"));
_fullScreen.setInt(ConfMan.getInt("grim_fullscreen")); // TODO: Should probably map against normal fullscreen, but this may have issues with alt-enter, so leaving it like this for now.
}
Registry::Value &Registry::value(const Common::String &key) {
if (scumm_stricmp("good_times", key.c_str()) == 0 || scumm_stricmp("GrimDeveloper", key.c_str()) == 0) {
return _develMode;
} else if (scumm_stricmp("GrimDataDir", key.c_str()) == 0) {
return _dataPath;
} else if (scumm_stricmp("savepath", key.c_str()) == 0) {
return _savePath;
} else if (scumm_stricmp("GrimLastSet", key.c_str()) == 0) {
return _lastSet;
} else if (scumm_stricmp("MusicVolume", key.c_str()) == 0) {
return _musicVolume;
} else if (scumm_stricmp("SfxVolume", key.c_str()) == 0) {
return _sfxVolume;
} else if (scumm_stricmp("VoiceVolume", key.c_str()) == 0) {
return _voiceVolume;
} else if (scumm_stricmp("LastSavedGame", key.c_str()) == 0) {
return _lastSavedGame;
} else if (scumm_stricmp("Gamma", key.c_str()) == 0 || scumm_stricmp("GammaCorrection", key.c_str()) == 0) {
return _gamma;
} else if (scumm_stricmp("VoiceEffects", key.c_str()) == 0) {
return _voiceEffects;
} else if (scumm_stricmp("TextSpeed", key.c_str()) == 0) {
return _textSpeed;
} else if (scumm_stricmp("TextMode", key.c_str()) == 0 || scumm_stricmp("SpeechMode", key.c_str()) == 0) {
return _speechMode;
} else if (scumm_stricmp("MovementMode", key.c_str()) == 0) {
return _movement;
} else if (scumm_stricmp("JoystickEnabled", key.c_str()) == 0) {
return _joystick;
} else if (scumm_stricmp("SpewOnError", key.c_str()) == 0) {
return _spewOnError;
} else if (scumm_stricmp("Transcript", key.c_str()) == 0) {
return _transcript;
} else if (scumm_stricmp("DirectorsCommentary", key.c_str()) == 0) {
return _directorsCommentary;
} else if (scumm_stricmp("Widescreen", key.c_str()) == 0) {
return _widescreen;
} else if (scumm_stricmp("Language", key.c_str()) == 0) {
return _language;
} else if (scumm_stricmp("ResolutionScaling", key.c_str()) == 0) {
return _resolutionScaling;
} else if (scumm_stricmp("MouseSpeed", key.c_str()) == 0) {
return _mouseSpeed;
} else if (scumm_stricmp("AdvancedLighting", key.c_str()) == 0) {
return _advancedLighting;
} else if (scumm_stricmp("DirectorsCommentaryVolume", key.c_str()) == 0) {
return _directorsCommentaryVolume;
} else if (scumm_stricmp("RenderingMode", key.c_str()) == 0) {
return _renderingMode;
} else if (scumm_stricmp("Fullscreen", key.c_str()) == 0) {
return _fullScreen;
} else {
warning("write unknown regisry value %s", key.c_str());
return _musicVolume;
}
assert(0);
return _dummy; // Silence warning
}
const Registry::Value &Registry::value(const Common::String &key) const {
if (scumm_stricmp("good_times", key.c_str()) == 0 || scumm_stricmp("GrimDeveloper", key.c_str()) == 0) {
return _develMode;
} else if (scumm_stricmp("GrimDataDir", key.c_str()) == 0) {
return _dataPath;
} else if (scumm_stricmp("savepath", key.c_str()) == 0) {
return _savePath;
} else if (scumm_stricmp("GrimLastSet", key.c_str()) == 0) {
return _lastSet;
} else if (scumm_stricmp("MusicVolume", key.c_str()) == 0) {
return _musicVolume;
} else if (scumm_stricmp("SfxVolume", key.c_str()) == 0) {
return _sfxVolume;
} else if (scumm_stricmp("VoiceVolume", key.c_str()) == 0) {
return _voiceVolume;
} else if (scumm_stricmp("LastSavedGame", key.c_str()) == 0) {
return _lastSavedGame;
} else if (scumm_stricmp("Gamma", key.c_str()) == 0 || scumm_stricmp("GammaCorrection", key.c_str()) == 0) {
return _gamma;
} else if (scumm_stricmp("VoiceEffects", key.c_str()) == 0) {
return _voiceEffects;
} else if (scumm_stricmp("TextSpeed", key.c_str()) == 0) {
return _textSpeed;
} else if (scumm_stricmp("TextMode", key.c_str()) == 0 || scumm_stricmp("SpeechMode", key.c_str()) == 0) {
return _speechMode;
} else if (scumm_stricmp("MovementMode", key.c_str()) == 0) {
return _movement;
} else if (scumm_stricmp("JoystickEnabled", key.c_str()) == 0) {
return _joystick;
} else if (scumm_stricmp("SpewOnError", key.c_str()) == 0) {
return _spewOnError;
} else if (scumm_stricmp("Transcript", key.c_str()) == 0) {
return _transcript;
} else if (scumm_stricmp("DirectorsCommentary", key.c_str()) == 0) {
return _directorsCommentary;
} else if (scumm_stricmp("Widescreen", key.c_str()) == 0) {
return _widescreen;
} else if (scumm_stricmp("Language", key.c_str()) == 0) {
return _language;
} else if (scumm_stricmp("ResolutionScaling", key.c_str()) == 0) {
return _resolutionScaling;
} else if (scumm_stricmp("MouseSpeed", key.c_str()) == 0) {
return _mouseSpeed;
} else if (scumm_stricmp("AdvancedLighting", key.c_str()) == 0) {
return _advancedLighting;
} else if (scumm_stricmp("DirectorsCommentaryVolume", key.c_str()) == 0) {
return _directorsCommentaryVolume;
} else if (scumm_stricmp("RenderingMode", key.c_str()) == 0) {
return _renderingMode;
} else if (scumm_stricmp("Fullscreen", key.c_str()) == 0) {
return _fullScreen;
} else {
warning("unknown regisry value %s", key.c_str());
return _musicVolume;
}
assert(0);
return _dummy; // Silence warning
}
const Common::String &Registry::getString(const Common::String &key) const {
return value(key).getString();
}
int Registry::getInt(const Common::String &key) const {
return value(key).getInt();
}
bool Registry::getBool(const Common::String &key) const {
return value(key).getBool();
}
void Registry::setString(const Common::String &key, const Common::String &val) {
_dirty = true;
value(key).setString(val);
}
void Registry::setInt(const Common::String &key, int val) {
_dirty = true;
value(key).setInt(val);
}
void Registry::setBool(const Common::String &key, bool val) {
_dirty = true;
value(key).setBool(val);
}
Registry::ValueType Registry::getValueType(const Common::String &key) const {
return value(key).getType();
}
void Registry::save() {
if (!_dirty)
return;
ConfMan.set("spew_on_error", _spewOnError.getString());
ConfMan.set("path", _dataPath.getString());
ConfMan.set("savepath", _savePath.getString());
if (ConfMan.hasKey("last_set")) {
ConfMan.set("last_set", _lastSet.getString());
}
ConfMan.setBool("game_devel_mode", _develMode.getBool());
ConfMan.setInt("music_volume", convertVolumeToMixer(_musicVolume.getInt()));
ConfMan.setInt("sfx_volume", convertVolumeToMixer(_sfxVolume.getInt()));
ConfMan.setInt("speech_volume", convertVolumeToMixer(_voiceVolume.getInt()));
ConfMan.set("last_saved_game", _lastSavedGame.getString());
ConfMan.setInt("gamma", _gamma.getInt());
ConfMan.setInt("talkspeed", convertTalkSpeedToGUI(_textSpeed.getInt()));
ConfMan.setBool("subtitles", convertSubtitlesToGUI(_speechMode.getInt()));
ConfMan.setBool("speech_mute", convertSpeechMuteToGUI(_speechMode.getInt()));
ConfMan.set("movement", _movement.getString());
ConfMan.set("joystick", _joystick.getString());
ConfMan.set("voice_effects", _voiceEffects.getString());
ConfMan.set("transcript", _transcript.getString());
// Remastered (TODO: These are handled as string for now)
ConfMan.setInt("widescreen", _widescreen.getInt());
ConfMan.setInt("directors_commentary", _directorsCommentary.getInt());
ConfMan.setInt("grim_language", _language.getInt());
ConfMan.setInt("resolution_scaling", _resolutionScaling.getInt());
ConfMan.setInt("mouse_speed", _mouseSpeed.getInt());
ConfMan.setInt("advanced_lighting", _advancedLighting.getInt());
ConfMan.setInt("directors_commentary_volume", convertVolumeToMixer(_directorsCommentaryVolume.getInt()));
ConfMan.setInt("rendering_mode", _renderingMode.getInt());
ConfMan.setInt("grim_fullscreen", _fullScreen.getInt());
_dirty = false;
}
uint Registry::convertVolumeToMixer(uint grimVolume) {
return CLIP<uint>(grimVolume * 2, 0, Audio::Mixer::kMaxMixerVolume);
}
uint Registry::convertVolumeFromMixer(uint volume) {
return CLIP<uint>(volume / 2, 0, 127);
}
uint Registry::convertTalkSpeedToGUI(uint talkspeed) {
return CLIP<uint>(talkspeed * 255 / 10, 0, 255);
}
uint Registry::convertTalkSpeedFromGUI(uint talkspeed) {
return CLIP<uint>(talkspeed * 10 / 255, 1, 10);
}
bool Registry::convertSubtitlesToGUI(uint speechmode) {
return speechmode == 1 || speechmode == 3;
}
bool Registry::convertSpeechMuteToGUI(uint speechmode) {
return speechmode == 1;
}
uint Registry::convertSpeechModeFromGUI(bool subtitles, bool speechMute) {
if (!subtitles && !speechMute) // Speech only
return 2;
else if (subtitles && !speechMute) // Speech and subtitles
return 3;
else if (subtitles && speechMute) // Subtitles only
return 1;
else
warning("Wrong configuration: Both subtitles and speech are off. Assuming subtitles only");
return 1;
}
} // end of namespace Grim