/* * CTownHandler.h, 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 * */ #pragma once #include #include "CFaction.h" #include "../../IHandlerBase.h" #include "../../bonuses/Bonus.h" #include "../../constants/EntityIdentifiers.h" #include "../../json/JsonNode.h" VCMI_LIB_NAMESPACE_BEGIN class CBuilding; class CTown; class DLL_LINKAGE CTownHandler : public CHandlerBase { struct BuildingRequirementsHelper { JsonNode json; CBuilding * building; CTown * town; }; std::map warMachinesToLoad; std::vector requirementsToLoad; std::vector overriddenBidsToLoad; //list of buildings, which bonuses should be overridden. static const TPropagatorPtr & emptyPropagator(); void initializeRequirements(); void initializeOverridden(); void initializeWarMachines(); /// loads CBuilding's into town void loadBuildingRequirements(CBuilding * building, const JsonNode & source, std::vector & bidsToLoad) const; void loadBuilding(CTown * town, const std::string & stringID, const JsonNode & source); void loadBuildings(CTown * town, const JsonNode & source); std::shared_ptr createBonus(CBuilding * build, BonusType type, int val) const; std::shared_ptr createBonus(CBuilding * build, BonusType type, int val, BonusSubtypeID subtype) const; std::shared_ptr createBonus(CBuilding * build, BonusType type, int val, BonusSubtypeID subtype, const TPropagatorPtr & prop) const; /// loads CStructure's into town void loadStructure(CTown & town, const std::string & stringID, const JsonNode & source) const; void loadStructures(CTown & town, const JsonNode & source) const; /// loads town hall vector (hallSlots) void loadTownHall(CTown & town, const JsonNode & source) const; void loadSiegeScreen(CTown & town, const JsonNode & source) const; void loadClientData(CTown & town, const JsonNode & source) const; void loadTown(CTown * town, const JsonNode & source); void loadPuzzle(CFaction & faction, const JsonNode & source) const; void loadRandomFaction(); public: template static R getMappedValue(const K key, const R defval, const std::map & map, bool required = true); template static R getMappedValue(const JsonNode & node, const R defval, const std::map & map, bool required = true); CTown * randomTown; CFaction * randomFaction; CTownHandler(); ~CTownHandler(); std::vector loadLegacyData() override; void loadObject(std::string scope, std::string name, const JsonNode & data) override; void loadObject(std::string scope, std::string name, const JsonNode & data, size_t index) override; void addBonusesForVanilaBuilding(CBuilding * building) const; void loadCustom() override; void afterLoadFinalization() override; std::set getDefaultAllowed() const; std::set getAllowedFactions(bool withTown = true) const; static void loadSpecialBuildingBonuses(const JsonNode & source, BonusList & bonusList, CBuilding * building); protected: const std::vector & getTypeNames() const override; std::shared_ptr loadFromJson(const std::string & scope, const JsonNode & data, const std::string & identifier, size_t index) override; }; template R CTownHandler::getMappedValue(const K key, const R defval, const std::map & map, bool required) { auto it = map.find(key); if(it != map.end()) return it->second; if(required) logMod->warn("Warning: Property: '%s' is unknown. Correct the typo or update VCMI.", key); return defval; } template R CTownHandler::getMappedValue(const JsonNode & node, const R defval, const std::map & map, bool required) { if(!node.isNull() && node.getType() == JsonNode::JsonType::DATA_STRING) return getMappedValue(node.String(), defval, map, required); return defval; } VCMI_LIB_NAMESPACE_END