diff options
Diffstat (limited to 'engines/zvision/detection.cpp')
| -rw-r--r-- | engines/zvision/detection.cpp | 278 | 
1 files changed, 189 insertions, 89 deletions
| diff --git a/engines/zvision/detection.cpp b/engines/zvision/detection.cpp index 9961db1215..1eaff83413 100644 --- a/engines/zvision/detection.cpp +++ b/engines/zvision/detection.cpp @@ -26,13 +26,14 @@  #include "zvision/zvision.h"  #include "zvision/detection.h" +#include "zvision/file/save_manager.h" +#include "zvision/scripting/script_manager.h"  #include "common/translation.h"  #include "common/savefile.h"  #include "common/str-array.h"  #include "common/system.h" -  namespace ZVision {  uint32 ZVision::getFeatures() const { @@ -45,7 +46,6 @@ Common::Language ZVision::getLanguage() const {  } // End of namespace ZVision -  static const PlainGameDescriptor zVisionGames[] = {  	{"zvision",  "ZVision Game"},  	{"znemesis", "Zork Nemesis: The Forbidden Lands"}, @@ -53,9 +53,13 @@ static const PlainGameDescriptor zVisionGames[] = {  	{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[] = {  	{ @@ -67,21 +71,63 @@ static const ZVisionGameDescription gameDescriptions[] = {  			Common::EN_ANY,  			Common::kPlatformDOS,  			ADGF_NO_FLAGS, -			GUIO1(GUIO_NONE) +			GUIO4(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_DOUBLE_FPS, GAMEOPTION_ENABLE_VENUS, GAMEOPTION_DISABLE_ANIM_WHILE_TURNING)  		},  		GID_NEMESIS  	},  	{ -		// Zork Grand Inquisitor English version +		// 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", -			0, +			"CD",  			AD_ENTRY1s("SCRIPTS.ZFS", "81efd40ecc3d22531e211368b779f17f", 8336944),  			Common::EN_ANY,  			Common::kPlatformWindows,  			ADGF_NO_FLAGS, -			GUIO1(GUIO_NONE) +			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  	}, @@ -99,16 +145,53 @@ static const char *directoryGlobs[] = {  	0  }; -static const ExtraGuiOption ZVisionExtraGuiOption = { -	_s("Use original save/load screens"), -	_s("Use the original save/load screens, instead of the ScummVM ones"), -	"originalsaveload", -	false +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  };  class ZVisionMetaEngine : public AdvancedMetaEngine {  public: -	ZVisionMetaEngine() : AdvancedMetaEngine(ZVision::gameDescriptions, sizeof(ZVision::ZVisionGameDescription), zVisionGames) { +	ZVisionMetaEngine() : AdvancedMetaEngine(ZVision::gameDescriptions, sizeof(ZVision::ZVisionGameDescription), zVisionGames, optionsList) {  		_maxScanDepth = 2;  		_directoryGlobs = directoryGlobs;  		_singleid = "zvision"; @@ -124,7 +207,6 @@ public:  	virtual bool hasFeature(MetaEngineFeature f) const;  	virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const; -	virtual const ExtraGuiOptions getExtraGuiOptions(const Common::String &target) const;  	SaveStateList listSaves(const char *target) const;  	virtual int getMaximumSaveSlot() const;  	void removeSaveState(const char *target, int slot) const; @@ -132,24 +214,40 @@ public:  };  bool ZVisionMetaEngine::hasFeature(MetaEngineFeature f) const { -	return false; -		/* -		(f == kSupportsListSaves) || -		(f == kSupportsLoadingDuringStartup) || -		(f == kSupportsDeleteSave) || -		(f == kSavesSupportMetaInfo) || -		(f == kSavesSupportThumbnail) || -		(f == kSavesSupportCreationDate) || -		(f == kSavesSupportPlayTime); -		*/ +	return +	(f == kSupportsListSaves) || +	(f == kSupportsLoadingDuringStartup) || +	(f == kSupportsDeleteSave) || +	(f == kSavesSupportMetaInfo) || +	(f == kSavesSupportThumbnail) || +	(f == kSavesSupportCreationDate); +	//(f == kSavesSupportPlayTime);  } -/*bool ZVision::ZVision::hasFeature(EngineFeature f) const { -	return -		(f == kSupportsRTL) || -		(f == kSupportsLoadingDuringRuntime) || -		(f == kSupportsSavingDuringRuntime); -}*/ +bool ZVision::ZVision::hasFeature(EngineFeature f) const { +    return +        (f == kSupportsRTL) || +        (f == kSupportsLoadingDuringRuntime) || +        (f == kSupportsSavingDuringRuntime); +} + +Common::Error ZVision::ZVision::loadGameState(int slot) { +	return _saveManager->loadGame(slot); +} + +Common::Error ZVision::ZVision::saveGameState(int slot, const Common::String &desc) { +	_saveManager->saveGame(slot, desc); +	return Common::kNoError; +} + +bool ZVision::ZVision::canLoadGameStateCurrently() { +	return !_videoIsPlaying; +} + +bool ZVision::ZVision::canSaveGameStateCurrently() { +	Location currentLocation = _scriptManager->getCurrentLocation(); +	return !_videoIsPlaying && currentLocation.world != 'g' && !(currentLocation.room == 'j' || currentLocation.room == 'a'); +}  bool ZVisionMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {  	const ZVision::ZVisionGameDescription *gd = (const ZVision::ZVisionGameDescription *)desc; @@ -159,37 +257,36 @@ bool ZVisionMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADG  	return gd != 0;  } -const ExtraGuiOptions ZVisionMetaEngine::getExtraGuiOptions(const Common::String &target) const { -	ExtraGuiOptions options; -	options.push_back(ZVisionExtraGuiOption); -	return options; -} -  SaveStateList ZVisionMetaEngine::listSaves(const char *target) const { -	//Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); -	/*ZVision::ZVision::SaveHeader header; +	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); +	ZVision::SaveGameHeader header;  	Common::String pattern = target;  	pattern += ".???";  	Common::StringArray filenames;  	filenames = saveFileMan->listSavefiles(pattern.c_str()); -	Common::sort(filenames.begin(), filenames.end());	// Sort (hopefully ensuring we are sorted numerically..)*/ +	Common::sort(filenames.begin(), filenames.end());   // Sort (hopefully ensuring we are sorted numerically..)*/  	SaveStateList saveList; -/*	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 (ZVision::ZVision::readSaveHeader(in, false, header) == ZVision::ZVision::kRSHENoError) { -					saveList.push_back(SaveStateDescriptor(slotNum, header.description)); -				} -				delete in; -			} -		} -	}*/ +	// 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; +	            } +	        } +	} + +	delete zvisionSaveMan;  	return saveList;  } @@ -199,9 +296,8 @@ int ZVisionMetaEngine::getMaximumSaveSlot() const {  }  void ZVisionMetaEngine::removeSaveState(const char *target, int slot) const { -	/*  	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); -	Common::String filename = ZVision::ZVision::getSavegameFilename(target, slot); +	Common::String filename = Common::String::format("%s.%03u", target, slot);  	saveFileMan->removeSavefile(filename.c_str()); @@ -209,63 +305,67 @@ void ZVisionMetaEngine::removeSaveState(const char *target, int slot) const {  	Common::String pattern = target;  	pattern += ".???";  	filenames = saveFileMan->listSavefiles(pattern.c_str()); -	Common::sort(filenames.begin(), filenames.end());	// Sort (hopefully ensuring we are sorted numerically..) +	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 = ZVision::ZVision::getSavegameFilename(target, ++slot); -		} +	    // 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); +	    }  	} -	*/  }  SaveStateDescriptor ZVisionMetaEngine::querySaveMetaInfos(const char *target, int slot) const { -	/* -	Common::String filename = ZVision::ZVision::getSavegameFilename(target, slot); +	Common::String filename = Common::String::format("%s.%03u", target, slot);  	Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(filename.c_str());  	if (in) { -		ZVision::ZVision::SaveHeader header; -		ZVision::ZVision::kReadSaveHeaderError error; +	    ZVision::SaveGameHeader header; -		error = ZVision::ZVision::readSaveHeader(in, true, header); -		delete in; +		// 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; -		if (error == ZVision::ZVision::kRSHENoError) { -			SaveStateDescriptor desc(slot, header.description); +	    if (successfulRead) { +	        SaveStateDescriptor desc(slot, header.saveName); -			desc.setThumbnail(header.thumbnail); +			// Do not allow save slot 0 (used for auto-saving) to be deleted or +			// overwritten. +			desc.setDeletableFlag(slot != 0); +			desc.setWriteProtectedFlag(slot == 0); -			if (header.version > 0) { -				int day = (header.saveDate >> 24) & 0xFF; -				int month = (header.saveDate >> 16) & 0xFF; -				int year = header.saveDate & 0xFFFF; +	        desc.setThumbnail(header.thumbnail); -				desc.setSaveDate(year, month, day); +	        if (header.version > 0) { +	            int day = header.saveDay; +	            int month = header.saveMonth; +	            int year = header.saveYear; -				int hour = (header.saveTime >> 16) & 0xFF; -				int minutes = (header.saveTime >> 8) & 0xFF; +	            desc.setSaveDate(year, month, day); -				desc.setSaveTime(hour, minutes); +	            int hour = header.saveHour; +	            int minutes = header.saveMinutes; -				desc.setPlayTime(header.playTime * 1000); -			} +	            desc.setSaveTime(hour, minutes); -			return desc; -		} +	            //desc.setPlayTime(header.playTime * 1000); +	        } + +	        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 | 
