1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-13 19:54:17 +02:00

Eliminating duplicated bonuses. Smarter getting [no code duplication].

This commit is contained in:
Michał W. Urbańczyk
2011-02-27 11:26:18 +00:00
parent 13af78edca
commit d7b586f1fd
2 changed files with 49 additions and 26 deletions

View File

@@ -113,17 +113,19 @@ void DLL_EXPORT BonusList::getModifiersWDescr(TModDescr &out) const
out.push_back(std::make_pair(i->val, i->Description())); out.push_back(std::make_pair(i->val, i->Description()));
} }
void DLL_EXPORT BonusList::getBonuses(BonusList &out, const CSelector &selector, const CBonusSystemNode *source /*= NULL*/) const void DLL_EXPORT BonusList::getBonuses(BonusList &out, const CSelector &selector) const
{ {
BOOST_FOREACH(Bonus *i, *this) // BOOST_FOREACH(Bonus *i, *this)
if(selector(i) && i->effectRange == Bonus::NO_LIMIT) // if(selector(i) && i->effectRange == Bonus::NO_LIMIT)
out.push_back(i); // out.push_back(i);
getBonuses(out, selector, 0);
} }
void DLL_EXPORT BonusList::getBonuses(BonusList &out, const CSelector &selector, const CSelector &limit, const CBonusSystemNode *source /*= NULL*/) const void DLL_EXPORT BonusList::getBonuses(BonusList &out, const CSelector &selector, const CSelector &limit) const
{ {
BOOST_FOREACH(Bonus *i, *this) BOOST_FOREACH(Bonus *i, *this)
if(selector(i) && (!limit || limit(i))) if(selector(i) && (!limit && i->effectRange == Bonus::NO_LIMIT || limit && limit(i))) //add matching bonuses that matches limit predicate or have NO_LIMIT if no given predicate
out.push_back(i); out.push_back(i);
} }
@@ -132,6 +134,12 @@ void BonusList::limit(const CBonusSystemNode &node)
remove_if(boost::bind(&CBonusSystemNode::isLimitedOnUs, boost::ref(node), _1)); remove_if(boost::bind(&CBonusSystemNode::isLimitedOnUs, boost::ref(node), _1));
} }
void DLL_EXPORT BonusList::eliminateDuplicates()
{
sort();
unique();
}
int CBonusSystemNode::valOfBonuses(Bonus::BonusType type, const CSelector &selector) const int CBonusSystemNode::valOfBonuses(Bonus::BonusType type, const CSelector &selector) const
{ {
return valOfBonuses(Selector::type(type) && selector); return valOfBonuses(Selector::type(type) && selector);
@@ -220,13 +228,14 @@ void CBonusSystemNode::getParents(TNodes &out)
void CBonusSystemNode::getBonuses(BonusList &out, const CSelector &selector, const CBonusSystemNode *root /*= NULL*/) const void CBonusSystemNode::getBonuses(BonusList &out, const CSelector &selector, const CBonusSystemNode *root /*= NULL*/) const
{ {
FOREACH_CONST_PARENT(p) //unwinded macro getBonuses(out, selector, 0, root);
p->getBonuses(out, selector, root ? root : this); // FOREACH_CONST_PARENT(p)
// p->getBonuses(out, selector, root ? root : this);
bonuses.getBonuses(out, selector); //
// bonuses.getBonuses(out, selector);
if(!root) //
out.limit(*this); // if(!root)
// out.limit(*this);
} }
BonusList CBonusSystemNode::getBonuses(const CSelector &selector) const BonusList CBonusSystemNode::getBonuses(const CSelector &selector) const
@@ -236,11 +245,14 @@ BonusList CBonusSystemNode::getBonuses(const CSelector &selector) const
return ret; return ret;
} }
void CBonusSystemNode::getBonuses(BonusList &out, const CSelector &selector, const CSelector &limit) const void CBonusSystemNode::getBonuses(BonusList &out, const CSelector &selector, const CSelector &limit, const CBonusSystemNode *root /*= NULL*/) const
{ {
getBonuses(out, selector); //first get all the bonuses getAllBonuses(out, selector, limit, root);
out.remove_if(std::not1(limit)); //now remove the ones we don't like out.eliminateDuplicates();
out.limit(*this); //apply bonuses' limiters //
// getBonuses(out, selector); //first get all the bonuses
// out.remove_if(std::not1(limit)); //now remove the ones we don't like
// out.limit(*this); //apply bonuses' limiters
} }
BonusList CBonusSystemNode::getBonuses(const CSelector &selector, const CSelector &limit) const BonusList CBonusSystemNode::getBonuses(const CSelector &selector, const CSelector &limit) const
@@ -250,6 +262,17 @@ BonusList CBonusSystemNode::getBonuses(const CSelector &selector, const CSelecto
return ret; return ret;
} }
void CBonusSystemNode::getAllBonuses(BonusList &out, const CSelector &selector, const CSelector &limit, const CBonusSystemNode *root /*= NULL*/) const
{
FOREACH_CONST_PARENT(p)
p->getBonuses(out, selector, limit, root ? root : this);
bonuses.getBonuses(out, selector, limit);
if(!root)
out.limit(*this);
}
bool CBonusSystemNode::hasBonusFrom(ui8 source, ui32 sourceID) const bool CBonusSystemNode::hasBonusFrom(ui8 source, ui32 sourceID) const
{ {
return hasBonus(Selector::source(source,sourceID)); return hasBonus(Selector::source(source,sourceID));

View File

@@ -312,15 +312,17 @@ class BonusList : public std::list<Bonus*>
{ {
public: public:
int DLL_EXPORT totalValue() const; //subtype -> subtype of bonus, if -1 then any int DLL_EXPORT totalValue() const; //subtype -> subtype of bonus, if -1 then any
void DLL_EXPORT getBonuses(BonusList &out, const CSelector &selector, const CBonusSystemNode *source = NULL) const; void DLL_EXPORT getBonuses(BonusList &out, const CSelector &selector, const CSelector &limit) const;
void DLL_EXPORT getBonuses(BonusList &out, const CSelector &selector, const CSelector &limit, const CBonusSystemNode *source = NULL) const;
void DLL_EXPORT getModifiersWDescr(TModDescr &out) const; void DLL_EXPORT getModifiersWDescr(TModDescr &out) const;
void DLL_EXPORT getBonuses(BonusList &out, const CSelector &selector) const;
//special find functions //special find functions
DLL_EXPORT Bonus * getFirst(const CSelector &select); DLL_EXPORT Bonus * getFirst(const CSelector &select);
DLL_EXPORT const Bonus * getFirst(const CSelector &select) const; DLL_EXPORT const Bonus * getFirst(const CSelector &select) const;
void limit(const CBonusSystemNode &node); //erases bonuses using limitor void limit(const CBonusSystemNode &node); //erases bonuses using limitor
void DLL_EXPORT eliminateDuplicates();
template <typename Handler> void serialize(Handler &h, const int version) template <typename Handler> void serialize(Handler &h, const int version)
{ {
@@ -385,20 +387,17 @@ public:
//new bonusing node interface //new bonusing node interface
// * selector is predicate that tests if HeroBonus matches our criteria // * selector is predicate that tests if HeroBonus matches our criteria
// * root is node on which call was made (NULL will be replaced with this) // * root is node on which call was made (NULL will be replaced with this)
void getParents(TCNodes &out) const; //retrieves list of parent nodes (nodes to inherit bonuses from), source is the prinary asker
void getBonuses(BonusList &out, const CSelector &selector, const CBonusSystemNode *root = NULL) const;
virtual std::string bonusToString(Bonus *bonus, bool description) const {return "";}; //description or bonus name
//////////////////////////////////////////////////////////////////////////
//interface //interface
void getAllBonuses(BonusList &out, const CSelector &selector, const CSelector &limit, const CBonusSystemNode *root = NULL) const;
void getBonuses(BonusList &out, const CSelector &selector, const CSelector &limit, const CBonusSystemNode *root = NULL) const; //as above but without duplicates
void getBonuses(BonusList &out, const CSelector &selector, const CBonusSystemNode *root = NULL) const;
void getModifiersWDescr(TModDescr &out, const CSelector &selector) const; //out: pairs<modifier value, modifier description> void getModifiersWDescr(TModDescr &out, const CSelector &selector) const; //out: pairs<modifier value, modifier description>
int getBonusesCount(const CSelector &selector) const; int getBonusesCount(const CSelector &selector) const;
int valOfBonuses(const CSelector &selector) const; int valOfBonuses(const CSelector &selector) const;
bool hasBonus(const CSelector &selector) const; bool hasBonus(const CSelector &selector) const;
BonusList getBonuses(const CSelector &selector, const CSelector &limit) const; BonusList getBonuses(const CSelector &selector, const CSelector &limit) const;
void getBonuses(BonusList &out, const CSelector &selector, const CSelector &limit) const;
BonusList getBonuses(const CSelector &selector) const; BonusList getBonuses(const CSelector &selector) const;
void getParents(TCNodes &out) const; //retrieves list of parent nodes (nodes to inherit bonuses from),
//legacy interface //legacy interface
int valOfBonuses(Bonus::BonusType type, const CSelector &selector) const; int valOfBonuses(Bonus::BonusType type, const CSelector &selector) const;
@@ -446,6 +445,7 @@ public:
void battleTurnPassed(); //updates count of remaining turns and removed outdated bonuses void battleTurnPassed(); //updates count of remaining turns and removed outdated bonuses
void popBonuses(const CSelector &s); void popBonuses(const CSelector &s);
virtual std::string bonusToString(Bonus *bonus, bool description) const {return "";}; //description or bonus name
virtual std::string nodeName() const; virtual std::string nodeName() const;
void deserializationFix(); void deserializationFix();
void exportBonus(Bonus * b); void exportBonus(Bonus * b);