浏览代码

Map object use format mod:object (or mod:object.subobject)

Ivan Savenko 2 年之前
父节点
当前提交
eebc6fd625
共有 3 个文件被更改,包括 39 次插入39 次删除
  1. 22 20
      lib/mapObjects/CObjectClassesHandler.cpp
  2. 15 17
      lib/mapObjects/CObjectClassesHandler.h
  3. 2 2
      lib/mapping/MapFormatJson.cpp

+ 22 - 20
lib/mapObjects/CObjectClassesHandler.cpp

@@ -156,7 +156,7 @@ std::vector<JsonNode> CObjectClassesHandler::loadLegacyData(size_t dataSize)
 
 void CObjectClassesHandler::loadSubObject(const std::string & scope, const std::string & identifier, const JsonNode & entry, ObjectClass * obj)
 {
-	auto object = loadSubObjectFromJson(scope, VLC->modh->normalizeIdentifier(scope, CModHandler::scopeBuiltin(), identifier), entry, obj, obj->objects.size());
+	auto object = loadSubObjectFromJson(scope, identifier, entry, obj, obj->objects.size());
 
 	assert(object);
 	obj->objects.push_back(object);
@@ -166,8 +166,7 @@ void CObjectClassesHandler::loadSubObject(const std::string & scope, const std::
 
 void CObjectClassesHandler::loadSubObject(const std::string & scope, const std::string & identifier, const JsonNode & entry, ObjectClass * obj, size_t index)
 {
-	//TODO: load name for subobjects
-	auto object = loadSubObjectFromJson(scope, VLC->modh->normalizeIdentifier(scope, CModHandler::scopeBuiltin(), identifier), entry, obj, index);
+	auto object = loadSubObjectFromJson(scope, identifier, entry, obj, index);
 
 	assert(object);
 	assert(obj->objects[index] == nullptr); // ensure that this id was not loaded before
@@ -178,6 +177,9 @@ void CObjectClassesHandler::loadSubObject(const std::string & scope, const std::
 
 TObjectTypeHandler CObjectClassesHandler::loadSubObjectFromJson(const std::string & scope, const std::string & identifier, const JsonNode & entry, ObjectClass * obj, size_t index)
 {
+	assert(identifier.find(':') == std::string::npos);
+	assert(!scope.empty());
+
 	if(!handlerConstructors.count(obj->handlerName))
 	{
 		logGlobal->error("Handler with name %s was not found!", obj->handlerName);
@@ -186,12 +188,12 @@ TObjectTypeHandler CObjectClassesHandler::loadSubObjectFromJson(const std::strin
 
 	auto createdObject = handlerConstructors.at(obj->handlerName)();
 
-	if (identifier.find(':') == std::string::npos)
-		createdObject->setTypeName(obj->getJsonKey(), scope + ":" + identifier);
-	else
-		createdObject->setTypeName(obj->getJsonKey(), identifier);
+	createdObject->modScope = scope;
+	createdObject->typeName = obj->identifier;;
+	createdObject->subTypeName = identifier;
 
-	createdObject->setType(obj->id, index);
+	createdObject->type = obj->id;
+	createdObject->subtype = index;
 	createdObject->init(entry);
 
 	auto range = legacyTemplates.equal_range(std::make_pair(obj->id, index));
@@ -208,7 +210,7 @@ TObjectTypeHandler CObjectClassesHandler::loadSubObjectFromJson(const std::strin
 
 std::string ObjectClass::getJsonKey() const
 {
-	return identifier;
+	return modScope + ':' + identifier;
 }
 
 std::string ObjectClass::getNameTextID() const
@@ -223,8 +225,10 @@ std::string ObjectClass::getNameTranslated() const
 
 ObjectClass * CObjectClassesHandler::loadFromJson(const std::string & scope, const JsonNode & json, const std::string & name, size_t index)
 {
-	auto obj = new ObjectClass(scope, name);
+	auto obj = new ObjectClass();
 
+	obj->modScope = scope;
+	obj->identifier = name;
 	obj->handlerName = json["handler"].String();
 	obj->base = json["base"];
 	obj->id = index;
@@ -252,14 +256,14 @@ ObjectClass * CObjectClassesHandler::loadFromJson(const std::string & scope, con
 
 void CObjectClassesHandler::loadObject(std::string scope, std::string name, const JsonNode & data)
 {
-	auto object = loadFromJson(scope, data, VLC->modh->normalizeIdentifier(scope, CModHandler::scopeBuiltin(), name), objects.size());
+	auto object = loadFromJson(scope, data, name, objects.size());
 	objects.push_back(object);
 	VLC->modh->identifiers.registerObject(scope, "object", name, object->id);
 }
 
 void CObjectClassesHandler::loadObject(std::string scope, std::string name, const JsonNode & data, size_t index)
 {
-	auto object = loadFromJson(scope, data, VLC->modh->normalizeIdentifier(scope, CModHandler::scopeBuiltin(), name), index);
+	auto object = loadFromJson(scope, data, name, index);
 	assert(objects[(si32)index] == nullptr); // ensure that this id was not loaded before
 	objects[(si32)index] = object;
 	VLC->modh->identifiers.registerObject(scope, "object", name, object->id);
@@ -437,21 +441,19 @@ AObjectTypeHandler::~AObjectTypeHandler()
 {
 }
 
-void AObjectTypeHandler::setType(si32 type, si32 subtype)
+std::string AObjectTypeHandler::getJsonKey() const
 {
-	this->type = type;
-	this->subtype = subtype;
+	return modScope + ':' + subTypeName;
 }
 
-void AObjectTypeHandler::setTypeName(std::string type, std::string subtype)
+si32 AObjectTypeHandler::getIndex() const
 {
-	this->typeName = type;
-	this->subTypeName = subtype;
+	return type;
 }
 
-std::string AObjectTypeHandler::getJsonKey() const
+si32 AObjectTypeHandler::getSubIndex() const
 {
-	return subTypeName;
+	return subtype;
 }
 
 std::string AObjectTypeHandler::getTypeName() const

+ 15 - 17
lib/mapObjects/CObjectClassesHandler.h

@@ -152,23 +152,26 @@ class DLL_LINKAGE AObjectTypeHandler : public boost::noncopyable
 	boost::optional<si32> aiValue;
 	boost::optional<std::string> battlefield;
 
+	std::string modScope;
+	std::string typeName;
+	std::string subTypeName;
+
+	si32 type;
+	si32 subtype;
+
 protected:
 	void preInitObject(CGObjectInstance * obj) const;
 	virtual bool objectFilter(const CGObjectInstance *, std::shared_ptr<const ObjectTemplate>) const;
 
 	/// initialization for classes that inherit this one
 	virtual void initTypeData(const JsonNode & input);
-	std::string typeName;
-	std::string subTypeName;
 public:
 
-	si32 type;
-	si32 subtype;
 	AObjectTypeHandler();
 	virtual ~AObjectTypeHandler();
 
-	void setType(si32 type, si32 subtype);
-	void setTypeName(std::string type, std::string subtype);
+	si32 getIndex() const;
+	si32 getSubIndex() const;
 
 	std::string getTypeName() const;
 	std::string getSubTypeName() const;
@@ -229,6 +232,7 @@ public:
 		h & subtype;
 		h & templates;
 		h & rmgInfo;
+		h & modScope;
 		h & typeName;
 		h & subTypeName;
 		h & sounds;
@@ -242,18 +246,9 @@ typedef std::shared_ptr<AObjectTypeHandler> TObjectTypeHandler;
 /// Class responsible for creation of adventure map objects of specific type
 class DLL_LINKAGE ObjectClass
 {
-	std::string identifier;
-
 public:
-	ObjectClass() = default;
-	ObjectClass(const std::string & modScope, const std::string & identifier)
-	{
-		if (identifier.find(':') == std::string::npos)
-			this->identifier = modScope + ":" + identifier;
-		else
-			this->identifier = identifier;
-
-	}
+	std::string modScope;
+	std::string identifier;
 
 	si32 id;
 	std::string handlerName; // ID of handler that controls this object, should be determined using handlerConstructor map
@@ -261,6 +256,8 @@ public:
 	JsonNode base;
 	std::vector<TObjectTypeHandler> objects;
 
+	ObjectClass() = default;
+
 	std::string getJsonKey() const;
 	std::string getNameTextID() const;
 	std::string getNameTranslated() const;
@@ -271,6 +268,7 @@ public:
 		h & base;
 		h & objects;
 		h & identifier;
+		h & modScope;
 	}
 };
 

+ 2 - 2
lib/mapping/MapFormatJson.cpp

@@ -1159,8 +1159,8 @@ void CMapLoaderJson::MapObjectLoader::construct()
 
 	auto appearance = new ObjectTemplate;
 
-	appearance->id = Obj(handler->type);
-	appearance->subid = handler->subtype;
+	appearance->id = Obj(handler->getIndex());
+	appearance->subid = handler->getSubIndex();
 	appearance->readJson(configuration["template"], false);
 
 	// Will be destroyed soon and replaced with shared template