浏览代码

More fixes for weeks & growths.

DjWarmonger 15 年之前
父节点
当前提交
2c43707661
共有 5 个文件被更改,包括 10 次插入9 次删除
  1. 2 1
      client/CCastleInterface.cpp
  2. 4 3
      hch/CObjectHandler.cpp
  3. 1 1
      hch/CObjectHandler.h
  4. 1 4
      lib/NetPacksLib.cpp
  5. 2 0
      server/CGameHandler.cpp

+ 2 - 1
client/CCastleInterface.cpp

@@ -1161,7 +1161,8 @@ void CCastleInterface::CCreaInfo::clickRight(tribool down, bool previousState)
 				summ * CGI->creh->creatures[crid]->valOfBonuses(Bonus::CREATURE_GROWTH_PERCENT)/100);
 				summ * CGI->creh->creatures[crid]->valOfBonuses(Bonus::CREATURE_GROWTH_PERCENT)/100);
 
 
 			summ+=AddToString(CGI->generaltexth->artifNames[133] + " %+d",descr,
 			summ+=AddToString(CGI->generaltexth->artifNames[133] + " %+d",descr,
-				summ * ci->town->valOfGlobalBonuses(Bonus::CREATURE_GROWTH_PERCENT, -1)/100); //Statue of Legion 
+				summ * ci->town->valOfGlobalBonuses
+				(Selector::type(Bonus::CREATURE_GROWTH_PERCENT) && Selector::sourceType(Bonus::ARTIFACT))/100); //Statue of Legion 
 
 
 			if(ci->town->town->hordeLvl[0]==level)//horde, x to summ
 			if(ci->town->town->hordeLvl[0]==level)//horde, x to summ
 			if((bld.find(18)!=bld.end()) || (bld.find(19)!=bld.end()))
 			if((bld.find(18)!=bld.end()) || (bld.find(19)!=bld.end()))

+ 4 - 3
hch/CObjectHandler.cpp

@@ -1949,7 +1949,8 @@ int CGTownInstance::creatureGrowth(const int & level) const
 	ret *= (1 + VLC->creh->creatures[creid]->valOfBonuses(Bonus::CREATURE_GROWTH_PERCENT)/100); // double growth or plague
 	ret *= (1 + VLC->creh->creatures[creid]->valOfBonuses(Bonus::CREATURE_GROWTH_PERCENT)/100); // double growth or plague
 	if(tempOwner != NEUTRAL_PLAYER)
 	if(tempOwner != NEUTRAL_PLAYER)
 	{
 	{
-		ret *= (100.0f + cb->gameState()->players[tempOwner].valOfBonuses(Bonus::CREATURE_GROWTH_PERCENT))/100; //Statue of Legion
+		ret *= (100.0f + cb->gameState()->players[tempOwner].valOfBonuses
+			(Selector::type(Bonus::CREATURE_GROWTH_PERCENT) && Selector::sourceType(Bonus::ARTIFACT)))/100; //Statue of Legion
 		for (std::vector<CGDwelling*>::const_iterator it = cb->gameState()->players[tempOwner].dwellings.begin(); it != cb->gameState()->players[tempOwner].dwellings.end(); ++it)
 		for (std::vector<CGDwelling*>::const_iterator it = cb->gameState()->players[tempOwner].dwellings.begin(); it != cb->gameState()->players[tempOwner].dwellings.end(); ++it)
 		{ //+1 for each dwelling
 		{ //+1 for each dwelling
 			if (VLC->creh->creatures[creid]->idNumber == (*it)->creatures[0].second[0])
 			if (VLC->creh->creatures[creid]->idNumber == (*it)->creatures[0].second[0])
@@ -6613,10 +6614,10 @@ void CArmedInstance::getBonuses(BonusList &out, const CSelector &selector, const
 	}
 	}
 }
 }
 
 
-int CArmedInstance::valOfGlobalBonuses(Bonus::BonusType type, int subtype) const
+int CArmedInstance::valOfGlobalBonuses(CSelector selector) const
 {
 {
 	//if (tempOwner != NEUTRAL_PLAYER)
 	//if (tempOwner != NEUTRAL_PLAYER)
-	return cb->gameState()->players[tempOwner].valOfBonuses(type, subtype);
+	return cb->gameState()->players[tempOwner].valOfBonuses(selector, this);
 }
 }
 
 
 bool IMarket::getOffer(int id1, int id2, int &val1, int &val2, EMarketMode mode) const
 bool IMarket::getOffer(int id1, int id2, int &val1, int &val2, EMarketMode mode) const

+ 1 - 1
hch/CObjectHandler.h

@@ -228,7 +228,7 @@ public:
 	//////////////////////////////////////////////////////////////////////////
 	//////////////////////////////////////////////////////////////////////////
 	void getParents(TCNodes &out, const CBonusSystemNode *root = NULL) const;
 	void getParents(TCNodes &out, const CBonusSystemNode *root = NULL) const;
 	void getBonuses(BonusList &out, const CSelector &selector, const CBonusSystemNode *root = NULL) const;
 	void getBonuses(BonusList &out, const CSelector &selector, const CBonusSystemNode *root = NULL) const;
-	int valOfGlobalBonuses(Bonus::BonusType type, int subtype) const; //used only for castle interface
+	int valOfGlobalBonuses(CSelector selector) const; //used only for castle interface
 	//////////////////////////////////////////////////////////////////////////
 	//////////////////////////////////////////////////////////////////////////
 
 
 	CArmedInstance();
 	CArmedInstance();

+ 1 - 4
lib/NetPacksLib.cpp

@@ -648,30 +648,27 @@ DLL_EXPORT void NewTurn::applyGs( CGameState *gs )
 			b.duration = Bonus::ONE_WEEK;
 			b.duration = Bonus::ONE_WEEK;
 			b.source = Bonus::SPECIAL_WEEK;
 			b.source = Bonus::SPECIAL_WEEK;
 			b.effectRange = Bonus::NO_LIMIT;
 			b.effectRange = Bonus::NO_LIMIT;
+			b.valType = Bonus::BASE_NUMBER; //certainly not intuitive
 			switch (specialWeek)
 			switch (specialWeek)
 			{
 			{
 				case DOUBLE_GROWTH:
 				case DOUBLE_GROWTH:
 					b.val = 100;
 					b.val = 100;
 					b.type = Bonus::CREATURE_GROWTH_PERCENT;
 					b.type = Bonus::CREATURE_GROWTH_PERCENT;
 					b.limiter = new CCreatureTypeLimiter(*VLC->creh->creatures[creatureid], false);
 					b.limiter = new CCreatureTypeLimiter(*VLC->creh->creatures[creatureid], false);
-					b.valType = Bonus::BASE_NUMBER; //certainly not intuitive
 					break;
 					break;
 				case BONUS_GROWTH:
 				case BONUS_GROWTH:
 					b.val = 5;
 					b.val = 5;
 					b.type = Bonus::CREATURE_GROWTH;
 					b.type = Bonus::CREATURE_GROWTH;
 					b.limiter = new CCreatureTypeLimiter(*VLC->creh->creatures[creatureid], false);
 					b.limiter = new CCreatureTypeLimiter(*VLC->creh->creatures[creatureid], false);
-					b.valType = Bonus::BASE_NUMBER;
 					break;
 					break;
 				case DEITYOFFIRE:
 				case DEITYOFFIRE:
 					b.val = 15;
 					b.val = 15;
 					b.type = Bonus::CREATURE_GROWTH;
 					b.type = Bonus::CREATURE_GROWTH;
 					b.limiter = new CCreatureTypeLimiter(*VLC->creh->creatures[42], true);
 					b.limiter = new CCreatureTypeLimiter(*VLC->creh->creatures[42], true);
-					b.valType = Bonus::BASE_NUMBER;
 					break;
 					break;
 				case PLAGUE:
 				case PLAGUE:
 					b.val = -100; //no basic creatures
 					b.val = -100; //no basic creatures
 					b.type = Bonus::CREATURE_GROWTH_PERCENT;
 					b.type = Bonus::CREATURE_GROWTH_PERCENT;
-					b.valType = Bonus::BASE_NUMBER;
 					break;
 					break;
 				default:
 				default:
 					b.val = 0;
 					b.val = 0;

+ 2 - 0
server/CGameHandler.cpp

@@ -1041,6 +1041,8 @@ void CGameHandler::newTurn()
 				n.specialWeek = NewTurn::NORMAL;
 				n.specialWeek = NewTurn::NORMAL;
 		}
 		}
 	}
 	}
+	else
+		n.specialWeek = NewTurn::NO_ACTION; //don't remove bonuses
 
 
 	std::map<ui32,CGHeroInstance *> pool = gs->hpool.heroesPool;
 	std::map<ui32,CGHeroInstance *> pool = gs->hpool.heroesPool;