| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 | /* * MapIdentifiersH3M.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 "MapIdentifiersH3M.h"#include "../JsonNode.h"#include "../VCMI_Lib.h"#include "../CModHandler.h"#include "../CTownHandler.h"#include "../mapObjects/CObjectClassesHandler.h"#include "../filesystem/Filesystem.h"VCMI_LIB_NAMESPACE_BEGINtemplate<typename IdentifierID>void MapIdentifiersH3M::loadMapping(std::map<IdentifierID, IdentifierID> & result, const JsonNode & mapping, const std::string & identifierName){	for (auto entry : mapping.Struct())	{		IdentifierID sourceID (entry.second.Integer());		IdentifierID targetID (*VLC->modh->identifiers.getIdentifier(VLC->modh->scopeGame(), identifierName, entry.first));		result[sourceID] = targetID;	}}void MapIdentifiersH3M::loadMapping(const JsonNode & mapping){	for (auto entryFaction : mapping["buildings"].Struct())	{		FactionID factionID (*VLC->modh->identifiers.getIdentifier(VLC->modh->scopeGame(), "faction", entryFaction.first));		auto buildingMap = entryFaction.second;		for (auto entryBuilding : buildingMap.Struct())		{			BuildingID sourceID (entryBuilding.second.Integer());			BuildingID targetID (*VLC->modh->identifiers.getIdentifier(VLC->modh->scopeGame(), "building." + VLC->factions()->getById(factionID)->getJsonKey(), entryBuilding.first));			mappingFactionBuilding[factionID][sourceID] = targetID;		}	}	for (auto entryTemplate : mapping["templates"].Struct())	{		std::string h3mName = boost::to_lower_copy(entryTemplate.second.String());		std::string vcmiName = boost::to_lower_copy(entryTemplate.first);		if (!CResourceHandler::get()->existsResource(ResourceID( "SPRITES/" + vcmiName, EResType::ANIMATION)))			logMod->warn("Template animation file %s was not found!", vcmiName);		mappingObjectTemplate[h3mName] = vcmiName;	}	for (auto entryOuter : mapping["objects"].Struct())	{		if (entryOuter.second.isStruct())		{			for (auto entryInner : entryOuter.second.Struct())			{				auto handler = VLC->objtypeh->getHandlerFor( VLC->modh->scopeGame(), entryOuter.first, entryInner.first);				auto entryValues = entryInner.second.Vector();				ObjectTypeIdentifier h3mID{Obj(entryValues[0].Integer()), int32_t(entryValues[1].Integer())};				ObjectTypeIdentifier vcmiID{Obj(handler->getIndex()), handler->getSubIndex()};				mappingObjectIndex[h3mID] = vcmiID;			}		}		else		{			auto handler = VLC->objtypeh->getHandlerFor( VLC->modh->scopeGame(), entryOuter.first, entryOuter.first);			auto entryValues = entryOuter.second.Vector();			ObjectTypeIdentifier h3mID{Obj(entryValues[0].Integer()), int32_t(entryValues[1].Integer())};			ObjectTypeIdentifier vcmiID{Obj(handler->getIndex()), handler->getSubIndex()};			mappingObjectIndex[h3mID] = vcmiID;		}	}	loadMapping(mappingBuilding, mapping["buildingsCommon"], "building.core:random");	loadMapping(mappingFaction, mapping["factions"], "faction");	loadMapping(mappingCreature, mapping["creatures"], "creature");	loadMapping(mappingHeroType, mapping["heroes"], "hero");	loadMapping(mappingHeroClass, mapping["heroClasses"], "heroClass");	loadMapping(mappingTerrain, mapping["terrains"], "terrain");	loadMapping(mappingArtifact, mapping["artifacts"], "artifact");	loadMapping(mappingSecondarySkill, mapping["skills"], "skill");}void MapIdentifiersH3M::remapTemplate(ObjectTemplate & objectTemplate){	std::string name = boost::to_lower_copy(objectTemplate.animationFile);	if (mappingObjectTemplate.count(name))		objectTemplate.animationFile = mappingObjectTemplate.at(name);	ObjectTypeIdentifier objectType{ objectTemplate.id, objectTemplate.subid};	if (mappingObjectIndex.count(objectType))	{		auto mappedType = mappingObjectIndex.at(objectType);		objectTemplate.id = mappedType.ID;		objectTemplate.subid = mappedType.subID;	}}BuildingID MapIdentifiersH3M::remapBuilding(std::optional<FactionID> owner, BuildingID input) const{	if (owner.has_value() && mappingFactionBuilding.count(*owner))	{		auto submap = mappingFactionBuilding.at(*owner);		if (submap.count(input))			return submap.at(input);	}	if (mappingBuilding.count(input))		return mappingBuilding.at(input);	return BuildingID::NONE;}FactionID MapIdentifiersH3M::remap(FactionID input) const{	if (mappingFaction.count(input))		return mappingFaction.at(input);	return input;}CreatureID MapIdentifiersH3M::remap(CreatureID input) const{	if (mappingCreature.count(input))		return mappingCreature.at(input);	return input;}HeroTypeID MapIdentifiersH3M::remap(HeroTypeID input) const{	if (mappingHeroType.count(input))		return mappingHeroType.at(input);	return input;}HeroClassID MapIdentifiersH3M::remap(HeroClassID input) const{	if (mappingHeroClass.count(input))		return mappingHeroClass.at(input);	return input;}TerrainId MapIdentifiersH3M::remap(TerrainId input) const{	if (mappingTerrain.count(input))		return mappingTerrain.at(input);	return input;}ArtifactID MapIdentifiersH3M::remap(ArtifactID input) const{	if (mappingArtifact.count(input))		return mappingArtifact.at(input);	return input;}SecondarySkill MapIdentifiersH3M::remap(SecondarySkill input) const{	if (mappingSecondarySkill.count(input))		return mappingSecondarySkill.at(input);	return input;}VCMI_LIB_NAMESPACE_END
 |