1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-23 22:37:55 +02:00

resource generation

This commit is contained in:
Laserlicht
2024-08-19 23:18:14 +02:00
parent 11ac768599
commit fff0159ef6
12 changed files with 162 additions and 66 deletions

View File

@@ -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 "

View File

@@ -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;

View File

@@ -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());

View File

@@ -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)
{
}

View File

@@ -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;
}