Browse Source

Merge pull request #141 from vcmi/fix/oneWeekTurnsRemain

Bonus system: add turnsRemain support for ONE_WEEK duration
ArseniyShestakov 10 years ago
parent
commit
ac57eaf61d
3 changed files with 15 additions and 10 deletions
  1. 6 0
      lib/HeroBonus.cpp
  2. 5 7
      lib/HeroBonus.h
  3. 4 3
      lib/NetPacksLib.cpp

+ 6 - 0
lib/HeroBonus.cpp

@@ -780,6 +780,12 @@ void CBonusSystemNode::updateBonuses(const CSelector &s)
 
 void CBonusSystemNode::addNewBonus(Bonus *b)
 {
+	//turnsRemain shouldn't be zero for following durations
+	if(Bonus::NTurns(b) || Bonus::NDays(b) || Bonus::OneWeek(b))
+	{
+		assert(b->turnsRemain);
+	}
+
 	assert(!vstd::contains(exportedBonuses,b));
 	exportedBonuses.push_back(b);
 	exportBonus(b);

+ 5 - 7
lib/HeroBonus.h

@@ -294,7 +294,7 @@ struct DLL_LINKAGE Bonus
 	};
 
 	ui16 duration; //uses BonusDuration values
-	si16 turnsRemain; //used if duration is N_TURNS or N_DAYS
+	si16 turnsRemain; //used if duration is N_TURNS, N_DAYS or ONE_WEEK
 
 	BonusType type; //uses BonusType values - says to what is this bonus - 1 byte
 	TBonusSubtype subtype; //-1 if not applicable - 4 bytes
@@ -811,7 +811,7 @@ public:
 	bool operator()(const Bonus *bonus) const
 	{
 		return turnsRequested <= 0					//every present effect will last zero (or "less") turns
-			|| !(bonus->duration & Bonus::N_TURNS)	//so do every not expriing after N-turns effect
+			|| !Bonus::NTurns(bonus) //so do every not expriing after N-turns effect
 			|| bonus->turnsRemain > turnsRequested;
 	}
 	CWillLastTurns& operator()(const int &setVal)
@@ -828,13 +828,11 @@ public:
 
 	bool operator()(const Bonus *bonus) const
 	{
-		if(daysRequested <= 0)
+		if(daysRequested <= 0 || Bonus::Permanent(bonus) || Bonus::OneBattle(bonus))
 			return true;
-		else if(bonus->duration & Bonus::ONE_DAY)
+		else if(Bonus::OneDay(bonus))
 			return false;
-		else if(bonus->duration & Bonus::PERMANENT || bonus->duration & Bonus::ONE_BATTLE)
-			return true;
-		else if(bonus->duration & Bonus::N_DAYS)
+		else if(Bonus::NDays(bonus) || Bonus::OneWeek(bonus))
 		{
 			return bonus->turnsRemain > daysRequested;
 		}

+ 4 - 3
lib/NetPacksLib.cpp

@@ -263,6 +263,9 @@ DLL_LINKAGE void GiveBonus::applyGs( CGameState *gs )
 
 	assert(cbsn);
 
+	if(Bonus::OneWeek(&bonus))
+		bonus.turnsRemain = 8 - gs->getDate(Date::DAY_OF_WEEK); // set correct number of days before adding bonus
+
 	auto b = new Bonus(bonus);
 	cbsn->addNewBonus(b);
 
@@ -1023,10 +1026,8 @@ DLL_LINKAGE void NewTurn::applyGs( CGameState *gs )
 		creatureSet.second.applyGs(gs);
 
 	gs->globalEffects.popBonuses(Bonus::OneDay); //works for children -> all game objs
-	if(gs->getDate(Date::DAY_OF_WEEK) == 1) //new week
-		gs->globalEffects.popBonuses(Bonus::OneWeek); //works for children -> all game objs
-
 	gs->globalEffects.updateBonuses(Bonus::NDays);
+	gs->globalEffects.updateBonuses(Bonus::OneWeek);
 	//TODO not really a single root hierarchy, what about bonuses placed elsewhere? [not an issue with H3 mechanics but in the future...]
 
 	for(CGTownInstance* t : gs->map->towns)