#pragma once #include #include #include #include #include namespace mods { struct Mod { std::string ident; std::string name; std::string description; std::string dirname; std::string abspath; std::string parentname; Mod* parent; bool isBase; bool listed; bool enabled; bool isNew; bool forced; bool forCurrentVersion; unsigned short version; unsigned compatibility; std::unordered_map fallbacks; std::vector overrides; std::vector> override_patterns; std::unordered_set containedFiles; Mod(); std::string getProfile() const; std::string getProfile(const std::string& path) const; bool hasOverride(const std::string& path, bool isDirectory = false) const; bool resolve(std::string& path) const; void resolve(const std::string& path, std::vector& check) const; void listFiles(const std::string& dir, std::map& out, const char* filter = "*", bool recurse = false, bool inherit = true) const; void resolveDirectory(const std::string& dir, std::vector& out) const; void loadFileList(); bool isCompatible(const Mod* other) const; void getConflicts(const Mod* other, std::vector& conflicts) const; //Returns a mod to use for the requested version (may be this mod) // If the required mod is not present, returns null const Mod* getFallback(unsigned short version) const; }; class Manager { public: std::map modNames; std::vector mods, activeMods; Mod* baseMod; Mod* currentMod; Manager(); ~Manager(); void registerMod(const std::string& folder, const std::string& ident); void registerDirectory(const std::string& dirname); void finalize(); void saveState(); void clearMods(); bool enableMod(const std::string& name); const Mod* getMod(const std::string& name) const; std::string resolve(const std::string& path) const; std::string resolve(const std::string& path, const std::string& indir) const; void resolve(const std::string& path, std::vector& check) const; //Lists all files in a directory, pairing each name to the full path in void listFiles(const std::string& dir, std::map& out, const char* filter = "*", bool recurse = false) const; //Lists all files in a directory, calling with the full path of each void listFiles(const std::string& dir, const char* filter, std::function cb, bool recurse = false) const; //Finds all directories that match the passed relative dir and outputs their absolute paths void resolveDirectory(const std::string& dir, std::vector& out) const; std::string getProfile() const; std::string getProfile(const std::string& path) const; std::string getGlobalProfile(const std::string& path) const; }; };