瀏覽代碼

Fix commander ability accumulation, change commander ability bonus

Dydzio 1 年之前
父節點
當前提交
9e9849b741
共有 4 個文件被更改,包括 11 次插入3 次删除
  1. 7 0
      lib/bonuses/BonusSelector.cpp
  2. 1 0
      lib/bonuses/BonusSelector.h
  3. 1 1
      lib/bonuses/CBonusSystemNode.cpp
  4. 2 2
      server/CGameHandler.cpp

+ 7 - 0
lib/bonuses/BonusSelector.cpp

@@ -82,6 +82,13 @@ namespace Selector
 		return CSelectFieldEqual<BonusValueType>(&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;});
 }

+ 1 - 0
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

+ 1 - 1
lib/bonuses/CBonusSystemNode.cpp

@@ -356,7 +356,7 @@ void CBonusSystemNode::addNewBonus(const std::shared_ptr<Bonus>& b)
 
 void CBonusSystemNode::accumulateBonus(const std::shared_ptr<Bonus>& 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

+ 2 - 2
server/CGameHandler.cpp

@@ -253,11 +253,11 @@ 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;
 				break;
 			case ECommander::DAMAGE:
 				scp.accumulatedBonus.type = BonusType::CREATURE_DAMAGE;
-				scp.accumulatedBonus.valType = BonusValueType::PERCENT_TO_BASE;
+				scp.accumulatedBonus.valType = BonusValueType::PERCENT_TO_ALL;
 				break;
 			case ECommander::SPEED:
 				scp.accumulatedBonus.type = BonusType::STACKS_SPEED;