1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

Fixed #1338 and #1341. Introduced post-load step to ease initialization of bonus source ids.

This commit is contained in:
Michał W. Urbańczyk 2013-07-21 14:19:29 +00:00
parent 1e11904d8a
commit 0eb496fb57
5 changed files with 40 additions and 3 deletions

View File

@ -261,8 +261,7 @@ CArtifact * CArtHandler::loadFromJson(const JsonNode & node)
for (auto b : node["bonuses"].Vector())
{
auto bonus = JsonUtils::parseBonus (b);
bonus->sid = art->id;
art->addNewBonus (bonus);
art->addNewBonus(bonus);
}
return art;
}
@ -637,6 +636,20 @@ void CArtHandler::fillList( std::vector<CArtifact*> &listToBeFilled, CArtifact::
}
}
void CArtHandler::afterLoadFinalization()
{
//All artifacts have their id, so we can properly update their bonuses' source ids.
for(auto &art : artifacts)
{
for(auto &bonus : art->getExportedBonusList())
{
assert(art == artifacts[art->id]);
assert(bonus->source == Bonus::ARTIFACT);
bonus->sid = art->id;
}
}
}
CArtifactInstance::CArtifactInstance()
{
init();

View File

@ -235,6 +235,7 @@ public:
void loadObject(std::string scope, std::string name, const JsonNode & data) override;
void loadObject(std::string scope, std::string name, const JsonNode & data, size_t index) override;
void afterLoadFinalization() override;
std::vector<bool> getDefaultAllowed() const override;

View File

@ -264,6 +264,11 @@ void CContentHandler::ContentTypeHandler::loadMod(std::string modName)
}
}
void CContentHandler::ContentTypeHandler::afterLoadFinalization()
{
handler->afterLoadFinalization();
}
CContentHandler::CContentHandler()
{
handlers.insert(std::make_pair("heroClasses", ContentTypeHandler(&VLC->heroh->classes, "heroClass")));
@ -291,6 +296,14 @@ void CContentHandler::loadMod(std::string modName)
}
}
void CContentHandler::afterLoadFinalization()
{
for(auto & handler : handlers)
{
handler.second.afterLoadFinalization();
}
}
CModHandler::CModHandler()
{
for (int i = 0; i < GameConstants::RESOURCE_QUANTITY; ++i)
@ -558,8 +571,11 @@ void CModHandler::loadGameContent()
VLC->creh->loadCrExpBon();
VLC->creh->buildBonusTreeForTiers(); //do that after all new creatures are loaded
identifiers.finalize();
logGlobal->infoStream() << "\tResolving identifiers: " << timer.getDiff() << " ms";
content.afterLoadFinalization();
logGlobal->infoStream() << "\tHandlers post-load finalization: " << timer.getDiff() << " ms";
logGlobal->infoStream() << "\tAll game content loaded in " << totalTime.getDiff() << " ms";
}

View File

@ -93,6 +93,7 @@ class CContentHandler
/// local version of methods in ContentHandler
void preloadModData(std::string modName, std::vector<std::string> fileList);
void loadMod(std::string modName);
void afterLoadFinalization();
};
std::map<std::string, ContentTypeHandler> handlers;
@ -105,6 +106,9 @@ public:
/// actually loads data in mod
void loadMod(std::string modName);
/// all data was loaded, time for final validation / integration
void afterLoadFinalization();
};
typedef std::string TModID;

View File

@ -29,6 +29,9 @@ public:
virtual void loadObject(std::string scope, std::string name, const JsonNode & data) = 0;
virtual void loadObject(std::string scope, std::string name, const JsonNode & data, size_t index) = 0;
/// allows handler to do post-loading step for validation or integration of loaded data
virtual void afterLoadFinalization(){};
/**
* Gets a list of objects that are allowed by default on maps
*