mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	Fixes for artifact system - instances are serialized and synchronized. However, still some serializer issue prevents Scroll from working.
This commit is contained in:
		| @@ -113,7 +113,7 @@ public: | ||||
| 	void heroVisitCastle(int obj, int heroID){}; | ||||
| 	void stopHeroVisitCastle(int obj, int heroID){}; | ||||
| 	void giveHeroArtifact(int artid, int hid, int position){}; //pos==-1 - first free slot in backpack=0; pos==-2 - default if available or backpack | ||||
| 	void giveCustomArtifact(int artid, int hid, int position, int value){}; | ||||
| 	void giveNewArtifact(int hid, int position){}; | ||||
| 	bool removeArtifact(CArtifact* art, int hid){return false;}; | ||||
| 	void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool creatureBank = false, boost::function<void(BattleResult*)> cb = 0, const CGTownInstance *town = NULL){}; //use hero=NULL for no hero | ||||
| 	void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, boost::function<void(BattleResult*)> cb = 0, bool creatureBank = false){}; //if any of armies is hero, hero will be used | ||||
|   | ||||
| @@ -183,7 +183,7 @@ void CArtifact::getParents(TCNodes &out, const CBonusSystemNode *root /*= NULL*/ | ||||
|  | ||||
| void CScroll::Init() | ||||
| { | ||||
| 	bonuses.push_back (Bonus (Bonus::PERMANENT, Bonus::SPELL, Bonus::ARTIFACT, 0, id, spellid, Bonus::INDEPENDENT_MAX)); | ||||
| 	bonuses.push_back (Bonus (Bonus::PERMANENT, Bonus::SPELL, Bonus::ARTIFACT, 1, id, spellid, Bonus::INDEPENDENT_MAX)); | ||||
| 	//boost::algorithm::replace_first(description, "[spell name]", VLC->spellh->spells[spellid].name); | ||||
| } | ||||
|  | ||||
| @@ -756,32 +756,35 @@ void CArtHandler::equipArtifact(std::map<ui16, CArtifact*> &artifWorn, ui16 slot | ||||
| { | ||||
| 	unequipArtifact(artifWorn, slotID); | ||||
|  | ||||
| 	const CArtifact &artifact = *newArtifact; | ||||
|  | ||||
| 	// Add artifact. | ||||
| 	artifWorn[slotID] = const_cast<CArtifact*>(newArtifact); | ||||
|  | ||||
| 	// Add locks, in reverse order of being removed. | ||||
| 	if (artifact.constituents != NULL)  | ||||
| 	if (newArtifact) //false when artifact is NULL -> slot set to empty | ||||
| 	{ | ||||
| 		bool destConsumed = false; // Determines which constituent that will be counted for together with the artifact. | ||||
| 		const CArtifact &artifact = *newArtifact; | ||||
|  | ||||
| 		BOOST_FOREACH(ui32 constituentID, *artifact.constituents)  | ||||
| 		// Add artifact. | ||||
| 		artifWorn[slotID] = const_cast<CArtifact*>(newArtifact); | ||||
|  | ||||
| 		// Add locks, in reverse order of being removed. | ||||
| 		if (artifact.constituents != NULL)  | ||||
| 		{ | ||||
| 			const CArtifact &constituent = *artifacts[constituentID]; | ||||
| 			bool destConsumed = false; // Determines which constituent that will be counted for together with the artifact. | ||||
|  | ||||
| 			if (!destConsumed && vstd::contains(constituent.possibleSlots, slotID))  | ||||
| 			BOOST_FOREACH(ui32 constituentID, *artifact.constituents)  | ||||
| 			{ | ||||
| 				destConsumed = true; | ||||
| 			}  | ||||
| 			else  | ||||
| 			{ | ||||
| 				BOOST_FOREACH(ui16 slot, constituent.possibleSlots)  | ||||
| 				const CArtifact &constituent = *artifacts[constituentID]; | ||||
|  | ||||
| 				if (!destConsumed && vstd::contains(constituent.possibleSlots, slotID))  | ||||
| 				{ | ||||
| 					if (!vstd::contains(artifWorn, slot))  | ||||
| 					destConsumed = true; | ||||
| 				}  | ||||
| 				else  | ||||
| 				{ | ||||
| 					BOOST_FOREACH(ui16 slot, constituent.possibleSlots)  | ||||
| 					{ | ||||
| 						artifWorn[slot] = VLC->arth->artifacts[145]; //lock | ||||
| 						break; | ||||
| 						if (!vstd::contains(artifWorn, slot))  | ||||
| 						{ | ||||
| 							artifWorn[slot] = VLC->arth->artifacts[145]; //lock | ||||
| 							break; | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
|   | ||||
| @@ -588,7 +588,7 @@ DLL_EXPORT void NewObject::applyGs( CGameState *gs ) | ||||
| } | ||||
| DLL_EXPORT void NewArtifact::applyGs( CGameState *gs ) | ||||
| { | ||||
| 	CArtifact * art; | ||||
| 	IModableArt * art; | ||||
|  | ||||
| 	std::map<ui32,ui8>::iterator itr = VLC->arth->modableArtifacts.find(artid); | ||||
| 	switch (itr->second) | ||||
| @@ -605,11 +605,11 @@ DLL_EXPORT void NewArtifact::applyGs( CGameState *gs ) | ||||
| 			default: | ||||
| 				tlog1<<"unhandled customizable artifact!\n"; | ||||
| 	}; | ||||
| 	*art = *(VLC->arth->artifacts[artid]); //copy properties | ||||
| 	static_cast<IModableArt*>(art)->ID = gs->map->artInstances.size(); | ||||
| 	*art = *static_cast<IModableArt*>(VLC->arth->artifacts[artid]); //copy properties | ||||
| 	art->ID = gs->map->artInstances.size(); | ||||
| 	art->SetProperty (value); //init scroll, banner, commander art | ||||
| 	art->Init(); //set bonuses for new instance | ||||
| 	gs->map->artInstances.push_back(static_cast<IModableArt*>(art)); | ||||
| 	gs->map->artInstances.push_back(art); | ||||
| } | ||||
|  | ||||
| DLL_EXPORT void SetAvailableArtifacts::applyGs( CGameState *gs ) | ||||
|   | ||||
| @@ -289,7 +289,7 @@ struct DLL_EXPORT Mapa : public CMapHeader | ||||
| 	{ | ||||
| 		h & static_cast<CMapHeader&>(*this); | ||||
| 		h & rumors & allowedSpell & allowedAbilities & allowedArtifact & allowedHeroes & events & grailPos; | ||||
| 		h & monsters & heroesToBeat & artInstances; //hoprfully serialization is now automagical? | ||||
| 		h & monsters & heroesToBeat & artInstances; //hopefully serialization is now automagical? | ||||
|  | ||||
| 		//TODO: viccondetails | ||||
| 		if(h.saving) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user