Browse Source

Try to improve bonus grouping in creature window

Ivan Savenko 5 months ago
parent
commit
9975852d33
1 changed files with 22 additions and 9 deletions
  1. 22 9
      client/windows/CCreatureWindow.cpp

+ 22 - 9
client/windows/CCreatureWindow.cpp

@@ -274,7 +274,7 @@ CStackWindow::BonusLineSection::BonusLineSection(CStackWindow * owner, size_t li
 			{BonusSource::STACK_EXPERIENCE,  Colors::CYAN},
 			{BonusSource::COMMANDER,         Colors::CYAN},
 		};
-		
+
 		std::map<BonusSource, std::string> bonusNames = {
 			{BonusSource::ARTIFACT,          LIBRARY->generaltexth->translate("vcmi.bonusSource.artifact")},
 			{BonusSource::ARTIFACT_INSTANCE, LIBRARY->generaltexth->translate("vcmi.bonusSource.artifact")},
@@ -853,6 +853,7 @@ void CStackWindow::init()
 void CStackWindow::initBonusesList()
 {
 	BonusList receivedBonuses = *info->stackNode->getBonuses(CSelector(Bonus::Permanent), Selector::all);
+	BonusList abilities = info->creature->getExportedBonusList();
 
 	std::sort(receivedBonuses.begin(), receivedBonuses.end(), [this](const std::shared_ptr<Bonus> & v1, const std::shared_ptr<Bonus> & v2){
 		if (v1->source != v2->source)
@@ -865,15 +866,27 @@ void CStackWindow::initBonusesList()
 			return  info->stackNode->bonusToString(v1, false) < info->stackNode->bonusToString(v2, false);
 	});
 
-	BonusList visibleBonuses;
+	std::vector<BonusList> groupedBonuses;
+	while (!receivedBonuses.empty())
+	{
+		auto currentBonus = receivedBonuses.front();
+
+		const auto & sameBonusPredicate = [currentBonus](const std::shared_ptr<Bonus> & b)
+		{
+			return currentBonus->type == b->type && currentBonus->subtype == b->subtype;
+		};
+
+		groupedBonuses.push_back({});
+
+		std::copy_if(receivedBonuses.begin(), receivedBonuses.end(), std::back_inserter(groupedBonuses.back()), sameBonusPredicate);
+		receivedBonuses.remove_if(Selector::typeSubtype(currentBonus->type, currentBonus->subtype));
+		abilities.remove_if(Selector::typeSubtype(currentBonus->type, currentBonus->subtype));
+	}
+
+	BonusList visibleBonuses = abilities;
 
-	for (const auto & bonus : info->stackNode->getExportedBonusList())
-		visibleBonuses.push_back(bonus);
-	for (const auto & bonus : info->creature->getExportedBonusList())
-		visibleBonuses.push_back(bonus);
-	for (const auto & bonus : receivedBonuses)
-		if (bonus->sid.as<CreatureID>() != info->stackNode->getId())
-			visibleBonuses.push_back(bonus);
+	for (const auto & group : groupedBonuses)
+		visibleBonuses.push_back(group.front());
 
 	BonusInfo bonusInfo;
 	for(auto b : visibleBonuses)