Răsfoiți Sursa

IdentifierStorage is now separate handler in VLC

Ivan Savenko 2 ani în urmă
părinte
comite
7e27ac7073

+ 1 - 1
lib/IHandlerBase.cpp

@@ -23,7 +23,7 @@ std::string IHandlerBase::getScopeBuiltin()
 
 void IHandlerBase::registerObject(const std::string & scope, const std::string & type_name, const std::string & name, si32 index)
 {
-	return VLC->modh->getIdentifiers().registerObject(scope, type_name, name, index);
+	return VLC->identifiersHandler->registerObject(scope, type_name, name, index);
 }
 
 VCMI_LIB_NAMESPACE_END

+ 4 - 21
lib/VCMI_Lib.cpp

@@ -111,7 +111,7 @@ const IBonusTypeHandler * LibClasses::getBth() const
 
 const CIdentifierStorage * LibClasses::identifiers() const
 {
-	return &modh->getIdentifiers();
+	return identifiersHandler;
 }
 
 const spells::effects::Registry * LibClasses::spellEffects() const
@@ -185,6 +185,7 @@ void LibClasses::loadModFilesystem(bool onlyEssential)
 {
 	CStopWatch loadTime;
 	modh = new CModHandler();
+	identifiersHandler = new CIdentifierStorage();
 	modh->loadMods(onlyEssential);
 	logGlobal->info("\tMod handler: %d ms", loadTime.getDiff());
 
@@ -212,49 +213,29 @@ void LibClasses::init(bool onlyEssential)
 	modh->initializeConfig();
 
 	createHandler(generaltexth, "General text", pomtime);
-
 	createHandler(bth, "Bonus type", pomtime);
-
 	createHandler(roadTypeHandler, "Road", pomtime);
 	createHandler(riverTypeHandler, "River", pomtime);
 	createHandler(terrainTypeHandler, "Terrain", pomtime);
-
 	createHandler(heroh, "Hero", pomtime);
-
 	createHandler(arth, "Artifact", pomtime);
-
 	createHandler(creh, "Creature", pomtime);
-
 	createHandler(townh, "Town", pomtime);
-
 	createHandler(objh, "Object", pomtime);
-
 	createHandler(objtypeh, "Object types information", pomtime);
-
 	createHandler(spellh, "Spell", pomtime);
-
 	createHandler(skillh, "Skill", pomtime);
-
 	createHandler(terviewh, "Terrain view pattern", pomtime);
-
 	createHandler(tplh, "Template", pomtime); //templates need already resolved identifiers (refactor?)
-
 #if SCRIPTING_ENABLED
 	createHandler(scriptHandler, "Script", pomtime);
 #endif
-
 	createHandler(battlefieldsHandler, "Battlefields", pomtime);
-	
 	createHandler(obstacleHandler, "Obstacles", pomtime);
-
 	logGlobal->info("\tInitializing handlers: %d ms", totalTime.getDiff());
 
 	modh->load();
-
 	modh->afterLoad(onlyEssential);
-
-	//FIXME: make sure that everything is ok after game restart
-	//TODO: This should be done every time mod config changes
 }
 
 void LibClasses::clear()
@@ -276,6 +257,7 @@ void LibClasses::clear()
 #endif
 	delete battlefieldsHandler;
 	delete generaltexth;
+	delete identifiersHandler;
 	makeNull();
 }
 
@@ -298,6 +280,7 @@ void LibClasses::makeNull()
 	scriptHandler = nullptr;
 #endif
 	battlefieldsHandler = nullptr;
+	identifiersHandler = nullptr;
 }
 
 LibClasses::LibClasses()

+ 3 - 1
lib/VCMI_Lib.h

@@ -97,6 +97,7 @@ public:
 	TerrainTypeHandler * terrainTypeHandler;
 	RoadTypeHandler * roadTypeHandler;
 	RiverTypeHandler * riverTypeHandler;
+	CIdentifierStorage * identifiersHandler;
 
 	CTerrainViewPatternConfig * terviewh;
 	CRmgTemplateStorage * tplh;
@@ -122,8 +123,9 @@ public:
 
 	template <typename Handler> void serialize(Handler &h, const int version)
 	{
+		h & identifiersHandler; // must be first - identifiers registry is used for handlers loading
 #if SCRIPTING_ENABLED
-		h & scriptHandler;//must be first (or second after modh), it can modify factories other handlers depends on
+		h & scriptHandler;//must be first (or second after identifiers), it can modify factories other handlers depends on
 		if(!h.saving)
 		{
 			scriptsLoaded();

+ 2 - 2
lib/mapObjectConstructors/CObjectClassesHandler.cpp

@@ -277,7 +277,7 @@ void CObjectClassesHandler::loadObject(std::string scope, std::string name, cons
 {
 	auto * object = loadFromJson(scope, data, name, objects.size());
 	objects.push_back(object);
-	VLC->modh->getIdentifiers().registerObject(scope, "object", name, object->id);
+	VLC->identifiersHandler->registerObject(scope, "object", name, object->id);
 }
 
 void CObjectClassesHandler::loadObject(std::string scope, std::string name, const JsonNode & data, size_t index)
@@ -285,7 +285,7 @@ void CObjectClassesHandler::loadObject(std::string scope, std::string name, cons
 	auto * object = loadFromJson(scope, data, name, index);
 	assert(objects[(si32)index] == nullptr); // ensure that this id was not loaded before
 	objects[static_cast<si32>(index)] = object;
-	VLC->modh->getIdentifiers().registerObject(scope, "object", name, object->id);
+	VLC->identifiersHandler->registerObject(scope, "object", name, object->id);
 }
 
 void CObjectClassesHandler::loadSubObject(const std::string & identifier, JsonNode config, si32 ID, si32 subID)

+ 1 - 23
lib/modding/CModHandler.cpp

@@ -41,25 +41,8 @@ static JsonNode loadModSettings(const std::string & path)
 
 CModHandler::CModHandler()
 	: content(std::make_shared<CContentHandler>())
-	, identifiers(std::make_unique<CIdentifierStorage>())
 	, coreMod(std::make_unique<CModInfo>())
 {
-	//TODO: moddable spell schools
-	for (auto i = 0; i < GameConstants::DEFAULT_SCHOOLS; ++i)
-		identifiers->registerObject(ModScope::scopeBuiltin(), "spellSchool", SpellConfig::SCHOOL[i].jsonName, SpellConfig::SCHOOL[i].id);
-
-	identifiers->registerObject(ModScope::scopeBuiltin(), "spellSchool", "any", SpellSchool(ESpellSchool::ANY));
-
-	for (int i = 0; i < GameConstants::RESOURCE_QUANTITY; ++i)
-	{
-		identifiers->registerObject(ModScope::scopeBuiltin(), "resource", GameConstants::RESOURCE_NAMES[i], i);
-	}
-
-	for(int i=0; i<GameConstants::PRIMARY_SKILLS; ++i)
-	{
-		identifiers->registerObject(ModScope::scopeBuiltin(), "primSkill", NPrimarySkill::names[i], i);
-		identifiers->registerObject(ModScope::scopeBuiltin(), "primarySkill", NPrimarySkill::names[i], i);
-	}
 }
 
 CModHandler::~CModHandler() = default;
@@ -462,7 +445,7 @@ void CModHandler::load()
 
 	logMod->info("\tLoading mod data: %d ms", timer.getDiff());
 	VLC->creh->loadCrExpMod();
-	identifiers->finalize();
+	VLC->identifiersHandler->finalize();
 	logMod->info("\tResolving identifiers: %d ms", timer.getDiff());
 
 	content->afterLoadFinalization();
@@ -534,9 +517,4 @@ void CModHandler::trySetActiveMods(std::vector<TModID> saveActiveMods, const std
 	std::swap(activeMods, newActiveMods);
 }
 
-CIdentifierStorage & CModHandler::getIdentifiers()
-{
-	return *identifiers;
-}
-
 VCMI_LIB_NAMESPACE_END

+ 0 - 6
lib/modding/CModHandler.h

@@ -54,13 +54,9 @@ class DLL_LINKAGE CModHandler : boost::noncopyable
 	/// Attempt to set active mods according to provided list of mods from save, throws on failure
 	void trySetActiveMods(std::vector<TModID> saveActiveMods, const std::map<TModID, CModVersion> & modList);
 
-	std::unique_ptr<CIdentifierStorage> identifiers;
-
 public:
 	std::shared_ptr<CContentHandler> content; //(!)Do not serialize FIXME: make private
 
-	CIdentifierStorage & getIdentifiers();
-
 	/// receives list of available mods and trying to load mod.json from all of them
 	void initializeConfig();
 	void loadMods(bool onlyEssential = false);
@@ -109,8 +105,6 @@ public:
 
 			trySetActiveMods(saveActiveMods, modVersions);
 		}
-
-		h & identifiers;
 	}
 };
 

+ 22 - 0
lib/modding/IdentifierStorage.cpp

@@ -15,11 +15,33 @@
 
 #include "../JsonNode.h"
 #include "../VCMI_Lib.h"
+#include "../constants/StringConstants.h"
+#include "../spells/CSpellHandler.h"
 
 #include <vstd/StringUtils.h>
 
 VCMI_LIB_NAMESPACE_BEGIN
 
+CIdentifierStorage::CIdentifierStorage()
+{
+	//TODO: moddable spell schools
+	for (auto i = 0; i < GameConstants::DEFAULT_SCHOOLS; ++i)
+		registerObject(ModScope::scopeBuiltin(), "spellSchool", SpellConfig::SCHOOL[i].jsonName, SpellConfig::SCHOOL[i].id);
+
+	registerObject(ModScope::scopeBuiltin(), "spellSchool", "any", SpellSchool(ESpellSchool::ANY));
+
+	for (int i = 0; i < GameConstants::RESOURCE_QUANTITY; ++i)
+	{
+		registerObject(ModScope::scopeBuiltin(), "resource", GameConstants::RESOURCE_NAMES[i], i);
+	}
+
+	for(int i=0; i<GameConstants::PRIMARY_SKILLS; ++i)
+	{
+		registerObject(ModScope::scopeBuiltin(), "primSkill", NPrimarySkill::names[i], i);
+		registerObject(ModScope::scopeBuiltin(), "primarySkill", NPrimarySkill::names[i], i);
+	}
+}
+
 void CIdentifierStorage::checkIdentifier(std::string & ID)
 {
 	if (boost::algorithm::ends_with(ID, "."))

+ 1 - 1
lib/modding/IdentifierStorage.h

@@ -73,7 +73,7 @@ class DLL_LINKAGE CIdentifierStorage
 	std::vector<ObjectData> getPossibleIdentifiers(const ObjectCallback & callback) const;
 
 public:
-	CIdentifierStorage() = default;
+	CIdentifierStorage();
 	virtual ~CIdentifierStorage() = default;
 
 	/// request identifier for specific object name.