mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	All CGPickable objects are now fully configurable
This commit is contained in:
		| @@ -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"] | ||||
| 					} | ||||
| 				] | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -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"   ); | ||||
|   | ||||
| @@ -205,7 +205,6 @@ public: | ||||
|  | ||||
| 	//objects | ||||
| 	LegacyTextContainer advobtxt; | ||||
| 	LegacyTextContainer xtrainfo; | ||||
| 	LegacyTextContainer restypes; //names of resources | ||||
| 	LegacyTextContainer randsign; | ||||
| 	LegacyTextContainer seerEmpty; | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
| @@ -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); | ||||
| 		 | ||||
|   | ||||
| @@ -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() | ||||
|   | ||||
| @@ -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: | ||||
|   | ||||
| @@ -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>(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user