Browse Source

All CGPickable objects are now fully configurable

Ivan Savenko 3 years ago
parent
commit
83bb70cd8a

+ 158 - 11
config/objects/rewardable.json

@@ -173,13 +173,34 @@
 			}
 		},
 		"types" : {
-			"object" : {
+			"campfire" : {
+				//EXPERNCE.WAV
 				"index" : 0,
 				"aiValue" : 2000,
 				"rmg" : {
 					"value"		: 2000,
 					"rarity"	: 500
-				}
+				},
+				"visitMode" : "unlimited",
+				"selectMode" : "player",
+				"rewards" : [
+					{
+						"message" : 23,
+						"removeObject" : true,
+						"resources" : [
+							{
+								"type" : [ "wood", "ore", "mercury", "gems", "sulfur", "crystal" ],
+								"min" : 4,
+								"max" : 6
+							},
+							{
+								"type" : "gold",
+								"min" : 400,
+								"max" : 600
+							},
+						]
+					}
+				]
 			}
 		}
 	},
@@ -193,13 +214,38 @@
 			}
 		},
 		"types" : {
-			"object" : {
+			"flotsam" : {
+				//GENIE.WAV
 				"index" : 0,
 				"aiValue" : 2000,
 				"rmg" : {
 					"value"		: 2000,
 					"rarity"	: 100
-				}
+				},
+				"visitMode" : "unlimited",
+				"selectMode" : "player",
+				"rewards" : [
+					{
+						"message" : 51,
+						"removeObject" : true,
+					},
+					{
+						"message" : 52,
+						"removeObject" : true,
+						"resources" : {
+							"wood" : 5,
+							"gold" : 200
+						}
+					},
+					{
+						"message" : 53,
+						"removeObject" : true,
+						"resources" : {
+							"wood" : 10,
+							"gold" : 500
+						}
+					}
+				]
 			}
 		}
 	},
@@ -213,13 +259,42 @@
 			}
 		},
 		"types" : {
-			"object" : {
+			"seaChest" : {
+				//CHEST.WAV
 				"index" : 0,
 				"aiValue" : 1500,
 				"rmg" : {
 					"value"		: 1500,
 					"rarity"	: 500
-				}
+				},
+				"visitMode" : "unlimited",
+				"selectMode" : "player",
+				"rewards" : [
+					{
+						"appearChance" : { "max" : 20 },
+						"message" : 116,
+						"removeObject" : true,
+					},
+					{
+						"appearChance" : { "min" : 20, "max" : 30 },
+						"message" : 117, //FIXME: this text contains placeholder for artifact name
+						"removeObject" : true,
+						"artifacts" : [
+							{ "class" : "TREASURE" }
+						],
+						"resources" : {
+							"gold" : 1000
+						}
+					},
+					{
+						"appearChance" : { "min" : 30 },
+						"message" : 118,
+						"removeObject" : true,
+						"resources" : {
+							"gold" : 1500
+						}
+					}
+				]
 			}
 		}
 	},
@@ -233,13 +308,42 @@
 			}
 		},
 		"types" : {
-			"object" : {
+			"shipwreckSurvivor" : {
+				//EXPERNCE.WAV
 				"index" : 0,
 				"aiValue" : 1500,
 				"rmg" : {
 					"value"		: 1500,
 					"rarity"	: 50
-				}
+				},
+				"visitMode" : "unlimited",
+				"selectMode" : "player",
+				"rewards" : [
+					{
+						"appearChance" : { "max" : 55 },
+						"message" : 125, //FIXME: this text contains placeholder for artifact name
+						"removeObject" : true,
+						"artifacts" : [ "TREASURE"]
+					},
+					{
+						"appearChance" : { "min" : 55, "max" : 75 },
+						"message" : 125, //FIXME: this text contains placeholder for artifact name
+						"removeObject" : true,
+						"artifacts" : [ "MINOR"]
+					},
+					{
+						"appearChance" : { "min" : 75, "max" : 95 },
+						"message" : 125, //FIXME: this text contains placeholder for artifact name
+						"removeObject" : true,
+						"artifacts" : [ "MAJOR"]
+					},
+					{
+						"appearChance" : { "min" : 95 },
+						"message" : 125, //FIXME: this text contains placeholder for artifact name
+						"removeObject" : true,
+						"artifacts" : [ "RELIC"]
+					}
+				]
 			}
 		}
 	},
@@ -253,13 +357,56 @@
 			}
 		},
 		"types" : {
-			"object" : {
+			"onSelect" : 146,
+			"treasureChest" : {
 				"index" : 0,
-				"aiValue" : 1500,
+				"aiValue" : 2000,
 				"rmg" : {
 					"value"		: 1500,
 					"rarity"	: 1000
-				}
+				},
+				//CHEST.WAV
+				"visitMode" : "unlimited",
+				"selectMode" : "player",
+				"rewards" : [
+					{
+						"appearChance" : { "max" : 33 },
+						"resources" : { "gold" : 2000 }
+						"removeObject" : true,
+					},
+					{
+						"appearChance" : { "max" : 33 },
+						"experience" : 1500
+						"removeObject" : true,
+					},
+					{
+						"appearChance" : { "min" : 33, "max" : 65 },
+						"resources" : { "gold" : 1500 }
+						"removeObject" : true,
+					},
+					{
+						"appearChance" : { "min" : 33, "max" : 65 },
+						"experience" : 1000
+						"removeObject" : true,
+					},
+					{
+						"appearChance" : { "min" : 65, "max" : 95 },
+						"resources" : { "gold" : 1000 }
+						"removeObject" : true,
+					},
+					{
+						"appearChance" : { "min" : 65, "max" : 95 },
+						"experience" : 500
+						"removeObject" : true,
+					},
+					{
+						//TREASURE.WAV
+						"appearChance" : { "min" : 95 },
+						"message" : 145, //FIXME: this text contains placeholder for artifact name
+						"removeObject" : true,
+						"artifacts" : [ "TREASURE"]
+					}
+				]
 			}
 		}
 	},

+ 0 - 3
lib/CGameState.cpp

@@ -142,9 +142,6 @@ void MetaString::getLocalString(const std::pair<ui8,ui32> &txt, std::string &dst
 		case GENERAL_TXT:
 			dst = VLC->generaltexth->translate("core.genrltxt", ser);
 			break;
-		case XTRAINFO_TXT:
-			dst = VLC->generaltexth->translate("core.xtrainfo", ser);
-			break;
 		case RES_NAMES:
 			dst = VLC->generaltexth->translate("core.restypes", ser);
 			break;

+ 0 - 2
lib/CGeneralTextHandler.cpp

@@ -419,7 +419,6 @@ CGeneralTextHandler::CGeneralTextHandler():
 	hcommands        (*this, "core.hallinfo" ),
 	fcommands        (*this, "core.castinfo" ),
 	advobtxt         (*this, "core.advevent" ),
-	xtrainfo         (*this, "core.xtrainfo" ),
 	restypes         (*this, "core.restypes" ),
 	randsign         (*this, "core.randsign" ),
 	overview         (*this, "core.overview" ),
@@ -450,7 +449,6 @@ CGeneralTextHandler::CGeneralTextHandler():
 	readToVector("core.hallinfo", "DATA/HALLINFO.TXT" );
 	readToVector("core.castinfo", "DATA/CASTINFO.TXT" );
 	readToVector("core.advevent", "DATA/ADVEVENT.TXT" );
-	readToVector("core.xtrainfo", "DATA/XTRAINFO.TXT" );
 	readToVector("core.restypes", "DATA/RESTYPES.TXT" );
 	readToVector("core.randsign", "DATA/RANDSIGN.TXT" );
 	readToVector("core.crgen1",   "DATA/CRGEN1.TXT"   );

+ 0 - 1
lib/CGeneralTextHandler.h

@@ -205,7 +205,6 @@ public:
 
 	//objects
 	LegacyTextContainer advobtxt;
-	LegacyTextContainer xtrainfo;
 	LegacyTextContainer restypes; //names of resources
 	LegacyTextContainer randsign;
 	LegacyTextContainer seerEmpty;

+ 1 - 1
lib/NetPacksBase.h

@@ -96,7 +96,7 @@ struct DLL_LINKAGE MetaString
 private:
 	enum EMessage {TEXACT_STRING, TLOCAL_STRING, TNUMBER, TREPLACE_ESTRING, TREPLACE_LSTRING, TREPLACE_NUMBER, TREPLACE_PLUSNUMBER};
 public:
-	enum {GENERAL_TXT=1, XTRAINFO_TXT, OBJ_NAMES, RES_NAMES, ART_NAMES, ARRAY_TXT, CRE_PL_NAMES, CREGENS, MINE_NAMES,
+	enum {GENERAL_TXT=1, OBJ_NAMES, RES_NAMES, ART_NAMES, ARRAY_TXT, CRE_PL_NAMES, CREGENS, MINE_NAMES,
 		MINE_EVNTS, ADVOB_TXT, ART_EVNTS, SPELL_NAME, SEC_SKILL_NAME, CRE_SING_NAMES, CREGENS4, COLOR, ART_DESCR, JK_TXT};
 
 	std::vector<ui8> message; //vector of EMessage

+ 0 - 1
lib/mapObjects/CObjectClassesHandler.cpp

@@ -73,7 +73,6 @@ CObjectClassesHandler::CObjectClassesHandler()
 	SET_HANDLER("observatory", CGObservatory);
 	SET_HANDLER("onceVisitable", CGOnceVisitable);
 	SET_HANDLER("pandora", CGPandoraBox);
-	SET_HANDLER("pickable", CGPickable);
 	SET_HANDLER("prison", CGHeroInstance);
 	SET_HANDLER("questGuard", CGQuestGuard);
 	SET_HANDLER("resource", CGResource);

+ 2 - 0
lib/mapObjects/CRewardableConstructor.cpp

@@ -113,6 +113,8 @@ void CRandomRewardObjectInfo::configureObject(CRewardableObject * object, CRando
 		info.reward.spells = JsonRandom::loadSpells(reward["spells"], rng, spells);
 		info.reward.creatures = JsonRandom::loadCreatures(reward["creatures"], rng);
 
+		info.reward.removeObject  = reward["removeObject"].Bool();
+
 		info.message = loadMessage(reward["message"]);
 		info.selectChance = JsonRandom::loadValue(reward["selectChance"], rng);
 		

+ 0 - 142
lib/mapObjects/CRewardableObject.cpp

@@ -489,148 +489,6 @@ static void loadRandomArtifact(CRandomGenerator & rand, CVisitInfo & info, int t
 	info.reward.artifacts.push_back(artID);
 }
 
-CGPickable::CGPickable()
-{
-	visitMode = VISIT_UNLIMITED;
-	selectMode = SELECT_PLAYER;
-}
-
-void CGPickable::initObj(CRandomGenerator & rand)
-{
-	blockVisit = true;
-	switch(ID)
-	{
-	case Obj::CAMPFIRE:
-		{
-			int givenRes = rand.nextInt(5);
-			int givenAmm = rand.nextInt(4, 6);
-
-			info.resize(1);
-			info[0].reward.resources[givenRes] = givenAmm;
-			info[0].reward.resources[Res::GOLD]= givenAmm * 100;
-			info[0].message.addTxt(MetaString::ADVOB_TXT,23);
-			info[0].reward.removeObject = true;
-			break;
-		}
-	case Obj::FLOTSAM:
-		{
-			int type = rand.nextInt(3);
-			switch(type)
-			{
-			case 0:
-					info.resize(1);
-					info[0].message.addTxt(MetaString::ADVOB_TXT, 51);
-					info[0].reward.removeObject = true;
-					break;
-			case 1:
-				{
-					info.resize(1);
-					info[0].reward.resources[Res::WOOD] = 5;
-					info[0].message.addTxt(MetaString::ADVOB_TXT, 52);
-					info[0].reward.removeObject = true;
-					break;
-				}
-			case 2:
-				{
-					info.resize(1);
-					info[0].reward.resources[Res::WOOD] = 5;
-					info[0].reward.resources[Res::GOLD] = 200;
-					info[0].message.addTxt(MetaString::ADVOB_TXT, 53);
-					info[0].reward.removeObject = true;
-					break;
-				}
-			case 3:
-				{
-					info.resize(1);
-					info[0].reward.resources[Res::WOOD] = 10;
-					info[0].reward.resources[Res::GOLD] = 500;
-					info[0].message.addTxt(MetaString::ADVOB_TXT, 54);
-					info[0].reward.removeObject = true;
-					break;
-				}
-			}
-			break;
-		}
-	case Obj::SEA_CHEST:
-		{
-			int hlp = rand.nextInt(99);
-			if(hlp < 20)
-			{
-				info.resize(1);
-				info[0].message.addTxt(MetaString::ADVOB_TXT, 116);
-				info[0].reward.removeObject = true;
-			}
-			else if(hlp < 90)
-			{
-				info.resize(1);
-				info[0].reward.resources[Res::GOLD] = 1500;
-				info[0].message.addTxt(MetaString::ADVOB_TXT, 118);
-				info[0].reward.removeObject = true;
-			}
-			else
-			{
-				info.resize(1);
-				loadRandomArtifact(rand, info[0], 100, 0, 0, 0);
-				info[0].reward.resources[Res::GOLD] = 1000;
-				info[0].message.addTxt(MetaString::ADVOB_TXT, 117);
-				info[0].message.addReplacement(MetaString::ART_NAMES, info[0].reward.artifacts.back());
-				info[0].reward.removeObject = true;
-			}
-		}
-		break;
-	case Obj::SHIPWRECK_SURVIVOR:
-		{
-			info.resize(1);
-			loadRandomArtifact(rand, info[0], 55, 20, 20, 5);
-			info[0].message.addTxt(MetaString::ADVOB_TXT, 125);
-			info[0].message.addReplacement(MetaString::ART_NAMES, info[0].reward.artifacts.back());
-			info[0].reward.removeObject = true;
-		}
-		break;
-	case Obj::TREASURE_CHEST:
-		{
-			int hlp = rand.nextInt(99);
-			if(hlp >= 95)
-			{
-				info.resize(1);
-				loadRandomArtifact(rand, info[0], 100, 0, 0, 0);
-				info[0].message.addTxt(MetaString::ADVOB_TXT,145);
-				info[0].message.addReplacement(MetaString::ART_NAMES, info[0].reward.artifacts.back());
-				info[0].reward.removeObject = true;
-				return;
-			}
-			else if (hlp >= 65)
-			{
-				onSelect.addTxt(MetaString::ADVOB_TXT,146);
-				info.resize(2);
-				info[0].reward.resources[Res::GOLD] = 2000;
-				info[1].reward.gainedExp = 1500;
-				info[0].reward.removeObject = true;
-				info[1].reward.removeObject = true;
-			}
-			else if(hlp >= 33)
-			{
-				onSelect.addTxt(MetaString::ADVOB_TXT,146);
-				info.resize(2);
-				info[0].reward.resources[Res::GOLD] = 1500;
-				info[1].reward.gainedExp = 1000;
-				info[0].reward.removeObject = true;
-				info[1].reward.removeObject = true;
-			}
-			else
-			{
-				onSelect.addTxt(MetaString::ADVOB_TXT,146);
-				info.resize(2);
-				info[0].reward.resources[Res::GOLD] = 1000;
-				info[1].reward.gainedExp = 500;
-				info[0].reward.removeObject = true;
-				info[1].reward.removeObject = true;
-			}
-		}
-		break;
-	}
-}
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 CGBonusingObject::CGBonusingObject()

+ 0 - 13
lib/mapObjects/CRewardableObject.h

@@ -287,19 +287,6 @@ public:
 	friend class CRandomRewardObjectInfo;
 };
 
-class DLL_LINKAGE CGPickable : public CRewardableObject //campfire, treasure chest, Flotsam, Shipwreck Survivor, Sea Chest
-{
-public:
-	void initObj(CRandomGenerator & rand) override;
-
-	CGPickable();
-
-	template <typename Handler> void serialize(Handler &h, const int version)
-	{
-		h & static_cast<CRewardableObject&>(*this);
-	}
-};
-
 class DLL_LINKAGE CGBonusingObject : public CRewardableObject //objects giving bonuses to luck/morale/movement
 {
 protected:

+ 0 - 2
lib/registerTypes/RegisterTypes.h

@@ -121,7 +121,6 @@ void registerTypesMapObjectTypes(Serializer &s)
 	REGISTER_GENERIC_HANDLER(CGObservatory);
 	REGISTER_GENERIC_HANDLER(CGOnceVisitable);
 	REGISTER_GENERIC_HANDLER(CGPandoraBox);
-	REGISTER_GENERIC_HANDLER(CGPickable);
 	REGISTER_GENERIC_HANDLER(CGQuestGuard);
 	REGISTER_GENERIC_HANDLER(CGResource);
 	REGISTER_GENERIC_HANDLER(CGScholar);
@@ -162,7 +161,6 @@ void registerTypesMapObjects2(Serializer &s)
 			s.template registerType<CGTownBuilding, COPWBonus>();
 
 	s.template registerType<CGObjectInstance, CRewardableObject>();
-		s.template registerType<CRewardableObject, CGPickable>();
 		s.template registerType<CRewardableObject, CGBonusingObject>();
 		s.template registerType<CRewardableObject, CGVisitableOPH>();
 		s.template registerType<CRewardableObject, CGVisitableOPW>();