| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 | 
							- /*
 
-  * CArtifactInstance.cpp, part of VCMI engine
 
-  *
 
-  * Authors: listed in file AUTHORS in main folder
 
-  *
 
-  * License: GNU General Public License v2.0 or later
 
-  * Full text of license available in license.txt file, in main folder
 
-  *
 
-  */
 
-  
 
- #include "StdInc.h"
 
- #include "CArtifactInstance.h"
 
- #include "ArtifactUtils.h"
 
- #include "CArtHandler.h"
 
- #include "NetPacksBase.h"
 
- VCMI_LIB_NAMESPACE_BEGIN
 
- void CCombinedArtifactInstance::addPart(CArtifactInstance * art, const ArtifactPosition & slot)
 
- {
 
- 	auto artInst = static_cast<CArtifactInstance*>(this);
 
- 	assert(vstd::contains_if(artInst->artType->getConstituents(),
 
- 		[=](const CArtifact * partType)
 
- 		{
 
- 			return partType->getId() == art->getTypeId();
 
- 		}));
 
- 	assert(art->getParentNodes().size() == 1  &&  art->getParentNodes().front() == art->artType);
 
- 	partsInfo.emplace_back(art, slot);
 
- 	artInst->attachTo(*art);
 
- }
 
- bool CCombinedArtifactInstance::isPart(const CArtifactInstance * supposedPart) const
 
- {
 
- 	if(supposedPart == this)
 
- 		return true;
 
- 	for(const PartInfo & constituent : partsInfo)
 
- 	{
 
- 		if(constituent.art == supposedPart)
 
- 			return true;
 
- 	}
 
- 	return false;
 
- }
 
- const std::vector<CCombinedArtifactInstance::PartInfo> & CCombinedArtifactInstance::getPartsInfo() const
 
- {
 
- 	return partsInfo;
 
- }
 
- void CCombinedArtifactInstance::addPlacementMap(CArtifactSet::ArtPlacementMap & placementMap)
 
- {
 
- 	if(!placementMap.empty())
 
- 		for(auto & part : partsInfo)
 
- 		{
 
- 			assert(placementMap.find(part.art) != placementMap.end());
 
- 			part.slot = placementMap.at(part.art);
 
- 		}
 
- }
 
- SpellID CScrollArtifactInstance::getScrollSpellID() const
 
- {
 
- 	auto artInst = static_cast<const CArtifactInstance*>(this);
 
- 	const auto bonus = artInst->getBonusLocalFirst(Selector::type()(BonusType::SPELL));
 
- 	if(!bonus)
 
- 	{
 
- 		logMod->warn("Warning: %s doesn't bear any spell!", artInst->nodeName());
 
- 		return SpellID::NONE;
 
- 	}
 
- 	return SpellID(bonus->subtype);
 
- }
 
- void CGrowingArtifactInstance::growingUp()
 
- {
 
- 	auto artInst = static_cast<CArtifactInstance*>(this);
 
- 	
 
- 	if(artInst->artType->isGrowing())
 
- 	{
 
- 		auto bonus = std::make_shared<Bonus>();
 
- 		bonus->type = BonusType::LEVEL_COUNTER;
 
- 		bonus->val = 1;
 
- 		bonus->duration = BonusDuration::COMMANDER_KILLED;
 
- 		artInst->accumulateBonus(bonus);
 
- 		for(const auto & bonus : artInst->artType->getBonusesPerLevel())
 
- 		{
 
- 			// Every n levels
 
- 			if(artInst->valOfBonuses(BonusType::LEVEL_COUNTER) % bonus.first == 0)
 
- 			{
 
- 				artInst->accumulateBonus(std::make_shared<Bonus>(bonus.second));
 
- 			}
 
- 		}
 
- 		for(const auto & bonus : artInst->artType->getThresholdBonuses())
 
- 		{
 
- 			// At n level
 
- 			if(artInst->valOfBonuses(BonusType::LEVEL_COUNTER) == bonus.first)
 
- 			{
 
- 				artInst->addNewBonus(std::make_shared<Bonus>(bonus.second));
 
- 			}
 
- 		}
 
- 	}
 
- }
 
- void CArtifactInstance::init()
 
- {
 
- 	// Artifact to be randomized
 
- 	id = static_cast<ArtifactInstanceID>(ArtifactID::NONE);
 
- 	setNodeType(ARTIFACT_INSTANCE);
 
- }
 
- CArtifactInstance::CArtifactInstance(CArtifact * art)
 
- {
 
- 	init();
 
- 	setType(art);
 
- }
 
- CArtifactInstance::CArtifactInstance()
 
- {
 
- 	init();
 
- }
 
- void CArtifactInstance::setType(CArtifact * art)
 
- {
 
- 	artType = art;
 
- 	attachTo(*art);
 
- }
 
- std::string CArtifactInstance::nodeName() const
 
- {
 
- 	return "Artifact instance of " + (artType ? artType->getJsonKey() : std::string("uninitialized")) + " type";
 
- }
 
- std::string CArtifactInstance::getDescription() const
 
- {
 
- 	std::string text = artType->getDescriptionTranslated();
 
- 	if(artType->isScroll())
 
- 		ArtifactUtils::insertScrrollSpellName(text, getScrollSpellID());
 
- 	return text;
 
- }
 
- ArtifactID CArtifactInstance::getTypeId() const
 
- {
 
- 	return artType->getId();
 
- }
 
- ArtifactInstanceID CArtifactInstance::getId() const
 
- {
 
- 	return id;
 
- }
 
- void CArtifactInstance::setId(ArtifactInstanceID id)
 
- {
 
- 	this->id = id;
 
- }
 
- bool CArtifactInstance::canBePutAt(const ArtifactLocation & al, bool assumeDestRemoved) const
 
- {
 
- 	return artType->canBePutAt(al.getHolderArtSet(), al.slot, assumeDestRemoved);
 
- }
 
- bool CArtifactInstance::isCombined() const
 
- {
 
- 	return artType->isCombined();
 
- }
 
- void CArtifactInstance::putAt(const ArtifactLocation & al)
 
- {
 
- 	auto placementMap = al.getHolderArtSet()->putArtifact(al.slot, this);
 
- 	addPlacementMap(placementMap);
 
- }
 
- void CArtifactInstance::removeFrom(const ArtifactLocation & al)
 
- {
 
- 	al.getHolderArtSet()->removeArtifact(al.slot);
 
- 	for(auto & part : partsInfo)
 
- 	{
 
- 		if(part.slot != ArtifactPosition::PRE_FIRST)
 
- 			part.slot = ArtifactPosition::PRE_FIRST;
 
- 	}
 
- }
 
- void CArtifactInstance::move(const ArtifactLocation & src, const ArtifactLocation & dst)
 
- {
 
- 	removeFrom(src);
 
- 	putAt(dst);
 
- }
 
- void CArtifactInstance::deserializationFix()
 
- {
 
- 	setType(artType);
 
- 	for(PartInfo & part : partsInfo)
 
- 		attachTo(*part.art);
 
- }
 
- VCMI_LIB_NAMESPACE_END
 
 
  |