소스 검색

* fixed 8 hero limit to check only for wandering heroes (not garrisoned)
* srand at the beginning of handleConnection

Michał W. Urbańczyk 16 년 전
부모
커밋
7a9e323297
6개의 변경된 파일33개의 추가작업 그리고 8개의 파일을 삭제
  1. 2 2
      CCallback.cpp
  2. 2 2
      CCallback.h
  3. 19 1
      CCastleInterface.cpp
  4. 1 1
      CPlayerInterface.cpp
  5. 0 1
      lib/VCMI_Lib.cpp
  6. 9 1
      server/CGameHandler.cpp

+ 2 - 2
CCallback.cpp

@@ -145,10 +145,10 @@ const CGTownInstance * CCallback::getTownInfo(int val, bool mode) const //mode =
 	}
 	return NULL;
 }
-int CCallback::howManyHeroes() const
+int CCallback::howManyHeroes(bool includeGarrisoned) const
 {
 	boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
-	return gs->players[player].heroes.size();
+	return cl->getHeroCount(player,includeGarrisoned);
 }
 const CGHeroInstance * CCallback::getHeroInfo(int val, int mode) const //mode = 0 -> val = serial; mode = 1 -> val = ID
 {

+ 2 - 2
CCallback.h

@@ -56,7 +56,7 @@ public:
 	virtual std::vector< std::vector< std::vector<unsigned char> > > & getVisibilityMap()const =0; //returns visibility map (TODO: make it const)
 	virtual const CGHeroInstance * getHeroInfo(int val, int mode=2)const =0; //mode = 0 -> val = serial; mode = 1 -> val = ID
 	virtual int getResourceAmount(int type)const =0;
-	virtual int howManyHeroes()const =0;
+	virtual int howManyHeroes(bool includeGarrisoned = true)const =0;
 	virtual const CGTownInstance * getTownInfo(int val, bool mode)const =0; //mode = 0 -> val = serial; mode = 1 -> val = ID
 	virtual int howManyTowns()const =0;
 	virtual std::vector < std::string > getObjDescriptions(int3 pos)const =0; //returns descriptions of objects at pos in order from the lowest to the highest
@@ -148,7 +148,7 @@ public:
 	const CGHeroInstance * getHeroInfo(int val, int mode=2) const; //mode = 0 -> val = serial; mode = 1 -> val = ID
 	int getResourceAmount(int type) const;
 	std::vector<si32> getResourceAmount() const;
-	int howManyHeroes() const;
+	int howManyHeroes(bool includeGarrisoned = true) const;
 	const CGTownInstance * getTownInfo(int val, bool mode) const; //mode = 0 -> val = serial; mode = 1 -> val = ID
 	std::vector < const CGTownInstance *> getTownsInfo(bool onlyOur=true) const;
 	int howManyTowns()const;

+ 19 - 1
CCastleInterface.cpp

@@ -20,6 +20,7 @@
 #include <boost/algorithm/string.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/assign/std/vector.hpp> 
+#include <boost/lexical_cast.hpp>
 #include <cmath>
 #include <sstream>
 using namespace boost::assign;
@@ -252,8 +253,25 @@ void CHeroGSlot::clickLeft(boost::logic::tribool down)
 		}
 		else if(other->hero && other->highlight)
 		{
+			bool allow = true;
+			if(upg) //moving hero out of town - check if it is allowed
+			{
+				if(!hero && LOCPLINT->cb->howManyHeroes(false) >= 8)
+				{
+					std::string tmp = CGI->generaltexth->allTexts[18]; //You already have %d adventuring heroes under your command.
+					boost::algorithm::replace_first(tmp,"%d",boost::lexical_cast<std::string>(LOCPLINT->cb->howManyHeroes(false)));
+					LOCPLINT->showInfoDialog(tmp,std::vector<SComponent*>());
+					allow = false;
+				}
+				else if(!other->hero->army.slots.size()) //hero has no creatures - strange, but if we have appropriate error message...
+				{
+					LOCPLINT->showInfoDialog(CGI->generaltexth->allTexts[19],std::vector<SComponent*>()); //This hero has no creatures.  A hero must have creatures before he can brave the dangers of the countryside.
+					allow = false;
+				}
+			}
 			other->highlight = highlight = false;
-			LOCPLINT->cb->swapGarrisonHero(owner->town);
+			if(allow)
+				LOCPLINT->cb->swapGarrisonHero(owner->town);
 		}
 		else if(hero)
 		{

+ 1 - 1
CPlayerInterface.cpp

@@ -4426,7 +4426,7 @@ CTavernWindow::CTavernWindow(const CGHeroInstance *H1, const CGHeroInstance *H2,
 		recruit->hoverTexts[0] = CGI->generaltexth->tavernInfo[0]; //Cannot afford a Hero
 		recruit->block(2);
 	}
-	else if(LOCPLINT->cb->howManyHeroes() >= 8)
+	else if(LOCPLINT->cb->howManyHeroes(false) >= 8)
 	{
 		recruit->hoverTexts[0] = CGI->generaltexth->tavernInfo[1]; //Cannot recruit. You already have %d Heroes.
 		boost::algorithm::replace_first(recruit->hoverTexts[0],"%d",boost::lexical_cast<std::string>(LOCPLINT->cb->howManyHeroes()));

+ 0 - 1
lib/VCMI_Lib.cpp

@@ -24,7 +24,6 @@ DLL_EXPORT std::ostream *logfile = NULL
 ;
 DLL_EXPORT void initDLL(CLodHandler *b, CConsoleHandler *Console, std::ostream *Logfile)
 {
-	srand(time(NULL));
 	console = Console;
 	logfile = Logfile;
 	bitmaph=b;

+ 9 - 1
server/CGameHandler.cpp

@@ -485,6 +485,7 @@ void CGameHandler::prepareAttack(BattleAttack &bat, CStack *att, CStack *def)
 }
 void CGameHandler::handleConnection(std::set<int> players, CConnection &c)
 {
+	srand(time(NULL));
 	CPack *pack = NULL;
 	try
 	{
@@ -1746,6 +1747,13 @@ void CGameHandler::garrisonSwap(si32 tid)
 	}					
 	else if (town->garrisonHero && !town->visitingHero) //move hero out of the garrison
 	{
+		//check if moving hero out of town will break 8 wandering heroes limit
+		if(getHeroCount(town->garrisonHero->tempOwner,true) >= 8)
+		{
+			complain("Cannot move hero out of the garrison, there are already 8 wandering heroes!");
+			return;
+		}
+
 		SetHeroesInTown intown;
 		intown.tid = tid;
 		intown.garrison = -1;
@@ -1870,7 +1878,7 @@ void CGameHandler::hireHero( ui32 tid, ui8 hid )
 	if(!vstd::contains(t->builtBuildings,5) //no tavern in the town
 		|| gs->getPlayer(t->tempOwner)->resources[6]<2500 //not enough gold
 		|| t->visitingHero //there is visiting hero - no place
-		|| gs->getPlayer(t->tempOwner)->heroes.size()>7 //8 hero limit
+		|| getHeroCount(t->tempOwner,false) >= 8 && complain("Cannot hire hero, only 8 wandering heroes are allowed!")
 		)
 		return;
 	CGHeroInstance *nh = gs->getPlayer(t->tempOwner)->availableHeroes[hid];