mirror of
https://github.com/vcmi/vcmi.git
synced 2025-11-23 22:37:55 +02:00
resource generation
This commit is contained in:
@@ -66,11 +66,22 @@ CFilesystemList::~CFilesystemList()
|
||||
|
||||
std::unique_ptr<CInputStream> CFilesystemList::load(const ResourcePath & resourceName) const
|
||||
{
|
||||
// load resource from last loader that have it (last overridden version)
|
||||
for(const auto & loader : boost::adaptors::reverse(loaders))
|
||||
if(resourceName.getOriginalResource())
|
||||
{
|
||||
if (loader->existsResource(resourceName))
|
||||
return loader->load(resourceName);
|
||||
for(const auto & loader : loaders)
|
||||
{
|
||||
if (loader->existsResource(resourceName))
|
||||
return loader->load(resourceName);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// load resource from last loader that have it (last overridden version)
|
||||
for(const auto & loader : boost::adaptors::reverse(loaders))
|
||||
{
|
||||
if (loader->existsResource(resourceName))
|
||||
return loader->load(resourceName);
|
||||
}
|
||||
}
|
||||
|
||||
throw std::runtime_error("Resource with name " + resourceName.getName() + " and type "
|
||||
|
||||
@@ -118,10 +118,11 @@ std::unordered_map<ResourcePath, boost::filesystem::path> CFilesystemLoader::lis
|
||||
EResType::ARCHIVE_SND,
|
||||
EResType::ARCHIVE_ZIP };
|
||||
static const std::set<EResType> initialTypes(initArray, initArray + std::size(initArray));
|
||||
|
||||
assert(boost::filesystem::is_directory(baseDirectory));
|
||||
std::unordered_map<ResourcePath, boost::filesystem::path> fileList;
|
||||
|
||||
if(!boost::filesystem::is_directory(baseDirectory))
|
||||
return fileList;
|
||||
|
||||
std::vector<boost::filesystem::path> path; //vector holding relative path to our file
|
||||
|
||||
boost::filesystem::recursive_directory_iterator enddir;
|
||||
|
||||
@@ -182,10 +182,14 @@ void CResourceHandler::initialize()
|
||||
knownLoaders["root"] = globalResourceHandler.rootLoader.get();
|
||||
knownLoaders["saves"] = new CFilesystemLoader("SAVES/", VCMIDirs::get().userSavePath());
|
||||
knownLoaders["config"] = new CFilesystemLoader("CONFIG/", VCMIDirs::get().userConfigPath());
|
||||
knownLoaders["gen_data"] = new CFilesystemLoader("DATA/", VCMIDirs::get().userDataPath() / "Generated" / "Data");
|
||||
knownLoaders["gen_sprites"] = new CFilesystemLoader("SPRITES/", VCMIDirs::get().userDataPath() / "Generated" / "Sprites");
|
||||
|
||||
auto * localFS = new CFilesystemList();
|
||||
localFS->addLoader(knownLoaders["saves"], true);
|
||||
localFS->addLoader(knownLoaders["config"], true);
|
||||
localFS->addLoader(knownLoaders["gen_data"], true);
|
||||
localFS->addLoader(knownLoaders["gen_sprites"], true);
|
||||
|
||||
addFilesystem("root", "initial", createInitial());
|
||||
addFilesystem("root", "data", new CFilesystemList());
|
||||
|
||||
@@ -51,19 +51,22 @@ static inline std::string readName(std::string name, bool uppercase)
|
||||
ResourcePath::ResourcePath(const std::string & name_):
|
||||
type(readType(name_)),
|
||||
name(readName(name_, true)),
|
||||
originalName(readName(name_, false))
|
||||
originalName(readName(name_, false)),
|
||||
originalResource(false)
|
||||
{}
|
||||
|
||||
ResourcePath::ResourcePath(const std::string & name_, EResType type_):
|
||||
type(type_),
|
||||
name(readName(name_, true)),
|
||||
originalName(readName(name_, false))
|
||||
originalName(readName(name_, false)),
|
||||
originalResource(false)
|
||||
{}
|
||||
|
||||
ResourcePath::ResourcePath(const JsonNode & name, EResType type):
|
||||
type(type),
|
||||
name(readName(name.String(), true)),
|
||||
originalName(readName(name.String(), false))
|
||||
originalName(readName(name.String(), false)),
|
||||
originalResource(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -99,6 +99,7 @@ public:
|
||||
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);
|
||||
@@ -108,6 +109,8 @@ public:
|
||||
h & type;
|
||||
h & name;
|
||||
h & originalName;
|
||||
if (h.version >= Handler::Version::RESOURCE_GENERATION)
|
||||
h & originalResource;
|
||||
}
|
||||
|
||||
protected:
|
||||
@@ -120,6 +123,9 @@ protected:
|
||||
|
||||
/// name in original case
|
||||
std::string originalName;
|
||||
|
||||
/// flag for requesting unmodded, original resource
|
||||
bool originalResource;
|
||||
};
|
||||
|
||||
template<EResType Type>
|
||||
@@ -180,6 +186,17 @@ public:
|
||||
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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user