Browse Source

Moved CGOnceVisitable to config

Ivan Savenko 2 years ago
parent
commit
a6bda58276

+ 2 - 1
config/gameConfig.json

@@ -52,7 +52,8 @@
 		"config/objects/creatureBanks.json",
 		"config/objects/dwellings.json",
 		"config/objects/rewardable.json",
-		"config/objects/rewardablePickable.json"
+		"config/objects/rewardablePickable.json",
+		"config/objects/rewardableOnceVisitable.json"
 	],
 
 	"artifacts" :

+ 0 - 77
config/objects/rewardable.json

@@ -84,83 +84,6 @@
 			}
 		}
 	},
-	
-	"leanTo" :{
-		"index" : 39,
-		"handler": "onceVisitable",
-		"base" : {
-			"sounds" : {
-				"visit" : ["GENIE"]
-			}
-		},
-		"types" : {
-			"object" : {
-				"index" : 0,
-				"aiValue" : 500,
-				"rmg" : {
-					"value"		: 500,
-					"rarity"	: 100
-				}
-			}
-		}
-	},
-	"corpse" :{
-		"index" : 22,
-		"handler": "onceVisitable",
-		"base" : {
-			"sounds" : {
-				"visit" : ["MYSTERY"]
-			}
-		},
-		"types" : {
-			"object" : {
-				"index" : 0,
-				"aiValue" : 500,
-				"rmg" : {
-					"value"		: 500,
-					"rarity"	: 100
-				}
-			}
-		}
-	},
-	"wagon" :{
-		"index" : 105,
-		"handler": "onceVisitable",
-		"base" : {
-			"sounds" : {
-				"visit" : ["GENIE"]
-			}
-		},
-		"types" : {
-			"object" : {
-				"index" : 0,
-				"aiValue" : 500,
-				"rmg" : {
-					"value"		: 500,
-					"rarity"	: 50
-				}
-			}
-		}
-	},
-	"warriorTomb" : {
-		"index" : 108,
-		"handler": "onceVisitable",
-		"base" : {
-			"sounds" : {
-				"visit" : ["GRAVEYARD"]
-			}
-		},
-		"types" : {
-			"object" : {
-				"index" : 0,
-				"aiValue" : 6000,
-				"rmg" : {
-					"value"		: 6000,
-					"rarity"	: 20
-				}
-			}
-		}
-	},
 	"arena" : {
 		"index" : 4,
 		"handler": "oncePerHero",

+ 172 - 0
config/objects/rewardableOnceVisitable.json

@@ -0,0 +1,172 @@
+{
+	/// These are objects that covered by concept of "configurable object" and have their entire configuration in this config
+
+	"leanTo" :{
+		"index" : 39,
+		"handler": "configurable",
+		"base" : {
+			"sounds" : {
+				"visit" : ["GENIE"]
+			}
+		},
+		"types" : {
+			"leanTo" : {
+				"index" : 0,
+				"aiValue" : 500,
+				"rmg" : {
+					"value"		: 500,
+					"rarity"	: 100
+				},
+				
+				"onEmptyMessage" : 65,
+				"visitMode" : "once",
+				"selectMode" : "selectFirst",
+				"rewards" : [
+					{
+						"message" : 64,
+						"resources" : [
+							{
+								"list" : [ "wood", "ore", "mercury", "gems", "sulfur", "crystal" ],
+								"min" : 1,
+								"max" : 5
+							}
+						]
+					}
+				]				
+			}
+		}
+	},
+	"corpse" :{
+		"index" : 22,
+		"handler": "configurable",
+		"base" : {
+			"sounds" : {
+				"visit" : ["MYSTERY"]
+			}
+		},
+		"types" : {
+			"corpse" : {
+				"index" : 0,
+				"aiValue" : 500,
+				"rmg" : {
+					"value"		: 500,
+					"rarity"	: 100
+				},
+				
+				"onEmptyMessage" : 38,
+				"blockedVisitable" : true,
+				"visitMode" : "once",
+				"selectMode" : "selectFirst",
+				"rewards" : [
+					{
+						"appearChance" : { "max" : 10 },
+						"message" : 37,
+						"artifacts" : [ { "class" : "TREASURE" } ]
+					},
+					{
+						"appearChance" : { "min" : 10, "max" : 20 },
+						"message" : 37,
+						"artifacts" : [ { "class" : "MINOR" } ]
+					}
+				]
+
+			}
+		}
+	},
+	"wagon" :{
+		"index" : 105,
+		"handler": "configurable",
+		"base" : {
+			"sounds" : {
+				"visit" : ["GENIE"]
+			}
+		},
+		"types" : {
+			"wagon" : {
+				"index" : 0,
+				"aiValue" : 500,
+				"rmg" : {
+					"value"		: 500,
+					"rarity"	: 50
+				},
+				
+				"onEmptyMessage" : 156,
+				"visitMode" : "once",
+				"selectMode" : "selectFirst",
+				"rewards" : [
+					{
+						"appearChance" : { "max" : 20 },
+						"message" : 155,
+						"artifacts" : [ { "class" : "TREASURE" } ]
+					},
+					{
+						"appearChance" : { "min" : 20, "max" : 40 },
+						"message" : 155,
+						"artifacts" : [ { "class" : "MINOR" } ]
+					},
+					{
+						"message" : 154,
+						"appearChance" : { "min" : 40, "max" : 90 },
+						"resources" : [
+							{
+								"list" : [ "wood", "ore", "mercury", "gems", "sulfur", "crystal" ],
+								"min" : 2,
+								"max" : 5
+							},
+						]
+					}
+				]
+			}
+		}
+	},
+	"warriorTomb" : {
+		"index" : 108,
+		"handler": "configurable",
+		"base" : {
+			"sounds" : {
+				"visit" : ["GRAVEYARD"]
+			}
+		},
+		"types" : {
+			"warriorTomb" : {
+				"index" : 0,
+				"aiValue" : 6000,
+				"rmg" : {
+					"value"		: 6000,
+					"rarity"	: 20
+				},
+				
+				"onSelectMessage" : 161,
+				"onEmptyMessage" : 163,
+				"visitMode" : "once",
+				"selectMode" : "selectFirst",
+				"rewards" : [
+					{
+						"appearChance" : { "max" : 30 },
+						"message" : 162,
+						"artifacts" : [ { "class" : "TREASURE" } ],
+						"bonuses" : [ { "type" : "MORALE", "val" : -3, "duration" : "ONE_BATTLE" } ]
+					},
+					{
+						"appearChance" : { "min" : 30, "max" : 80 },
+						"message" : 162,
+						"artifacts" : [ { "class" : "MINOR" } ],
+						"bonuses" : [ { "type" : "MORALE", "val" : -3, "duration" : "ONE_BATTLE" } ]
+					},
+					{
+						"appearChance" : { "min" : 80, "max" : 95 },
+						"message" : 162,
+						"artifacts" : [ { "class" : "MAJOR" } ],
+						"bonuses" : [ { "type" : "MORALE", "val" : -3, "duration" : "ONE_BATTLE" } ]
+					},
+					{
+						"appearChance" : { "min" : 95 },
+						"message" : 162,
+						"artifacts" : [ { "class" : "RELIC" } ],
+						"bonuses" : [ { "type" : "MORALE", "val" : -3, "duration" : "ONE_BATTLE" } ]
+					}
+				]
+			}
+		}
+	}
+}

+ 1 - 1
config/objects/rewardablePickable.json

@@ -37,7 +37,7 @@
 								"type" : "gold",
 								"min" : 400,
 								"max" : 600
-							},
+							}
 						]
 					}
 				]

+ 0 - 1
lib/mapObjects/CObjectClassesHandler.cpp

@@ -71,7 +71,6 @@ CObjectClassesHandler::CObjectClassesHandler()
 	SET_HANDLER("mine", CGMine);
 	SET_HANDLER("obelisk", CGObelisk);
 	SET_HANDLER("observatory", CGObservatory);
-	SET_HANDLER("onceVisitable", CGOnceVisitable);
 	SET_HANDLER("pandora", CGPandoraBox);
 	SET_HANDLER("prison", CGHeroInstance);
 	SET_HANDLER("questGuard", CGQuestGuard);

+ 7 - 0
lib/mapObjects/CRewardableConstructor.cpp

@@ -101,6 +101,13 @@ void CRandomRewardObjectInfo::configureObject(CRewardableObject * object, CRando
 		info.reward.removeObject = reward["removeObject"].Bool();
 		info.reward.bonuses = JsonRandom::loadBonuses(reward["bonuses"]);
 
+		for (auto & bonus : info.reward.bonuses)
+		{
+			bonus.source = Bonus::OBJECT;
+			bonus.sid = object->ID;
+			//TODO: bonus.description = object->getObjectName();
+		}
+
 		info.reward.primary = JsonRandom::loadPrimary(reward["primary"], rng);
 		info.reward.secondary = JsonRandom::loadSecondary(reward["secondary"], rng);
 

+ 0 - 106
lib/mapObjects/CRewardableObject.cpp

@@ -471,32 +471,6 @@ CRewardableObject::CRewardableObject():
 ///               END OF CODE FOR CREWARDABLEOBJECT AND RELATED CLASSES                         ///
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-/// Helper, selects random art class based on weights
-static int selectRandomArtClass(CRandomGenerator & rand, int treasure, int minor, int major, int relic)
-{
-	int total = treasure + minor + major + relic;
-	assert(total != 0);
-	int hlp = rand.nextInt(total - 1);
-
-	if(hlp < treasure)
-		return CArtifact::ART_TREASURE;
-	if(hlp < treasure + minor)
-		return CArtifact::ART_MINOR;
-	if(hlp < treasure + minor + major)
-		return CArtifact::ART_MAJOR;
-	return CArtifact::ART_RELIC;
-}
-
-/// Helper, adds random artifact to reward selecting class based on weights
-static void loadRandomArtifact(CRandomGenerator & rand, CVisitInfo & info, int treasure, int minor, int major, int relic)
-{
-	int artClass = selectRandomArtClass(rand, treasure, minor, major, relic);
-	ArtifactID artID = VLC->arth->pickRandomArtifact(rand, artClass);
-	info.reward.artifacts.push_back(artID);
-}
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
 CGBonusingObject::CGBonusingObject()
 {
 	visitMode = VISIT_BONUS;
@@ -679,86 +653,6 @@ void CGBonusingObject::grantReward(ui32 rewardID, const CGHeroInstance * hero) c
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-CGOnceVisitable::CGOnceVisitable()
-{
-	visitMode = VISIT_ONCE;
-	selectMode = SELECT_FIRST;
-}
-
-void CGOnceVisitable::initObj(CRandomGenerator & rand)
-{
-	switch(ID)
-	{
-	case Obj::CORPSE:
-		{
-			onEmpty.addTxt(MetaString::ADVOB_TXT, 38);
-			blockVisit = true;
-			if(rand.nextInt(99) < 20)
-			{
-				info.resize(1);
-				loadRandomArtifact(rand, info[0], 10, 10, 10, 0);
-				info[0].message.addTxt(MetaString::ADVOB_TXT, 37);
-				info[0].limiter.numOfGrants = 1;
-			}
-		}
-		break;
-	case Obj::LEAN_TO:
-		{
-			onEmpty.addTxt(MetaString::ADVOB_TXT, 65);
-			info.resize(1);
-			int type =  rand.nextInt(5); //any basic resource without gold
-			int value = rand.nextInt(1, 4);
-			info[0].reward.resources[type] = value;
-			info[0].message.addTxt(MetaString::ADVOB_TXT, 64);
-			info[0].limiter.numOfGrants = 1;
-		}
-		break;
-	case Obj::WARRIORS_TOMB:
-		{
-			onSelect.addTxt(MetaString::ADVOB_TXT, 161);
-			onVisited.addTxt(MetaString::ADVOB_TXT, 163);
-
-			info.resize(1);
-			loadRandomArtifact(rand, info[0], 30, 50, 25, 5);
-
-			Bonus bonus(Bonus::ONE_BATTLE, Bonus::MORALE, Bonus::OBJECT, -3, ID);
-			info[0].reward.bonuses.push_back(bonus);
-			info[0].limiter.numOfGrants = 1;
-			info[0].message.addTxt(MetaString::ADVOB_TXT, 162);
-			info[0].message.addReplacement(VLC->arth->objects[info[0].reward.artifacts.back()]->getNameTranslated());
-		}
-		break;
-	case Obj::WAGON:
-		{
-			onVisited.addTxt(MetaString::ADVOB_TXT, 156);
-
-			int hlp = rand.nextInt(99);
-
-			if(hlp < 40) //minor or treasure art
-			{
-				info.resize(1);
-				loadRandomArtifact(rand, info[0], 10, 10, 0, 0);
-				info[0].limiter.numOfGrants = 1;
-				info[0].message.addTxt(MetaString::ADVOB_TXT, 155);
-				info[0].message.addReplacement(VLC->arth->objects[info[0].reward.artifacts.back()]->getNameTranslated());
-			}
-			else if(hlp < 90) //2 - 5 of non-gold resource
-			{
-				info.resize(1);
-				int type  = rand.nextInt(5);
-				int value = rand.nextInt(2, 5);
-				info[0].reward.resources[type] = value;
-				info[0].limiter.numOfGrants = 1;
-				info[0].message.addTxt(MetaString::ADVOB_TXT, 154);
-			}
-			// or nothing
-		}
-		break;
-	}
-}
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
 CGVisitableOPH::CGVisitableOPH()
 {
 	visitMode = VISIT_HERO;

+ 0 - 13
lib/mapObjects/CRewardableObject.h

@@ -314,19 +314,6 @@ public:
 	}
 };
 
-class DLL_LINKAGE CGOnceVisitable : public CRewardableObject // wagon, corpse, lean to, warriors tomb
-{
-public:
-	void initObj(CRandomGenerator & rand) override;
-
-	CGOnceVisitable();
-
-	template <typename Handler> void serialize(Handler &h, const int version)
-	{
-		h & static_cast<CRewardableObject&>(*this);
-	}
-};
-
 class DLL_LINKAGE CGVisitableOPH : public CRewardableObject //objects visitable only once per hero
 {
 public:

+ 0 - 2
lib/registerTypes/RegisterTypes.h

@@ -119,7 +119,6 @@ void registerTypesMapObjectTypes(Serializer &s)
 	REGISTER_GENERIC_HANDLER(CGMine);
 	REGISTER_GENERIC_HANDLER(CGObelisk);
 	REGISTER_GENERIC_HANDLER(CGObservatory);
-	REGISTER_GENERIC_HANDLER(CGOnceVisitable);
 	REGISTER_GENERIC_HANDLER(CGPandoraBox);
 	REGISTER_GENERIC_HANDLER(CGQuestGuard);
 	REGISTER_GENERIC_HANDLER(CGResource);
@@ -164,7 +163,6 @@ void registerTypesMapObjects2(Serializer &s)
 		s.template registerType<CRewardableObject, CGBonusingObject>();
 		s.template registerType<CRewardableObject, CGVisitableOPH>();
 		s.template registerType<CRewardableObject, CGVisitableOPW>();
-		s.template registerType<CRewardableObject, CGOnceVisitable>();
 			s.template registerType<CGVisitableOPW, CGMagicSpring>();
 
 	s.template registerType<CGObjectInstance, CTeamVisited>();