From d2546e397934da3e89fdd994e0c620dd0bcfbcd4 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 9 May 2006 14:16:43 +0000 Subject: - Updated MSVC8 project files - Renamed base/options.cpp to base/commandLine.cpp because of conflict with gui/options.cpp which sit in same directory in MSVC builds - Moved AudioCDManager singleton declaration outside of Audio namespace - Fixed numerous MSVC warning of potentially uninitialized variables and int <-> bool conversions. svn-id: r22397 --- backends/sdl/sdl.cpp | 3 +- base/commandLine.cpp | 707 +++++++++++++++++++++++++++++++++++++++++++++ base/commandLine.h | 38 +++ base/main.cpp | 2 +- base/module.mk | 2 +- base/options.cpp | 707 --------------------------------------------- base/options.h | 38 --- dists/msvc8/gob.vcproj | 32 ++ dists/msvc8/kyra.vcproj | 4 + dists/msvc8/scumm.vcproj | 20 ++ dists/msvc8/scummvm.vcproj | 50 +++- dists/msvc8/simon.vcproj | 28 ++ dists/msvc8/sword2.vcproj | 8 - dists/scummvm.rc | 2 +- dists/scummvm.rc.in | 2 +- engines/scumm/charset.cpp | 2 +- engines/scumm/script.cpp | 2 +- engines/simon/oracle.cpp | 2 +- graphics/font.cpp | 12 +- sound/audiocd.cpp | 4 +- 20 files changed, 888 insertions(+), 777 deletions(-) create mode 100644 base/commandLine.cpp create mode 100644 base/commandLine.h delete mode 100644 base/options.cpp delete mode 100644 base/options.h diff --git a/backends/sdl/sdl.cpp b/backends/sdl/sdl.cpp index 078a5a2d62..cff313cea4 100644 --- a/backends/sdl/sdl.cpp +++ b/backends/sdl/sdl.cpp @@ -35,7 +35,7 @@ #if !defined(_WIN32_WCE) && !defined(__MAEMO__) #if defined (WIN32) -int WinMain(HINSTANCE /*hInst*/, HINSTANCE /*hPrevInst*/, LPSTR /*lpCmdLine*/, int /*iShowCmd*/) { +int __stdcall WinMain(HINSTANCE /*hInst*/, HINSTANCE /*hPrevInst*/, LPSTR /*lpCmdLine*/, int /*iShowCmd*/) { SDL_SetModuleHandle(GetModuleHandle(NULL)); return main(__argc, __argv); } @@ -102,7 +102,6 @@ int main(int argc, char *argv[]) { } #endif - void OSystem_SDL::initBackend() { assert(!_inited); diff --git a/base/commandLine.cpp b/base/commandLine.cpp new file mode 100644 index 0000000000..2dec1703f5 --- /dev/null +++ b/base/commandLine.cpp @@ -0,0 +1,707 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001 Ludvig Strigeus + * Copyright (C) 2001-2006 The ScummVM project + * + * 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. + * + * $URL$ + * $Id$ + * + */ + +#include "common/stdafx.h" + +#include "base/engine.h" +#include "base/commandLine.h" +#include "base/plugins.h" +#include "base/version.h" + +#include "common/config-manager.h" +#include "common/system.h" + +#include "sound/mididrv.h" +#include "sound/mixer.h" + +#ifdef UNIX +#include +#include +#ifdef MACOSX +#define DEFAULT_SAVE_PATH "Documents/ScummVM Savegames" +#else +#define DEFAULT_SAVE_PATH ".scummvm" +#endif +#elif defined(__SYMBIAN32__) +#include +#include +#define DEFAULT_SAVE_PATH "Savegames" +#endif + +#define DETECTOR_TESTING_HACK + +#ifdef DETECTOR_TESTING_HACK +#include "backends/fs/fs.h" +#endif + +namespace Base { + +static const char USAGE_STRING[] = + "%s: %s\n" + "Usage: %s [OPTIONS]... [GAME]\n" + "\n" + "Try '%s --help' for more options.\n" +; + +// DONT FIXME: DO NOT ORDER ALPHABETICALLY, THIS IS ORDERED BY IMPORTANCE/CATEGORY! :) +#if defined(PALMOS_MODE) || defined(__SYMBIAN32__) || defined(__GP32__) +static const char HELP_STRING[] = "NoUsageString"; // save more data segment space +#else +static const char HELP_STRING[] = + "ScummVM - Graphical Adventure Game Interpreter\n" + "Usage: %s [OPTIONS]... [GAME]\n" + " -v, --version Display ScummVM version information and exit\n" + " -h, --help Display a brief help text and exit\n" + " -z, --list-games Display list of supported games and exit\n" + " -t, --list-targets Display list of configured targets and exit\n" + "\n" + " -c, --config=CONFIG Use alternate configuration file\n" + " -p, --path=PATH Path to where the game is installed\n" + " -x, --save-slot[=NUM] Save game slot to load (default: autosave)\n" + " -f, --fullscreen Force full-screen mode\n" + " -F, --no-fullscreen Force windowed mode\n" + " -g, --gfx-mode=MODE Select graphics scaler (normal,2x,3x,2xsai,\n" + " super2xsai,supereagle,advmame2x,advmame3x,hq2x,\n" + " hq3x,tv2x,dotmatrix)\n" + " -e, --music-driver=MODE Select music driver (see README for details)\n" + " -q, --language=LANG Select language (en,de,fr,it,pt,es,jp,zh,kr,se,gb,\n" + " hb,ru,cz)\n" + " -m, --music-volume=NUM Set the music volume, 0-255 (default: 192)\n" + " -s, --sfx-volume=NUM Set the sfx volume, 0-255 (default: 192)\n" + " -r, --speech-volume=NUM Set the speech volume, 0-255 (default: 192)\n" + " --midi-gain=NUM Set the gain for MIDI playback, 0-1000 (default:\n" + " 100) (only supported by some MIDI drivers)\n" + " -n, --subtitles Enable subtitles (use with games that have voice)\n" + " -b, --boot-param=NUM Pass number to the boot script (boot param)\n" + " -d, --debuglevel=NUM Set debug verbosity level\n" + " --debugflags=FLAGS Enables engine specific debug flags\n" + " (separated by commas)\n" + " -u, --dump-scripts Enable script dumping if a directory called 'dumps'\n" + " exists in the current directory\n" + "\n" + " --cdrom=NUM CD drive to play CD audio from (default: 0 = first\n" + " drive)\n" + " --joystick[=NUM] Enable input with joystick (default: 0 = first\n" + " joystick)\n" + " --platform=WORD Specify platform of game (allowed values: 3do, acorn,\n" + " amiga, atari, c64, fmtowns, nes, mac, pc, segacd,\n" + " windows)\n" + " --savepath=PATH Path to where savegames are stored\n" + " --soundfont=FILE Select the SoundFont for MIDI playback (only\n" + " supported by some MIDI drivers)\n" + " --multi-midi Enable combination Adlib and native MIDI\n" + " --native-mt32 True Roland MT-32 (disable GM emulation)\n" + " --enable-gs Enable Roland GS mode for MIDI playback\n" + " --output-rate=RATE Select output sample rate in Hz (e.g. 22050)\n" + " --aspect-ratio Enable aspect ratio correction\n" + " --render-mode=MODE Enable additional render modes (cga, ega, hercGreen,\n" + " hercAmber, amiga)\n" + " --force-1x-overlay Make inner GUI 320x200\n" + "\n" +#if !defined(DISABLE_SKY) || !defined(DISABLE_QUEEN) + " --alt-intro Use alternative intro for CD versions of Beneath a\n" + " Steel Sky and Flight of the Amazon Queen\n" +#endif + " --copy-protection Enable copy protection in SCUMM games, when\n" + " ScummVM disables it by default.\n" + " --talkspeed=NUM Set talk speed for games (default: 60)\n" +#ifndef DISABLE_SCUMM + " --demo-mode Start demo mode of Maniac Mansion\n" + " --tempo=NUM Set music tempo (in percent, 50-200) for SCUMM games\n" + " (default: 100)\n" +#endif + "\n" + "The meaning of boolean long options can be inverted by prefixing them with\n" + "\"no-\", e.g. \"--no-aspect-ratio\".\n" +; +#endif + +#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__)) +static Common::String s_appName("scummvm"); +#else +static const char *s_appName = "scummvm"; +#endif + +static void usage(const char *s, ...) GCC_PRINTF(1, 2); + +static void usage(const char *s, ...) { + char buf[STRINGBUFLEN]; + va_list va; + + va_start(va, s); + vsnprintf(buf, STRINGBUFLEN, s, va); + va_end(va); + +#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__)) + printf(USAGE_STRING, s_appName.c_str(), buf, s_appName.c_str(), s_appName.c_str()); +#endif + exit(1); +} + +void registerDefaults() { + + // Graphics + ConfMan.registerDefault("fullscreen", false); + ConfMan.registerDefault("aspect_ratio", false); + ConfMan.registerDefault("gfx_mode", "normal"); + ConfMan.registerDefault("render_mode", "default"); +#if defined(__SYMBIAN32__) + ConfMan.registerDefault("force_1x_overlay", true); +#else + ConfMan.registerDefault("force_1x_overlay", false); +#endif + + + // Sound & Music + ConfMan.registerDefault("music_volume", 192); + ConfMan.registerDefault("sfx_volume", 192); + ConfMan.registerDefault("speech_volume", 192); + + ConfMan.registerDefault("music_mute", false); + ConfMan.registerDefault("sfx_mute", false); + ConfMan.registerDefault("speech_mute", false); + + ConfMan.registerDefault("multi_midi", false); + ConfMan.registerDefault("native_mt32", false); + ConfMan.registerDefault("enable_gs", false); + ConfMan.registerDefault("midi_gain", 100); +// ConfMan.registerDefault("music_driver", ???); + + ConfMan.registerDefault("cdrom", 0); + + // Game specific + ConfMan.registerDefault("path", ""); + ConfMan.registerDefault("savepath", ""); + +// ConfMan.registerDefault("amiga", false); + ConfMan.registerDefault("platform", Common::kPlatformPC); + ConfMan.registerDefault("language", "en"); + ConfMan.registerDefault("subtitles", false); + ConfMan.registerDefault("boot_param", 0); + ConfMan.registerDefault("dump_scripts", false); + ConfMan.registerDefault("save_slot", -1); + ConfMan.registerDefault("autosave_period", 5 * 60); // By default, trigger autosave every 5 minutes + +#if !defined(DISABLE_SCUMM) || !defined(DISABLE_SWORD2) + ConfMan.registerDefault("object_labels", true); +#endif + + ConfMan.registerDefault("copy_protection", false); + ConfMan.registerDefault("talkspeed", 60); + +#ifndef DISABLE_SCUMM + ConfMan.registerDefault("demo_mode", false); + ConfMan.registerDefault("tempo", 0); +#endif + +#if !defined(DISABLE_SKY) || !defined(DISABLE_QUEEN) + ConfMan.registerDefault("alt_intro", false); +#endif + + // Miscellaneous + ConfMan.registerDefault("joystick_num", -1); + ConfMan.registerDefault("confirm_exit", false); + ConfMan.registerDefault("disable_sdl_parachute", false); +#ifdef USE_ALSA + ConfMan.registerDefault("alsa_port", "65:0"); +#endif + +#ifdef DEFAULT_SAVE_PATH + char savePath[MAXPATHLEN]; +#ifdef UNIX + struct stat sb; + const char *home = getenv("HOME"); + if (home && *home && strlen(home) < MAXPATHLEN) { + snprintf(savePath, MAXPATHLEN, "%s/%s", home, DEFAULT_SAVE_PATH); + if (stat(savePath, &sb) == -1) { + /* create the dir if it does not exist */ + if (errno == ENOENT) { + if (mkdir(savePath, 0755) != 0) { + perror("mkdir"); + exit(1); + } + } + } + /* check that the dir is there */ + if (stat(savePath, &sb) == 0) { + ConfMan.registerDefault("savepath", savePath); + } + } +#elif defined(__SYMBIAN32__) + strcpy(savePath, Symbian::GetExecutablePath()); + strcat(savePath, DEFAULT_SAVE_PATH); + struct stat sb; + if (stat(savePath, &sb) == -1) + if (errno == ENOENT)// create the dir if it does not exist + if (mkdir(savePath, 0755) != 0) + error("mkdir for '%s' failed!", savePath); + ConfMan.registerDefault("savepath", savePath); // this should be enough... +#endif +#endif // #ifdef DEFAULT_SAVE_PATH +} + +// +// Various macros used by the command line parser. +// + +// Use this for options which have an *optional* value +#define DO_OPTION_OPT(shortCmd, longCmd, defaultVal) \ + if (isLongCmd ? (!memcmp(s+2, longCmd"=", sizeof(longCmd"=") - 1)) : (tolower(s[1]) == shortCmd)) { \ + s += 2; \ + if (isLongCmd) \ + s += sizeof(longCmd"=") - 1; \ + const char *option = s; \ + if (*s == '\0') { option = s2; i++; } \ + if (!option) option = defaultVal; \ + if (option) settings[longCmd] = option; + +// Use this for options which have a required (string) value +#define DO_OPTION(shortCmd, longCmd) \ + DO_OPTION_OPT(shortCmd, longCmd, 0) \ + if (!option) usage("Option '%s' requires an argument", argv[i]); + +// Use this for options which have a required integer value +#define DO_OPTION_INT(shortCmd, longCmd) \ + DO_OPTION_OPT(shortCmd, longCmd, 0) \ + if (!option) usage("Option '%s' requires an argument", argv[i]); \ + char *endptr = 0; \ + int intValue; intValue = (int)strtol(option, &endptr, 0); \ + if (endptr == NULL || *endptr != 0) usage("--%s: Invalid number '%s'", longCmd, option); + +// Use this for boolean options; this distinguishes between "-x" and "-X", +// resp. between "--some-option" and "--no-some-option". +#define DO_OPTION_BOOL(shortCmd, longCmd) \ + if (isLongCmd ? (!strcmp(s+2, longCmd) || !strcmp(s+2, "no-"longCmd)) : (tolower(s[1]) == shortCmd)) { \ + bool boolValue = islower(s[1]); \ + s += 2; \ + if (isLongCmd) { \ + boolValue = !strcmp(s, longCmd); \ + s += boolValue ? (sizeof(longCmd) - 1) : (sizeof("no-"longCmd) - 1); \ + } \ + if (*s != '\0') goto unknownOption; \ + const char *option = boolValue ? "true" : "false"; \ + settings[longCmd] = option; + +// Use this for options which never have a value, i.e. for 'commands', like "--help". +#define DO_COMMAND(shortCmd, longCmd) \ + if (isLongCmd ? (!strcmp(s+2, longCmd)) : (tolower(s[1]) == shortCmd)) { \ + s += 2; \ + if (isLongCmd) \ + s += sizeof(longCmd) - 1; \ + if (*s != '\0') goto unknownOption; \ + return longCmd; + + +#define DO_LONG_OPTION_OPT(longCmd, d) DO_OPTION_OPT(0, longCmd, d) +#define DO_LONG_OPTION(longCmd) DO_OPTION(0, longCmd) +#define DO_LONG_OPTION_INT(longCmd) DO_OPTION_INT(0, longCmd) +#define DO_LONG_OPTION_BOOL(longCmd) DO_OPTION_BOOL(0, longCmd) +#define DO_LONG_COMMAND(longCmd) DO_COMMAND(0, longCmd) + +// End an option handler +#define END_OPTION \ + continue; \ + } + + +Common::String parseCommandLine(Common::StringMap &settings, int argc, char **argv) { + const char *s, *s2; + + // argv[0] contains the name of the executable. + if (argv && argv[0]) { + s = strrchr(argv[0], '/'); + s_appName = s ? (s+1) : argv[0]; + } + + // We store all command line settings into a string map. + + // Iterate over all command line arguments and parse them into our string map. + for (int i = 1; i < argc; ++i) { + s = argv[i]; + s2 = (i < argc-1) ? argv[i+1] : 0; + + if (s[0] != '-') { + // The argument doesn't start with a dash, so it's not an option. + // Hence it must be the target name. We currently enforce that + // this always comes last. + if (i != argc - 1) + usage("Stray argument '%s'", s); + + // We defer checking whether this is a valid target to a later point. + return s; + } else { + + bool isLongCmd = (s[0] == '-' && s[1] == '-'); + + DO_COMMAND('h', "help") + END_OPTION + + DO_COMMAND('v', "version") + END_OPTION + + DO_COMMAND('t', "list-targets") + END_OPTION + + DO_COMMAND('z', "list-games") + END_OPTION + + // HACK FIXME TODO: This command is intentionally *not* documented! + DO_LONG_COMMAND("test-detector") + END_OPTION + + + DO_OPTION('c', "config") + END_OPTION + + DO_OPTION_INT('b', "boot-param") + END_OPTION + + DO_OPTION_OPT('d', "debuglevel", "0") + END_OPTION + + DO_LONG_OPTION("debugflags") + END_OPTION + + DO_OPTION('e', "music-driver") + if (MidiDriver::parseMusicDriver(option) < 0) + usage("Unrecognized music driver '%s'", option); + END_OPTION + + DO_LONG_OPTION_INT("output-rate") + END_OPTION + + DO_OPTION_BOOL('f', "fullscreen") + END_OPTION + + DO_OPTION('g', "gfx-mode") + // Check whether 'option' specifies a valid graphics mode. + bool isValid = false; + if (!scumm_stricmp(option, "normal") || !scumm_stricmp(option, "default")) + isValid = true; + if (!isValid) { + const OSystem::GraphicsMode *gm = g_system->getSupportedGraphicsModes(); + while (gm->name && !isValid) { + isValid = !scumm_stricmp(gm->name, option); + gm++; + } + } + if (!isValid) + usage("Unrecognized graphics mode '%s'", option); + END_OPTION + + DO_OPTION_INT('m', "music-volume") + END_OPTION + + DO_OPTION_BOOL('n', "subtitles") + END_OPTION + + DO_OPTION('p', "path") + // TODO: Verify whether the path is valid + END_OPTION + + DO_OPTION('q', "language") + if (Common::parseLanguage(option) == Common::UNK_LANG) + usage("Unrecognized language '%s'", option); + END_OPTION + + DO_OPTION_INT('s', "sfx-volume") + END_OPTION + + DO_OPTION_INT('r', "speech-volume") + END_OPTION + + DO_LONG_OPTION_INT("midi-gain") + END_OPTION + + DO_OPTION_BOOL('u', "dump-scripts") + END_OPTION + + DO_OPTION_OPT('x', "save-slot", "0") + END_OPTION + + DO_LONG_OPTION_INT("cdrom") + END_OPTION + + DO_LONG_OPTION_OPT("joystick", "0") + END_OPTION + + DO_LONG_OPTION("platform") + int platform = Common::parsePlatform(option); + if (platform == Common::kPlatformUnknown) + usage("Unrecognized platform '%s'", option); + END_OPTION + + DO_LONG_OPTION("soundfont") + // TODO: Verify whether the path is valid + END_OPTION + + DO_LONG_OPTION_BOOL("disable-sdl-parachute") + END_OPTION + + DO_LONG_OPTION_BOOL("multi-midi") + END_OPTION + + DO_LONG_OPTION_BOOL("native-mt32") + END_OPTION + + DO_LONG_OPTION_BOOL("enable-gs") + END_OPTION + + DO_LONG_OPTION_BOOL("aspect-ratio") + END_OPTION + + DO_LONG_OPTION("render-mode") + int renderMode = Common::parseRenderMode(option); + if (renderMode == Common::kRenderDefault) + usage("Unrecognized render mode '%s'", option); + END_OPTION + + DO_LONG_OPTION_BOOL("force-1x-overlay") + END_OPTION + + DO_LONG_OPTION("savepath") + // TODO: Verify whether the path is valid + END_OPTION + + DO_LONG_OPTION_INT("talkspeed") + END_OPTION + + DO_LONG_OPTION_BOOL("copy-protection") + END_OPTION + + DO_LONG_OPTION("gui-theme") + END_OPTION + + DO_LONG_OPTION("target-md5") + END_OPTION + +#ifndef DISABLE_SCUMM + DO_LONG_OPTION_INT("tempo") + END_OPTION + + DO_LONG_OPTION_BOOL("demo-mode") + END_OPTION +#endif + +#if !defined(DISABLE_SKY) || !defined(DISABLE_QUEEN) + DO_LONG_OPTION_BOOL("alt-intro") + END_OPTION +#endif + +unknownOption: + // If we get till here, the option is unhandled and hence unknown. + usage("Unrecognized option '%s'", argv[i]); + } + } + + + return Common::String::emptyString; +} + +/** List all supported game IDs, i.e. all games which any loaded plugin supports. */ +static void listGames() { + const PluginList &plugins = PluginManager::instance().getPlugins(); + + printf("Game ID Full Title \n" + "-------------------- ------------------------------------------------------\n"); + + PluginList::const_iterator iter = plugins.begin(); + for (iter = plugins.begin(); iter != plugins.end(); ++iter) { + GameList list = (*iter)->getSupportedGames(); + for (GameList::iterator v = list.begin(); v != list.end(); ++v) { + printf("%-20s %s\n", v->gameid.c_str(), v->description.c_str()); + } + } +} + +/** List all targets which are configured in the config file. */ +static void listTargets() { + using namespace Common; + const ConfigManager::DomainMap &domains = ConfMan.getGameDomains(); + + printf("Target Description \n" + "-------------------- ------------------------------------------------------\n"); + + ConfigManager::DomainMap::const_iterator iter = domains.begin(); + for (iter = domains.begin(); iter != domains.end(); ++iter) { + Common::String name(iter->_key); + Common::String description(iter->_value.get("description")); + + if (description.empty()) { + // FIXME: At this point, we should check for a "gameid" override + // to find the proper desc. In fact, the platform probably should + // be taken into account, too. + Common::String gameid(name); + GameDescriptor g = Base::findGame(gameid); + if (g.description.size() > 0) + description = g.description; + } + + printf("%-20s %s\n", name.c_str(), description.c_str()); + } +} + +#ifdef DETECTOR_TESTING_HACK +static void runDetectorTest() { + // HACK: The following code can be used to test the detection code of our + // engines. Basically, it loops over all targets, and calls the detector + // for the given path. It then prints out the result and also checks + // whether the result agrees with the settings of the target. + + const Common::ConfigManager::DomainMap &domains = ConfMan.getGameDomains(); + Common::ConfigManager::DomainMap::const_iterator iter = domains.begin(); + int success = 0, failure = 0; + for (iter = domains.begin(); iter != domains.end(); ++iter) { + Common::String name(iter->_key); + Common::String gameid(iter->_value.get("gameid")); + Common::String path(iter->_value.get("path")); + printf("Looking at target '%s', gameid '%s', path '%s' ...\n", + name.c_str(), gameid.c_str(), path.c_str()); + if (path.empty()) { + printf(" ... no path specified, skipping\n"); + continue; + } + if (gameid.empty()) { + gameid = name; + } + + FilesystemNode dir(path); + FSList files; + if (!dir.listDir(files, FilesystemNode::kListAll)) { + printf(" ... invalid path, skipping\n"); + continue; + } + + DetectedGameList candidates(PluginManager::instance().detectGames(files)); + bool gameidDiffers = false; + for (DetectedGameList::iterator x = candidates.begin(); x != candidates.end(); ++x) { + gameidDiffers |= scumm_stricmp(gameid.c_str(), x->gameid.c_str()); + } + + if (candidates.empty()) { + printf(" FAILURE: No games detected\n"); + failure++; + } else if (candidates.size() > 1) { + if (gameidDiffers) { + printf(" FAILURE: Multiple games detected, some/all with wrong gameid\n"); + } else { + printf(" FAILURE: Multiple games detected, but all have the same gameid\n"); + } + failure++; + } else if (gameidDiffers) { + printf(" FAILURE: Wrong gameid detected\n"); + failure++; + } else { + printf(" SUCCESS: Game was detected correctly\n"); + success++; + } + + for (DetectedGameList::iterator x = candidates.begin(); x != candidates.end(); ++x) { + printf(" gameid '%s', desc '%s', language '%s', platform '%s'\n", + x->gameid.c_str(), + x->description.c_str(), + Common::getLanguageCode(x->language), + Common::getPlatformCode(x->platform)); + } + } + int total = domains.size(); + printf("Detector test run: %d fail, %d success, %d skipped, out of %d\n", + failure, success, total - failure - success, total); +} +#endif + +bool processSettings(Common::String &command, Common::StringMap &settings) { + + // Handle commands passed via the command line (like --list-targets and + // --list-games). This must be done after the config file and the plugins + // have been loaded. + // FIXME: The way are are doing this is rather arbitrary at this time. + // E.g. --version and --help are very similar, but are still handled + // inside parseCommandLine. This should be unified. + if (command == "list-targets") { + listTargets(); + return false; + } else if (command == "list-games") { + listGames(); + return false; + } else if (command == "version") { + printf("%s\n", gScummVMFullVersion); + printf("Features compiled in: %s\n", gScummVMFeatures); + return false; + } else if (command == "help") { + printf(HELP_STRING, s_appName.c_str()); + return false; + } +#ifdef DETECTOR_TESTING_HACK + else if (command == "test-detector") { + runDetectorTest(); + return false; + } +#endif + + + // If a target was specified, check whether there is either a game + // domain (i.e. a target) matching this argument, or alternatively + // whether there is a gameid matching that name. + if (!command.empty()) { + if (ConfMan.hasGameDomain(command) || Base::findGame(command).gameid.size() > 0) { + ConfMan.setActiveDomain(command); + } else { + usage("Unrecognized game target '%s'", command.c_str()); + } + } + + + // The user can override the savepath with the SCUMMVM_SAVEPATH + // environment variable. This is weaker than a --savepath on the + // command line, but overrides the default savepath, hence it is + // handled here, just before the command line gets parsed. +#if !defined(MACOS_CARBON) && !defined(_WIN32_WCE) && !defined(PALMOS_MODE) && !defined(__GP32__) + if (!settings.contains("savepath")) { + const char *dir = getenv("SCUMMVM_SAVEPATH"); + if (dir && *dir && strlen(dir) < MAXPATHLEN) { + // TODO: Verify whether the path is valid + settings["savepath"] = dir; + } + } +#endif + + + // Finally, store the command line settings into the config manager. + for (Common::StringMap::const_iterator x = settings.begin(); x != settings.end(); ++x) { + 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 (Common::String::iterator c = key.begin(); c != key.end(); ++c) + if (*c == '-') + *c = '_'; + + // Store it into ConfMan. + ConfMan.set(key, value, Common::ConfigManager::kTransientDomain); + } + + return true; +} + +} // End of namespace Base diff --git a/base/commandLine.h b/base/commandLine.h new file mode 100644 index 0000000000..dbf1776c74 --- /dev/null +++ b/base/commandLine.h @@ -0,0 +1,38 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001 Ludvig Strigeus + * Copyright (C) 2001-2006 The ScummVM project + * + * 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. + * + * $URL$ + * $Id$ + * + */ + +#ifndef BASE_OPTIONS_H +#define BASE_OPTIONS_H + +#include "common/str.h" +#include "common/config-manager.h" + +namespace Base { + +void registerDefaults(); +Common::String parseCommandLine(Common::StringMap &settings, int argc, char **argv); +bool processSettings(Common::String &command, Common::StringMap &settings); + +} // End of namespace Base + +#endif diff --git a/base/main.cpp b/base/main.cpp index c5f646c7a4..292b57afdd 100644 --- a/base/main.cpp +++ b/base/main.cpp @@ -32,7 +32,7 @@ #include "common/stdafx.h" #include "backends/fs/fs.h" #include "base/engine.h" -#include "base/options.h" +#include "base/commandLine.h" #include "base/plugins.h" #include "base/version.h" #include "common/config-manager.h" diff --git a/base/module.mk b/base/module.mk index 5af0e1349c..3a515b4f5c 100644 --- a/base/module.mk +++ b/base/module.mk @@ -3,7 +3,7 @@ MODULE := base MODULE_OBJS := \ engine.o \ main.o \ - options.o \ + commandLine.o \ plugins.o \ version.o diff --git a/base/options.cpp b/base/options.cpp deleted file mode 100644 index e01621af0a..0000000000 --- a/base/options.cpp +++ /dev/null @@ -1,707 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2001 Ludvig Strigeus - * Copyright (C) 2001-2006 The ScummVM project - * - * 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. - * - * $URL$ - * $Id$ - * - */ - -#include "common/stdafx.h" - -#include "base/engine.h" -#include "base/options.h" -#include "base/plugins.h" -#include "base/version.h" - -#include "common/config-manager.h" -#include "common/system.h" - -#include "sound/mididrv.h" -#include "sound/mixer.h" - -#ifdef UNIX -#include -#include -#ifdef MACOSX -#define DEFAULT_SAVE_PATH "Documents/ScummVM Savegames" -#else -#define DEFAULT_SAVE_PATH ".scummvm" -#endif -#elif defined(__SYMBIAN32__) -#include -#include -#define DEFAULT_SAVE_PATH "Savegames" -#endif - -#define DETECTOR_TESTING_HACK - -#ifdef DETECTOR_TESTING_HACK -#include "backends/fs/fs.h" -#endif - -namespace Base { - -static const char USAGE_STRING[] = - "%s: %s\n" - "Usage: %s [OPTIONS]... [GAME]\n" - "\n" - "Try '%s --help' for more options.\n" -; - -// DONT FIXME: DO NOT ORDER ALPHABETICALLY, THIS IS ORDERED BY IMPORTANCE/CATEGORY! :) -#if defined(PALMOS_MODE) || defined(__SYMBIAN32__) || defined(__GP32__) -static const char HELP_STRING[] = "NoUsageString"; // save more data segment space -#else -static const char HELP_STRING[] = - "ScummVM - Graphical Adventure Game Interpreter\n" - "Usage: %s [OPTIONS]... [GAME]\n" - " -v, --version Display ScummVM version information and exit\n" - " -h, --help Display a brief help text and exit\n" - " -z, --list-games Display list of supported games and exit\n" - " -t, --list-targets Display list of configured targets and exit\n" - "\n" - " -c, --config=CONFIG Use alternate configuration file\n" - " -p, --path=PATH Path to where the game is installed\n" - " -x, --save-slot[=NUM] Save game slot to load (default: autosave)\n" - " -f, --fullscreen Force full-screen mode\n" - " -F, --no-fullscreen Force windowed mode\n" - " -g, --gfx-mode=MODE Select graphics scaler (normal,2x,3x,2xsai,\n" - " super2xsai,supereagle,advmame2x,advmame3x,hq2x,\n" - " hq3x,tv2x,dotmatrix)\n" - " -e, --music-driver=MODE Select music driver (see README for details)\n" - " -q, --language=LANG Select language (en,de,fr,it,pt,es,jp,zh,kr,se,gb,\n" - " hb,ru,cz)\n" - " -m, --music-volume=NUM Set the music volume, 0-255 (default: 192)\n" - " -s, --sfx-volume=NUM Set the sfx volume, 0-255 (default: 192)\n" - " -r, --speech-volume=NUM Set the speech volume, 0-255 (default: 192)\n" - " --midi-gain=NUM Set the gain for MIDI playback, 0-1000 (default:\n" - " 100) (only supported by some MIDI drivers)\n" - " -n, --subtitles Enable subtitles (use with games that have voice)\n" - " -b, --boot-param=NUM Pass number to the boot script (boot param)\n" - " -d, --debuglevel=NUM Set debug verbosity level\n" - " --debugflags=FLAGS Enables engine specific debug flags\n" - " (separated by commas)\n" - " -u, --dump-scripts Enable script dumping if a directory called 'dumps'\n" - " exists in the current directory\n" - "\n" - " --cdrom=NUM CD drive to play CD audio from (default: 0 = first\n" - " drive)\n" - " --joystick[=NUM] Enable input with joystick (default: 0 = first\n" - " joystick)\n" - " --platform=WORD Specify platform of game (allowed values: 3do, acorn,\n" - " amiga, atari, c64, fmtowns, nes, mac, pc, segacd,\n" - " windows)\n" - " --savepath=PATH Path to where savegames are stored\n" - " --soundfont=FILE Select the SoundFont for MIDI playback (only\n" - " supported by some MIDI drivers)\n" - " --multi-midi Enable combination Adlib and native MIDI\n" - " --native-mt32 True Roland MT-32 (disable GM emulation)\n" - " --enable-gs Enable Roland GS mode for MIDI playback\n" - " --output-rate=RATE Select output sample rate in Hz (e.g. 22050)\n" - " --aspect-ratio Enable aspect ratio correction\n" - " --render-mode=MODE Enable additional render modes (cga, ega, hercGreen,\n" - " hercAmber, amiga)\n" - " --force-1x-overlay Make inner GUI 320x200\n" - "\n" -#if !defined(DISABLE_SKY) || !defined(DISABLE_QUEEN) - " --alt-intro Use alternative intro for CD versions of Beneath a\n" - " Steel Sky and Flight of the Amazon Queen\n" -#endif - " --copy-protection Enable copy protection in SCUMM games, when\n" - " ScummVM disables it by default.\n" - " --talkspeed=NUM Set talk speed for games (default: 60)\n" -#ifndef DISABLE_SCUMM - " --demo-mode Start demo mode of Maniac Mansion\n" - " --tempo=NUM Set music tempo (in percent, 50-200) for SCUMM games\n" - " (default: 100)\n" -#endif - "\n" - "The meaning of boolean long options can be inverted by prefixing them with\n" - "\"no-\", e.g. \"--no-aspect-ratio\".\n" -; -#endif - -#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__)) -static Common::String s_appName("scummvm"); -#else -static const char *s_appName = "scummvm"; -#endif - -static void usage(const char *s, ...) GCC_PRINTF(1, 2); - -static void usage(const char *s, ...) { - char buf[STRINGBUFLEN]; - va_list va; - - va_start(va, s); - vsnprintf(buf, STRINGBUFLEN, s, va); - va_end(va); - -#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__)) - printf(USAGE_STRING, s_appName.c_str(), buf, s_appName.c_str(), s_appName.c_str()); -#endif - exit(1); -} - -void registerDefaults() { - - // Graphics - ConfMan.registerDefault("fullscreen", false); - ConfMan.registerDefault("aspect_ratio", false); - ConfMan.registerDefault("gfx_mode", "normal"); - ConfMan.registerDefault("render_mode", "default"); -#if defined(__SYMBIAN32__) - ConfMan.registerDefault("force_1x_overlay", true); -#else - ConfMan.registerDefault("force_1x_overlay", false); -#endif - - - // Sound & Music - ConfMan.registerDefault("music_volume", 192); - ConfMan.registerDefault("sfx_volume", 192); - ConfMan.registerDefault("speech_volume", 192); - - ConfMan.registerDefault("music_mute", false); - ConfMan.registerDefault("sfx_mute", false); - ConfMan.registerDefault("speech_mute", false); - - ConfMan.registerDefault("multi_midi", false); - ConfMan.registerDefault("native_mt32", false); - ConfMan.registerDefault("enable_gs", false); - ConfMan.registerDefault("midi_gain", 100); -// ConfMan.registerDefault("music_driver", ???); - - ConfMan.registerDefault("cdrom", 0); - - // Game specific - ConfMan.registerDefault("path", ""); - ConfMan.registerDefault("savepath", ""); - -// ConfMan.registerDefault("amiga", false); - ConfMan.registerDefault("platform", Common::kPlatformPC); - ConfMan.registerDefault("language", "en"); - ConfMan.registerDefault("subtitles", false); - ConfMan.registerDefault("boot_param", 0); - ConfMan.registerDefault("dump_scripts", false); - ConfMan.registerDefault("save_slot", -1); - ConfMan.registerDefault("autosave_period", 5 * 60); // By default, trigger autosave every 5 minutes - -#if !defined(DISABLE_SCUMM) || !defined(DISABLE_SWORD2) - ConfMan.registerDefault("object_labels", true); -#endif - - ConfMan.registerDefault("copy_protection", false); - ConfMan.registerDefault("talkspeed", 60); - -#ifndef DISABLE_SCUMM - ConfMan.registerDefault("demo_mode", false); - ConfMan.registerDefault("tempo", 0); -#endif - -#if !defined(DISABLE_SKY) || !defined(DISABLE_QUEEN) - ConfMan.registerDefault("alt_intro", false); -#endif - - // Miscellaneous - ConfMan.registerDefault("joystick_num", -1); - ConfMan.registerDefault("confirm_exit", false); - ConfMan.registerDefault("disable_sdl_parachute", false); -#ifdef USE_ALSA - ConfMan.registerDefault("alsa_port", "65:0"); -#endif - -#ifdef DEFAULT_SAVE_PATH - char savePath[MAXPATHLEN]; -#ifdef UNIX - struct stat sb; - const char *home = getenv("HOME"); - if (home && *home && strlen(home) < MAXPATHLEN) { - snprintf(savePath, MAXPATHLEN, "%s/%s", home, DEFAULT_SAVE_PATH); - if (stat(savePath, &sb) == -1) { - /* create the dir if it does not exist */ - if (errno == ENOENT) { - if (mkdir(savePath, 0755) != 0) { - perror("mkdir"); - exit(1); - } - } - } - /* check that the dir is there */ - if (stat(savePath, &sb) == 0) { - ConfMan.registerDefault("savepath", savePath); - } - } -#elif defined(__SYMBIAN32__) - strcpy(savePath, Symbian::GetExecutablePath()); - strcat(savePath, DEFAULT_SAVE_PATH); - struct stat sb; - if (stat(savePath, &sb) == -1) - if (errno == ENOENT)// create the dir if it does not exist - if (mkdir(savePath, 0755) != 0) - error("mkdir for '%s' failed!", savePath); - ConfMan.registerDefault("savepath", savePath); // this should be enough... -#endif -#endif // #ifdef DEFAULT_SAVE_PATH -} - -// -// Various macros used by the command line parser. -// - -// Use this for options which have an *optional* value -#define DO_OPTION_OPT(shortCmd, longCmd, defaultVal) \ - if (isLongCmd ? (!memcmp(s+2, longCmd"=", sizeof(longCmd"=") - 1)) : (tolower(s[1]) == shortCmd)) { \ - s += 2; \ - if (isLongCmd) \ - s += sizeof(longCmd"=") - 1; \ - const char *option = s; \ - if (*s == '\0') { option = s2; i++; } \ - if (!option) option = defaultVal; \ - if (option) settings[longCmd] = option; - -// Use this for options which have a required (string) value -#define DO_OPTION(shortCmd, longCmd) \ - DO_OPTION_OPT(shortCmd, longCmd, 0) \ - if (!option) usage("Option '%s' requires an argument", argv[i]); - -// Use this for options which have a required integer value -#define DO_OPTION_INT(shortCmd, longCmd) \ - DO_OPTION_OPT(shortCmd, longCmd, 0) \ - if (!option) usage("Option '%s' requires an argument", argv[i]); \ - char *endptr = 0; \ - int intValue; intValue = (int)strtol(option, &endptr, 0); \ - if (endptr == NULL || *endptr != 0) usage("--%s: Invalid number '%s'", longCmd, option); - -// Use this for boolean options; this distinguishes between "-x" and "-X", -// resp. between "--some-option" and "--no-some-option". -#define DO_OPTION_BOOL(shortCmd, longCmd) \ - if (isLongCmd ? (!strcmp(s+2, longCmd) || !strcmp(s+2, "no-"longCmd)) : (tolower(s[1]) == shortCmd)) { \ - bool boolValue = islower(s[1]); \ - s += 2; \ - if (isLongCmd) { \ - boolValue = !strcmp(s, longCmd); \ - s += boolValue ? (sizeof(longCmd) - 1) : (sizeof("no-"longCmd) - 1); \ - } \ - if (*s != '\0') goto unknownOption; \ - const char *option = boolValue ? "true" : "false"; \ - settings[longCmd] = option; - -// Use this for options which never have a value, i.e. for 'commands', like "--help". -#define DO_COMMAND(shortCmd, longCmd) \ - if (isLongCmd ? (!strcmp(s+2, longCmd)) : (tolower(s[1]) == shortCmd)) { \ - s += 2; \ - if (isLongCmd) \ - s += sizeof(longCmd) - 1; \ - if (*s != '\0') goto unknownOption; \ - return longCmd; - - -#define DO_LONG_OPTION_OPT(longCmd, d) DO_OPTION_OPT(0, longCmd, d) -#define DO_LONG_OPTION(longCmd) DO_OPTION(0, longCmd) -#define DO_LONG_OPTION_INT(longCmd) DO_OPTION_INT(0, longCmd) -#define DO_LONG_OPTION_BOOL(longCmd) DO_OPTION_BOOL(0, longCmd) -#define DO_LONG_COMMAND(longCmd) DO_COMMAND(0, longCmd) - -// End an option handler -#define END_OPTION \ - continue; \ - } - - -Common::String parseCommandLine(Common::StringMap &settings, int argc, char **argv) { - const char *s, *s2; - - // argv[0] contains the name of the executable. - if (argv && argv[0]) { - s = strrchr(argv[0], '/'); - s_appName = s ? (s+1) : argv[0]; - } - - // We store all command line settings into a string map. - - // Iterate over all command line arguments and parse them into our string map. - for (int i = 1; i < argc; ++i) { - s = argv[i]; - s2 = (i < argc-1) ? argv[i+1] : 0; - - if (s[0] != '-') { - // The argument doesn't start with a dash, so it's not an option. - // Hence it must be the target name. We currently enforce that - // this always comes last. - if (i != argc - 1) - usage("Stray argument '%s'", s); - - // We defer checking whether this is a valid target to a later point. - return s; - } else { - - bool isLongCmd = (s[0] == '-' && s[1] == '-'); - - DO_COMMAND('h', "help") - END_OPTION - - DO_COMMAND('v', "version") - END_OPTION - - DO_COMMAND('t', "list-targets") - END_OPTION - - DO_COMMAND('z', "list-games") - END_OPTION - - // HACK FIXME TODO: This command is intentionally *not* documented! - DO_LONG_COMMAND("test-detector") - END_OPTION - - - DO_OPTION('c', "config") - END_OPTION - - DO_OPTION_INT('b', "boot-param") - END_OPTION - - DO_OPTION_OPT('d', "debuglevel", "0") - END_OPTION - - DO_LONG_OPTION("debugflags") - END_OPTION - - DO_OPTION('e', "music-driver") - if (MidiDriver::parseMusicDriver(option) < 0) - usage("Unrecognized music driver '%s'", option); - END_OPTION - - DO_LONG_OPTION_INT("output-rate") - END_OPTION - - DO_OPTION_BOOL('f', "fullscreen") - END_OPTION - - DO_OPTION('g', "gfx-mode") - // Check whether 'option' specifies a valid graphics mode. - bool isValid = false; - if (!scumm_stricmp(option, "normal") || !scumm_stricmp(option, "default")) - isValid = true; - if (!isValid) { - const OSystem::GraphicsMode *gm = g_system->getSupportedGraphicsModes(); - while (gm->name && !isValid) { - isValid = !scumm_stricmp(gm->name, option); - gm++; - } - } - if (!isValid) - usage("Unrecognized graphics mode '%s'", option); - END_OPTION - - DO_OPTION_INT('m', "music-volume") - END_OPTION - - DO_OPTION_BOOL('n', "subtitles") - END_OPTION - - DO_OPTION('p', "path") - // TODO: Verify whether the path is valid - END_OPTION - - DO_OPTION('q', "language") - if (Common::parseLanguage(option) == Common::UNK_LANG) - usage("Unrecognized language '%s'", option); - END_OPTION - - DO_OPTION_INT('s', "sfx-volume") - END_OPTION - - DO_OPTION_INT('r', "speech-volume") - END_OPTION - - DO_LONG_OPTION_INT("midi-gain") - END_OPTION - - DO_OPTION_BOOL('u', "dump-scripts") - END_OPTION - - DO_OPTION_OPT('x', "save-slot", "0") - END_OPTION - - DO_LONG_OPTION_INT("cdrom") - END_OPTION - - DO_LONG_OPTION_OPT("joystick", "0") - END_OPTION - - DO_LONG_OPTION("platform") - int platform = Common::parsePlatform(option); - if (platform == Common::kPlatformUnknown) - usage("Unrecognized platform '%s'", option); - END_OPTION - - DO_LONG_OPTION("soundfont") - // TODO: Verify whether the path is valid - END_OPTION - - DO_LONG_OPTION_BOOL("disable-sdl-parachute") - END_OPTION - - DO_LONG_OPTION_BOOL("multi-midi") - END_OPTION - - DO_LONG_OPTION_BOOL("native-mt32") - END_OPTION - - DO_LONG_OPTION_BOOL("enable-gs") - END_OPTION - - DO_LONG_OPTION_BOOL("aspect-ratio") - END_OPTION - - DO_LONG_OPTION("render-mode") - int renderMode = Common::parseRenderMode(option); - if (renderMode == Common::kRenderDefault) - usage("Unrecognized render mode '%s'", option); - END_OPTION - - DO_LONG_OPTION_BOOL("force-1x-overlay") - END_OPTION - - DO_LONG_OPTION("savepath") - // TODO: Verify whether the path is valid - END_OPTION - - DO_LONG_OPTION_INT("talkspeed") - END_OPTION - - DO_LONG_OPTION_BOOL("copy-protection") - END_OPTION - - DO_LONG_OPTION("gui-theme") - END_OPTION - - DO_LONG_OPTION("target-md5") - END_OPTION - -#ifndef DISABLE_SCUMM - DO_LONG_OPTION_INT("tempo") - END_OPTION - - DO_LONG_OPTION_BOOL("demo-mode") - END_OPTION -#endif - -#if !defined(DISABLE_SKY) || !defined(DISABLE_QUEEN) - DO_LONG_OPTION_BOOL("alt-intro") - END_OPTION -#endif - -unknownOption: - // If we get till here, the option is unhandled and hence unknown. - usage("Unrecognized option '%s'", argv[i]); - } - } - - - return Common::String::emptyString; -} - -/** List all supported game IDs, i.e. all games which any loaded plugin supports. */ -static void listGames() { - const PluginList &plugins = PluginManager::instance().getPlugins(); - - printf("Game ID Full Title \n" - "-------------------- ------------------------------------------------------\n"); - - PluginList::const_iterator iter = plugins.begin(); - for (iter = plugins.begin(); iter != plugins.end(); ++iter) { - GameList list = (*iter)->getSupportedGames(); - for (GameList::iterator v = list.begin(); v != list.end(); ++v) { - printf("%-20s %s\n", v->gameid.c_str(), v->description.c_str()); - } - } -} - -/** List all targets which are configured in the config file. */ -static void listTargets() { - using namespace Common; - const ConfigManager::DomainMap &domains = ConfMan.getGameDomains(); - - printf("Target Description \n" - "-------------------- ------------------------------------------------------\n"); - - ConfigManager::DomainMap::const_iterator iter = domains.begin(); - for (iter = domains.begin(); iter != domains.end(); ++iter) { - Common::String name(iter->_key); - Common::String description(iter->_value.get("description")); - - if (description.empty()) { - // FIXME: At this point, we should check for a "gameid" override - // to find the proper desc. In fact, the platform probably should - // be taken into account, too. - Common::String gameid(name); - GameDescriptor g = Base::findGame(gameid); - if (g.description.size() > 0) - description = g.description; - } - - printf("%-20s %s\n", name.c_str(), description.c_str()); - } -} - -#ifdef DETECTOR_TESTING_HACK -static void runDetectorTest() { - // HACK: The following code can be used to test the detection code of our - // engines. Basically, it loops over all targets, and calls the detector - // for the given path. It then prints out the result and also checks - // whether the result agrees with the settings of the target. - - const Common::ConfigManager::DomainMap &domains = ConfMan.getGameDomains(); - Common::ConfigManager::DomainMap::const_iterator iter = domains.begin(); - int success = 0, failure = 0; - for (iter = domains.begin(); iter != domains.end(); ++iter) { - Common::String name(iter->_key); - Common::String gameid(iter->_value.get("gameid")); - Common::String path(iter->_value.get("path")); - printf("Looking at target '%s', gameid '%s', path '%s' ...\n", - name.c_str(), gameid.c_str(), path.c_str()); - if (path.empty()) { - printf(" ... no path specified, skipping\n"); - continue; - } - if (gameid.empty()) { - gameid = name; - } - - FilesystemNode dir(path); - FSList files; - if (!dir.listDir(files, FilesystemNode::kListAll)) { - printf(" ... invalid path, skipping\n"); - continue; - } - - DetectedGameList candidates(PluginManager::instance().detectGames(files)); - bool gameidDiffers = false; - for (DetectedGameList::iterator x = candidates.begin(); x != candidates.end(); ++x) { - gameidDiffers |= scumm_stricmp(gameid.c_str(), x->gameid.c_str()); - } - - if (candidates.empty()) { - printf(" FAILURE: No games detected\n"); - failure++; - } else if (candidates.size() > 1) { - if (gameidDiffers) { - printf(" FAILURE: Multiple games detected, some/all with wrong gameid\n"); - } else { - printf(" FAILURE: Multiple games detected, but all have the same gameid\n"); - } - failure++; - } else if (gameidDiffers) { - printf(" FAILURE: Wrong gameid detected\n"); - failure++; - } else { - printf(" SUCCESS: Game was detected correctly\n"); - success++; - } - - for (DetectedGameList::iterator x = candidates.begin(); x != candidates.end(); ++x) { - printf(" gameid '%s', desc '%s', language '%s', platform '%s'\n", - x->gameid.c_str(), - x->description.c_str(), - Common::getLanguageCode(x->language), - Common::getPlatformCode(x->platform)); - } - } - int total = domains.size(); - printf("Detector test run: %d fail, %d success, %d skipped, out of %d\n", - failure, success, total - failure - success, total); -} -#endif - -bool processSettings(Common::String &command, Common::StringMap &settings) { - - // Handle commands passed via the command line (like --list-targets and - // --list-games). This must be done after the config file and the plugins - // have been loaded. - // FIXME: The way are are doing this is rather arbitrary at this time. - // E.g. --version and --help are very similar, but are still handled - // inside parseCommandLine. This should be unified. - if (command == "list-targets") { - listTargets(); - return false; - } else if (command == "list-games") { - listGames(); - return false; - } else if (command == "version") { - printf("%s\n", gScummVMFullVersion); - printf("Features compiled in: %s\n", gScummVMFeatures); - return false; - } else if (command == "help") { - printf(HELP_STRING, s_appName.c_str()); - return false; - } -#ifdef DETECTOR_TESTING_HACK - else if (command == "test-detector") { - runDetectorTest(); - return false; - } -#endif - - - // If a target was specified, check whether there is either a game - // domain (i.e. a target) matching this argument, or alternatively - // whether there is a gameid matching that name. - if (!command.empty()) { - if (ConfMan.hasGameDomain(command) || Base::findGame(command).gameid.size() > 0) { - ConfMan.setActiveDomain(command); - } else { - usage("Unrecognized game target '%s'", command.c_str()); - } - } - - - // The user can override the savepath with the SCUMMVM_SAVEPATH - // environment variable. This is weaker than a --savepath on the - // command line, but overrides the default savepath, hence it is - // handled here, just before the command line gets parsed. -#if !defined(MACOS_CARBON) && !defined(_WIN32_WCE) && !defined(PALMOS_MODE) && !defined(__GP32__) - if (!settings.contains("savepath")) { - const char *dir = getenv("SCUMMVM_SAVEPATH"); - if (dir && *dir && strlen(dir) < MAXPATHLEN) { - // TODO: Verify whether the path is valid - settings["savepath"] = dir; - } - } -#endif - - - // Finally, store the command line settings into the config manager. - for (Common::StringMap::const_iterator x = settings.begin(); x != settings.end(); ++x) { - 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 (Common::String::iterator c = key.begin(); c != key.end(); ++c) - if (*c == '-') - *c = '_'; - - // Store it into ConfMan. - ConfMan.set(key, value, Common::ConfigManager::kTransientDomain); - } - - return true; -} - -} // End of namespace Base diff --git a/base/options.h b/base/options.h deleted file mode 100644 index dbf1776c74..0000000000 --- a/base/options.h +++ /dev/null @@ -1,38 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2001 Ludvig Strigeus - * Copyright (C) 2001-2006 The ScummVM project - * - * 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. - * - * $URL$ - * $Id$ - * - */ - -#ifndef BASE_OPTIONS_H -#define BASE_OPTIONS_H - -#include "common/str.h" -#include "common/config-manager.h" - -namespace Base { - -void registerDefaults(); -Common::String parseCommandLine(Common::StringMap &settings, int argc, char **argv); -bool processSettings(Common::String &command, Common::StringMap &settings); - -} // End of namespace Base - -#endif diff --git a/dists/msvc8/gob.vcproj b/dists/msvc8/gob.vcproj index f2c29bcbf3..b2b61cab8d 100644 --- a/dists/msvc8/gob.vcproj +++ b/dists/msvc8/gob.vcproj @@ -190,6 +190,14 @@ RelativePath="..\..\engines\gob\draw.h" > + + + + @@ -206,6 +214,14 @@ RelativePath="..\..\engines\gob\game.h" > + + + + @@ -238,6 +254,14 @@ RelativePath="..\..\engines\gob\init.h" > + + + + @@ -358,6 +382,14 @@ RelativePath="..\..\engines\gob\video.h" > + + + + diff --git a/dists/msvc8/kyra.vcproj b/dists/msvc8/kyra.vcproj index b0de755d4a..c182546aa7 100644 --- a/dists/msvc8/kyra.vcproj +++ b/dists/msvc8/kyra.vcproj @@ -190,6 +190,10 @@ RelativePath="..\..\engines\kyra\kyra.h" > + + diff --git a/dists/msvc8/scumm.vcproj b/dists/msvc8/scumm.vcproj index 0cee3729a5..5120208a32 100644 --- a/dists/msvc8/scumm.vcproj +++ b/dists/msvc8/scumm.vcproj @@ -310,6 +310,14 @@ + + + + @@ -418,6 +426,18 @@ RelativePath="..\..\engines\scumm\imuse\instrument.h" > + + + + + + + + + + @@ -207,17 +215,21 @@ > + + @@ -226,6 +238,10 @@ RelativePath="..\..\base\plugins.h" > + + @@ -275,11 +291,15 @@ > + + + + + + @@ -889,6 +917,10 @@ RelativePath="..\..\gui\TabWidget.h" > + + @@ -897,6 +929,10 @@ RelativePath="..\..\gui\theme.h" > + + diff --git a/dists/msvc8/simon.vcproj b/dists/msvc8/simon.vcproj index f5b8b162f7..3c49c31a03 100644 --- a/dists/msvc8/simon.vcproj +++ b/dists/msvc8/simon.vcproj @@ -159,6 +159,14 @@ + + + + @@ -183,6 +191,14 @@ RelativePath="..\..\engines\simon\debugger.h" > + + + + @@ -239,6 +255,14 @@ RelativePath="..\..\engines\simon\sound.h" > + + + + @@ -251,6 +275,10 @@ RelativePath="..\..\engines\simon\vga.h" > + + diff --git a/dists/msvc8/sword2.vcproj b/dists/msvc8/sword2.vcproj index f91633e45b..38def46c26 100644 --- a/dists/msvc8/sword2.vcproj +++ b/dists/msvc8/sword2.vcproj @@ -186,10 +186,6 @@ RelativePath="..\..\engines\sword2\controls.h" > - - @@ -282,10 +278,6 @@ RelativePath="..\..\engines\sword2\protocol.cpp" > - - diff --git a/dists/scummvm.rc b/dists/scummvm.rc index a18e4bd76f..e01a69fdd9 100644 --- a/dists/scummvm.rc +++ b/dists/scummvm.rc @@ -1,6 +1,6 @@ #include "winresrc.h" -IDI_ICON ICON DISCARDABLE "icons/scummvm.ico" +IDI_ICON ICON DISCARDABLE "../../icons/scummvm.ico" VS_VERSION_INFO VERSIONINFO FILEVERSION 0,9,0,0 diff --git a/dists/scummvm.rc.in b/dists/scummvm.rc.in index 6cc4818be0..8876989c49 100644 --- a/dists/scummvm.rc.in +++ b/dists/scummvm.rc.in @@ -1,6 +1,6 @@ #include "winresrc.h" -IDI_ICON ICON DISCARDABLE "icons/scummvm.ico" +IDI_ICON ICON DISCARDABLE "../../icons/scummvm.ico" VS_VERSION_INFO VERSIONINFO FILEVERSION @VER_MAJOR@,@VER_MINOR@,@VER_PATCH@,0 diff --git a/engines/scumm/charset.cpp b/engines/scumm/charset.cpp index 44c0074760..e38fbf5934 100644 --- a/engines/scumm/charset.cpp +++ b/engines/scumm/charset.cpp @@ -1201,7 +1201,7 @@ void CharsetRendererCommon::enableShadow(bool enable) { void CharsetRendererV3::printChar(int chr, bool ignoreCharsetMask) { // Indy3 / Zak256 / Loom - int width, height, origWidth, origHeight; + int width, height, origWidth = 0, origHeight; VirtScreen *vs; byte *charPtr, *dst; int is2byte = (chr >= 0x80 && _vm->_useCJKMode) ? 1 : 0; diff --git a/engines/scumm/script.cpp b/engines/scumm/script.cpp index 686e6262db..fa014a4465 100644 --- a/engines/scumm/script.cpp +++ b/engines/scumm/script.cpp @@ -606,7 +606,7 @@ void ScummEngine::writeVar(uint var, int value) { if (_game.heversion <= 73 && vm.slot[_currentScript].number == 1) return; assert(value == 0 || value == 1); - ConfMan.setBool("subtitles", value); + ConfMan.setBool("subtitles", (value != 0)); } if (VAR_NOSUBTITLES != 0xFF && var == VAR_NOSUBTITLES) { // Ignore default setting in HE60-71 games diff --git a/engines/simon/oracle.cpp b/engines/simon/oracle.cpp index e159d55e57..8e90befff1 100644 --- a/engines/simon/oracle.cpp +++ b/engines/simon/oracle.cpp @@ -386,7 +386,7 @@ void SimonEngine::saveUserGame(int slot) { } if (_keyPressed == 10 || _keyPressed == 13) { if (!saveGame(readVariable(55), name)) - _variableArray[55] = 0xFFFF; + _variableArray[55] = (int16)0xFFFF; else _variableArray[55] = 0; break; diff --git a/graphics/font.cpp b/graphics/font.cpp index 18379d7e8c..b40f6fc283 100644 --- a/graphics/font.cpp +++ b/graphics/font.cpp @@ -172,8 +172,8 @@ NewFontData* bdf_read_font(Common::SeekableReadStream &fp) { /* read bdf font header information, return 0 on error*/ int bdf_read_header(Common::SeekableReadStream &fp, NewFontData* pf) { - int encoding; - int nchars, maxwidth; + int encoding = 0; + int nchars = 0, maxwidth; int firstchar = 65535; int lastchar = -1; char buf[256]; @@ -308,8 +308,8 @@ int bdf_read_header(Common::SeekableReadStream &fp, NewFontData* pf) { int bdf_read_bitmaps(Common::SeekableReadStream &fp, NewFontData* pf) { long ofs = 0; int maxwidth = 0; - int i, k, encoding, width; - int bbw, bbh, bbx, bby; + int i, k, encoding = 0, width = 0; + int bbw, bbh = 0, bbx = 0, bby = 0; int proportional = 0; int encodetable = 0; long l; @@ -627,7 +627,7 @@ NewFont *NewFont::loadFromCache(Common::SeekableReadStream &stream) { data->bits[i] = stream.readUint16BE(); } - bool hasOffsetTable = stream.readByte(); + bool hasOffsetTable = (stream.readByte() != 0); if (hasOffsetTable) { data->offset = (unsigned long*)malloc(sizeof(unsigned long)*data->size); if (!data->offset) { @@ -641,7 +641,7 @@ NewFont *NewFont::loadFromCache(Common::SeekableReadStream &stream) { } } - bool hasWidthTable = stream.readByte(); + bool hasWidthTable = (stream.readByte() != 0); if (hasWidthTable) { data->width = (unsigned char*)malloc(sizeof(unsigned char)*data->size); if (!data->width) { diff --git a/sound/audiocd.cpp b/sound/audiocd.cpp index 1487f4491a..15b16b5e45 100644 --- a/sound/audiocd.cpp +++ b/sound/audiocd.cpp @@ -31,6 +31,8 @@ #include "common/util.h" #include "common/system.h" +DECLARE_SINGLETON(Audio::AudioCDManager); + namespace Audio { struct TrackFormat { @@ -61,8 +63,6 @@ static const TrackFormat TRACK_FORMATS[] = { }; -DECLARE_SINGLETON(AudioCDManager); - AudioCDManager::AudioCDManager() { memset(&_cd, 0, sizeof(_cd)); memset(_cachedTracks, 0, sizeof(_cachedTracks)); -- cgit v1.2.3