diff --git a/lib/bonuses/BonusSelector.cpp b/lib/bonuses/BonusSelector.cpp index 1d57e8e13..1c75f1f4e 100644 --- a/lib/bonuses/BonusSelector.cpp +++ b/lib/bonuses/BonusSelector.cpp @@ -82,6 +82,13 @@ namespace Selector return CSelectFieldEqual(&Bonus::valType)(valType); } + CSelector DLL_LINKAGE typeSubtypeValueType(BonusType Type, BonusSubtypeID Subtype, BonusValueType valType) + { + return type()(Type) + .And(subtype()(Subtype)) + .And(valueType(valType)); + } + DLL_LINKAGE CSelector all([](const Bonus * b){return true;}); DLL_LINKAGE CSelector none([](const Bonus * b){return false;}); } diff --git a/lib/bonuses/BonusSelector.h b/lib/bonuses/BonusSelector.h index 4e2ebbc74..14fe31c92 100644 --- a/lib/bonuses/BonusSelector.h +++ b/lib/bonuses/BonusSelector.h @@ -139,6 +139,7 @@ namespace Selector CSelector DLL_LINKAGE source(BonusSource source, BonusSourceID sourceID); CSelector DLL_LINKAGE sourceTypeSel(BonusSource source); CSelector DLL_LINKAGE valueType(BonusValueType valType); + CSelector DLL_LINKAGE typeSubtypeValueType(BonusType Type, BonusSubtypeID Subtype, BonusValueType valType); /** * Selects all bonuses diff --git a/lib/bonuses/CBonusSystemNode.cpp b/lib/bonuses/CBonusSystemNode.cpp index 4de398409..8306e3ae1 100644 --- a/lib/bonuses/CBonusSystemNode.cpp +++ b/lib/bonuses/CBonusSystemNode.cpp @@ -356,7 +356,7 @@ void CBonusSystemNode::addNewBonus(const std::shared_ptr& b) void CBonusSystemNode::accumulateBonus(const std::shared_ptr& b) { - auto bonus = exportedBonuses.getFirst(Selector::typeSubtype(b->type, b->subtype)); //only local bonuses are interesting //TODO: what about value type? + auto bonus = exportedBonuses.getFirst(Selector::typeSubtypeValueType(b->type, b->subtype, b->valType)); //only local bonuses are interesting if(bonus) bonus->val += b->val; else diff --git a/server/CGameHandler.cpp b/server/CGameHandler.cpp index aa3ce8a6b..3a943d2b8 100644 --- a/server/CGameHandler.cpp +++ b/server/CGameHandler.cpp @@ -253,11 +253,12 @@ void CGameHandler::levelUpCommander (const CCommanderInstance * c, int skill) break; case ECommander::HEALTH: scp.accumulatedBonus.type = BonusType::STACK_HEALTH; - scp.accumulatedBonus.valType = BonusValueType::PERCENT_TO_BASE; + scp.accumulatedBonus.valType = BonusValueType::PERCENT_TO_ALL; //TODO: check how it accumulates in original WoG with artifacts such as vial of life blood, elixir of life etc. break; case ECommander::DAMAGE: scp.accumulatedBonus.type = BonusType::CREATURE_DAMAGE; - scp.accumulatedBonus.valType = BonusValueType::PERCENT_TO_BASE; + scp.accumulatedBonus.subtype = BonusCustomSubtype::creatureDamageBoth; + scp.accumulatedBonus.valType = BonusValueType::PERCENT_TO_ALL; break; case ECommander::SPEED: scp.accumulatedBonus.type = BonusType::STACKS_SPEED;