|
@@ -95,7 +95,8 @@ const std::map<std::string, TPropagatorPtr> bonusPropagatorMap =
|
|
|
const std::map<std::string, TUpdaterPtr> bonusUpdaterMap =
|
|
|
{
|
|
|
{"TIMES_HERO_LEVEL", std::make_shared<TimesHeroLevelUpdater>()},
|
|
|
- {"TIMES_STACK_LEVEL", std::make_shared<TimesStackLevelUpdater>()}
|
|
|
+ {"TIMES_STACK_LEVEL", std::make_shared<TimesStackLevelUpdater>()},
|
|
|
+ {"ARMY_MOVEMENT", std::make_shared<ArmyMovementUpdater>()}
|
|
|
};
|
|
|
|
|
|
///CBonusProxy
|
|
@@ -565,11 +566,6 @@ std::shared_ptr<const Bonus> BonusList::getFirst(const CSelector &selector) cons
|
|
|
return nullptr;
|
|
|
}
|
|
|
|
|
|
-void BonusList::getBonuses(BonusList & out, const CSelector &selector) const
|
|
|
-{
|
|
|
- getBonuses(out, selector, nullptr);
|
|
|
-}
|
|
|
-
|
|
|
void BonusList::getBonuses(BonusList & out, const CSelector &selector, const CSelector &limit) const
|
|
|
{
|
|
|
out.reserve(bonuses.size());
|
|
@@ -1102,6 +1098,19 @@ std::shared_ptr<Bonus> CBonusSystemNode::getUpdatedBonus(const std::shared_ptr<B
|
|
|
return updater->createUpdatedBonus(b, * this);
|
|
|
}
|
|
|
|
|
|
+TConstBonusListPtr CBonusSystemNode::getUpdatedBonusList(const BonusList & out, const CSelector & sel) const
|
|
|
+{
|
|
|
+ auto ret = std::make_shared<BonusList>();
|
|
|
+ for(const auto & b : out)
|
|
|
+ {
|
|
|
+ if(sel(b.get()) && b->updater)
|
|
|
+ ret->push_back(getUpdatedBonus(b, b->updater));
|
|
|
+ else
|
|
|
+ ret->push_back(b);
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
CBonusSystemNode::CBonusSystemNode()
|
|
|
:CBonusSystemNode(false)
|
|
|
{
|
|
@@ -2553,6 +2562,30 @@ JsonNode TimesHeroLevelUpdater::toJsonNode() const
|
|
|
return JsonUtils::stringNode("TIMES_HERO_LEVEL");
|
|
|
}
|
|
|
|
|
|
+std::shared_ptr<Bonus> ArmyMovementUpdater::createUpdatedBonus(const std::shared_ptr<Bonus> & b, const CBonusSystemNode & context) const
|
|
|
+{
|
|
|
+ if(b->type == Bonus::MOVEMENT && context.getNodeType() == CBonusSystemNode::HERO)
|
|
|
+ {
|
|
|
+ auto newBonus = std::make_shared<Bonus>(*b);
|
|
|
+ newBonus->source = Bonus::ARMY;
|
|
|
+ newBonus->val = static_cast<const CGHeroInstance &>(context).getArmyMovementBonus();
|
|
|
+ return newBonus;
|
|
|
+ }
|
|
|
+ if(b->type != Bonus::MOVEMENT)
|
|
|
+ logGlobal->error("ArmyMovementUpdater should only be used for MOVEMENT bonus!");
|
|
|
+ return b;
|
|
|
+}
|
|
|
+
|
|
|
+std::string ArmyMovementUpdater::toString() const
|
|
|
+{
|
|
|
+ return "ArmyMovementUpdater";
|
|
|
+}
|
|
|
+
|
|
|
+JsonNode ArmyMovementUpdater::toJsonNode() const
|
|
|
+{
|
|
|
+ return JsonUtils::stringNode("ARMY_MOVEMENT");
|
|
|
+}
|
|
|
+
|
|
|
TimesStackLevelUpdater::TimesStackLevelUpdater()
|
|
|
{
|
|
|
}
|