| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 | /* * ResourcePath.h, part of VCMI engine * * Authors: listed in file AUTHORS in main folder * * License: GNU General Public License v2.0 or later * Full text of license available in license.txt file, in main folder * */#pragma onceVCMI_LIB_NAMESPACE_BEGINclass JsonNode;class JsonSerializeFormat;/** * Specifies the resource type. * * Supported file extensions: * * Text: .txt * Json: .json * Animation: .def * Mask: .msk .msg * Campaign: .h3c * Map: .h3m * Font: .fnt * Image: .bmp, .jpg, .pcx, .png, .tga * Sound: .wav .82m * Video: .smk, .bik .mjpg .mpg .webm * Music: .mp3, .ogg * Archive: .lod, .snd, .vid .pac .zip * Palette: .pal * Savegame: .v*gm1 */enum class EResType{	TEXT,	JSON,	ANIMATION,	MASK,	CAMPAIGN,	MAP,	BMP_FONT,	TTF_FONT,	IMAGE,	VIDEO,	VIDEO_LOW_QUALITY,	SOUND,	ARCHIVE_VID,	ARCHIVE_ZIP,	ARCHIVE_SND,	ARCHIVE_LOD,	PALETTE,	SAVEGAME,	DIRECTORY,	ERM,	ERT,	ERS,	LUA,	OTHER,	UNDEFINED,};/** * A struct which identifies a resource clearly. */class DLL_LINKAGE ResourcePath{protected:	/// Constructs resource path based on JsonNode and selected type. File extension is ignored	ResourcePath(const JsonNode & name, EResType type);public:	/// Constructs resource path based on full name including extension	explicit ResourcePath(const std::string & fullName);	/// Constructs resource path based on filename and selected type. File extension is ignored	ResourcePath(const std::string & name, EResType type);	inline bool operator==(const ResourcePath & other) const	{		return name == other.name && type == other.type;	}	inline bool operator!=(const ResourcePath & other) const	{		return name != other.name || type != other.type;	}	inline bool operator<(const ResourcePath & other) const	{		if (type != other.type)			return type < other.type;		return name < other.name;	}	bool empty() const {return name.empty();}	std::string getName() const {return name;}	std::string getOriginalName() const {return originalName;}	bool getOriginalResource() const {return originalResource;}	EResType getType() const {return type;}	void serializeJson(JsonSerializeFormat & handler);	template <typename Handler> void serialize(Handler & h)	{		h & type;		h & name;		h & originalName;		if (h.version >= Handler::Version::RESOURCE_GENERATION)			h & originalResource;	}protected:	 /// Specifies the resource type. EResType::OTHER if not initialized.	 /// Required to prevent conflicts if files with different types (e.g. text and image) have the same name.	EResType type;	/// Specifies the resource name. No extension so .pcx and .png can override each other, always in upper case.	std::string name;	/// name in original case	std::string originalName;	/// flag for requesting unmodded, original resource	bool originalResource;};template<EResType Type>class ResourcePathTempl : public ResourcePath{	template <EResType>	friend class ResourcePathTempl;	ResourcePathTempl(const ResourcePath & copy)		:ResourcePath(copy)	{		type = Type;	}	ResourcePathTempl(const std::string & path)		:ResourcePath(path, Type)	{}	ResourcePathTempl(const JsonNode & name)		:ResourcePath(name, Type)	{}public:	ResourcePathTempl()		:ResourcePath("", Type)	{}	static ResourcePathTempl fromResource(const ResourcePath & resource)	{		assert(Type == resource.getType());		return ResourcePathTempl(resource);	}	static ResourcePathTempl builtin(const std::string & filename)	{		return ResourcePathTempl(filename);	}	static ResourcePathTempl builtinTODO(const std::string & filename)	{		return ResourcePathTempl(filename);	}	static ResourcePathTempl fromJson(const JsonNode & path)	{		return ResourcePathTempl(path);	}	template<EResType Type2>	ResourcePathTempl<Type2> toType() const	{		ResourcePathTempl<Type2> result(static_cast<ResourcePath>(*this));		return result;	}	ResourcePathTempl addPrefix(const std::string & prefix) const	{		ResourcePathTempl result;		result.name = prefix + this->getName();		result.originalName = prefix + this->getOriginalName();		result.originalResource = this->getOriginalResource();		return result;	}	ResourcePathTempl setOriginalResource(bool original) const	{		ResourcePathTempl result;		result.name = this->getName();		result.originalName = this->getOriginalName();		result.originalResource = original;		return result;	}};using AnimationPath = ResourcePathTempl<EResType::ANIMATION>;using ImagePath = ResourcePathTempl<EResType::IMAGE>;using TextPath = ResourcePathTempl<EResType::TEXT>;using JsonPath = ResourcePathTempl<EResType::JSON>;using VideoPath = ResourcePathTempl<EResType::VIDEO>;using AudioPath = ResourcePathTempl<EResType::SOUND>;namespace EResTypeHelper{	/**	 * Converts a extension string to a EResType enum object.	 *	 * @param extension The extension string e.g. .BMP, .PNG	 * @return Returns a EResType enum object	 */	EResType getTypeFromExtension(std::string extension);	/**	 * Gets the EResType as a string representation.	 *	 * @param type the EResType	 * @return the type as a string representation	 */	std::string getEResTypeAsString(EResType type);};VCMI_LIB_NAMESPACE_ENDnamespace std{template <> struct hash<VCMI_LIB_WRAP_NAMESPACE(ResourcePath)>{	size_t operator()(const VCMI_LIB_WRAP_NAMESPACE(ResourcePath) & resourceIdent) const	{		std::hash<int> intHasher;		std::hash<std::string> stringHasher;		return stringHasher(resourceIdent.getName()) ^ intHasher(static_cast<int>(resourceIdent.getType()));	}};}
 |