Browse Source

Support rewardable objects

nordsoft 3 years ago
parent
commit
7dc05d8e81

+ 22 - 4
lib/mapObjects/CRewardableConstructor.cpp

@@ -111,16 +111,35 @@ void CRandomRewardObjectInfo::configureObject(CRewardableObject * object, CRando
 
 		info.message = loadMessage(reward["message"]);
 		info.selectChance = JsonRandom::loadValue(reward["selectChance"], rng);
+		
+		object->info.push_back(info);
 	}
 
 	object->onSelect  = loadMessage(parameters["onSelectMessage"]);
 	object->onVisited = loadMessage(parameters["onVisitedMessage"]);
 	object->onEmpty   = loadMessage(parameters["onEmptyMessage"]);
-
-	//TODO: visitMode and selectMode
-
 	object->resetDuration = static_cast<ui16>(parameters["resetDuration"].Float());
 	object->canRefuse = parameters["canRefuse"].Bool();
+	
+	auto visitMode = parameters["visitMode"].String();
+	for(int i = 0; Rewardable::VisitModeString.size(); ++i)
+	{
+		if(Rewardable::VisitModeString[i] == visitMode)
+		{
+			object->visitMode = i;
+			break;
+		}
+	}
+	
+	auto selectMode = parameters["selectMode"].String();
+	for(int i = 0; Rewardable::SelectModeString.size(); ++i)
+	{
+		if(Rewardable::SelectModeString[i] == selectMode)
+		{
+			object->selectMode = i;
+			break;
+		}
+	}	
 }
 
 bool CRandomRewardObjectInfo::givesResources() const
@@ -179,7 +198,6 @@ CRewardableConstructor::CRewardableConstructor()
 
 void CRewardableConstructor::initTypeData(const JsonNode & config)
 {
-	AObjectTypeHandler::init(config);
 	objectInfo.init(config);
 }
 

+ 5 - 0
lib/mapObjects/CRewardableObject.cpp

@@ -446,6 +446,11 @@ void CRewardableObject::newTurn(CRandomGenerator & rand) const
 		triggerRewardReset();
 }
 
+void CRewardableObject::initObj(CRandomGenerator & rand)
+{
+	VLC->objtypeh->getHandlerFor(ID, subID)->configureObject(this, rand);
+}
+
 CRewardableObject::CRewardableObject():
 	selectMode(0),
 	visitMode(0),

+ 8 - 0
lib/mapObjects/CRewardableObject.h

@@ -175,6 +175,12 @@ public:
 	}
 };
 
+namespace Rewardable
+{
+	const std::array<std::string, 3> SelectModeString{"selectFirst", "selectPlayer", "selectRandom"};
+	const std::array<std::string, 5> VisitModeString{"unlimited", "once", "hero", "bonus", "player"};
+}
+
 /// Base class that can handle granting rewards to visiting heroes.
 /// Inherits from CArmedInstance for proper trasfer of armies
 class DLL_LINKAGE CRewardableObject : public CArmedInstance
@@ -256,6 +262,8 @@ public:
 
 	/// function that will be called once reward is fully granted to hero
 	virtual void onRewardGiven(const CGHeroInstance * hero) const;
+	
+	void initObj(CRandomGenerator & rand) override;
 
 	CRewardableObject();