Node * BehaviorTreeLoader::
	CreateBehaviorTree(const std::string & btName) const
	{
		Node * pBehaviorTreeRoot = nullptr;

		for (auto pIt = _XMLDoc.FirstChildElement()->FirstChildElement(); 
			 pIt != nullptr; 
			 pIt = pIt->NextSiblingElement()) {

			if (strcmp(pIt->Value(), btName.c_str()) == 0) {
				auto pChild = pIt->FirstChildElement();
				if (pChild == nullptr)
					continue;

				std::string name;
				pChild->QueryStringAttribute(DEFAULT_NODE_ATTRIBUTE, &name);
				pBehaviorTreeRoot = _NodeFactory.Create(name);

				if (pChild->NextSibling() != nullptr)
					std::cerr << "Warning, Behavior Tree [" << btName 
					<< "] has more than One Root!" << std::endl;

				CreateBehaviorTreeNode(pChild->FirstChildElement(), pBehaviorTreeRoot, pChild->Value());

				break;
			}
		}

		if (!pBehaviorTreeRoot)
			std::cerr << "BehaviorTreeLoader::Cannot create BehaviorTree, " << btName << "!" << std::endl;

		return pBehaviorTreeRoot;
	}
Exemplo n.º 2
0
void zerokernel::Select::loadFromXml(const tinyxml2::XMLElement *data)
{
    BaseMenuObject::loadFromXml(data);

    const char *target;
    if (tinyxml2::XML_SUCCESS == data->QueryStringAttribute("target", &target))
    {
        auto var = settings::Manager::instance().lookup(target);
        if (!var)
        {
            printf("WARNING: Creating Select element: could not find settings "
                   "'%s'\n",
                   target);
        }
        else
        {
            zerokernel::special::SettingsManagerList::markVariable(target);
            variable = var;
        }
    }

    auto child = data->FirstChildElement(nullptr);
    while (child != nullptr)
    {
        if (!strcmp("Option", child->Name()))
        {
            const char *name;
            const char *value;
            const char *tooltip;
            if (child->QueryStringAttribute("name", &name) || child->QueryStringAttribute("value", &value))
                continue;
            printf("adding %s: %s\n", name, value);
            auto has_tooltip = !(child->QueryStringAttribute("tooltip", &tooltip));
            options.push_back(option{ name, value, has_tooltip ? std::optional<std::string>(tooltip) : std::nullopt });
        };
        child = child->NextSiblingElement(nullptr);
    }
}
Exemplo n.º 3
0
void TabContainer::loadFromXml(const tinyxml2::XMLElement *data)
{
    BaseMenuObject::loadFromXml(data);

    auto el = data->FirstChildElement("Tab");
    while (el != nullptr)
    {
        const char *name = "Unnamed";
        el->QueryStringAttribute("name", &name);
        addTab(name);
        containers.at(containers.size() - 1)->loadFromXml(el);
        el = el->NextSiblingElement("Tab");
    }
}
	void BehaviorTreeLoader::
	CreateBehaviorTreeNode(const TiXmlElement* pFirstChild, Node * & pNode, const std::string & btName) const
	{
		for (auto pIt = pFirstChild; pIt != nullptr; pIt = pIt->NextSiblingElement()) {
			std::string name;
			pIt->QueryStringAttribute(DEFAULT_NODE_ATTRIBUTE, &name);
			Node * pChildNode = _NodeFactory.Create(name);
			
			if (btName == DEFAULT_NODE_COMPOSITE)
				dynamic_cast<Composite *>(pNode)->AddChildNode(pChildNode);
			else if (btName == DEFAULT_NODE_DECORATOR)
				dynamic_cast<Decorator *>(pNode)->SetChildNode(pChildNode);
			else
				std::cerr << "Error, Unknown BehaviorTree Node Type : " + btName << std::endl;

			CreateBehaviorTreeNode(pIt->FirstChildElement(), pChildNode, pIt->Value());
		}
	}