mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	CMap removed from CArtifactSet level
This commit is contained in:
		| @@ -14,7 +14,6 @@ | ||||
| #include "GameSettings.h" | ||||
| #include "spells/CSpellHandler.h" | ||||
|  | ||||
| #include "mapping/CMap.h" | ||||
| #include "mapObjects/CGHeroInstance.h" | ||||
|  | ||||
| VCMI_LIB_NAMESPACE_BEGIN | ||||
| @@ -256,33 +255,23 @@ DLL_LINKAGE CArtifactInstance * ArtifactUtils::createNewArtifactInstance(const A | ||||
| 	return ArtifactUtils::createNewArtifactInstance(aid.toArtifact()); | ||||
| } | ||||
|  | ||||
| DLL_LINKAGE CArtifactInstance * ArtifactUtils::createArtifact(CMap * map, const ArtifactID & aid, SpellID spellID) | ||||
| DLL_LINKAGE CArtifactInstance * ArtifactUtils::createArtifact(const ArtifactID & aid, SpellID spellID) | ||||
| { | ||||
| 	CArtifactInstance * art = nullptr; | ||||
| 	if(aid.getNum() >= 0) | ||||
| 	{ | ||||
| 		if(spellID == SpellID::NONE) | ||||
| 		{ | ||||
| 			art = ArtifactUtils::createNewArtifactInstance(aid); | ||||
| 			return ArtifactUtils::createNewArtifactInstance(aid); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			art = ArtifactUtils::createScroll(spellID); | ||||
| 			return ArtifactUtils::createScroll(spellID); | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		art = new CArtifactInstance(); // random, empty | ||||
| 		return new CArtifactInstance(); // random, empty | ||||
| 	} | ||||
| 	map->addNewArtifactInstance(art); | ||||
| 	if(art->artType && art->isCombined()) | ||||
| 	{ | ||||
| 		for(auto & part : art->getPartsInfo()) | ||||
| 		{ | ||||
| 			map->addNewArtifactInstance(part.art); | ||||
| 		} | ||||
| 	} | ||||
| 	return art; | ||||
| } | ||||
|  | ||||
| DLL_LINKAGE void ArtifactUtils::insertScrrollSpellName(std::string & description, const SpellID & sid) | ||||
|   | ||||
| @@ -21,7 +21,6 @@ class CGHeroInstance; | ||||
| class CArtifactSet; | ||||
| class CArtifactInstance; | ||||
| struct ArtSlotInfo; | ||||
| class CMap; | ||||
|  | ||||
| namespace ArtifactUtils | ||||
| { | ||||
| @@ -43,7 +42,7 @@ namespace ArtifactUtils | ||||
| 	DLL_LINKAGE CArtifactInstance * createScroll(const SpellID & sid); | ||||
| 	DLL_LINKAGE CArtifactInstance * createNewArtifactInstance(const CArtifact * art); | ||||
| 	DLL_LINKAGE CArtifactInstance * createNewArtifactInstance(const ArtifactID & aid); | ||||
| 	DLL_LINKAGE CArtifactInstance * createArtifact(CMap * map, const ArtifactID & aid, SpellID spellID = SpellID::NONE); | ||||
| 	DLL_LINKAGE CArtifactInstance * createArtifact(const ArtifactID & aid, SpellID spellID = SpellID::NONE); | ||||
| 	DLL_LINKAGE void insertScrrollSpellName(std::string & description, const SpellID & sid); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -964,7 +964,7 @@ void CArtifactSet::artDeserializationFix(CBonusSystemNode *node) | ||||
| 			node->attachTo(*elem.second.artifact); | ||||
| } | ||||
|  | ||||
| void CArtifactSet::serializeJsonArtifacts(JsonSerializeFormat & handler, const std::string & fieldName, CMap * map) | ||||
| void CArtifactSet::serializeJsonArtifacts(JsonSerializeFormat & handler, const std::string & fieldName) | ||||
| { | ||||
| 	//todo: creature and commander artifacts | ||||
| 	if(handler.saving && artifactsInBackpack.empty() && artifactsWorn.empty()) | ||||
| @@ -972,7 +972,6 @@ void CArtifactSet::serializeJsonArtifacts(JsonSerializeFormat & handler, const s | ||||
|  | ||||
| 	if(!handler.saving) | ||||
| 	{ | ||||
| 		assert(map); | ||||
| 		artifactsInBackpack.clear(); | ||||
| 		artifactsWorn.clear(); | ||||
| 	} | ||||
| @@ -982,13 +981,13 @@ void CArtifactSet::serializeJsonArtifacts(JsonSerializeFormat & handler, const s | ||||
| 	switch(bearerType()) | ||||
| 	{ | ||||
| 	case ArtBearer::HERO: | ||||
| 		serializeJsonHero(handler, map); | ||||
| 		serializeJsonHero(handler); | ||||
| 		break; | ||||
| 	case ArtBearer::CREATURE: | ||||
| 		serializeJsonCreature(handler, map); | ||||
| 		serializeJsonCreature(handler); | ||||
| 		break; | ||||
| 	case ArtBearer::COMMANDER: | ||||
| 		serializeJsonCommander(handler, map); | ||||
| 		serializeJsonCommander(handler); | ||||
| 		break; | ||||
| 	default: | ||||
| 		assert(false); | ||||
| @@ -996,11 +995,11 @@ void CArtifactSet::serializeJsonArtifacts(JsonSerializeFormat & handler, const s | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void CArtifactSet::serializeJsonHero(JsonSerializeFormat & handler, CMap * map) | ||||
| void CArtifactSet::serializeJsonHero(JsonSerializeFormat & handler) | ||||
| { | ||||
| 	for(const auto & slot : ArtifactUtils::allWornSlots()) | ||||
| 	{ | ||||
| 		serializeJsonSlot(handler, slot, map); | ||||
| 		serializeJsonSlot(handler, slot); | ||||
| 	} | ||||
|  | ||||
| 	std::vector<ArtifactID> backpackTemp; | ||||
| @@ -1016,7 +1015,7 @@ void CArtifactSet::serializeJsonHero(JsonSerializeFormat & handler, CMap * map) | ||||
| 	{ | ||||
| 		for(const ArtifactID & artifactID : backpackTemp) | ||||
| 		{ | ||||
| 			auto * artifact = ArtifactUtils::createArtifact(map, artifactID); | ||||
| 			auto * artifact = ArtifactUtils::createArtifact(artifactID); | ||||
| 			auto slot = ArtifactPosition::BACKPACK_START + artifactsInBackpack.size(); | ||||
| 			if(artifact->artType->canBePutAt(this, slot)) | ||||
| 			{ | ||||
| @@ -1027,17 +1026,17 @@ void CArtifactSet::serializeJsonHero(JsonSerializeFormat & handler, CMap * map) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void CArtifactSet::serializeJsonCreature(JsonSerializeFormat & handler, CMap * map) | ||||
| void CArtifactSet::serializeJsonCreature(JsonSerializeFormat & handler) | ||||
| { | ||||
| 	logGlobal->error("CArtifactSet::serializeJsonCreature not implemented"); | ||||
| } | ||||
|  | ||||
| void CArtifactSet::serializeJsonCommander(JsonSerializeFormat & handler, CMap * map) | ||||
| void CArtifactSet::serializeJsonCommander(JsonSerializeFormat & handler) | ||||
| { | ||||
| 	logGlobal->error("CArtifactSet::serializeJsonCommander not implemented"); | ||||
| } | ||||
|  | ||||
| void CArtifactSet::serializeJsonSlot(JsonSerializeFormat & handler, const ArtifactPosition & slot, CMap * map) | ||||
| void CArtifactSet::serializeJsonSlot(JsonSerializeFormat & handler, const ArtifactPosition & slot) | ||||
| { | ||||
| 	ArtifactID artifactID; | ||||
|  | ||||
| @@ -1057,7 +1056,7 @@ void CArtifactSet::serializeJsonSlot(JsonSerializeFormat & handler, const Artifa | ||||
|  | ||||
| 		if(artifactID != ArtifactID::NONE) | ||||
| 		{ | ||||
| 			auto * artifact = ArtifactUtils::createArtifact(map, artifactID.toEnum()); | ||||
| 			auto * artifact = ArtifactUtils::createArtifact(artifactID.toEnum()); | ||||
|  | ||||
| 			if(artifact->artType->canBePutAt(this, slot)) | ||||
| 			{ | ||||
|   | ||||
| @@ -25,7 +25,6 @@ class CArtHandler; | ||||
| class CGHeroInstance; | ||||
| class CArtifactSet; | ||||
| class CArtifactInstance; | ||||
| class CMap; | ||||
| class JsonSerializeFormat; | ||||
|  | ||||
| #define ART_BEARER_LIST \ | ||||
| @@ -233,16 +232,16 @@ public: | ||||
|  | ||||
| 	void artDeserializationFix(CBonusSystemNode *node); | ||||
|  | ||||
| 	void serializeJsonArtifacts(JsonSerializeFormat & handler, const std::string & fieldName, CMap * map); | ||||
| 	void serializeJsonArtifacts(JsonSerializeFormat & handler, const std::string & fieldName); | ||||
| protected: | ||||
| 	std::pair<const CArtifactInstance *, const CArtifactInstance *> searchForConstituent(const ArtifactID & aid) const; | ||||
|  | ||||
| private: | ||||
| 	void serializeJsonHero(JsonSerializeFormat & handler, CMap * map); | ||||
| 	void serializeJsonCreature(JsonSerializeFormat & handler, CMap * map); | ||||
| 	void serializeJsonCommander(JsonSerializeFormat & handler, CMap * map); | ||||
| 	void serializeJsonHero(JsonSerializeFormat & handler); | ||||
| 	void serializeJsonCreature(JsonSerializeFormat & handler); | ||||
| 	void serializeJsonCommander(JsonSerializeFormat & handler); | ||||
|  | ||||
| 	void serializeJsonSlot(JsonSerializeFormat & handler, const ArtifactPosition & slot, CMap * map);//normal slots | ||||
| 	void serializeJsonSlot(JsonSerializeFormat & handler, const ArtifactPosition & slot);//normal slots | ||||
| }; | ||||
|  | ||||
| // Used to try on artifacts before the claimed changes have been applied | ||||
|   | ||||
| @@ -407,7 +407,8 @@ CGHeroInstance * CampaignState::crossoverDeserialize(const JsonNode & node, CMap | ||||
| 	hero->ID = Obj::HERO; | ||||
| 	hero->serializeJsonOptions(handler); | ||||
| 	if (map) | ||||
| 		hero->serializeJsonArtifacts(handler, "artifacts", map); | ||||
| 		hero->serializeJsonArtifacts(handler, "artifacts"); | ||||
| 	map->addNewArtifactInstance(*hero); | ||||
| 	return hero; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1686,7 +1686,7 @@ void CGHeroInstance::serializeCommonOptions(JsonSerializeFormat & handler) | ||||
| 	handler.serializeIdArray("spellBook", spells); | ||||
|  | ||||
| 	if(handler.saving) | ||||
| 		CArtifactSet::serializeJsonArtifacts(handler, "artifacts", nullptr); | ||||
| 		CArtifactSet::serializeJsonArtifacts(handler, "artifacts"); | ||||
| } | ||||
|  | ||||
| void CGHeroInstance::serializeJsonOptions(JsonSerializeFormat & handler) | ||||
|   | ||||
| @@ -519,10 +519,26 @@ void CMap::checkForObjectives() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void CMap::addNewArtifactInstance(CArtifactSet & artSet) | ||||
| { | ||||
| 	for(const auto & [slot, slotInfo] : artSet.artifactsWorn) | ||||
| 	{ | ||||
| 		if(!slotInfo.locked && slotInfo.getArt()) | ||||
| 			addNewArtifactInstance(slotInfo.artifact); | ||||
| 	} | ||||
| 	for(const auto & slotInfo : artSet.artifactsInBackpack) | ||||
| 		addNewArtifactInstance(slotInfo.artifact); | ||||
| } | ||||
|  | ||||
| void CMap::addNewArtifactInstance(ConstTransitivePtr<CArtifactInstance> art) | ||||
| { | ||||
| 	assert(art); | ||||
| 	assert(art->getId() == -1); | ||||
| 	art->setId(static_cast<ArtifactInstanceID>(artInstances.size())); | ||||
| 	artInstances.emplace_back(art); | ||||
| 		 | ||||
| 	for(const auto & partInfo : art->getPartsInfo()) | ||||
| 		addNewArtifactInstance(partInfo.art); | ||||
| } | ||||
|  | ||||
| void CMap::eraseArtifactInstance(CArtifactInstance * art) | ||||
|   | ||||
| @@ -20,6 +20,7 @@ | ||||
| VCMI_LIB_NAMESPACE_BEGIN | ||||
|  | ||||
| class CArtifactInstance; | ||||
| class CArtifactSet; | ||||
| class CGObjectInstance; | ||||
| class CGHeroInstance; | ||||
| class CCommanderInstance; | ||||
| @@ -102,6 +103,7 @@ public: | ||||
| 	void removeBlockVisTiles(CGObjectInstance * obj, bool total = false); | ||||
| 	void calculateGuardingGreaturePositions(); | ||||
|  | ||||
| 	void addNewArtifactInstance(CArtifactSet & artSet); | ||||
| 	void addNewArtifactInstance(ConstTransitivePtr<CArtifactInstance> art); | ||||
| 	void eraseArtifactInstance(CArtifactInstance * art); | ||||
|  | ||||
|   | ||||
| @@ -954,10 +954,11 @@ bool CMapLoaderH3M::loadArtifactToSlot(CGHeroInstance * hero, int slot) | ||||
| 	// H3 bug workaround - Enemy hero on 3rd scenario of Good1.h3c campaign ("Long Live The Queen") | ||||
| 	// He has Shackles of War (normally - MISC slot artifact) in LEFT_HAND slot set in editor | ||||
| 	// Artifact seems to be missing in game, so skip artifacts that don't fit target slot | ||||
| 	auto * artifact = ArtifactUtils::createArtifact(map, artifactID); | ||||
| 	auto * artifact = ArtifactUtils::createArtifact(artifactID); | ||||
| 	if(artifact->canBePutAt(hero, ArtifactPosition(slot))) | ||||
| 	{ | ||||
| 		artifact->putAt(*hero, ArtifactPosition(slot)); | ||||
| 		map->addNewArtifactInstance(artifact); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| @@ -1305,7 +1306,8 @@ CGObjectInstance * CMapLoaderH3M::readArtifact(const int3 & mapPosition, std::sh | ||||
| 		artID = ArtifactID(objectTemplate->subid); | ||||
| 	} | ||||
|  | ||||
| 	object->storedArtifact = ArtifactUtils::createArtifact(map, artID, spellID.getNum()); | ||||
| 	object->storedArtifact = ArtifactUtils::createArtifact(artID, spellID.getNum()); | ||||
| 	map->addNewArtifactInstance(object->storedArtifact); | ||||
| 	return object; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1107,13 +1107,15 @@ void CMapLoaderJson::MapObjectLoader::configure() | ||||
| 			artID = art->getArtifact(); | ||||
| 		} | ||||
|  | ||||
| 		art->storedArtifact = ArtifactUtils::createArtifact(owner->map, artID, spellID.getNum()); | ||||
| 		art->storedArtifact = ArtifactUtils::createArtifact(artID, spellID.getNum()); | ||||
| 		owner->map->addNewArtifactInstance(art->storedArtifact); | ||||
| 	} | ||||
|  | ||||
| 	if(auto * hero = dynamic_cast<CGHeroInstance *>(instance)) | ||||
| 	{ | ||||
| 		auto o = handler.enterStruct("options"); | ||||
| 		hero->serializeJsonArtifacts(handler, "artifacts", owner->map); | ||||
| 		hero->serializeJsonArtifacts(handler, "artifacts"); | ||||
| 		owner->map->addNewArtifactInstance(*hero); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user