Moved GameDetector::setTarget & findGame to the new namespace Base; moved their declaration to base/game.h, their implementation to base/main.cpp (both until we can come up with a better location). Also moved detectMain into main.cpp, where it now is a local static function

svn-id: r22346
This commit is contained in:
Max Horn 2006-05-04 23:24:09 +00:00
parent c46301bcc2
commit 5d5c02d66c
7 changed files with 102 additions and 96 deletions

View File

@ -24,7 +24,7 @@
#include <common/stdafx.h>
#include <common/scummsys.h>
#include <base/engine.h>
#include <base/gameDetector.h>
#include <base/game.h>
#include <base/main.h>
#include <base/plugins.h>
#include "dc.h"
@ -224,7 +224,7 @@ int DCLauncherDialog::runModal()
ConfMan.set("path", dir, base);
// Set the target.
GameDetector::setTarget(base);
Base::setTarget(base);
return 0;
}

View File

@ -53,4 +53,18 @@ struct GameDescriptor {
gameid(g.gameid), description(g.description) {}
};
class Plugin;
namespace Base {
// TODO: Find a better place for this function.
GameDescriptor findGame(const Common::String &gameName, const Plugin **plugin = NULL);
// TODO: Find a better place for this function.
void setTarget(const Common::String &name);
} // End of namespace Base
#endif

View File

@ -252,26 +252,6 @@ void GameDetector::registerDefaults() {
#endif // #ifdef DEFAULT_SAVE_PATH
}
GameDescriptor GameDetector::findGame(const String &gameName, const Plugin **plugin) {
// Find the GameDescriptor for this target
const PluginList &plugins = PluginManager::instance().getPlugins();
GameDescriptor result;
if (plugin)
*plugin = 0;
PluginList::const_iterator iter = plugins.begin();
for (iter = plugins.begin(); iter != plugins.end(); ++iter) {
result = (*iter)->findGame(gameName.c_str());
if (!result.gameid.empty()) {
if (plugin)
*plugin = *iter;
break;
}
}
return result;
}
//
// Various macros used by the command line parser.
//
@ -545,8 +525,8 @@ void GameDetector::processSettings(Common::String &target, Common::StringMap &se
// domain (i.e. a target) matching this argument, or alternatively
// whether there is a gameid matching that name.
if (!target.empty()) {
if (ConfMan.hasGameDomain(target) || findGame(target).gameid.size() > 0) {
setTarget(target);
if (ConfMan.hasGameDomain(target) || Base::findGame(target).gameid.size() > 0) {
Base::setTarget(target);
} else {
usage("Unrecognized game target '%s'", target.c_str());
}
@ -570,11 +550,11 @@ void GameDetector::processSettings(Common::String &target, Common::StringMap &se
// Finally, store the command line settings into the config manager.
for (Common::StringMap::const_iterator x = settings.begin(); x != settings.end(); ++x) {
String key(x->_key);
String value(x->_value);
Common::String key(x->_key);
Common::String value(x->_value);
// Replace any "-" in the key by "_" (e.g. change "save-slot" to "save_slot").
for (String::iterator c = key.begin(); c != key.end(); ++c)
for (Common::String::iterator c = key.begin(); c != key.end(); ++c)
if (*c == '-')
*c = '_';
@ -582,50 +562,3 @@ void GameDetector::processSettings(Common::String &target, Common::StringMap &se
ConfMan.set(key, value, Common::ConfigManager::kTransientDomain);
}
}
void GameDetector::setTarget(const String &target) {
ConfMan.setActiveDomain(target);
// Make sure the gameid is set in the config manager, and that it is lowercase.
String gameid(target);
if (ConfMan.hasKey("gameid"))
gameid = ConfMan.get("gameid");
gameid.toLowercase();
ConfMan.set("gameid", gameid);
}
const Plugin *GameDetector::detectMain() {
const Plugin *plugin = 0;
if (ConfMan.getActiveDomainName().empty()) {
warning("No game was specified...");
return 0;
}
printf("Looking for %s\n", ConfMan.get("gameid").c_str());
GameDescriptor game = findGame(ConfMan.get("gameid"), &plugin);
if (plugin == 0) {
printf("Failed game detection\n");
warning("%s is an invalid target. Use the --list-targets option to list targets", ConfMan.getActiveDomainName().c_str());
return 0;
}
printf("Trying to start game '%s'\n", game.description.c_str());
String gameDataPath(ConfMan.get("path"));
if (gameDataPath.empty()) {
warning("No path was provided. Assuming the data files are in the current directory");
gameDataPath = "./";
} else if (gameDataPath.lastChar() != '/'
#if defined(__MORPHOS__) || defined(__amigaos4__)
&& gameDataPath.lastChar() != ':'
#endif
&& gameDataPath.lastChar() != '\\') {
gameDataPath += '/';
ConfMan.set("path", gameDataPath, Common::ConfigManager::kTransientDomain);
}
return plugin;
}

View File

@ -28,24 +28,11 @@
#include "common/config-manager.h"
#include "base/game.h"
class Plugin;
class GameDetector {
typedef Common::String String;
public:
static void registerDefaults();
static Common::String parseCommandLine(Common::StringMap &settings, int argc, char **argv);
static void processSettings(Common::String &target, Common::StringMap &settings);
static const Plugin *detectMain();
public:
static GameDescriptor findGame(const String &gameName, const Plugin **plugin = NULL);
//protected:
static void setTarget(const String &name); // TODO: This should be protected
};
#endif

View File

@ -65,6 +65,45 @@
#include "gui/Actions.h"
#endif
namespace Base {
// TODO: Find a better place for this function.
GameDescriptor findGame(const Common::String &gameName, const Plugin **plugin) {
// Find the GameDescriptor for this target
const PluginList &plugins = PluginManager::instance().getPlugins();
GameDescriptor result;
if (plugin)
*plugin = 0;
PluginList::const_iterator iter = plugins.begin();
for (iter = plugins.begin(); iter != plugins.end(); ++iter) {
result = (*iter)->findGame(gameName.c_str());
if (!result.gameid.empty()) {
if (plugin)
*plugin = *iter;
break;
}
}
return result;
}
// TODO: Find a better place for this function.
void setTarget(const Common::String &target) {
ConfMan.setActiveDomain(target);
// Make sure the gameid is set in the config manager, and that it is lowercase.
Common::String gameid(target);
if (ConfMan.hasKey("gameid"))
gameid = ConfMan.get("gameid");
gameid.toLowercase();
ConfMan.set("gameid", gameid);
}
} // End of namespace Base
/** List all supported game IDs, i.e. all games which any loaded plugin supports. */
void listGames() {
const PluginList &plugins = PluginManager::instance().getPlugins();
@ -99,7 +138,7 @@ void listTargets() {
// to find the proper desc. In fact, the platform probably should
// be taken into account, too.
Common::String gameid(name);
GameDescriptor g = GameDetector::findGame(gameid);
GameDescriptor g = Base::findGame(gameid);
if (g.description.size() > 0)
description = g.description;
}
@ -164,6 +203,41 @@ static bool launcherDialog(OSystem &system) {
return (dlg.runModal() != -1);
}
static const Plugin *detectMain() {
const Plugin *plugin = 0;
if (ConfMan.getActiveDomainName().empty()) {
warning("No game was specified...");
return 0;
}
printf("Looking for %s\n", ConfMan.get("gameid").c_str());
GameDescriptor game = Base::findGame(ConfMan.get("gameid"), &plugin);
if (plugin == 0) {
printf("Failed game detection\n");
warning("%s is an invalid target. Use the --list-targets option to list targets", ConfMan.getActiveDomainName().c_str());
return 0;
}
printf("Trying to start game '%s'\n", game.description.c_str());
Common::String gameDataPath(ConfMan.get("path"));
if (gameDataPath.empty()) {
warning("No path was provided. Assuming the data files are in the current directory");
gameDataPath = "./";
} else if (gameDataPath.lastChar() != '/'
#if defined(__MORPHOS__) || defined(__amigaos4__)
&& gameDataPath.lastChar() != ':'
#endif
&& gameDataPath.lastChar() != '\\') {
gameDataPath += '/';
ConfMan.set("path", gameDataPath, Common::ConfigManager::kTransientDomain);
}
return plugin;
}
static int runGame(const Plugin *plugin, OSystem &system, const Common::String &edebuglevels) {
// We add it here, so MD5-based detection will be able to
// read mixed case files
@ -197,7 +271,7 @@ static int runGame(const Plugin *plugin, OSystem &system, const Common::String &
// Set the window caption to the game name
Common::String caption(ConfMan.get("description"));
Common::String desc = GameDetector::findGame(ConfMan.get("gameid")).description;
Common::String desc = Base::findGame(ConfMan.get("gameid")).description;
if (caption.empty() && !desc.empty())
caption = desc;
if (caption.empty())
@ -424,7 +498,7 @@ extern "C" int scummvm_main(int argc, char *argv[]) {
// cleanly, so this is now enabled to encourage people to fix bits :)
while (running) {
// Verify the given game name is a valid supported game
const Plugin *plugin = GameDetector::detectMain();
const Plugin *plugin = detectMain();
if (plugin) {
// Unload all plugins not needed for this game,
// to save memory

View File

@ -25,8 +25,6 @@
#include "backends/intern.h"
#include "base/gameDetector.h"
#include "gui/message.h"
#include "common/config-manager.h"

View File

@ -24,7 +24,7 @@
#include "backends/fs/fs.h"
#include "base/engine.h"
#include "base/gameDetector.h"
#include "base/game.h"
#include "base/plugins.h"
#include "base/version.h"
@ -538,7 +538,7 @@ void LauncherDialog::updateListing() {
if (gameid.empty())
gameid = iter->_key;
if (description.empty()) {
GameDescriptor g = GameDetector::findGame(gameid);
GameDescriptor g = Base::findGame(gameid);
if (!g.description.empty())
description = g.description;
}
@ -696,7 +696,7 @@ void LauncherDialog::editGame(int item) {
String gameId(ConfMan.get("gameid", _domains[item]));
if (gameId.empty())
gameId = _domains[item];
EditGameDialog editDialog(_domains[item], GameDetector::findGame(gameId).description);
EditGameDialog editDialog(_domains[item], Base::findGame(gameId).description);
if (editDialog.runModal() > 0) {
// User pressed OK, so make changes permanent
@ -737,7 +737,7 @@ void LauncherDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat
case kListItemDoubleClickedCmd:
// Print out what was selected
assert(item >= 0);
GameDetector::setTarget(_domains[item]);
Base::setTarget(_domains[item]);
close();
break;
case kListSelectionChangedCmd: