diff options
Diffstat (limited to 'engines/zvision/detection.cpp')
| -rw-r--r-- | engines/zvision/detection.cpp | 282 | 
1 files changed, 66 insertions, 216 deletions
| diff --git a/engines/zvision/detection.cpp b/engines/zvision/detection.cpp index 1eaff83413..5e535a9954 100644 --- a/engines/zvision/detection.cpp +++ b/engines/zvision/detection.cpp @@ -24,8 +24,9 @@  #include "base/plugins.h" +#include "engines/advancedDetector.h" +  #include "zvision/zvision.h" -#include "zvision/detection.h"  #include "zvision/file/save_manager.h"  #include "zvision/scripting/script_manager.h" @@ -36,173 +37,39 @@  namespace ZVision { -uint32 ZVision::getFeatures() const { -	return _gameDescription->desc.flags; -} +struct ZVisionGameDescription { +	ADGameDescription desc; +	ZVisionGameId gameId; +}; +ZVisionGameId ZVision::getGameId() const { +	return _gameDescription->gameId; +}  Common::Language ZVision::getLanguage() const {  	return _gameDescription->desc.language;  } +uint32 ZVision::getFeatures() const { +	return _gameDescription->desc.flags; +}  } // End of namespace ZVision -static const PlainGameDescriptor zVisionGames[] = { -	{"zvision",  "ZVision Game"}, -	{"znemesis", "Zork Nemesis: The Forbidden Lands"}, -	{"zgi",      "Zork: Grand Inquisitor"}, -	{0, 0} -}; - -namespace ZVision { - -#define GAMEOPTION_ORIGINAL_SAVELOAD          GUIO_GAMEOPTIONS1 -#define GAMEOPTION_DOUBLE_FPS                 GUIO_GAMEOPTIONS2 -#define GAMEOPTION_ENABLE_VENUS               GUIO_GAMEOPTIONS3 -#define GAMEOPTION_DISABLE_ANIM_WHILE_TURNING GUIO_GAMEOPTIONS4 - -static const ZVisionGameDescription gameDescriptions[] = { - -	{ -		// Zork Nemesis English version -		{ -			"znemesis", -			0, -			AD_ENTRY1s("CSCR.ZFS", "88226e51a205d2e50c67a5237f3bd5f2", 2397741), -			Common::EN_ANY, -			Common::kPlatformDOS, -			ADGF_NO_FLAGS, -			GUIO4(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_DOUBLE_FPS, GAMEOPTION_ENABLE_VENUS, GAMEOPTION_DISABLE_ANIM_WHILE_TURNING) -		}, -		GID_NEMESIS -	}, - -	{ -		// Zork Nemesis English demo version -		{ -			"znemesis", -			"Demo", -			AD_ENTRY1s("SCRIPTS.ZFS", "64f1e881394e9462305104f99513c833", 380539), -			Common::EN_ANY, -			Common::kPlatformWindows, -			ADGF_DEMO, -			GUIO4(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_DOUBLE_FPS, GAMEOPTION_ENABLE_VENUS, GAMEOPTION_DISABLE_ANIM_WHILE_TURNING) -		}, -		GID_NEMESIS -	}, - -	{ -		// Zork Grand Inquisitor English CD version -		{ -			"zgi", -			"CD", -			AD_ENTRY1s("SCRIPTS.ZFS", "81efd40ecc3d22531e211368b779f17f", 8336944), -			Common::EN_ANY, -			Common::kPlatformWindows, -			ADGF_NO_FLAGS, -			GUIO3(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_DOUBLE_FPS, GAMEOPTION_DISABLE_ANIM_WHILE_TURNING) -		}, -		GID_GRANDINQUISITOR -	}, - -	{ -		// Zork Grand Inquisitor English DVD version -		{ -			"zgi", -			"DVD", -			AD_ENTRY1s("SCRIPTS.ZFS", "03157a3399513bfaaf8dc6d5ab798b36", 8433326), -			Common::EN_ANY, -			Common::kPlatformWindows, -			ADGF_NO_FLAGS, -			GUIO3(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_DOUBLE_FPS, GAMEOPTION_DISABLE_ANIM_WHILE_TURNING) -		}, -		GID_GRANDINQUISITOR -	}, - -	{ -		// Zork Grand Inquisitor English demo version -		{ -			"zgi", -			"Demo", -			AD_ENTRY1s("SCRIPTS.ZFS", "71a2494fd2fb999347deb13401e9b998", 304239), -			Common::EN_ANY, -			Common::kPlatformWindows, -			ADGF_DEMO, -			GUIO3(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_DOUBLE_FPS, GAMEOPTION_DISABLE_ANIM_WHILE_TURNING) -		}, -		GID_GRANDINQUISITOR -	}, - -	{ -		AD_TABLE_END_MARKER, -		GID_NONE -	} -}; - -} // End of namespace ZVision - -static const char *directoryGlobs[] = { -	"znemscr", -	0 -}; - -static const ADExtraGuiOptionsMap optionsList[] = { -	{ -		GAMEOPTION_ORIGINAL_SAVELOAD, -		{ -			_s("Use original save/load screens"), -			_s("Use the original save/load screens, instead of the ScummVM ones"), -			"originalsaveload", -			false -		} -	}, - -	{ -		GAMEOPTION_DOUBLE_FPS, -		{ -			_s("Double FPS"), -			_s("Halve the update delay"), -			"doublefps", -			false -		} -	}, - -	{ -		GAMEOPTION_ENABLE_VENUS, -		{ -			_s("Enable Venus"), -			_s("Enable the Venus help system"), -			"venusenabled", -			true -		} -	}, - -	{ -		GAMEOPTION_DISABLE_ANIM_WHILE_TURNING, -		{ -			_s("Disable animation while turning"), -			_s("Disable animation while turning in panoramic mode"), -			"noanimwhileturning", -			false -		} -	}, - -	AD_EXTRA_GUI_OPTIONS_TERMINATOR -}; +#include "zvision/detection_tables.h"  class ZVisionMetaEngine : public AdvancedMetaEngine {  public: -	ZVisionMetaEngine() : AdvancedMetaEngine(ZVision::gameDescriptions, sizeof(ZVision::ZVisionGameDescription), zVisionGames, optionsList) { +	ZVisionMetaEngine() : AdvancedMetaEngine(ZVision::gameDescriptions, sizeof(ZVision::ZVisionGameDescription), ZVision::zVisionGames, ZVision::optionsList) {  		_maxScanDepth = 2; -		_directoryGlobs = directoryGlobs; -		_singleid = "zvision"; +		_directoryGlobs = ZVision::directoryGlobs; +		_singleId = "zvision";  	}  	virtual const char *getName() const { -		return "ZVision"; +		return "Z-Vision";  	}  	virtual const char *getOriginalCopyright() const { -		return "ZVision Activision (C) 1996"; +		return "Z-Vision (C) 1996 Activision";  	}  	virtual bool hasFeature(MetaEngineFeature f) const; @@ -215,20 +82,21 @@ public:  bool ZVisionMetaEngine::hasFeature(MetaEngineFeature f) const {  	return -	(f == kSupportsListSaves) || -	(f == kSupportsLoadingDuringStartup) || -	(f == kSupportsDeleteSave) || -	(f == kSavesSupportMetaInfo) || -	(f == kSavesSupportThumbnail) || -	(f == kSavesSupportCreationDate); -	//(f == kSavesSupportPlayTime); +		(f == kSupportsListSaves) || +		(f == kSupportsLoadingDuringStartup) || +		(f == kSupportsDeleteSave) || +		(f == kSavesSupportMetaInfo) || +		(f == kSavesSupportThumbnail) || +		(f == kSavesSupportCreationDate) || +		(f == kSimpleSavesNames); +		//(f == kSavesSupportPlayTime);  }  bool ZVision::ZVision::hasFeature(EngineFeature f) const { -    return -        (f == kSupportsRTL) || -        (f == kSupportsLoadingDuringRuntime) || -        (f == kSupportsSavingDuringRuntime); +	return +		(f == kSupportsRTL) || +		(f == kSupportsLoadingDuringRuntime) || +		(f == kSupportsSavingDuringRuntime);  }  Common::Error ZVision::ZVision::loadGameState(int slot) { @@ -236,7 +104,7 @@ Common::Error ZVision::ZVision::loadGameState(int slot) {  }  Common::Error ZVision::ZVision::saveGameState(int slot, const Common::String &desc) { -	_saveManager->saveGame(slot, desc); +	_saveManager->saveGame(slot, desc, false);  	return Common::kNoError;  } @@ -261,33 +129,34 @@ SaveStateList ZVisionMetaEngine::listSaves(const char *target) const {  	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();  	ZVision::SaveGameHeader header;  	Common::String pattern = target; -	pattern += ".???"; +	pattern += ".###";  	Common::StringArray filenames;  	filenames = saveFileMan->listSavefiles(pattern.c_str()); -	Common::sort(filenames.begin(), filenames.end());   // Sort (hopefully ensuring we are sorted numerically..)*/  	SaveStateList saveList;  	// We only use readSaveGameHeader() here, which doesn't need an engine callback  	ZVision::SaveManager *zvisionSaveMan = new ZVision::SaveManager(NULL);  	for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); file++) { -	        // Obtain the last 3 digits of the filename, since they correspond to the save slot -	        int slotNum = atoi(file->c_str() + file->size() - 3); - -	        if (slotNum >= 0 && slotNum <= 999) { -	            Common::InSaveFile *in = saveFileMan->openForLoading(file->c_str()); -	            if (in) { -	                if (zvisionSaveMan->readSaveGameHeader(in, header)) { -	                    saveList.push_back(SaveStateDescriptor(slotNum, header.saveName)); -	                } -	                delete in; -	            } -	        } +		// Obtain the last 3 digits of the filename, since they correspond to the save slot +		int slotNum = atoi(file->c_str() + file->size() - 3); + +		if (slotNum >= 0 && slotNum <= 999) { +			Common::InSaveFile *in = saveFileMan->openForLoading(file->c_str()); +			if (in) { +				if (zvisionSaveMan->readSaveGameHeader(in, header)) { +					saveList.push_back(SaveStateDescriptor(slotNum, header.saveName)); +				} +				delete in; +			} +		}  	}  	delete zvisionSaveMan; +	// Sort saves based on slot number. +	Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator());  	return saveList;  } @@ -297,26 +166,7 @@ int ZVisionMetaEngine::getMaximumSaveSlot() const {  void ZVisionMetaEngine::removeSaveState(const char *target, int slot) const {  	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); -	Common::String filename = Common::String::format("%s.%03u", target, slot); - -	saveFileMan->removeSavefile(filename.c_str()); - -	Common::StringArray filenames; -	Common::String pattern = target; -	pattern += ".???"; -	filenames = saveFileMan->listSavefiles(pattern.c_str()); -	Common::sort(filenames.begin(), filenames.end());   // Sort (hopefully ensuring we are sorted numerically..) - -	for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { -	    // Obtain the last 3 digits of the filename, since they correspond to the save slot -	    int slotNum = atoi(file->c_str() + file->size() - 3); - -	    // Rename every slot greater than the deleted slot, -	    if (slotNum > slot) { -	        saveFileMan->renameSavefile(file->c_str(), filename.c_str()); -	        filename = Common::String::format("%s.%03u", target, ++slot); -	    } -	} +	saveFileMan->removeSavefile(Common::String::format("%s.%03u", target, slot));  }  SaveStateDescriptor ZVisionMetaEngine::querySaveMetaInfos(const char *target, int slot) const { @@ -324,48 +174,48 @@ SaveStateDescriptor ZVisionMetaEngine::querySaveMetaInfos(const char *target, in  	Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(filename.c_str());  	if (in) { -	    ZVision::SaveGameHeader header; +		ZVision::SaveGameHeader header;  		// We only use readSaveGameHeader() here, which doesn't need an engine callback  		ZVision::SaveManager *zvisionSaveMan = new ZVision::SaveManager(NULL);  		bool successfulRead = zvisionSaveMan->readSaveGameHeader(in, header);  		delete zvisionSaveMan; -	    delete in; +		delete in; -	    if (successfulRead) { -	        SaveStateDescriptor desc(slot, header.saveName); +		if (successfulRead) { +			SaveStateDescriptor desc(slot, header.saveName);  			// Do not allow save slot 0 (used for auto-saving) to be deleted or  			// overwritten.  			desc.setDeletableFlag(slot != 0);  			desc.setWriteProtectedFlag(slot == 0); -	        desc.setThumbnail(header.thumbnail); +			desc.setThumbnail(header.thumbnail); -	        if (header.version > 0) { -	            int day = header.saveDay; -	            int month = header.saveMonth; -	            int year = header.saveYear; +			if (header.version > 0) { +				int day = header.saveDay; +				int month = header.saveMonth; +				int year = header.saveYear; -	            desc.setSaveDate(year, month, day); +				desc.setSaveDate(year, month, day); -	            int hour = header.saveHour; -	            int minutes = header.saveMinutes; +				int hour = header.saveHour; +				int minutes = header.saveMinutes; -	            desc.setSaveTime(hour, minutes); +				desc.setSaveTime(hour, minutes); -	            //desc.setPlayTime(header.playTime * 1000); -	        } +				//desc.setPlayTime(header.playTime * 1000); +			} -	        return desc; -	    } +			return desc; +		}  	}  	return SaveStateDescriptor();  }  #if PLUGIN_ENABLED_DYNAMIC(ZVISION) -REGISTER_PLUGIN_DYNAMIC(ZVISION, PLUGIN_TYPE_ENGINE, ZVisionMetaEngine); +	REGISTER_PLUGIN_DYNAMIC(ZVISION, PLUGIN_TYPE_ENGINE, ZVisionMetaEngine);  #else -REGISTER_PLUGIN_STATIC(ZVISION, PLUGIN_TYPE_ENGINE, ZVisionMetaEngine); +	REGISTER_PLUGIN_STATIC(ZVISION, PLUGIN_TYPE_ENGINE, ZVisionMetaEngine);  #endif | 
