diff --git a/client/windows/GUIClasses.cpp b/client/windows/GUIClasses.cpp index 362ee283d..8ee1d28e5 100644 --- a/client/windows/GUIClasses.cpp +++ b/client/windows/GUIClasses.cpp @@ -51,6 +51,7 @@ #include "../lib/mapObjects/CGHeroInstance.h" #include "../lib/mapObjects/CGMarket.h" #include "../lib/mapObjects/CGTownInstance.h" +#include "../lib/mapObjects/ObjectTemplate.h" #include "../lib/gameState/CGameState.h" #include "../lib/gameState/SThievesGuildInfo.h" #include "../lib/gameState/TavernHeroesPool.h" diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index bdeee78f6..8f074adce 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -140,6 +140,7 @@ set(lib_MAIN_SRCS mapObjectConstructors/DwellingInstanceConstructor.cpp mapObjectConstructors/FlaggableInstanceConstructor.cpp mapObjectConstructors/HillFortInstanceConstructor.cpp + mapObjectConstructors/MarketInstanceConstructor.cpp mapObjectConstructors/ShipyardInstanceConstructor.cpp mapObjects/CGCreature.cpp @@ -565,6 +566,7 @@ set(lib_MAIN_HEADERS mapObjectConstructors/HillFortInstanceConstructor.h mapObjectConstructors/FlaggableInstanceConstructor.h mapObjectConstructors/IObjectInfo.h + mapObjectConstructors/MarketInstanceConstructor.h mapObjectConstructors/RandomMapInfo.h mapObjectConstructors/ShipyardInstanceConstructor.h mapObjectConstructors/SObjectSounds.h diff --git a/lib/mapObjectConstructors/CObjectClassesHandler.cpp b/lib/mapObjectConstructors/CObjectClassesHandler.cpp index bd199a1d0..dc5dc6407 100644 --- a/lib/mapObjectConstructors/CObjectClassesHandler.cpp +++ b/lib/mapObjectConstructors/CObjectClassesHandler.cpp @@ -25,6 +25,7 @@ #include "../mapObjectConstructors/DwellingInstanceConstructor.h" #include "../mapObjectConstructors/FlaggableInstanceConstructor.h" #include "../mapObjectConstructors/HillFortInstanceConstructor.h" +#include "../mapObjectConstructors/MarketInstanceConstructor.h" #include "../mapObjectConstructors/ShipyardInstanceConstructor.h" #include "../mapObjects/CGCreature.h" diff --git a/lib/mapObjectConstructors/CommonConstructors.cpp b/lib/mapObjectConstructors/CommonConstructors.cpp index f055f654a..3019e0e28 100644 --- a/lib/mapObjectConstructors/CommonConstructors.cpp +++ b/lib/mapObjectConstructors/CommonConstructors.cpp @@ -10,24 +10,20 @@ #include "StdInc.h" #include "CommonConstructors.h" -#include "../texts/CGeneralTextHandler.h" #include "../json/JsonRandom.h" #include "../constants/StringConstants.h" -#include "../TerrainHandler.h" #include "../GameLibrary.h" -#include "../CConfigHandler.h" #include "../callback/IGameInfoCallback.h" #include "../entities/faction/CTownHandler.h" #include "../entities/hero/CHeroClass.h" -#include "../json/JsonUtils.h" #include "../mapObjects/CGHeroInstance.h" -#include "../mapObjects/CGMarket.h" #include "../mapObjects/CGTownInstance.h" #include "../mapObjects/MiscObjects.h" #include "../mapObjects/ObjectTemplate.h" #include "../mapping/TerrainTile.h" #include "../modding/IdentifierStorage.h" +#include "../texts/TextIdentifier.h" VCMI_LIB_NAMESPACE_BEGIN @@ -277,90 +273,4 @@ AnimationPath BoatInstanceConstructor::getBoatAnimationName() const return actualAnimation; } -void MarketInstanceConstructor::initTypeData(const JsonNode & input) -{ - if (settings["mods"]["validation"].String() != "off") - JsonUtils::validate(input, "vcmi:market", getJsonKey()); - - if (!input["description"].isNull()) - { - std::string description = input["description"].String(); - descriptionTextID = TextIdentifier(getBaseTextID(), "description").get(); - LIBRARY->generaltexth->registerString( input.getModScope(), descriptionTextID, input["description"]); - } - - if (!input["speech"].isNull()) - { - std::string speech = input["speech"].String(); - if (!speech.empty() && speech.at(0) == '@') - { - speechTextID = speech.substr(1); - } - else - { - speechTextID = TextIdentifier(getBaseTextID(), "speech").get(); - LIBRARY->generaltexth->registerString( input.getModScope(), speechTextID, input["speech"]); - } - } - - for(auto & element : input["modes"].Vector()) - { - if(MappedKeys::MARKET_NAMES_TO_TYPES.count(element.String())) - marketModes.insert(MappedKeys::MARKET_NAMES_TO_TYPES.at(element.String())); - } - - marketEfficiency = input["efficiency"].isNull() ? 5 : input["efficiency"].Integer(); - predefinedOffer = input["offer"]; -} - -bool MarketInstanceConstructor::hasDescription() const -{ - return !descriptionTextID.empty(); -} - -std::shared_ptr MarketInstanceConstructor::createObject(IGameInfoCallback * cb) const -{ - if(marketModes.size() == 1) - { - switch(*marketModes.begin()) - { - case EMarketMode::ARTIFACT_RESOURCE: - case EMarketMode::RESOURCE_ARTIFACT: - return std::make_shared(cb); - - case EMarketMode::RESOURCE_SKILL: - return std::make_shared(cb); - } - } - return std::make_shared(cb); -} - -const std::set & MarketInstanceConstructor::availableModes() const -{ - return marketModes; -} - -void MarketInstanceConstructor::randomizeObject(CGMarket * object, IGameRandomizer & gameRandomizer) const -{ - JsonRandom randomizer(object->cb, gameRandomizer); - JsonRandom::Variables emptyVariables; - - if(auto * university = dynamic_cast(object)) - { - for(auto skill : randomizer.loadSecondaries(predefinedOffer, emptyVariables)) - university->skills.push_back(skill.first); - } -} - -std::string MarketInstanceConstructor::getSpeechTranslated() const -{ - assert(marketModes.count(EMarketMode::RESOURCE_SKILL)); - return LIBRARY->generaltexth->translate(speechTextID); -} - -int MarketInstanceConstructor::getMarketEfficiency() const -{ - return marketEfficiency; -} - VCMI_LIB_NAMESPACE_END diff --git a/lib/mapObjectConstructors/CommonConstructors.h b/lib/mapObjectConstructors/CommonConstructors.h index a941d3143..4b75c1bc8 100644 --- a/lib/mapObjectConstructors/CommonConstructors.h +++ b/lib/mapObjectConstructors/CommonConstructors.h @@ -15,10 +15,8 @@ #include "../mapObjects/MiscObjects.h" #include "../mapObjects/CGCreature.h" #include "../mapObjects/CGHeroInstance.h" -#include "../mapObjects/CGMarket.h" #include "../mapObjects/CGResource.h" #include "../mapObjects/CGTownInstance.h" -#include "../mapObjects/ObstacleSetHandler.h" VCMI_LIB_NAMESPACE_BEGIN @@ -126,25 +124,4 @@ public: AnimationPath getBoatAnimationName() const; }; -class MarketInstanceConstructor : public CDefaultObjectTypeHandler -{ - std::string descriptionTextID; - std::string speechTextID; - - std::set marketModes; - JsonNode predefinedOffer; - int marketEfficiency; - - void initTypeData(const JsonNode & config) override; -public: - std::shared_ptr createObject(IGameInfoCallback * cb) const override; - void randomizeObject(CGMarket * object, IGameRandomizer & gameRandomizer) const override; - - const std::set & availableModes() const; - bool hasDescription() const; - - std::string getSpeechTranslated() const; - int getMarketEfficiency() const; -}; - VCMI_LIB_NAMESPACE_END diff --git a/lib/mapObjectConstructors/MarketInstanceConstructor.cpp b/lib/mapObjectConstructors/MarketInstanceConstructor.cpp new file mode 100644 index 000000000..d8e076c2d --- /dev/null +++ b/lib/mapObjectConstructors/MarketInstanceConstructor.cpp @@ -0,0 +1,105 @@ +/* +* MarketInstanceConstructor.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 "MarketInstanceConstructor.h" + +#include "../CConfigHandler.h" +#include "../GameLibrary.h" +#include "../constants/StringConstants.h" +#include "../json/JsonRandom.h" +#include "../json/JsonUtils.h" +#include "../texts/CGeneralTextHandler.h" +#include "../texts/TextIdentifier.h" + +void MarketInstanceConstructor::initTypeData(const JsonNode & input) +{ + if (settings["mods"]["validation"].String() != "off") + JsonUtils::validate(input, "vcmi:market", getJsonKey()); + + if (!input["description"].isNull()) + { + std::string description = input["description"].String(); + descriptionTextID = TextIdentifier(getBaseTextID(), "description").get(); + LIBRARY->generaltexth->registerString( input.getModScope(), descriptionTextID, input["description"]); + } + + if (!input["speech"].isNull()) + { + std::string speech = input["speech"].String(); + if (!speech.empty() && speech.at(0) == '@') + { + speechTextID = speech.substr(1); + } + else + { + speechTextID = TextIdentifier(getBaseTextID(), "speech").get(); + LIBRARY->generaltexth->registerString( input.getModScope(), speechTextID, input["speech"]); + } + } + + for(auto & element : input["modes"].Vector()) + { + if(MappedKeys::MARKET_NAMES_TO_TYPES.count(element.String())) + marketModes.insert(MappedKeys::MARKET_NAMES_TO_TYPES.at(element.String())); + } + + marketEfficiency = input["efficiency"].isNull() ? 5 : input["efficiency"].Integer(); + predefinedOffer = input["offer"]; +} + +bool MarketInstanceConstructor::hasDescription() const +{ + return !descriptionTextID.empty(); +} + +std::shared_ptr MarketInstanceConstructor::createObject(IGameInfoCallback * cb) const +{ + if(marketModes.size() == 1) + { + switch(*marketModes.begin()) + { + case EMarketMode::ARTIFACT_RESOURCE: + case EMarketMode::RESOURCE_ARTIFACT: + return std::make_shared(cb); + + case EMarketMode::RESOURCE_SKILL: + return std::make_shared(cb); + } + } + return std::make_shared(cb); +} + +const std::set & MarketInstanceConstructor::availableModes() const +{ + return marketModes; +} + +void MarketInstanceConstructor::randomizeObject(CGMarket * object, IGameRandomizer & gameRandomizer) const +{ + JsonRandom randomizer(object->cb, gameRandomizer); + JsonRandom::Variables emptyVariables; + + if(auto * university = dynamic_cast(object)) + { + for(auto skill : randomizer.loadSecondaries(predefinedOffer, emptyVariables)) + university->skills.push_back(skill.first); + } +} + +std::string MarketInstanceConstructor::getSpeechTranslated() const +{ + assert(marketModes.count(EMarketMode::RESOURCE_SKILL)); + return LIBRARY->generaltexth->translate(speechTextID); +} + +int MarketInstanceConstructor::getMarketEfficiency() const +{ + return marketEfficiency; +} diff --git a/lib/mapObjectConstructors/MarketInstanceConstructor.h b/lib/mapObjectConstructors/MarketInstanceConstructor.h new file mode 100644 index 000000000..2858b3a86 --- /dev/null +++ b/lib/mapObjectConstructors/MarketInstanceConstructor.h @@ -0,0 +1,39 @@ +/* +* MarketInstanceConstructor.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 "CDefaultObjectTypeHandler.h" +#include "../mapObjects/CGMarket.h" +#include "../json/JsonNode.h" + +VCMI_LIB_NAMESPACE_BEGIN + +class MarketInstanceConstructor : public CDefaultObjectTypeHandler +{ + std::string descriptionTextID; + std::string speechTextID; + + std::set marketModes; + JsonNode predefinedOffer; + int marketEfficiency; + + void initTypeData(const JsonNode & config) override; +public: + std::shared_ptr createObject(IGameInfoCallback * cb) const override; + void randomizeObject(CGMarket * object, IGameRandomizer & gameRandomizer) const override; + + const std::set & availableModes() const; + bool hasDescription() const; + + std::string getSpeechTranslated() const; + int getMarketEfficiency() const; +}; + +VCMI_LIB_NAMESPACE_END diff --git a/lib/mapObjects/CGMarket.cpp b/lib/mapObjects/CGMarket.cpp index 8fadfdc2f..e4cc0641f 100644 --- a/lib/mapObjects/CGMarket.cpp +++ b/lib/mapObjects/CGMarket.cpp @@ -11,19 +11,21 @@ #include "StdInc.h" #include "CGMarket.h" -#include "../callback/IGameInfoCallback.h" -#include "../callback/IGameEventCallback.h" -#include "../callback/IGameRandomizer.h" -#include "../texts/CGeneralTextHandler.h" -#include "../CCreatureHandler.h" +#include "CGHeroInstance.h" #include "CGTownInstance.h" + +//#include "../CCreatureHandler.h" +#include "../CPlayerState.h" +//#include "../CSkillHandler.h" #include "../IGameSettings.h" -#include "../CSkillHandler.h" +#include "../callback/IGameEventCallback.h" +#include "../callback/IGameInfoCallback.h" +#include "../callback/IGameRandomizer.h" #include "../mapObjectConstructors/AObjectTypeHandler.h" #include "../mapObjectConstructors/CObjectClassesHandler.h" -#include "../mapObjectConstructors/CommonConstructors.h" +#include "../mapObjectConstructors/MarketInstanceConstructor.h" #include "../networkPacks/PacksForClient.h" -#include "CPlayerState.h" +#include "../texts/TextIdentifier.h" VCMI_LIB_NAMESPACE_BEGIN