diff --git a/configure b/configure index d9292e7efc0..7f69b05cecc 100755 --- a/configure +++ b/configure @@ -6164,7 +6164,7 @@ declare -a static_detect_engines=("PLUMBERS" "AGI" "SCUMM" "SKY" "DREAMWEB" "DRA "SWORD1" "SWORD2" "SWORD25" "ADL" "QUEEN" "CGE" "CGE2" "ACCESS" "ZVISION" "AGOS" "GOB" "COMPOSER" "DM" "DRACI" "DRAGONS" "GNAP" "GRIFFON" "GROOVIE" "HDB" "HOPKINS" "HUGO" "ILLUSIONS" "KINGDOM" - "KYRA" "LAB" "LASTEXPRESS" "LILLIPUT") + "KYRA" "LAB" "LASTEXPRESS" "LILLIPUT" "MACVENTURE") detectId="_DETECTION" echo "Creating engines/plugins_table.h" diff --git a/engines/macventure/detection.cpp b/engines/macventure/detection.cpp index 6a3556ac34b..062f2695692 100644 --- a/engines/macventure/detection.cpp +++ b/engines/macventure/detection.cpp @@ -23,9 +23,6 @@ #include "base/plugins.h" #include "engines/advancedDetector.h" -#include "common/system.h" - -#include "macventure/macventure.h" namespace MacVenture { @@ -40,9 +37,6 @@ static const ADGameDescription gameDescriptions[] = { AD_TABLE_END_MARKER }; -const char *MacVentureEngine::getGameFileName() const { - return _gameDescription->filesDescriptions[0].fileName; -} } // End of namespace MacVenture static const PlainGameDescriptor macventureGames[] = { @@ -74,112 +68,8 @@ public: const char *getOriginalCopyright() const override { return "(C) ICOM Simulations"; } - -protected: - bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const override; - bool hasFeature(MetaEngineFeature f) const override; - SaveStateList listSaves(const char *target) const override; - int getMaximumSaveSlot() const override; - void removeSaveState(const char *target, int slot) const override; - SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const override; }; -bool MacVentureMetaEngine::hasFeature(MetaEngineFeature f) const { - return - (f == kSupportsListSaves) || - (f == kSupportsLoadingDuringStartup) || - (f == kSupportsDeleteSave) || - (f == kSavesSupportMetaInfo) || - (f == kSavesSupportThumbnail) || - (f == kSavesSupportCreationDate) || - (f == kSavesSupportPlayTime); -} - -bool MacVentureEngine::hasFeature(EngineFeature f) const { - return - (f == kSupportsReturnToLauncher) || - (f == kSupportsLoadingDuringRuntime) || - (f == kSupportsSavingDuringRuntime); -} - -SaveStateList MacVentureMetaEngine::listSaves(const char *target) const { - Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); - Common::StringArray filenames; - Common::String pattern = target; - pattern += ".###"; - - filenames = saveFileMan->listSavefiles(pattern); - - SaveStateList saveList; - for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { - int slotNum = atoi(file->c_str() + file->size() - 3); - SaveStateDescriptor desc; - // Do not allow save slot 0 (used for auto-saving) to be deleted or - // overwritten. - desc.setDeletableFlag(slotNum != 0); - desc.setWriteProtectedFlag(slotNum == 0); - - if (slotNum >= 0 && slotNum <= getMaximumSaveSlot()) { - Common::InSaveFile *in = saveFileMan->openForLoading(*file); - if (in) { - desc = loadMetaData(in, slotNum); - if (desc.getSaveSlot() != slotNum) { - // invalid - delete in; - continue; - } - saveList.push_back(desc); - delete in; - } - } - } - - // Sort saves based on slot number. - Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); - return saveList; -} - -int MacVentureMetaEngine::getMaximumSaveSlot() const { return 999; } - -bool MacVentureMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *game) const { - if (game) { - *engine = new MacVenture::MacVentureEngine(syst, game); - } - return game != 0; -} - -void MacVentureMetaEngine::removeSaveState(const char *target, int slot) const { - g_system->getSavefileManager()->removeSavefile(Common::String::format("%s.%03d", target, slot)); -} - - -SaveStateDescriptor MacVentureMetaEngine::querySaveMetaInfos(const char *target, int slot) const { - Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); - SaveStateDescriptor desc; - Common::String saveFileName; - Common::String pattern = target; - pattern += ".###"; - Common::StringArray filenames = saveFileMan->listSavefiles(pattern); - for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { - int slotNum = atoi(file->c_str() + file->size() - 3); - if (slotNum == slot) { - saveFileName = *file; - } - } - - Common::InSaveFile *in = saveFileMan->openForLoading(saveFileName); - if (in) { - desc = loadMetaData(in, slot, false); - delete in; - return desc; - } - return SaveStateDescriptor(-1, ""); -} - } // End of namespace MacVenture -#if PLUGIN_ENABLED_DYNAMIC(MACVENTURE) - REGISTER_PLUGIN_DYNAMIC(MACVENTURE, PLUGIN_TYPE_ENGINE, MacVenture::MacVentureMetaEngine); -#else - REGISTER_PLUGIN_STATIC(MACVENTURE, PLUGIN_TYPE_ENGINE, MacVenture::MacVentureMetaEngine); -#endif +REGISTER_PLUGIN_STATIC(MACVENTURE_DETECTION, PLUGIN_TYPE_METAENGINE, MacVenture::MacVentureMetaEngine); diff --git a/engines/macventure/metaengine.cpp b/engines/macventure/metaengine.cpp new file mode 100644 index 00000000000..af5a0bde124 --- /dev/null +++ b/engines/macventure/metaengine.cpp @@ -0,0 +1,157 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "base/plugins.h" + +#include "engines/advancedDetector.h" +#include "common/system.h" + +#include "macventure/macventure.h" + +namespace MacVenture { + +const char *MacVentureEngine::getGameFileName() const { + return _gameDescription->filesDescriptions[0].fileName; +} + +} // End of namespace MacVenture + + +namespace MacVenture { + +SaveStateDescriptor loadMetaData(Common::SeekableReadStream *s, int slot, bool skipThumbnail = true); + +class MacVentureMetaEngineConnect : public AdvancedMetaEngineConnect { +public: + const char *getName() const override { + return "macventure"; + } + +protected: + bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const override; + bool hasFeature(MetaEngineFeature f) const override; + SaveStateList listSaves(const char *target) const override; + int getMaximumSaveSlot() const override; + void removeSaveState(const char *target, int slot) const override; + SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const override; + +}; + +bool MacVentureMetaEngineConnect::hasFeature(MetaEngineFeature f) const { + return + (f == kSupportsListSaves) || + (f == kSupportsLoadingDuringStartup) || + (f == kSupportsDeleteSave) || + (f == kSavesSupportMetaInfo) || + (f == kSavesSupportThumbnail) || + (f == kSavesSupportCreationDate) || + (f == kSavesSupportPlayTime); +} + +bool MacVentureEngine::hasFeature(EngineFeature f) const { + return + (f == kSupportsReturnToLauncher) || + (f == kSupportsLoadingDuringRuntime) || + (f == kSupportsSavingDuringRuntime); +} + +SaveStateList MacVentureMetaEngineConnect::listSaves(const char *target) const { + Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); + Common::StringArray filenames; + Common::String pattern = target; + pattern += ".###"; + + filenames = saveFileMan->listSavefiles(pattern); + + SaveStateList saveList; + for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { + int slotNum = atoi(file->c_str() + file->size() - 3); + SaveStateDescriptor desc; + // Do not allow save slot 0 (used for auto-saving) to be deleted or + // overwritten. + desc.setDeletableFlag(slotNum != 0); + desc.setWriteProtectedFlag(slotNum == 0); + + if (slotNum >= 0 && slotNum <= getMaximumSaveSlot()) { + Common::InSaveFile *in = saveFileMan->openForLoading(*file); + if (in) { + desc = loadMetaData(in, slotNum); + if (desc.getSaveSlot() != slotNum) { + // invalid + delete in; + continue; + } + saveList.push_back(desc); + delete in; + } + } + } + + // Sort saves based on slot number. + Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); + return saveList; +} + +int MacVentureMetaEngineConnect::getMaximumSaveSlot() const { return 999; } + +bool MacVentureMetaEngineConnect::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *game) const { + if (game) { + *engine = new MacVenture::MacVentureEngine(syst, game); + } + return game != 0; +} + +void MacVentureMetaEngineConnect::removeSaveState(const char *target, int slot) const { + g_system->getSavefileManager()->removeSavefile(Common::String::format("%s.%03d", target, slot)); +} + + +SaveStateDescriptor MacVentureMetaEngineConnect::querySaveMetaInfos(const char *target, int slot) const { + Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); + SaveStateDescriptor desc; + Common::String saveFileName; + Common::String pattern = target; + pattern += ".###"; + Common::StringArray filenames = saveFileMan->listSavefiles(pattern); + for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { + int slotNum = atoi(file->c_str() + file->size() - 3); + if (slotNum == slot) { + saveFileName = *file; + } + } + + Common::InSaveFile *in = saveFileMan->openForLoading(saveFileName); + if (in) { + desc = loadMetaData(in, slot, false); + delete in; + return desc; + } + return SaveStateDescriptor(-1, ""); +} + +} // End of namespace MacVenture + +#if PLUGIN_ENABLED_DYNAMIC(MACVENTURE) + REGISTER_PLUGIN_DYNAMIC(MACVENTURE, PLUGIN_TYPE_ENGINE, MacVenture::MacVentureMetaEngineConnect); +#else + REGISTER_PLUGIN_STATIC(MACVENTURE, PLUGIN_TYPE_ENGINE, MacVenture::MacVentureMetaEngineConnect); +#endif diff --git a/engines/macventure/module.mk b/engines/macventure/module.mk index 227eb41e28d..0c0cf8b0932 100644 --- a/engines/macventure/module.mk +++ b/engines/macventure/module.mk @@ -5,11 +5,11 @@ MODULE_OBJS := \ controls.o \ cursor.o \ datafiles.o \ - detection.o \ dialog.o \ gui.o \ image.o \ macventure.o \ + metaengine.o \ prebuilt_dialogs.o \ saveload.o \ script.o \ @@ -29,3 +29,6 @@ endif # Include common rules include $(srcdir)/rules.mk + +# Detection objects +DETECT_OBJS += $(MODULE)/detection.o