Add initial way to make some bubbles traversable and others solid. More tweaking will be necessary

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@10630 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
auria 2012-01-10 02:04:46 +00:00
parent f30bab0dea
commit 2c9db720c0
3 changed files with 53 additions and 2 deletions

View File

@ -179,6 +179,21 @@ int XMLNode::get(const std::string &attribute, std::string *value) const
if(o==m_attributes.end()) return 0;
*value=core::stringc(o->second).c_str();
return 1;
} // get
// ----------------------------------------------------------------------------
/** If 'attribute' was defined, set 'value' to the value of the
* attribute and return 1, otherwise return 0 and do not change value.
* \param attribute Name of the attribute.
* \param value Value of the attribute.
*/
int XMLNode::get(const std::string &attribute, core::stringc *value) const
{
if(m_attributes.size()==0) return 0;
std::map<std::string, core::stringw>::const_iterator o;
o = m_attributes.find(attribute);
if(o==m_attributes.end()) return 0;
*value = core::stringc(o->second).c_str();
return 1;
} // get
// ----------------------------------------------------------------------------
int XMLNode::get(const std::string &attribute, core::stringw *value) const

View File

@ -78,6 +78,7 @@ public:
const XMLNode *getNode(unsigned int i) const;
unsigned int getNumNodes() const {return m_nodes.size(); }
int get(const std::string &attribute, std::string *value) const;
int get(const std::string &attribute, core::stringc *value) const;
int get(const std::string &attribute, core::stringw *value) const;
int get(const std::string &attribute, int32_t *value) const;
int get(const std::string &attribute, uint32_t *value) const;

View File

@ -693,18 +693,53 @@ bool Track::loadMainTrack(const XMLNode &root)
}
// some static meshes are conditional
std::string condition;
core::stringc condition;
n->get("if", &condition);
if (condition == "splatting")
{
if (!irr_driver->supportsSplatting()) continue;
}
else if (condition.find("trophies") == 0)
{
std::vector<std::string> split = StringUtils::split(std::string(condition.c_str()), ' ');
if (split.size() != 3)
{
fprintf(stderr, "[Track] WARNING: unexpected number of tokens in '%s'\n", condition.c_str());
continue;
}
const std::string& op = split[1];
int val = -1;
if (StringUtils::fromString(split[2], val))
{
// only 'lt' is supported atm
if (op != "lt")
{
fprintf(stderr, "[Track] WARNING: operator '%s' not supported in '%s'\n", op.c_str(),
condition.c_str());
}
if (unlock_manager->getCurrentSlot()->getPoints() < val)
{
// show object
}
else
{
// don't show object
continue;
}
}
else
{
fprintf(stderr, "[Track] WARNING: token '%s' in '%s' should have been a number\n",
split[2].c_str(), condition.c_str());
}
}
else if (condition.size() > 0)
{
fprintf(stderr, "[Track] WARNING: unknown condition <%s>\n", condition.c_str());
}
std::string neg_condition;
core::stringc neg_condition;
n->get("ifnot", &neg_condition);
if (neg_condition == "splatting")
{