Преглед на файлове

It is now possible to configure what exactly will be reset in object

Ivan Savenko преди 2 години
родител
ревизия
ecbcafefbc

+ 10 - 1
config/objects/rewardableBonusing.json

@@ -115,22 +115,31 @@
 				
 				"onVisitedMessage" : 56,
 				"visitMode" : "bonus",
-				"selectMode" : "selectRandom",
+				"selectMode" : "selectFirst",
+				"resetParameters" : {
+					"period" : 7,
+					"rewards" : true
+				},
+
 				"rewards" : [
 					{
 						"message" : 55,
+						"appearChance" : { "min" : 0, "max" : 25 },
 						"bonuses" : [ { "type" : "LUCK", "val" : -1, "duration" : "ONE_BATTLE", "desription" : 69 } ] // NOTE: strings has %s placeholder for morale value
 					},
 					{
 						"message" : 55,
+						"appearChance" : { "min" : 25, "max" : 50 },
 						"bonuses" : [ { "type" : "LUCK", "val" : 1, "duration" : "ONE_BATTLE", "desription" : 69 } ] // NOTE: strings has %s placeholder for morale value
 					},
 					{
 						"message" : 55,
+						"appearChance" : { "min" : 50, "max" : 75 },
 						"bonuses" : [ { "type" : "LUCK", "val" : 2, "duration" : "ONE_BATTLE", "desription" : 69 } ] // NOTE: strings has %s placeholder for morale value
 					},
 					{
 						"message" : 55,
+						"appearChance" : { "min" : 75, "max" : 100 },
 						"bonuses" : [ { "type" : "LUCK", "val" : 3, "duration" : "ONE_BATTLE", "desription" : 69 } ] // NOTE: strings has %s placeholder for morale value
 					},
 				]

+ 20 - 7
config/objects/rewardableOncePerWeek.json

@@ -1,6 +1,5 @@
 {
 	/// These are objects that covered by concept of "configurable object" and have their entire configuration in this config
-	
 	"magicWell" : {
 		"index" :49,
 		"handler" : "configurable",
@@ -21,14 +20,14 @@
 				
 				"onEmptyMessage" : 79,
 				"onVisitedMessage" : 78,
-				"resetDuration" : 1,
-				"visitMode" : "once",
+				"visitMode" : "bonus",
 				"selectMode" : "selectFirst",
 				"rewards" : [
 					{
 						"limiter" : {
 							"noneOf" : [ { "manaPercentage" : 100 } ]
 						},
+						"bonuses" : [ { "type" : "NONE", "duration" : "ONE_DAY"} ],
 						"message" : 77,
 						"manaPercentage" : 100
 					}
@@ -58,7 +57,10 @@
 				
 				"onEmptyMessage" : 76,
 				"onVisitedMessage" : 75,
-				"resetDuration" : 7,
+				"resetParameters" : {
+					"period" : 7,
+					"visitors" : true
+				},
 				"visitMode" : "once",
 				"selectMode" : "selectFirst",
 				"rewards" : [
@@ -92,7 +94,11 @@
 				},
 				
 				"onEmptyMessage" : 93,
-				"resetDuration" : 7,
+				"resetParameters" : {
+					"period" : 7,
+					"visitors" : true,
+					"rewards" : true
+				},
 				"visitMode" : "once",
 				"selectMode" : "selectFirst",
 				"rewards" : [
@@ -129,7 +135,11 @@
 				},
 				
 				"onEmptyMessage" : 169,
-				"resetDuration" : 7,
+				"resetParameters" : {
+					"period" : 7,
+					"visitors" : true,
+					"rewards" : true
+				},
 				"visitMode" : "once",
 				"selectMode" : "selectFirst",
 				"rewards" : [
@@ -166,7 +176,10 @@
 				},
 				
 				"onEmptyMessage" : 165,
-				"resetDuration" : 7,
+				"resetParameters" : {
+					"period" : 7,
+					"visitors" : true
+				},
 				"visitMode" : "once",
 				"selectMode" : "selectFirst",
 				"rewards" : [

+ 1 - 1
lib/NetPacks.h

@@ -1178,7 +1178,7 @@ namespace ObjProperty
 		BANK_DAYCOUNTER, BANK_RESET, BANK_CLEAR,
 
 		//object with reward
-		REWARD_RESET, REWARD_SELECT
+		REWARD_RANDOMIZE, REWARDS_CLEAR_GRANTS, REWARD_SELECT
 	};
 }
 

+ 14 - 2
lib/mapObjects/CRewardableConstructor.cpp

@@ -119,8 +119,18 @@ void CRandomRewardObjectInfo::configureReward(CRewardableObject * object, CRando
 	reward.creatures = JsonRandom::loadCreatures(source["creatures"], rng);
 }
 
+void CRandomRewardObjectInfo::configureResetInfo(CRewardableObject * object, CRandomGenerator & rng, CRewardResetInfo & resetParameters, const JsonNode & source) const
+{
+	resetParameters.period   = static_cast<ui32>(source["period"].Float());
+	resetParameters.visitors = source["visitors"].Bool();
+	resetParameters.grants   = source["grants"].Bool();
+	resetParameters.rewards  = source["rewards"].Bool();
+}
+
 void CRandomRewardObjectInfo::configureObject(CRewardableObject * object, CRandomGenerator & rng) const
 {
+	object->info.clear();
+
 	std::map<si32, si32> thrownDice;
 
 	for (const JsonNode & reward : parameters["rewards"].Vector())
@@ -147,7 +157,7 @@ void CRandomRewardObjectInfo::configureObject(CRewardableObject * object, CRando
 			}
 		}
 
-		CVisitInfo info;
+		CRewardVisitInfo info;
 		configureLimiter(object, rng, info.limiter, reward["limiter"]);
 		configureReward(object, rng, info.reward, reward);
 
@@ -168,7 +178,9 @@ void CRandomRewardObjectInfo::configureObject(CRewardableObject * object, CRando
 	object->onSelect  = loadMessage(parameters["onSelectMessage"]);
 	object->onVisited = loadMessage(parameters["onVisitedMessage"]);
 	object->onEmpty   = loadMessage(parameters["onEmptyMessage"]);
-	object->resetDuration = static_cast<ui16>(parameters["resetDuration"].Float());
+
+	configureResetInfo(object, rng, object->resetParameters, parameters["resetParameters"]);
+
 	object->canRefuse = parameters["canRefuse"].Bool();
 	
 	auto visitMode = parameters["visitMode"].String();

+ 1 - 0
lib/mapObjects/CRewardableConstructor.h

@@ -24,6 +24,7 @@ class DLL_LINKAGE CRandomRewardObjectInfo : public IObjectInfo
 	TRewardLimitersList configureSublimiters(CRewardableObject * object, CRandomGenerator & rng, const JsonNode & source) const;
 
 	void configureReward(CRewardableObject * object, CRandomGenerator & rng, CRewardInfo & info, const JsonNode & source) const;
+	void configureResetInfo(CRewardableObject * object, CRandomGenerator & rng, CRewardResetInfo & info, const JsonNode & source) const;
 public:
 	bool givesResources() const override;
 

+ 25 - 11
lib/mapObjects/CRewardableObject.cpp

@@ -102,7 +102,7 @@ std::vector<ui32> CRewardableObject::getAvailableRewards(const CGHeroInstance *
 
 	for(size_t i=0; i<info.size(); i++)
 	{
-		const CVisitInfo & visit = info[i];
+		const CRewardVisitInfo & visit = info[i];
 
 		if((visit.numOfGrantsAllowed == 0 || visit.numOfGrantsPerformed < visit.numOfGrantsAllowed) // reward has unlimited uses or some are still available
 			&& visit.limiter.heroAllowed(hero))
@@ -114,7 +114,7 @@ std::vector<ui32> CRewardableObject::getAvailableRewards(const CGHeroInstance *
 	return ret;
 }
 
-CVisitInfo CRewardableObject::getVisitInfo(int index, const CGHeroInstance *) const
+CRewardVisitInfo CRewardableObject::getVisitInfo(int index, const CGHeroInstance *) const
 {
 	return info[index];
 }
@@ -250,7 +250,7 @@ void CRewardableObject::grantReward(ui32 rewardID, const CGHeroInstance * hero)
 	grantRewardBeforeLevelup(getVisitInfo(rewardID, hero), hero);
 }
 
-void CRewardableObject::grantRewardBeforeLevelup(const CVisitInfo & info, const CGHeroInstance * hero) const
+void CRewardableObject::grantRewardBeforeLevelup(const CRewardVisitInfo & info, const CGHeroInstance * hero) const
 {
 	assert(hero);
 	assert(hero->tempOwner.isValidPlayer());
@@ -287,7 +287,7 @@ void CRewardableObject::grantRewardBeforeLevelup(const CVisitInfo & info, const
 	}
 }
 
-void CRewardableObject::grantRewardAfterLevelup(const CVisitInfo & info, const CGHeroInstance * hero) const
+void CRewardableObject::grantRewardAfterLevelup(const CRewardVisitInfo & info, const CGHeroInstance * hero) const
 {
 	if(info.reward.manaDiff || info.reward.manaPercentage >= 0)
 	{
@@ -392,7 +392,7 @@ CRewardableObject::EVisitMode CRewardableObject::getVisitMode() const
 
 ui16 CRewardableObject::getResetDuration() const
 {
-	return resetDuration;
+	return resetParameters.period;
 }
 
 void CRewardInfo::loadComponents(std::vector<Component> & comps,
@@ -468,7 +468,10 @@ void CRewardableObject::setPropertyDer(ui8 what, ui32 val)
 {
 	switch (what)
 	{
-		case ObjProperty::REWARD_RESET:
+		case ObjProperty::REWARD_RANDOMIZE:
+			initObj(cb->gameState()->getRandomGenerator());
+			break;
+		case ObjProperty::REWARDS_CLEAR_GRANTS:
 			for (auto & visit : info)
 				visit.numOfGrantsPerformed = 0;
 			break;
@@ -479,15 +482,27 @@ void CRewardableObject::setPropertyDer(ui8 what, ui32 val)
 	}
 }
 
-void CRewardableObject::triggerRewardReset() const
+void CRewardableObject::triggerReset() const
 {
-	cb->setObjProperty(id, ObjProperty::REWARD_RESET, 0);
+	if (resetParameters.rewards)
+	{
+		cb->setObjProperty(id, ObjProperty::REWARD_RANDOMIZE, 0);
+	}
+	if (resetParameters.grants)
+	{
+		cb->setObjProperty(id, ObjProperty::REWARDS_CLEAR_GRANTS, 0);
+	}
+	if (resetParameters.visitors)
+	{
+		ChangeObjectVisitors cov(ChangeObjectVisitors::VISITOR_CLEAR, id);
+		cb->sendAndApply(&cov);
+	}
 }
 
 void CRewardableObject::newTurn(CRandomGenerator & rand) const
 {
-	if (resetDuration != 0 && cb->getDate(Date::DAY) > 1 && (cb->getDate(Date::DAY) % resetDuration) == 1)
-		triggerRewardReset();
+	if (resetParameters.period != 0 && cb->getDate(Date::DAY) > 1 && (cb->getDate(Date::DAY) % resetParameters.period) == 1)
+		triggerReset();
 }
 
 void CRewardableObject::initObj(CRandomGenerator & rand)
@@ -499,7 +514,6 @@ CRewardableObject::CRewardableObject():
 	selectMode(0),
 	visitMode(0),
 	selectedReward(0),
-	resetDuration(0),
 	canRefuse(false)
 {}
 

+ 41 - 10
lib/mapObjects/CRewardableObject.h

@@ -88,6 +88,37 @@ public:
 	}
 };
 
+class DLL_LINKAGE CRewardResetInfo
+{
+public:
+	CRewardResetInfo()
+		: period(0)
+		, visitors(false)
+		, grants(false)
+		, rewards(false)
+	{}
+
+	/// if above zero, object state will be reset each resetDuration days
+	ui32 period;
+
+	/// if true - reset list of visitors (heroes & players) on reset
+	bool visitors;
+
+	/// if true - reset number of grants of rewards on reset
+	bool grants;
+
+	/// if true - re-randomize rewards on a new week
+	bool rewards;
+
+	template <typename Handler> void serialize(Handler &h, const int version)
+	{
+		h & period;
+		h & visitors;
+		h & grants;
+		h & rewards;
+	}
+};
+
 /// Reward that can be granted to a hero
 /// NOTE: eventually should replace seer hut rewards and events/pandoras
 class DLL_LINKAGE CRewardInfo
@@ -170,7 +201,7 @@ public:
 	}
 };
 
-class DLL_LINKAGE CVisitInfo
+class DLL_LINKAGE CRewardVisitInfo
 {
 public:
 	CRewardLimiter limiter;
@@ -188,7 +219,7 @@ public:
 	/// How many times this reward has been granted since last reset
 	si32 numOfGrantsPerformed;
 
-	CVisitInfo():
+	CRewardVisitInfo():
 		selectChance(0),
 		numOfGrantsAllowed(0),
 		numOfGrantsPerformed(0)
@@ -216,10 +247,10 @@ namespace Rewardable
 class DLL_LINKAGE CRewardableObject : public CArmedInstance
 {
 	/// function that must be called if hero got level-up during grantReward call
-	void grantRewardAfterLevelup(const CVisitInfo & reward, const CGHeroInstance * hero) const;
+	void grantRewardAfterLevelup(const CRewardVisitInfo & reward, const CGHeroInstance * hero) const;
 
 	/// grants reward to hero
-	void grantRewardBeforeLevelup(const CVisitInfo & reward, const CGHeroInstance * hero) const;
+	void grantRewardBeforeLevelup(const CRewardVisitInfo & reward, const CGHeroInstance * hero) const;
 
 public:
 	enum EVisitMode
@@ -245,12 +276,12 @@ protected:
 
 	virtual void grantReward(ui32 rewardID, const CGHeroInstance * hero) const;
 
-	virtual CVisitInfo getVisitInfo(int index, const CGHeroInstance *h) const;
+	virtual CRewardVisitInfo getVisitInfo(int index, const CGHeroInstance *h) const;
 
-	virtual void triggerRewardReset() const;
+	virtual void triggerReset() const;
 
 	/// Rewards that can be granted by an object
-	std::vector<CVisitInfo> info;
+	std::vector<CRewardVisitInfo> info;
 
 	/// MetaString's that contain text for messages for specific situations
 	MetaString onSelect;
@@ -264,8 +295,8 @@ protected:
 	/// reward selected by player
 	ui16 selectedReward;
 
-	/// object visitability info will be reset each resetDuration days
-	ui16 resetDuration;
+	/// how and when should the object be reset
+	CRewardResetInfo resetParameters;
 
 	/// if true - player can refuse visiting an object (e.g. Tomb)
 	bool canRefuse;
@@ -306,7 +337,7 @@ public:
 		h & static_cast<CArmedInstance&>(*this);
 		h & info;
 		h & canRefuse;
-		h & resetDuration;
+		h & resetParameters;
 		h & onSelect;
 		h & onVisited;
 		h & onEmpty;