Ver Fonte

Bonus system: add CWillLastDays selector

ArseniyShestakov há 10 anos atrás
pai
commit
ee1c5e452f
2 ficheiros alterados com 27 adições e 0 exclusões
  1. 1 0
      lib/HeroBonus.cpp
  2. 26 0
      lib/HeroBonus.h

+ 1 - 0
lib/HeroBonus.cpp

@@ -1201,6 +1201,7 @@ namespace Selector
 	DLL_LINKAGE CSelectFieldEqual<Bonus::BonusSource> sourceType(&Bonus::source);
 	DLL_LINKAGE CSelectFieldEqual<Bonus::LimitEffect> effectRange(&Bonus::effectRange);
 	DLL_LINKAGE CWillLastTurns turns;
+	DLL_LINKAGE CWillLastDays days;
 	DLL_LINKAGE CSelectFieldAny<Bonus::LimitEffect> anyRange(&Bonus::effectRange);
 
 	CSelector DLL_LINKAGE typeSubtype(Bonus::BonusType Type, TBonusSubtype Subtype)

+ 26 - 0
lib/HeroBonus.h

@@ -821,6 +821,31 @@ public:
 	}
 };
 
+class DLL_LINKAGE CWillLastDays
+{
+public:
+	int daysRequested;
+
+	bool operator()(const Bonus *bonus) const
+	{
+		if(daysRequested <= 0)
+			return true;
+		else if(bonus->duration & Bonus::ONE_DAY)
+			return false;
+		else if(bonus->duration & Bonus::N_DAYS)
+		{
+			return bonus->turnsRemain > daysRequested;
+		}
+
+		return false; // TODO: ONE_WEEK need support for turnsRemain, but for now we'll exclude all unhandled durations
+	}
+	CWillLastDays& operator()(const int &setVal)
+	{
+		daysRequested = setVal;
+		return *this;
+	}
+};
+
 //Stores multiple limiters. If any of them fails -> bonus is dropped.
 class DLL_LINKAGE LimiterList : public ILimiter
 {
@@ -959,6 +984,7 @@ namespace Selector
 	extern DLL_LINKAGE CSelectFieldEqual<Bonus::BonusSource> sourceType;
 	extern DLL_LINKAGE CSelectFieldEqual<Bonus::LimitEffect> effectRange;
 	extern DLL_LINKAGE CWillLastTurns turns;
+	extern DLL_LINKAGE CWillLastDays days;
 	extern DLL_LINKAGE CSelectFieldAny<Bonus::LimitEffect> anyRange;
 
 	CSelector DLL_LINKAGE typeSubtype(Bonus::BonusType Type, TBonusSubtype Subtype);