コード例 #1
0
void CObjectClassesHandler::loadObjectEntry(const JsonNode & entry, ObjectContainter * obj)
{
	if (!handlerConstructors.count(obj->handlerName))
	{
		logGlobal->errorStream() << "Handler with name " << obj->handlerName << " was not found!";
		return;
	}
	si32 id = selectNextID(entry["index"], obj->objects, 1000);

	auto handler = handlerConstructors.at(obj->handlerName)();
	handler->setType(obj->id, id);

	if (customNames.count(obj->id) && customNames.at(obj->id).size() > id)
		handler->init(entry, customNames.at(obj->id).at(id));
	else
		handler->init(entry);

	if (handler->getTemplates().empty())
	{
		auto range = legacyTemplates.equal_range(std::make_pair(obj->id, id));
		for (auto & templ : boost::make_iterator_range(range.first, range.second))
		{
			handler->addTemplate(templ.second);
		}
		legacyTemplates.erase(range.first, range.second);
	}

	logGlobal->debugStream() << "Loaded object " << obj->id << ":" << id;
	assert(!obj->objects.count(id)); // DO NOT override
	obj->objects[id] = handler;
}
コード例 #2
0
CObjectClassesHandler::ObjectContainter * CObjectClassesHandler::loadFromJson(const JsonNode & json)
{
	auto obj = new ObjectContainter();
	obj->name = json["name"].String();
	obj->handlerName = json["handler"].String();
	obj->base = json["base"];
	obj->id = selectNextID(json["index"], objects, 256);
	for (auto entry : json["types"].Struct())
	{
		loadObjectEntry(entry.second, obj);
	}
	return obj;
}
コード例 #3
0
ファイル: CObjectClassesHandler.cpp プロジェクト: vcmi/vcmi
CObjectClassesHandler::ObjectContainter * CObjectClassesHandler::loadFromJson(const JsonNode & json, const std::string & name)
{
	auto obj = new ObjectContainter();
	obj->identifier = name;
	obj->name = json["name"].String();
	obj->handlerName = json["handler"].String();
	obj->base = json["base"];
	obj->id = selectNextID(json["index"], objects, 256);
	if(json["defaultAiValue"].isNull())
		obj->groupDefaultAiValue = boost::none;
	else
		obj->groupDefaultAiValue = json["defaultAiValue"].Integer();

	for (auto entry : json["types"].Struct())
	{
		loadObjectEntry(entry.first, entry.second, obj);
	}

	return obj;
}
コード例 #4
0
ファイル: CObjectClassesHandler.cpp プロジェクト: vcmi/vcmi
void CObjectClassesHandler::loadObjectEntry(const std::string & identifier, const JsonNode & entry, ObjectContainter * obj)
{
	if (!handlerConstructors.count(obj->handlerName))
	{
		logGlobal->error("Handler with name %s was not found!", obj->handlerName);
		return;
	}

	std::string convertedId = VLC->modh->normalizeIdentifier(entry.meta, "core", identifier);

	si32 id = selectNextID(entry["index"], obj->subObjects, 1000);

	auto handler = handlerConstructors.at(obj->handlerName)();
	handler->setType(obj->id, id);
	handler->setTypeName(obj->identifier, convertedId);

	if (customNames.count(obj->id) && customNames.at(obj->id).size() > id)
		handler->init(entry, customNames.at(obj->id).at(id));
	else
		handler->init(entry);

	if (handler->getTemplates().empty())
	{
		auto range = legacyTemplates.equal_range(std::make_pair(obj->id, id));
		for (auto & templ : boost::make_iterator_range(range.first, range.second))
		{
			handler->addTemplate(templ.second);
		}
		legacyTemplates.erase(range.first, range.second);
	}

	logGlobal->debug("Loaded object %s(%d)::%s(%d)", obj->identifier, obj->id, convertedId, id);
	assert(!obj->subObjects.count(id)); // DO NOT override
	obj->subObjects[id] = handler;
	obj->subIds[convertedId] = id;
}