aboutsummaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
authorMax Horn2003-10-08 21:59:23 +0000
committerMax Horn2003-10-08 21:59:23 +0000
commitd1773647159f9ef1393d7a1d33204de5886edce5 (patch)
treed31f1a3689fa34a525671f21d7a858fe8570762f /base
parent3c78c0929c553fd67016f87c6cdc38d3f50d7ca2 (diff)
downloadscummvm-rg350-d1773647159f9ef1393d7a1d33204de5886edce5.tar.gz
scummvm-rg350-d1773647159f9ef1393d7a1d33204de5886edce5.tar.bz2
scummvm-rg350-d1773647159f9ef1393d7a1d33204de5886edce5.zip
new config manager. not everything is completed, and some things will still be changed, but it seems to work well enough to put it into CVS
svn-id: r10687
Diffstat (limited to 'base')
-rw-r--r--base/engine.cpp10
-rw-r--r--base/gameDetector.cpp429
-rw-r--r--base/gameDetector.h64
-rw-r--r--base/main.cpp59
4 files changed, 210 insertions, 352 deletions
diff --git a/base/engine.cpp b/base/engine.cpp
index 9eb5ab8e42..567def93cd 100644
--- a/base/engine.cpp
+++ b/base/engine.cpp
@@ -24,7 +24,7 @@
#endif
#include "base/engine.h"
#include "base/gameDetector.h"
-#include "common/config-file.h"
+#include "common/config-manager.h"
#include "common/timer.h"
#include "sound/mixer.h"
@@ -36,7 +36,7 @@ Engine::Engine(GameDetector *detector, OSystem *syst)
g_engine = this;
_mixer = detector->createMixer();
- _gameDataPath = detector->_gameDataPath;
+ _gameDataPath = strdup(ConfMan.get("path").c_str()); // FIXME - leak. Just conver to a String?
_timer = g_timer;
}
@@ -61,11 +61,7 @@ const char *Engine::getSavePath() const {
// If SCUMMVM_SAVEPATH was not specified, try to use game specific savepath from config
if (!dir || dir[0] == 0)
- dir = g_config->get("savepath");
-
- // If SCUMMVM_SAVEPATH was not specified, try to use general path from config
- if (!dir || dir[0] == 0)
- dir = g_config->get("savepath", "scummvm");
+ dir = ConfMan.get("savepath").c_str();
// If no save path was specified, use no directory prefix
if (dir == NULL)
diff --git a/base/gameDetector.cpp b/base/gameDetector.cpp
index 7c73715da1..36ee551b89 100644
--- a/base/gameDetector.cpp
+++ b/base/gameDetector.cpp
@@ -27,7 +27,7 @@
#include "base/gameDetector.h"
#include "base/plugins.h"
-#include "common/config-file.h"
+#include "common/config-manager.h"
#include "common/scaler.h" // Only for gfx_modes
#include "sound/mididrv.h"
@@ -69,20 +69,26 @@ static const char USAGE_STRING[] =
" -m<num> - Set music volume to <num> (0-255)\n"
" -o<num> - Set master volume to <num> (0-255)\n"
" -s<num> - Set sfx volume to <num> (0-255)\n"
+#ifndef DISABLE_SCUMM
" -t<num> - Set music tempo (50-200, default 100%%)\n"
+#endif
"\n"
" -n - No subtitles for speech\n"
+#ifndef DISABLE_SCUMM
" -y - Set text speed (default: 60)\n"
+#endif
"\n"
+/* FIXME / TODO: config rewrite
" -l<file> - Load config file instead of default\n"
#if defined(UNIX)
" -w[file] - Write to config file [~/.scummvmrc]\n"
#else
" -w[file] - Write to config file [scummvm.ini]\n"
#endif
+*/
" -v - Show version info and exit\n"
" -h - Display this text and exit\n"
- " -z - Display list of games\n"
+ " -z - Display list of supported games\n"
"\n"
" -b<num> - Pass number to the boot script (boot param)\n"
" -d[num] - Enable debug output (debug level [0])\n"
@@ -143,13 +149,13 @@ static const struct GraphicsMode gfx_modes[] = {
{0, 0, 0}
};
-struct Language {
+struct LanguageDescription {
const char *name;
const char *description;
- int id;
+ Language id;
};
-static const struct Language languages[] = {
+static const struct LanguageDescription languages[] = {
{"en", "English", EN_USA},
{"de", "German", DE_DEU},
{"fr", "French", FR_FRA},
@@ -162,162 +168,105 @@ static const struct Language languages[] = {
{"gb", "English", EN_GRB},
{"se", "Swedish", SE_SWE},
{"hb", "Hebrew", HB_HEB},
- {0, 0, 0}
+ {0, 0, UNK_LANG}
};
-
GameDetector::GameDetector() {
- _fullScreen = false;
- _aspectRatio = false;
-
- _master_volume = kDefaultMasterVolume;
- _music_volume = kDefaultMusicVolume;
- _sfx_volume = kDefaultSFXVolume;
- _amiga = false;
- _platform = 0;
- _language = 0;
-
-#ifndef DISABLE_SCUMM
- _demo_mode = false;
-#endif
-
-#ifndef DISABLE_SKY
- _floppyIntro = false;
-#endif
-
- _talkSpeed = 60;
- _debugMode = 0;
- _debugLevel = 0;
- _dumpScripts = 0;
- _noSubtitles = false;
- _bootParam = 0;
-
- _gameDataPath = 0;
- _gameTempo = 0;
- _midi_driver = MD_AUTO;
- _game.features = 0;
- _plugin = 0;
-
- _multi_midi = false;
- _native_mt32 = false;
- _cdrom = 0;
- _joystick_num = 0;
- _save_slot = 0;
-
- _saveconfig = false;
- _confirmExit = false;
-
+ // Graphics
+ ConfMan.registerDefault("fullscreen", false);
+ ConfMan.registerDefault("aspect_ratio", false);
#ifndef _WIN32_WCE
- _gfx_mode = GFX_DOUBLESIZE;
+ ConfMan.registerDefault("gfx_mode", "2x");
#else
- _gfx_mode = GFX_NORMAL;
+ ConfMan.registerDefault("gfx_mode", "normal");
#endif
- _default_gfx_mode = true;
-}
-
-void GameDetector::updateconfig() {
- const char *val;
-
- _amiga = g_config->getBool("amiga", _amiga);
- _platform = g_config->getInt("platform", _platform);
+ // Sound & Music
+ ConfMan.registerDefault("master_volume", kDefaultMasterVolume);
+ ConfMan.registerDefault("music_volume", kDefaultMusicVolume);
+ ConfMan.registerDefault("sfx_volume", kDefaultSFXVolume);
- _save_slot = g_config->getInt("save_slot", _save_slot);
+ ConfMan.registerDefault("multi_midi", false);
+ ConfMan.registerDefault("native_mt32", false);
+// ConfMan.registerDefault("music_driver", ???);
- _joystick_num = g_config->getInt("joystick_num", _joystick_num);
+ ConfMan.registerDefault("cdrom", 0);
- _cdrom = g_config->getInt("cdrom", _cdrom);
+ // Game specifc
+ ConfMan.registerDefault("path", "");
- _bootParam = g_config->getInt("boot_param", _bootParam);
-
- if ((val = g_config->get("music_driver")))
- if (!parseMusicDriver(val)) {
- printf("Error in the config file: invalid music_driver.\n");
- printf(USAGE_STRING);
- exit(-1);
- }
-
- _fullScreen = g_config->getBool("fullscreen", _fullScreen);
- _aspectRatio = g_config->getBool("aspect_ratio", _aspectRatio);
-
- if ((val = g_config->get("gfx_mode")))
- if ((_gfx_mode = parseGraphicsMode(val)) == -1) {
- printf("Error in the config file: invalid gfx_mode.\n");
- printf(USAGE_STRING);
- exit(-1);
- }
-
-#ifndef DISABLE_SKY
- _floppyIntro = g_config->getBool("floppy_intro", _floppyIntro);
-#endif
+ ConfMan.registerDefault("amiga", false);
+ ConfMan.registerDefault("platform", kPlatformPC);
+ ConfMan.registerDefault("language", "en");
+ ConfMan.registerDefault("nosubtitles", false);
+ ConfMan.registerDefault("boot_param", 0);
+ ConfMan.registerDefault("save_slot", -1);
#ifndef DISABLE_SCUMM
- _demo_mode = g_config->getBool("demo_mode", _demo_mode);
+ ConfMan.registerDefault("demo_mode", false);
+ ConfMan.registerDefault("talkspeed", 60);
+ ConfMan.registerDefault("tempo", 0);
#endif
- if ((val = g_config->get("language")))
- if ((_language = parseLanguage(val)) == -1) {
- printf("Error in the config file: invalid language.\n");
- printf(USAGE_STRING);
- exit(-1);
- }
-
- _master_volume = g_config->getInt("master_volume", _master_volume);
-
- _music_volume = g_config->getInt("music_volume", _music_volume);
-
- _noSubtitles = g_config->getBool("nosubtitles", _noSubtitles ? true : false);
-
- if ((val = g_config->get("path")))
- _gameDataPath = strdup(val);
-
- _sfx_volume = g_config->getInt("sfx_volume", _sfx_volume);
-
- _debugLevel = g_config->getInt("debuglevel", _debugLevel);
- if (_debugLevel)
- _debugMode = true;
+#ifndef DISABLE_SKY
+ ConfMan.registerDefault("floppy_intro", false);
+#endif
- // We use strtol for the tempo to allow it to be specified in hex.
- if ((val = g_config->get("tempo")))
- _gameTempo = strtol(val, NULL, 0);
+ // Miscellaneous
+ ConfMan.registerDefault("debuglevel", 0);
+ ConfMan.registerDefault("joystick_num", -1);
+ ConfMan.registerDefault("confirm_exit", false);
- _talkSpeed = g_config->getInt("talkspeed", _talkSpeed);
+ _debugMode = false;
+ _dumpScripts = false;
+ _midi_driver = MD_AUTO;
- _confirmExit = g_config->getBool("confirm_exit", _confirmExit ? true : false);
+ _saveconfig = false;
- _multi_midi = g_config->getBool ("multi_midi", _multi_midi);
- _native_mt32 = g_config->getBool ("native_mt32", _native_mt32);
+ _game.features = 0;
+ _plugin = 0;
}
void GameDetector::list_games() {
+ // FIXME / TODO: config rewrite
+ // Right now this lists all known built-in targets; and also for each of
+ // those it tells the user if the target is "configured".
+ // To me this seems like an ill mix of two different functionalities.
+ // IMHO we should split this into two seperate commands/options:
+ // 1) List all built-in gameids (e.g. monkey, atlantis, ...) similiar to
+ // what this code does, but without the "Config" column.
+ // 2) List all available (configured) targets, including those with custom
+ // names, e.g. "monkey-mac", "skycd-demo", ...
const PluginList &plugins = g_pluginManager->getPlugins();
const TargetSettings *v;
- const char *config;
- printf("Game Full Title Config\n"
- "---------------- ------------------------------------------------------ -------\n");
+ printf("Game Full Title \n"
+ "---------------- ------------------------------------------------------\n");
PluginList::ConstIterator iter = plugins.begin();
for (iter = plugins.begin(); iter != plugins.end(); ++iter) {
v = (*iter)->getTargets();
while (v->targetName && v->description) {
- config = (g_config->has_domain(v->targetName)) ? "Yes" : "";
+#if 1
+ printf("%-17s%-56s\n", v->targetName, v->description);
+#else
+ const char *config = (g_config->has_domain(v->targetName)) ? "Yes" : "";
printf("%-17s%-56s%s\n", v->targetName, v->description, config);
+#endif
v++;
}
}
}
-const TargetSettings *GameDetector::findTarget(const char *targetName, const Plugin **plugin) const {
+const TargetSettings *GameDetector::findTarget(const String &targetName, const Plugin **plugin) const {
// Find the TargetSettings for this target
- assert(targetName);
const TargetSettings *target;
const PluginList &plugins = g_pluginManager->getPlugins();
PluginList::ConstIterator iter = plugins.begin();
for (iter = plugins.begin(); iter != plugins.end(); ++iter) {
- target = (*iter)->findTarget(targetName);
+ target = (*iter)->findTarget(targetName.c_str());
if (target) {
if (plugin)
*plugin = *iter;
@@ -334,12 +283,15 @@ void GameDetector::parseCommandLine(int argc, char **argv) {
char *option = NULL;
char c;
bool long_option_value;
- _save_slot = -1;
- _joystick_num = -1;
- // Parse the arguments
- // into a transient "_COMMAND_LINE" config comain.
- g_config->set_domain ("_COMMAND_LINE");
+ // Iterate over all comman line arguments, backwards.
+ // FIXME: Looping backwards has a major problem: Consider this example
+ // invocation: "scummvm -g 1x". It should work exactly like "scummvm -g1x"
+ // but it doesn't! Instead of starting the launcher with the 1x sacler
+ // in effect, it will give an error about target 1x being unknown.
+ // This can be fixed by forward iterating the args. Of course doing that
+ // essentially means we have to rewrite the whole command line parser,
+ // but that seems like a good idea anyway.
for (i = argc - 1; i >= 1; i--) {
s = argv[i];
@@ -349,20 +301,19 @@ void GameDetector::parseCommandLine(int argc, char **argv) {
switch (tolower(c)) {
case 'b':
HANDLE_OPTION();
- _bootParam = atoi(option);
+ ConfMan.set("boot_param", (int)strtol(option, 0, 10));
break;
case 'c':
HANDLE_OPTION();
- _cdrom = atoi(option);
- g_config->setInt("cdrom", _cdrom);
+ ConfMan.set("cdrom", (int)strtol(option, 0, 10));
break;
case 'd':
_debugMode = true;
HANDLE_OPT_OPTION();
if (option != NULL)
- _debugLevel = atoi(option);
- if (_debugLevel) {
- printf("Debuglevel (from command line): %d\n", _debugLevel);
+ ConfMan.set("debuglevel", (int)strtol(option, 0, 10));
+ if (ConfMan.getInt("debuglevel")) {
+ printf("Debuglevel (from command line): %d\n", ConfMan.getInt("debuglevel"));
} else {
printf("Debuglevel (from command line): 0 - Engine only\n");
}
@@ -373,37 +324,31 @@ void GameDetector::parseCommandLine(int argc, char **argv) {
// maybe print a message like:
// "'option' is not a supported music driver on this machine.
// Available driver: ..."
- if (!parseMusicDriver(option))
+ if (parseMusicDriver(option) < 0)
goto ShowHelpAndExit;
- g_config->set("music_driver", option);
+ ConfMan.set("music_driver", option);
break;
case 'f':
CHECK_OPTION();
- _fullScreen = (c == 'f');
- g_config->setBool("fullscreen", _fullScreen);
- g_config->setBool("fullscreen", _fullScreen, "scummvm");
+ ConfMan.set("fullscreen", (c == 'f'));
break;
- case 'g':
+ case 'g':{
HANDLE_OPTION();
- _gfx_mode = parseGraphicsMode(option);
+ int _gfx_mode = parseGraphicsMode(option);
// TODO: Instead of just showing the generic help text,
// maybe print a message like:
// "'option' is not a supported graphic mode on this machine.
// Available graphic modes: ..."
if (_gfx_mode == -1)
goto ShowHelpAndExit;
- g_config->set("gfx_mode", option);
- g_config->set("gfx_mode", option, "scummvm");
- break;
+ ConfMan.set("gfx_mode", option);
+ break;}
// case 'h': reserved for help
case 'j':
- _joystick_num = 0;
HANDLE_OPT_OPTION();
- if (option != NULL) {
- _joystick_num = atoi(option);
- g_config->setInt("joystick_num", _joystick_num);
- }
+ ConfMan.set("joystick_num", (option != NULL) ? (int)strtol(option, 0, 10) : 0);
break;
+/* FIXME / TODO: config rewrite
case 'l':
HANDLE_OPTION();
{
@@ -414,47 +359,43 @@ void GameDetector::parseCommandLine(int argc, char **argv) {
break;
}
break;
+*/
case 'm':
HANDLE_OPTION();
- _music_volume = atoi(option);
- g_config->setInt("music_volume", _music_volume);
+ ConfMan.set("music_volume", (int)strtol(option, 0, 10));
break;
case 'n':
CHECK_OPTION();
- _noSubtitles = (c == 'n');
- g_config->setBool("nosubtitles", _noSubtitles ? true : false);
+ ConfMan.set("nosubtitles", (c == 'n'));
break;
case 'o':
HANDLE_OPTION();
- _master_volume = atoi(option);
- g_config->setInt("master_volume", _master_volume);
+ ConfMan.set("master_volume", (int)strtol(option, 0, 10));
break;
case 'p':
HANDLE_OPTION();
- _gameDataPath = option;
- g_config->set("path", _gameDataPath);
+ // TODO: Verify path is valid
+ ConfMan.set("path", option);
break;
case 'q':
HANDLE_OPTION();
- _language = parseLanguage(option);
- if (_language == -1)
+ if (parseLanguage(option) == UNK_LANG)
goto ShowHelpAndExit;
- g_config->set("language", option);
- break;
- case 'r':
- HANDLE_OPTION();
- // Ignore -r for now, to ensure backward compatibility.
+ ConfMan.set("language", option);
break;
case 's':
HANDLE_OPTION();
- _sfx_volume = atoi(option);
- g_config->setInt("sfx_volume", _sfx_volume);
+ ConfMan.set("sfx_volume", (int)strtol(option, 0, 10));
break;
+#ifndef DISABLE_SCUMM
case 't':
HANDLE_OPTION();
- _gameTempo = strtol(option, 0, 0);
- g_config->set("tempo", option);
+ // Use the special value '0' for the base in (int)strtol.
+ // Doing that makes it possible to enter hex values
+ // as "0x1234", but also decimal values ("123").
+ ConfMan.set("tempo", (int)strtol(option, 0, 0));
break;
+#endif
case 'u':
CHECK_OPTION();
_dumpScripts = true;
@@ -462,7 +403,9 @@ void GameDetector::parseCommandLine(int argc, char **argv) {
case 'v':
CHECK_OPTION();
printf("%s\n", gScummVMFullVersion);
- exit(1);
+ exit(0);
+ break;
+/* FIXME / TODO: config rewrite
case 'w':
_saveconfig = true;
g_config->set_writing(true);
@@ -470,19 +413,17 @@ void GameDetector::parseCommandLine(int argc, char **argv) {
if (option != NULL)
g_config->set_filename(option);
break;
+*/
case 'x':
- _save_slot = 0;
HANDLE_OPT_OPTION();
- if (option != NULL) {
- _save_slot = atoi(option);
- g_config->setInt("save_slot", _save_slot);
- }
+ ConfMan.set("save_slot", (option != NULL) ? (int)strtol(option, 0, 10) : 0);
break;
+#ifndef DISABLE_SCUMM
case 'y':
HANDLE_OPTION();
- _talkSpeed = atoi(option);
- g_config->setInt("talkspeed", _talkSpeed);
+ ConfMan.set("talkspeed", (int)strtol(option, 0, 10));
break;
+#endif
case 'z':
CHECK_OPTION();
list_games();
@@ -491,16 +432,11 @@ void GameDetector::parseCommandLine(int argc, char **argv) {
// Long options. Let the fun begin!
if (!strncmp(s, "platform=", 9)) {
s += 9;
- if (!strcmp (s, "amiga"))
- _platform = 1;
- else if (!strcmp (s, "atari-st"))
- _platform = 2;
- else if (!strcmp (s, "macintosh"))
- _platform = 3;
- else
+ int platform = parsePlatform(s);
+ if (platform == kPlatformUnknown)
goto ShowHelpAndExit;
- g_config->setInt ("platform", _platform);
+ ConfMan.set("platform", platform);
break;
}
@@ -511,28 +447,21 @@ void GameDetector::parseCommandLine(int argc, char **argv) {
long_option_value = true;
if (!strcmp (s, "multi-midi")) {
- _multi_midi = long_option_value;
- g_config->setBool ("multi_midi", _multi_midi);
+ ConfMan.set("multi_midi", long_option_value);
} else if (!strcmp (s, "native-mt32")) {
- _native_mt32 = long_option_value;
- g_config->setBool ("native_mt32", _native_mt32);
+ ConfMan.set("native_mt32", long_option_value);
} else if (!strcmp (s, "aspect-ratio")) {
- _aspectRatio = long_option_value;
- g_config->setBool ("aspect_ratio", _aspectRatio);
+ ConfMan.set("aspect_ratio", long_option_value);
} else if (!strcmp (s, "fullscreen")) {
- _fullScreen = long_option_value;
- g_config->setBool("fullscreen", _fullScreen);
- g_config->setBool("fullscreen", _fullScreen, "scummvm");
+ ConfMan.set("fullscreen", long_option_value);
#ifndef DISABLE_SCUMM
} else if (!strcmp (s, "demo-mode")) {
- _demo_mode = long_option_value;
- g_config->setBool ("demo_mode", _demo_mode);
+ ConfMan.set("demo_mode", long_option_value);
#endif
#ifndef DISABLE_SKY
} else if (!strcmp (s, "floppy-intro")) {
- _floppyIntro = long_option_value;
- g_config->setBool ("floppy_intro", _floppyIntro);
+ ConfMan.set("floppy_intro", long_option_value);
#endif
} else {
goto ShowHelpAndExit;
@@ -553,8 +482,10 @@ void GameDetector::parseCommandLine(int argc, char **argv) {
}
}
+/* FIXME / TODO: config rewrite
if (!_gameFileName.isEmpty())
- g_config->flush();
+ ConfMan.flushToDisk();
+*/
return;
@@ -565,29 +496,14 @@ ShowHelpAndExit:
void GameDetector::setGame(const String &name) {
_gameFileName = name;
- g_config->set_domain(name);
- g_config->rename_domain(name, "game-specific");
- g_config->rename_domain("game-specific", name);
- updateconfig();
-
- // The command line and launcher options
- // override config file global and game-specific options.
- g_config->set_domain("_COMMAND_LINE");
- updateconfig();
- g_config->set_domain("_USER_OVERRIDES");
- updateconfig();
- g_config->delete_domain("_COMMAND_LINE");
- g_config->delete_domain("_USER_OVERRIDES");
- g_config->set_domain(name);
- if (_debugMode)
- printf("Debuglevel (from config): %d\n", _debugLevel);
+ ConfMan.setActiveDomain(name);
}
-int GameDetector::parseGraphicsMode(const char *s) {
+int GameDetector::parseGraphicsMode(const String &str) {
+ const char *s = str.c_str();
const GraphicsMode *gm = gfx_modes;
- while(gm->name) {
+ while (gm->name) {
if (!scumm_stricmp(gm->name, s)) {
- _default_gfx_mode = false;
return gm->id;
}
gm++;
@@ -596,50 +512,65 @@ int GameDetector::parseGraphicsMode(const char *s) {
return -1;
}
-int GameDetector::parseLanguage(const char *s) {
- const Language *l = languages;
- while(l->name) {
+Language GameDetector::parseLanguage(const String &str) {
+ const char *s = str.c_str();
+ const LanguageDescription *l = languages;
+ while (l->name) {
if (!scumm_stricmp(l->name, s))
return l->id;
l++;
}
- return -1;
+ return UNK_LANG;
+}
+
+Platform GameDetector::parsePlatform(const String &str) {
+ const char *s = str.c_str();
+ if (!scumm_stricmp(s, "pc"))
+ return kPlatformPC;
+ else if (!scumm_stricmp(s, "amiga") || !scumm_stricmp(s, "1"))
+ return kPlatformAmiga;
+ else if (!scumm_stricmp(s, "atari-st") || !scumm_stricmp(s, "atari") || !scumm_stricmp(s, "2"))
+ return kPlatformAtariST;
+ else if (!scumm_stricmp(s, "macintosh") || !scumm_stricmp(s, "mac") || !scumm_stricmp(s, "3"))
+ return kPlatformMacintosh;
+ else
+ return kPlatformUnknown;
}
-bool GameDetector::parseMusicDriver(const char *s) {
+int GameDetector::parseMusicDriver(const String &str) {
+ const char *s = str.c_str();
const MidiDriverDescription *md = getAvailableMidiDrivers();
while (md->name) {
if (!scumm_stricmp(md->name, s)) {
- _midi_driver = md->id;
- return true;
+ return md->id;
}
md++;
}
- return false;
+ return -1;
}
bool GameDetector::detectGame() {
const TargetSettings *target;
- const char *realGame, *basename;
- _gameText.clear();
+ String realGame;
- realGame = g_config->get("gameid");
- if (!realGame)
- realGame = _gameFileName.c_str();
- printf("Looking for %s\n", realGame);
+ if (ConfMan.hasKey("gameid"))
+ realGame = ConfMan.get("gameid");
+ else
+ realGame = _gameFileName;
+ printf("Looking for %s\n", realGame.c_str());
target = findTarget(realGame, &_plugin);
if (target) {
_game = *target;
- if ((basename = g_config->get("basename"))) {
+ if (ConfMan.hasKey("basename")) {
// FIXME: What is this good for?
- _game.targetName = basename;
+ // FIXME: This leaks now!
+ _game.targetName = strdup(ConfMan.get("basename").c_str());
}
- _gameText = _game.description;
printf("Trying to start game '%s'\n", _game.description);
return true;
} else {
@@ -648,15 +579,6 @@ bool GameDetector::detectGame() {
}
}
-const Common::String& GameDetector::getGameName() {
- if (_gameText.isEmpty()) {
- _gameText = "Unknown game: \"";
- _gameText += _gameFileName;
- _gameText += "\"";
- }
- return _gameText;
-}
-
bool GameDetector::detectMain() {
if (_gameFileName.isEmpty()) {
warning("No game was specified...");
@@ -672,7 +594,8 @@ bool GameDetector::detectMain() {
* and the game is one of those that want adlib as
* default, OR if the game is an older game that doesn't
* support anything else anyway. */
- if (_midi_driver == MD_AUTO) {
+ _midi_driver = parseMusicDriver(ConfMan.get("music_driver"));
+ if (_midi_driver == MD_AUTO || _midi_driver < 0) {
if (_game.midi & MDT_PREFER_NATIVE)
_midi_driver = getMidiDriverType();
else
@@ -691,21 +614,17 @@ bool GameDetector::detectMain() {
if ((_midi_driver == MD_PCSPK || _midi_driver == MD_PCJR) && !(_game.midi & MDT_PCSPK))
_midi_driver = MD_NULL;
- if (!_gameDataPath) {
+ String gameDataPath(ConfMan.get("path"));
+ if (gameDataPath.isEmpty()) {
warning("No path was provided. Assuming the data files are in the current directory");
- _gameDataPath = strdup("");
#ifndef __PALM_OS__ // add last slash also in File::fopenNoCase, so this is not needed
- } else if (_gameDataPath[strlen(_gameDataPath)-1] != '/'
+ } else if (gameDataPath.lastChar() != '/'
#ifdef __MORPHOS__
- && _gameDataPath[strlen(_gameDataPath)-1] != ':'
+ && gameDataPath.lastChar() != ':'
#endif
- && _gameDataPath[strlen(_gameDataPath)-1] != '\\') {
- char slashless[1024]; /* Append slash to path */
- strcpy(slashless, _gameDataPath);
-
- // need to allocate 2 extra bytes, one for the "/" and one for the NULL terminator
- _gameDataPath = (char *)malloc((strlen(slashless) + 2) * sizeof(char));
- sprintf(_gameDataPath, "%s/", slashless);
+ && gameDataPath.lastChar() != '\\') {
+ gameDataPath += '/';
+ ConfMan.set("path", gameDataPath);
#endif
}
@@ -713,6 +632,8 @@ bool GameDetector::detectMain() {
}
OSystem *GameDetector::createSystem() {
+ int _gfx_mode = parseGraphicsMode(ConfMan.get("gfx_mode")); // FIXME: Get rid of this again!
+
#if defined(USE_NULL_DRIVER)
return OSystem_NULL_create();
#elif defined(__DC__)
@@ -720,18 +641,18 @@ OSystem *GameDetector::createSystem() {
#elif defined(X11_BACKEND)
return OSystem_X11_create();
#elif defined(__MORPHOS__)
- return OSystem_MorphOS_create(_gfx_mode, _fullScreen);
+ return OSystem_MorphOS_create(_gfx_mode, ConfMan.getBool("fullscreen"));
#elif defined(_WIN32_WCE)
return OSystem_WINCE3_create();
#elif defined(MACOS_CARBON)
- return OSystem_MAC_create(_gfx_mode, _fullScreen);
+ return OSystem_MAC_create(_gfx_mode, ConfMan.getBool("fullscreen"));
#elif defined(__GP32__) // ph0x
return OSystem_GP32_create(GFX_NORMAL, true);
#elif defined(__PALM_OS__) //chrilith
- return OSystem_PALMOS_create(_gfx_mode, _fullScreen);
+ return OSystem_PALMOS_create(_gfx_mode, ConfMan.getBool("fullscreen"));
#else
/* SDL is the default driver for now */
- return OSystem_SDL_create(_gfx_mode, _fullScreen, _aspectRatio, _joystick_num);
+ return OSystem_SDL_create(_gfx_mode, ConfMan.getBool("fullscreen"), ConfMan.getBool("aspect_ratio"), ConfMan.getBool("joystick_num"));
#endif
}
diff --git a/base/gameDetector.h b/base/gameDetector.h
index a78288e437..7f96ecf4e4 100644
--- a/base/gameDetector.h
+++ b/base/gameDetector.h
@@ -51,7 +51,8 @@ enum {
* @note The order and mappings of the values 0..8 are *required* to stay the
* way they are now, as scripts in COMI rely on them. So don't touch them.
*/
-enum {
+enum Language {
+ UNK_LANG = -1, // Use default language (i.e. none specified)
EN_USA = 0,
DE_DEU = 1,
FR_FRA = 2,
@@ -66,6 +67,14 @@ enum {
HB_HEB = 20
};
+enum Platform {
+ kPlatformUnknown = -1,
+ kPlatformPC = 0,
+ kPlatformAmiga = 1,
+ kPlatformAtariST = 2,
+ kPlatformMacintosh = 3
+};
+
enum MidiDriverType {
MDT_NONE = 0,
MDT_PCSPK = 1, // MD_PCSPK and MD_PCJR
@@ -92,69 +101,36 @@ public:
void parseCommandLine(int argc, char **argv);
bool detectMain();
- void setGame(const String &name);
- const String& getGameName(void);
String _gameFileName;
TargetSettings _game;
const Plugin *_plugin;
- bool _fullScreen;
- bool _aspectRatio;
-
- int _master_volume;
- int _music_volume;
- int _sfx_volume;
- bool _amiga;
- int _platform;
- int _language;
-
- bool _demo_mode;
- bool _floppyIntro;
-
- uint16 _talkSpeed;
- uint16 _debugMode;
- uint16 _debugLevel;
+ bool _debugMode;
bool _dumpScripts;
- bool _noSubtitles;
- uint16 _bootParam;
+ bool _saveconfig;
- char *_gameDataPath;
- int _gameTempo;
int _midi_driver;
- int _gfx_mode;
- bool _default_gfx_mode;
-
- bool _multi_midi;
- bool _native_mt32;
-
- int _cdrom;
- int _joystick_num;
- int _save_slot;
-
- bool _saveconfig;
- bool _confirmExit;
-
public:
OSystem *createSystem();
Engine *createEngine(OSystem *system);
SoundMixer *createMixer();
MidiDriver *createMidi();
- int getMidiDriverType();
+ int getMidiDriverType(); // FIXME: Try to get rid of this, only Sky frontend uses it
- int parseGraphicsMode(const char *s);
- void updateconfig();
+ void setGame(const String &name);
+
+ static int parseGraphicsMode(const String &s); // Used in main()
+ static int parseMusicDriver(const String &s);
+ static Language parseLanguage(const String &s);
+ static Platform parsePlatform(const String &s);
- const TargetSettings *findTarget(const char *targetName, const Plugin **plugin = NULL) const;
+ const TargetSettings *findTarget(const String &targetName, const Plugin **plugin = NULL) const;
protected:
- String _gameText;
-
bool detectGame(void);
- bool parseMusicDriver(const char *s);
- int parseLanguage(const char *s);
void list_games();
};
diff --git a/base/main.cpp b/base/main.cpp
index 98fd8413f5..1ebd405899 100644
--- a/base/main.cpp
+++ b/base/main.cpp
@@ -32,7 +32,7 @@
#include "base/engine.h"
#include "base/gameDetector.h"
#include "base/plugins.h"
-#include "common/config-file.h"
+#include "common/config-manager.h"
#include "common/scaler.h" // For GFX_NORMAL
#include "common/timer.h"
#include "gui/newgui.h"
@@ -83,7 +83,6 @@ const char *gScummVMBuildDate = __DATE__ " " __TIME__;
const char *gScummVMFullVersion = "ScummVM 0.5.4cvs (" __DATE__ " " __TIME__ ")";
-Config *g_config = 0;
NewGui *g_gui = 0;
OSystem *g_system = 0;
@@ -109,20 +108,6 @@ extern "C" int main(int argc, char *argv[]);
#endif
#if defined(UNIX)
-#include <sys/param.h>
-#ifndef MAXPATHLEN
-#define MAXPATHLEN 256
-#endif
-#ifdef MACOSX
-#define DEFAULT_CONFIG_FILE "Library/Preferences/ScummVM Preferences"
-#else
-#define DEFAULT_CONFIG_FILE ".scummvmrc"
-#endif
-#else
-#define DEFAULT_CONFIG_FILE "scummvm.ini"
-#endif
-
-#if defined(UNIX)
#include <signal.h>
#ifndef SCUMM_NEED_ALIGNMENT
@@ -211,23 +196,6 @@ int main(int argc, char *argv[]) {
#if defined(UNIX)
/* On Unix, do a quick endian / alignement check before starting */
do_memory_test();
-
- char scummhome[MAXPATHLEN];
- if(getenv("HOME") != NULL)
- sprintf(scummhome,"%s/%s", getenv("HOME"), DEFAULT_CONFIG_FILE);
- else strcpy(scummhome,DEFAULT_CONFIG_FILE);
-#else
- char scummhome[256];
- #if defined (WIN32) && !defined(_WIN32_WCE)
- GetWindowsDirectory(scummhome, 256);
- strcat(scummhome, "\\");
- strcat(scummhome, DEFAULT_CONFIG_FILE);
- #elif defined(__PALM_OS__)
- strcpy(scummhome,"/PALM/Programs/ScummVM/");
- strcat(scummhome, DEFAULT_CONFIG_FILE);
- #else
- strcpy(scummhome, DEFAULT_CONFIG_FILE);
- #endif
#endif
// Code copied from SDL_main
@@ -265,9 +233,8 @@ int main(int argc, char *argv[]) {
#endif //defined(WIN32) && defined(USE_CONSOLE)
- // Read the config file
- g_config = new Config(scummhome, "scummvm");
- g_config->set("versioninfo", gScummVMVersion);
+ // Update the config file
+ ConfMan.set("versioninfo", gScummVMVersion, "scummvm");
// Load the plugins
g_pluginManager = new PluginManager();
@@ -276,7 +243,6 @@ int main(int argc, char *argv[]) {
// Parse the command line information
GameDetector detector;
detector._saveconfig = false;
- detector.updateconfig();
detector.parseCommandLine(argc, argv);
// Create the system object
@@ -301,30 +267,30 @@ int main(int argc, char *argv[]) {
if (detector.detectMain()) {
// Set the window caption to the game name
- prop.caption = g_config->get("description", detector._gameFileName);
+ prop.caption = ConfMan.get("description", detector._gameFileName).c_str();
if (prop.caption == NULL)
- prop.caption = detector.getGameName().c_str();
- system->property(OSystem::PROP_SET_WINDOW_CAPTION, &prop);
+ prop.caption = detector._gameFileName.c_str();
+ if (prop.caption != NULL)
+ system->property(OSystem::PROP_SET_WINDOW_CAPTION, &prop);
// FIXME: It seem not logical that we first might set the gfx mode to
// 1x, and then immediately after might override it again. We probably
// should combine both checks into one.
// See if the game should default to 1x scaler
- if ((detector._default_gfx_mode) &&
+ if (!ConfMan.hasKey("gfx_mode", detector._gameFileName) &&
(detector._game.features & GF_DEFAULT_TO_1X_SCALER)) {
prop.gfx_mode = GFX_NORMAL;
system->property(OSystem::PROP_SET_GFX_MODE, &prop);
- }
-
+ } else
// Override global scaler with any game-specific define
- if (g_config->get("gfx_mode")) {
- prop.gfx_mode = detector.parseGraphicsMode(g_config->get("gfx_mode"));
+ if (ConfMan.hasKey("gfx_mode")) {
+ prop.gfx_mode = detector.parseGraphicsMode(ConfMan.get("gfx_mode"));
system->property(OSystem::PROP_SET_GFX_MODE, &prop);
}
// Override global fullscreen setting with any game-specific define
- if (g_config->getBool("fullscreen", false)) {
+ if (ConfMan.getBool("fullscreen")) {
if (!system->property(OSystem::PROP_GET_FULLSCREEN, 0))
system->property(OSystem::PROP_TOGGLE_FULLSCREEN, 0);
}
@@ -344,7 +310,6 @@ int main(int argc, char *argv[]) {
}
delete g_gui;
- delete g_config;
// ...and quit (the return 0 should never be reached)
system->quit();