diff options
Diffstat (limited to 'engines/sci/detection.cpp')
-rw-r--r-- | engines/sci/detection.cpp | 120 |
1 files changed, 107 insertions, 13 deletions
diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index 1ccfc6bf02..eb2c989e0d 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -36,12 +36,11 @@ #include "sci/engine/script.h" #include "sci/engine/seg_manager.h" #include "sci/engine/state.h" -#include "sci/engine/vm.h" // for convertSierraGameId namespace Sci { // Titles of the games -static const PlainGameDescriptor SciGameTitles[] = { +static const PlainGameDescriptor s_sciGameTitles[] = { {"sci", "Sierra SCI Game"}, {"sci-fanmade", "Fanmade SCI Game"}, // === SCI0 games ========================================================= @@ -106,6 +105,7 @@ static const PlainGameDescriptor SciGameTitles[] = { // TODO: Inside The Chest/Behind the Developer's Shield {"kq7", "King's Quest VII: The Princeless Bride"}, // TODO: King's Questions + {"lsl6hires", "Leisure Suit Larry 6: Shape Up or Slip Out!"}, {"phantasmagoria", "Phantasmagoria"}, {"pqswat", "Police Quest: SWAT"}, {"shivers", "Shivers"}, @@ -120,6 +120,81 @@ static const PlainGameDescriptor SciGameTitles[] = { {0, 0} }; +struct GameIdStrToEnum { + const char *gameidStr; + SciGameId gameidEnum; +}; + +static const GameIdStrToEnum s_gameIdStrToEnum[] = { + { "astrochicken", GID_ASTROCHICKEN }, + { "camelot", GID_CAMELOT }, + { "castlebrain", GID_CASTLEBRAIN }, + { "christmas1988", GID_CHRISTMAS1988 }, + { "christmas1990", GID_CHRISTMAS1990 }, + { "christmas1992", GID_CHRISTMAS1992 }, + { "cnick-kq", GID_CNICK_KQ }, + { "cnick-laurabow", GID_CNICK_LAURABOW }, + { "cnick-longbow", GID_CNICK_LONGBOW }, + { "cnick-lsl", GID_CNICK_LSL }, + { "cnick-sq", GID_CNICK_SQ }, + { "ecoquest", GID_ECOQUEST }, + { "ecoquest2", GID_ECOQUEST2 }, + { "fairytales", GID_FAIRYTALES }, + { "freddypharkas", GID_FREDDYPHARKAS }, + { "funseeker", GID_FUNSEEKER }, + { "gk1", GID_GK1 }, + { "gk2", GID_GK2 }, + { "hoyle1", GID_HOYLE1 }, + { "hoyle2", GID_HOYLE2 }, + { "hoyle3", GID_HOYLE3 }, + { "hoyle4", GID_HOYLE4 }, + { "iceman", GID_ICEMAN }, + { "islandbrain", GID_ISLANDBRAIN }, + { "jones", GID_JONES }, + { "kq1sci", GID_KQ1 }, + { "kq4sci", GID_KQ4 }, + { "kq5", GID_KQ5 }, + { "kq6", GID_KQ6 }, + { "kq7", GID_KQ7 }, + { "laurabow", GID_LAURABOW }, + { "laurabow2", GID_LAURABOW2 }, + { "lighthouse", GID_LIGHTHOUSE }, + { "longbow", GID_LONGBOW }, + { "lsl1sci", GID_LSL1 }, + { "lsl2", GID_LSL2 }, + { "lsl3", GID_LSL3 }, + { "lsl5", GID_LSL5 }, + { "lsl6", GID_LSL6 }, + { "lsl6hires", GID_LSL6HIRES }, + { "lsl7", GID_LSL7 }, + { "mothergoose", GID_MOTHERGOOSE }, + { "msastrochicken", GID_MSASTROCHICKEN }, + { "pepper", GID_PEPPER }, + { "phantasmagoria", GID_PHANTASMAGORIA }, + { "phantasmagoria2", GID_PHANTASMAGORIA2 }, + { "pq1sci", GID_PQ1 }, + { "pq2", GID_PQ2 }, + { "pq3", GID_PQ3 }, + { "pq4", GID_PQ4 }, + { "pqswat", GID_PQSWAT }, + { "qfg1", GID_QFG1 }, + { "qfg2", GID_QFG2 }, + { "qfg3", GID_QFG3 }, + { "qfg4", GID_QFG4 }, + { "rama", GID_RAMA }, + { "sci-fanmade", GID_FANMADE }, // FIXME: Do we really need/want this? + { "shivers", GID_SHIVERS }, + { "shivers2", GID_SHIVERS2 }, + { "slater", GID_SLATER }, + { "sq1sci", GID_SQ1 }, + { "sq3", GID_SQ3 }, + { "sq4", GID_SQ4 }, + { "sq5", GID_SQ5 }, + { "sq6", GID_SQ6 }, + { "torin", GID_TORIN }, + { NULL, (SciGameId)-1 } +}; + struct OldNewIdTableEntry { const char *oldId; const char *newId; @@ -198,6 +273,12 @@ static const OldNewIdTableEntry s_oldNewTable[] = { { "", "", SCI_VERSION_NONE } }; +/** + * Converts the builtin Sierra game IDs to the ones we use in ScummVM + * @param[in] gameId The internal game ID + * @param[in] gameFlags The game's flags, which are adjusted accordingly for demos + * @return The equivalent ScummVM game id + */ Common::String convertSierraGameId(Common::String sierraId, uint32 *gameFlags, ResourceManager *resMan) { // Convert the id to lower case, so that we match all upper/lower case variants. sierraId.toLowercase(); @@ -295,7 +376,7 @@ static const ADParams detectionParams = { // Number of bytes to compute MD5 sum for 5000, // List of all engine targets - SciGameTitles, + s_sciGameTitles, // Structure for autoupgrading obsolete targets 0, // Name of single gameid (optional) @@ -305,7 +386,11 @@ static const ADParams detectionParams = { // Flags 0, // Additional GUI options (for every game} - Common::GUIO_NONE + Common::GUIO_NONE, + // Maximum directory depth + 1, + // List of directory globs + 0 }; class SciMetaEngine : public AdvancedMetaEngine { @@ -419,7 +504,12 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const Common::FSList &fsl return 0; } - ResourceManager *resMan = new ResourceManager(fslist); + ResourceManager *resMan = new ResourceManager(); + assert(resMan); + resMan->addAppropriateSources(fslist); + resMan->init(); + // TODO: Add error handling. + ViewType gameViews = resMan->getViewType(); // Have we identified the game views? If not, stop here @@ -509,12 +599,16 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const Common::FSList &fsl return (const ADGameDescription *)&s_fallbackDesc; } -bool SciMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *gd) const { - const ADGameDescription *desc = (const ADGameDescription *)gd; - - *engine = new SciEngine(syst, desc); +bool SciMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const { + const GameIdStrToEnum *g = s_gameIdStrToEnum; + for (; g->gameidStr; ++g) { + if (0 == strcmp(desc->gameid, g->gameidStr)) { + *engine = new SciEngine(syst, desc, g->gameidEnum); + return true; + } + } - return true; + return false; } bool SciMetaEngine::hasFeature(MetaEngineFeature f) const { @@ -652,7 +746,7 @@ Common::Error SciEngine::saveGameState(int slot, const char *desc) { return Common::kWritingFailed; } - if (gamestate_save(_gamestate, out, desc, version)) { + if (!gamestate_save(_gamestate, out, desc, version)) { warning("Saving the game state to '%s' failed", fileName.c_str()); return Common::kWritingFailed; } else { @@ -668,11 +762,11 @@ Common::Error SciEngine::saveGameState(int slot, const char *desc) { } bool SciEngine::canLoadGameStateCurrently() { - return !_gamestate->execution_stack_base; + return !_gamestate->executionStackBase; } bool SciEngine::canSaveGameStateCurrently() { - return !_gamestate->execution_stack_base; + return !_gamestate->executionStackBase; } } // End of namespace Sci |