Pārlūkot izejas kodu

Allow merging stack on recruitment to give place for recruited unit

Ivan Savenko 2 gadi atpakaļ
vecāks
revīzija
8a92941681

+ 19 - 9
client/windows/GUIClasses.cpp

@@ -158,23 +158,33 @@ void CRecruitmentWindow::select(std::shared_ptr<CCreatureCard> card)
 void CRecruitmentWindow::buy()
 {
 	CreatureID crid =  selected->creature->getId();
-	SlotID dstslot = dst-> getSlotFor(crid);
+	SlotID dstslot = dst->getSlotFor(crid);
 
 	if(!dstslot.validSlot() && (selected->creature->warMachine == ArtifactID::NONE)) //no available slot
 	{
-		std::string txt;
-		if(dst->ID == Obj::HERO)
+		std::pair<SlotID, SlotID> toMerge;
+		bool allowMerge = CGI->settings()->getBoolean(EGameSettings::DWELLINGS_ACCUMULATE_WHEN_OWNED);
+
+		if (allowMerge && dst->mergableStacks(toMerge))
 		{
-			txt = CGI->generaltexth->allTexts[425]; //The %s would join your hero, but there aren't enough provisions to support them.
-			boost::algorithm::replace_first(txt, "%s", slider->getValue() > 1 ? CGI->creh->objects[crid]->getNamePluralTranslated() : CGI->creh->objects[crid]->getNameSingularTranslated());
+			LOCPLINT->cb->mergeStacks( dst, dst, toMerge.first, toMerge.second);
 		}
 		else
 		{
-			txt = CGI->generaltexth->allTexts[17]; //There is no room in the garrison for this army.
-		}
+			std::string txt;
+			if(dst->ID == Obj::HERO)
+			{
+				txt = CGI->generaltexth->allTexts[425]; //The %s would join your hero, but there aren't enough provisions to support them.
+				boost::algorithm::replace_first(txt, "%s", slider->getValue() > 1 ? CGI->creh->objects[crid]->getNamePluralTranslated() : CGI->creh->objects[crid]->getNameSingularTranslated());
+			}
+			else
+			{
+				txt = CGI->generaltexth->allTexts[17]; //There is no room in the garrison for this army.
+			}
 
-		LOCPLINT->showInfoDialog(txt);
-		return;
+			LOCPLINT->showInfoDialog(txt);
+			return;
+		}
 	}
 
 	onRecruit(crid, slider->getValue());

+ 2 - 0
config/gameConfig.json

@@ -311,6 +311,8 @@
 			"accumulateWhenNeutral" : false,
 			// if enabled, dwellings owned by players will accumulate creatures 
 			"accumulateWhenOwned" : false
+			// if enabled, game will attempt to merge slots in army on recruit if all slots in hero army are in use
+			"mergeOnRecruit" : true
 		},
 		
 		"markets" : 

+ 1 - 0
lib/GameSettings.cpp

@@ -68,6 +68,7 @@ void GameSettings::load(const JsonNode & input)
 		{EGameSettings::CREATURES_WEEKLY_GROWTH_PERCENT,        "creatures", "weeklyGrowthPercent"        },
 		{EGameSettings::DWELLINGS_ACCUMULATE_WHEN_NEUTRAL,      "dwellings", "accumulateWhenNeutral"      },
 		{EGameSettings::DWELLINGS_ACCUMULATE_WHEN_OWNED,        "dwellings", "accumulateWhenOwned"        },
+		{EGameSettings::DWELLINGS_MERGE_ON_RECRUIT,             "dwellings", "mergeOnRecruit"             },
 		{EGameSettings::HEROES_PER_PLAYER_ON_MAP_CAP,           "heroes",    "perPlayerOnMapCap"          },
 		{EGameSettings::HEROES_PER_PLAYER_TOTAL_CAP,            "heroes",    "perPlayerTotalCap"          },
 		{EGameSettings::HEROES_RETREAT_ON_WIN_WITHOUT_TROOPS,   "heroes",    "retreatOnWinWithoutTroops"  },

+ 1 - 0
lib/GameSettings.h

@@ -32,6 +32,7 @@ enum class EGameSettings
 	CREATURES_WEEKLY_GROWTH_PERCENT,
 	DWELLINGS_ACCUMULATE_WHEN_NEUTRAL,
 	DWELLINGS_ACCUMULATE_WHEN_OWNED,
+	DWELLINGS_MERGE_ON_RECRUIT,
 	HEROES_PER_PLAYER_ON_MAP_CAP,
 	HEROES_PER_PLAYER_TOTAL_CAP,
 	HEROES_RETREAT_ON_WIN_WITHOUT_TROOPS,

+ 15 - 0
lib/mapObjects/CGDwelling.cpp

@@ -324,6 +324,21 @@ void CGDwelling::heroAcceptsCreatures( const CGHeroInstance *h) const
 	{
 		if(count) //there are available creatures
 		{
+
+			if (VLC->settings()->getBoolean(EGameSettings::DWELLINGS_ACCUMULATE_WHEN_OWNED))
+			{
+				SlotID testSlot = h->getSlotFor(crid);
+				if(!testSlot.validSlot()) //no available slot - try merging army of visiting hero
+				{
+					std::pair<SlotID, SlotID> toMerge;
+					if (h->mergableStacks(toMerge))
+					{
+						cb->moveStack(StackLocation(h, toMerge.first), StackLocation(h, toMerge.second), -1); //merge toMerge.first into toMerge.second
+						assert(!h->hasStackAtSlot(toMerge.first)); //we have now a new free slot
+					}
+				}
+			}
+
 			SlotID slot = h->getSlotFor(crid);
 			if(!slot.validSlot()) //no available slot
 			{