mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-16 10:19:47 +02:00
20d5b33ea6
marketModes are now generated in runtime and are not a member of IMarket. Was not a bad change, but towns load buildings before town type is randomized, leading to case where market modes are not actually known when building is added to town (like random towns with market built) Since altar requires CArtifactSet for work, IMarket will now always contain it, but it will only be accessible if market supports altar mode.
117 lines
2.6 KiB
C++
117 lines
2.6 KiB
C++
/*
|
|
* CGMarket.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 "CGMarket.h"
|
|
|
|
#include "../texts/CGeneralTextHandler.h"
|
|
#include "../IGameCallback.h"
|
|
#include "../CCreatureHandler.h"
|
|
#include "CGTownInstance.h"
|
|
#include "../GameSettings.h"
|
|
#include "../CSkillHandler.h"
|
|
#include "../mapObjectConstructors/AObjectTypeHandler.h"
|
|
#include "../mapObjectConstructors/CObjectClassesHandler.h"
|
|
#include "../mapObjectConstructors/CommonConstructors.h"
|
|
#include "../networkPacks/PacksForClient.h"
|
|
|
|
VCMI_LIB_NAMESPACE_BEGIN
|
|
|
|
ObjectInstanceID CGMarket::getObjInstanceID() const
|
|
{
|
|
return id;
|
|
}
|
|
|
|
void CGMarket::initObj(vstd::RNG & rand)
|
|
{
|
|
getObjectHandler()->configureObject(this, rand);
|
|
}
|
|
|
|
void CGMarket::onHeroVisit(const CGHeroInstance * h) const
|
|
{
|
|
cb->showObjectWindow(this, EOpenWindowMode::MARKET_WINDOW, h, true);
|
|
}
|
|
|
|
int CGMarket::getMarketEfficiency() const
|
|
{
|
|
return marketEfficiency;
|
|
}
|
|
|
|
int CGMarket::availableUnits(EMarketMode mode, int marketItemSerial) const
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
std::set<EMarketMode> CGMarket::availableModes() const
|
|
{
|
|
const auto & baseHandler = getObjectHandler();
|
|
const auto & ourHandler = std::dynamic_pointer_cast<MarketInstanceConstructor>(baseHandler);
|
|
|
|
return ourHandler->availableModes();
|
|
}
|
|
|
|
CGMarket::CGMarket(IGameCallback *cb):
|
|
CGObjectInstance(cb)
|
|
{}
|
|
|
|
std::vector<TradeItemBuy> CGBlackMarket::availableItemsIds(EMarketMode mode) const
|
|
{
|
|
switch(mode)
|
|
{
|
|
case EMarketMode::RESOURCE_ARTIFACT:
|
|
{
|
|
std::vector<TradeItemBuy> ret;
|
|
for(const CArtifact *a : artifacts)
|
|
if(a)
|
|
ret.push_back(a->getId());
|
|
else
|
|
ret.push_back(ArtifactID{});
|
|
return ret;
|
|
}
|
|
default:
|
|
return std::vector<TradeItemBuy>();
|
|
}
|
|
}
|
|
|
|
void CGBlackMarket::newTurn(vstd::RNG & rand) const
|
|
{
|
|
int resetPeriod = VLC->settings()->getInteger(EGameSettings::MARKETS_BLACK_MARKET_RESTOCK_PERIOD);
|
|
|
|
bool isFirstDay = cb->getDate(Date::DAY) == 1;
|
|
bool regularResetTriggered = resetPeriod != 0 && ((cb->getDate(Date::DAY)-1) % resetPeriod) == 0;
|
|
|
|
if (!isFirstDay && !regularResetTriggered)
|
|
return;
|
|
|
|
SetAvailableArtifacts saa;
|
|
saa.id = id;
|
|
cb->pickAllowedArtsSet(saa.arts, rand);
|
|
cb->sendAndApply(&saa);
|
|
}
|
|
|
|
std::vector<TradeItemBuy> CGUniversity::availableItemsIds(EMarketMode mode) const
|
|
{
|
|
switch (mode)
|
|
{
|
|
case EMarketMode::RESOURCE_SKILL:
|
|
return skills;
|
|
|
|
default:
|
|
return std::vector<TradeItemBuy>();
|
|
}
|
|
}
|
|
|
|
void CGUniversity::onHeroVisit(const CGHeroInstance * h) const
|
|
{
|
|
cb->showObjectWindow(this, EOpenWindowMode::UNIVERSITY_WINDOW, h, true);
|
|
}
|
|
|
|
VCMI_LIB_NAMESPACE_END
|