1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-01-02 00:10:22 +02:00

market->getObjInstanceID()

This commit is contained in:
SoundSSGood 2024-08-20 17:15:50 +03:00
parent 58bb2b58e3
commit 2e3e6b1553
27 changed files with 77 additions and 61 deletions

View File

@ -1490,7 +1490,7 @@ void AIGateway::tryRealize(Goals::Trade & g) //trade
//TODO trade only as much as needed //TODO trade only as much as needed
if (toGive) //don't try to sell 0 resources if (toGive) //don't try to sell 0 resources
{ {
cb->trade(m, EMarketMode::RESOURCE_RESOURCE, res, GameResID(g.resID), toGive); cb->trade(m->getObjInstanceID(), EMarketMode::RESOURCE_RESOURCE, res, GameResID(g.resID), toGive);
acquiredResources = static_cast<int>(toGet * (it->resVal / toGive)); acquiredResources = static_cast<int>(toGet * (it->resVal / toGive));
logAi->debug("Traded %d of %s for %d of %s at %s", toGive, res, acquiredResources, g.resID, obj->getObjectName()); logAi->debug("Traded %d of %s for %d of %s at %s", toGive, res, acquiredResources, g.resID, obj->getObjectName());
} }

View File

@ -2130,7 +2130,7 @@ void VCAI::tryRealize(Goals::Trade & g) //trade
//TODO trade only as much as needed //TODO trade only as much as needed
if (toGive) //don't try to sell 0 resources if (toGive) //don't try to sell 0 resources
{ {
cb->trade(m, EMarketMode::RESOURCE_RESOURCE, res, GameResID(g.resID), toGive); cb->trade(m->getObjInstanceID(), EMarketMode::RESOURCE_RESOURCE, res, GameResID(g.resID), toGive);
acquiredResources = static_cast<int>(toGet * (it->resVal / toGive)); acquiredResources = static_cast<int>(toGet * (it->resVal / toGive));
logAi->debug("Traded %d of %s for %d of %s at %s", toGive, res, acquiredResources, g.resID, obj->getObjectName()); logAi->debug("Traded %d of %s for %d of %s at %s", toGive, res, acquiredResources, g.resID, obj->getObjectName());
} }

View File

@ -266,15 +266,15 @@ void CCallback::buyArtifact(const CGHeroInstance *hero, ArtifactID aid)
sendRequest(&pack); sendRequest(&pack);
} }
void CCallback::trade(const IMarket * market, EMarketMode mode, TradeItemSell id1, TradeItemBuy id2, ui32 val1, const CGHeroInstance * hero) void CCallback::trade(const ObjectInstanceID marketId, EMarketMode mode, TradeItemSell id1, TradeItemBuy id2, ui32 val1, const CGHeroInstance * hero)
{ {
trade(market, mode, std::vector(1, id1), std::vector(1, id2), std::vector(1, val1), hero); trade(marketId, mode, std::vector(1, id1), std::vector(1, id2), std::vector(1, val1), hero);
} }
void CCallback::trade(const IMarket * market, EMarketMode mode, const std::vector<TradeItemSell> & id1, const std::vector<TradeItemBuy> & id2, const std::vector<ui32> & val1, const CGHeroInstance * hero) void CCallback::trade(const ObjectInstanceID marketId, EMarketMode mode, const std::vector<TradeItemSell> & id1, const std::vector<TradeItemBuy> & id2, const std::vector<ui32> & val1, const CGHeroInstance * hero)
{ {
TradeOnMarketplace pack; TradeOnMarketplace pack;
pack.marketId = dynamic_cast<const CGObjectInstance *>(market)->id; pack.marketId = marketId;
pack.heroId = hero ? hero->id : ObjectInstanceID(); pack.heroId = hero ? hero->id : ObjectInstanceID();
pack.mode = mode; pack.mode = mode;
pack.r1 = id1; pack.r1 = id1;

View File

@ -34,7 +34,6 @@ class IBattleEventsReceiver;
class IGameEventsReceiver; class IGameEventsReceiver;
struct ArtifactLocation; struct ArtifactLocation;
class BattleStateInfoForRetreat; class BattleStateInfoForRetreat;
class IMarket;
VCMI_LIB_NAMESPACE_END VCMI_LIB_NAMESPACE_END
@ -81,8 +80,8 @@ public:
virtual bool upgradeCreature(const CArmedInstance *obj, SlotID stackPos, CreatureID newID=CreatureID::NONE)=0; //if newID==-1 then best possible upgrade will be made virtual bool upgradeCreature(const CArmedInstance *obj, SlotID stackPos, CreatureID newID=CreatureID::NONE)=0; //if newID==-1 then best possible upgrade will be made
virtual void swapGarrisonHero(const CGTownInstance *town)=0; virtual void swapGarrisonHero(const CGTownInstance *town)=0;
virtual void trade(const IMarket * market, EMarketMode mode, TradeItemSell id1, TradeItemBuy id2, ui32 val1, const CGHeroInstance * hero = nullptr)=0; //mode==0: sell val1 units of id1 resource for id2 resiurce virtual void trade(const ObjectInstanceID marketId, EMarketMode mode, TradeItemSell id1, TradeItemBuy id2, ui32 val1, const CGHeroInstance * hero = nullptr)=0; //mode==0: sell val1 units of id1 resource for id2 resiurce
virtual void trade(const IMarket * market, EMarketMode mode, const std::vector<TradeItemSell> & id1, const std::vector<TradeItemBuy> & id2, const std::vector<ui32> & val1, const CGHeroInstance * hero = nullptr)=0; virtual void trade(const ObjectInstanceID marketId, EMarketMode mode, const std::vector<TradeItemSell> & id1, const std::vector<TradeItemBuy> & id2, const std::vector<ui32> & val1, const CGHeroInstance * hero = nullptr)=0;
virtual int selectionMade(int selection, QueryID queryID) =0; virtual int selectionMade(int selection, QueryID queryID) =0;
virtual int sendQueryReply(std::optional<int32_t> reply, QueryID queryID) =0; virtual int sendQueryReply(std::optional<int32_t> reply, QueryID queryID) =0;
@ -190,8 +189,8 @@ public:
void endTurn() override; void endTurn() override;
void swapGarrisonHero(const CGTownInstance *town) override; void swapGarrisonHero(const CGTownInstance *town) override;
void buyArtifact(const CGHeroInstance *hero, ArtifactID aid) override; void buyArtifact(const CGHeroInstance *hero, ArtifactID aid) override;
void trade(const IMarket * market, EMarketMode mode, TradeItemSell id1, TradeItemBuy id2, ui32 val1, const CGHeroInstance * hero = nullptr) override; void trade(const ObjectInstanceID marketId, EMarketMode mode, TradeItemSell id1, TradeItemBuy id2, ui32 val1, const CGHeroInstance * hero = nullptr) override;
void trade(const IMarket * market, EMarketMode mode, const std::vector<TradeItemSell> & id1, const std::vector<TradeItemBuy> & id2, const std::vector<ui32> & val1, const CGHeroInstance * hero = nullptr) override; void trade(const ObjectInstanceID marketId, EMarketMode mode, const std::vector<TradeItemSell> & id1, const std::vector<TradeItemBuy> & id2, const std::vector<ui32> & val1, const CGHeroInstance * hero = nullptr) override;
void setFormation(const CGHeroInstance * hero, EArmyFormation mode) override; void setFormation(const CGHeroInstance * hero, EArmyFormation mode) override;
void recruitHero(const CGObjectInstance *townOrTavern, const CGHeroInstance *hero, const HeroTypeID & nextHero=HeroTypeID::NONE) override; void recruitHero(const CGObjectInstance *townOrTavern, const CGHeroInstance *hero, const HeroTypeID & nextHero=HeroTypeID::NONE) override;
void save(const std::string &fname) override; void save(const std::string &fname) override;

View File

@ -1654,8 +1654,17 @@ void CPlayerInterface::showMarketWindow(const IMarket * market, const CGHeroInst
GH.windows().createAndPushWindow<CMarketWindow>(market, visitor, onWindowClosed, EMarketMode::CREATURE_EXP); GH.windows().createAndPushWindow<CMarketWindow>(market, visitor, onWindowClosed, EMarketMode::CREATURE_EXP);
else if(market->allowsTrade(EMarketMode::CREATURE_UNDEAD)) else if(market->allowsTrade(EMarketMode::CREATURE_UNDEAD))
GH.windows().createAndPushWindow<CTransformerWindow>(market, visitor, onWindowClosed); GH.windows().createAndPushWindow<CTransformerWindow>(market, visitor, onWindowClosed);
else if(vstd::contains(market->availableModes(), EMarketMode::RESOURCE_RESOURCE)) else if (!market->availableModes().empty())
GH.windows().createAndPushWindow<CMarketWindow>(market, visitor, onWindowClosed, EMarketMode::RESOURCE_RESOURCE); for(auto mode = EMarketMode::RESOURCE_RESOURCE; mode != EMarketMode::MARKET_AFTER_LAST_PLACEHOLDER; mode = vstd::next(mode, 1))
{
if(vstd::contains(market->availableModes(), mode))
{
GH.windows().createAndPushWindow<CMarketWindow>(market, visitor, onWindowClosed, mode);
break;
}
}
else
onWindowClosed();
} }
void CPlayerInterface::showUniversityWindow(const IMarket *market, const CGHeroInstance *visitor, QueryID queryID) void CPlayerInterface::showUniversityWindow(const IMarket *market, const CGHeroInstance *visitor, QueryID queryID)

View File

@ -999,7 +999,7 @@ void ApplyClientNetPackVisitor::visitOpenWindow(OpenWindow & pack)
case EOpenWindowMode::UNIVERSITY_WINDOW: case EOpenWindowMode::UNIVERSITY_WINDOW:
{ {
//displays University window (when hero enters University on adventure map) //displays University window (when hero enters University on adventure map)
const auto * market = dynamic_cast<const IMarket*>(cl.getObj(ObjectInstanceID(pack.object))); const auto * market = cl.getMarket(ObjectInstanceID(pack.object));
const CGHeroInstance *hero = cl.getHero(ObjectInstanceID(pack.visitor)); const CGHeroInstance *hero = cl.getHero(ObjectInstanceID(pack.visitor));
callInterfaceIfPresent(cl, hero->tempOwner, &IGameEventsReceiver::showUniversityWindow, market, hero, pack.queryID); callInterfaceIfPresent(cl, hero->tempOwner, &IGameEventsReceiver::showUniversityWindow, market, hero, pack.queryID);
} }
@ -1009,7 +1009,7 @@ void ApplyClientNetPackVisitor::visitOpenWindow(OpenWindow & pack)
//displays Thieves' Guild window (when hero enters Den of Thieves) //displays Thieves' Guild window (when hero enters Den of Thieves)
const CGObjectInstance *obj = cl.getObj(ObjectInstanceID(pack.object)); const CGObjectInstance *obj = cl.getObj(ObjectInstanceID(pack.object));
const CGHeroInstance *hero = cl.getHero(ObjectInstanceID(pack.visitor)); const CGHeroInstance *hero = cl.getHero(ObjectInstanceID(pack.visitor));
const auto *market = dynamic_cast<const IMarket*>(obj); const auto market = cl.getMarket(pack.object);
callInterfaceIfPresent(cl, cl.getTile(obj->visitablePos())->visitableObjects.back()->tempOwner, &IGameEventsReceiver::showMarketWindow, market, hero, pack.queryID); callInterfaceIfPresent(cl, cl.getTile(obj->visitablePos())->visitableObjects.back()->tempOwner, &IGameEventsReceiver::showMarketWindow, market, hero, pack.queryID);
} }
break; break;

View File

@ -24,7 +24,7 @@
#include "../../../lib/networkPacks/ArtifactLocation.h" #include "../../../lib/networkPacks/ArtifactLocation.h"
#include "../../../lib/texts/CGeneralTextHandler.h" #include "../../../lib/texts/CGeneralTextHandler.h"
#include "../../../lib/mapObjects/CGHeroInstance.h" #include "../../../lib/mapObjects/CGHeroInstance.h"
#include "../../../lib/mapObjects/CGMarket.h" #include "../../../lib/mapObjects/IMarket.h"
CAltarArtifacts::CAltarArtifacts(const IMarket * market, const CGHeroInstance * hero) CAltarArtifacts::CAltarArtifacts(const IMarket * market, const CGHeroInstance * hero)
: CMarketBase(market, hero) : CMarketBase(market, hero)
@ -50,9 +50,7 @@ CAltarArtifacts::CAltarArtifacts(const IMarket * market, const CGHeroInstance *
// Hero's artifacts // Hero's artifacts
heroArts = std::make_shared<CArtifactsOfHeroAltar>(Point(-365, -11)); heroArts = std::make_shared<CArtifactsOfHeroAltar>(Point(-365, -11));
heroArts->setHero(hero); heroArts->setHero(hero);
const auto mapObj = dynamic_cast<const CGObjectInstance*>(market); heroArts->altarId = market->getObjInstanceID();
assert(mapObj);
heroArts->altarId = mapObj->id;
// Altar // Altar
offerTradePanel = std::make_shared<ArtifactsAltarPanel>([this](const std::shared_ptr<CTradeableItem> & altarSlot) offerTradePanel = std::make_shared<ArtifactsAltarPanel>([this](const std::shared_ptr<CTradeableItem> & altarSlot)
@ -105,7 +103,7 @@ void CAltarArtifacts::makeDeal()
{ {
positions.push_back(artInst->getId()); positions.push_back(artInst->getId());
} }
LOCPLINT->cb->trade(market, EMarketMode::ARTIFACT_EXP, positions, std::vector<TradeItemBuy>(), std::vector<ui32>(), hero); LOCPLINT->cb->trade(market->getObjInstanceID(), EMarketMode::ARTIFACT_EXP, positions, std::vector<TradeItemBuy>(), std::vector<ui32>(), hero);
deselect(); deselect();
} }

View File

@ -23,7 +23,7 @@
#include "../../../lib/texts/CGeneralTextHandler.h" #include "../../../lib/texts/CGeneralTextHandler.h"
#include "../../../lib/mapObjects/CGHeroInstance.h" #include "../../../lib/mapObjects/CGHeroInstance.h"
#include "../../../lib/mapObjects/CGMarket.h" #include "../../../lib/mapObjects/IMarket.h"
CAltarCreatures::CAltarCreatures(const IMarket * market, const CGHeroInstance * hero) CAltarCreatures::CAltarCreatures(const IMarket * market, const CGHeroInstance * hero)
: CMarketBase(market, hero) : CMarketBase(market, hero)
@ -157,7 +157,7 @@ void CAltarCreatures::makeDeal()
} }
} }
LOCPLINT->cb->trade(market, EMarketMode::CREATURE_EXP, ids, {}, toSacrifice, hero); LOCPLINT->cb->trade(market->getObjInstanceID(), EMarketMode::CREATURE_EXP, ids, {}, toSacrifice, hero);
for(int & units : unitsOnAltar) for(int & units : unitsOnAltar)
units = 0; units = 0;

View File

@ -68,7 +68,7 @@ void CArtifactsBuying::makeDeal()
{ {
if(ArtifactID(offerTradePanel->getSelectedItemId()).toArtifact()->canBePutAt(hero)) if(ArtifactID(offerTradePanel->getSelectedItemId()).toArtifact()->canBePutAt(hero))
{ {
LOCPLINT->cb->trade(market, EMarketMode::RESOURCE_ARTIFACT, GameResID(bidTradePanel->getSelectedItemId()), LOCPLINT->cb->trade(market->getObjInstanceID(), EMarketMode::RESOURCE_ARTIFACT, GameResID(bidTradePanel->getSelectedItemId()),
ArtifactID(offerTradePanel->getSelectedItemId()), offerQty, hero); ArtifactID(offerTradePanel->getSelectedItemId()), offerQty, hero);
CMarketTraderText::makeDeal(); CMarketTraderText::makeDeal();
deselect(); deselect();

View File

@ -78,7 +78,8 @@ void CArtifactsSelling::makeDeal()
{ {
const auto art = hero->getArt(selectedHeroSlot); const auto art = hero->getArt(selectedHeroSlot);
assert(art); assert(art);
LOCPLINT->cb->trade(market, EMarketMode::ARTIFACT_RESOURCE, art->getId(), GameResID(offerTradePanel->getSelectedItemId()), offerQty, hero); LOCPLINT->cb->trade(market->getObjInstanceID(), EMarketMode::ARTIFACT_RESOURCE, art->getId(),
GameResID(offerTradePanel->getSelectedItemId()), offerQty, hero);
CMarketTraderText::makeDeal(); CMarketTraderText::makeDeal();
} }

View File

@ -23,7 +23,7 @@
#include "../../../lib/texts/CGeneralTextHandler.h" #include "../../../lib/texts/CGeneralTextHandler.h"
#include "../../../lib/mapObjects/CGHeroInstance.h" #include "../../../lib/mapObjects/CGHeroInstance.h"
#include "../../../lib/mapObjects/CGMarket.h" #include "../../../lib/mapObjects/IMarket.h"
CFreelancerGuild::CFreelancerGuild(const IMarket * market, const CGHeroInstance * hero) CFreelancerGuild::CFreelancerGuild(const IMarket * market, const CGHeroInstance * hero)
: CMarketBase(market, hero) : CMarketBase(market, hero)
@ -69,7 +69,7 @@ void CFreelancerGuild::makeDeal()
{ {
if(auto toTrade = offerSlider->getValue(); toTrade != 0) if(auto toTrade = offerSlider->getValue(); toTrade != 0)
{ {
LOCPLINT->cb->trade(market, EMarketMode::CREATURE_RESOURCE, SlotID(bidTradePanel->highlightedSlot->serial), GameResID(offerTradePanel->getSelectedItemId()), bidQty * toTrade, hero); LOCPLINT->cb->trade(market->getObjInstanceID(), EMarketMode::CREATURE_RESOURCE, SlotID(bidTradePanel->highlightedSlot->serial), GameResID(offerTradePanel->getSelectedItemId()), bidQty * toTrade, hero);
CMarketTraderText::makeDeal(); CMarketTraderText::makeDeal();
deselect(); deselect();
} }

View File

@ -22,7 +22,7 @@
#include "../../../CCallback.h" #include "../../../CCallback.h"
#include "../../../lib/texts/CGeneralTextHandler.h" #include "../../../lib/texts/CGeneralTextHandler.h"
#include "../../../lib/mapObjects/CGMarket.h" #include "../../../lib/mapObjects/IMarket.h"
CMarketResources::CMarketResources(const IMarket * market, const CGHeroInstance * hero) CMarketResources::CMarketResources(const IMarket * market, const CGHeroInstance * hero)
: CMarketBase(market, hero) : CMarketBase(market, hero)
@ -60,7 +60,7 @@ void CMarketResources::makeDeal()
{ {
if(auto toTrade = offerSlider->getValue(); toTrade != 0) if(auto toTrade = offerSlider->getValue(); toTrade != 0)
{ {
LOCPLINT->cb->trade(market, EMarketMode::RESOURCE_RESOURCE, GameResID(bidTradePanel->getSelectedItemId()), LOCPLINT->cb->trade(market->getObjInstanceID(), EMarketMode::RESOURCE_RESOURCE, GameResID(bidTradePanel->getSelectedItemId()),
GameResID(offerTradePanel->highlightedSlot->id), bidQty * toTrade, hero); GameResID(offerTradePanel->highlightedSlot->id), bidQty * toTrade, hero);
CMarketTraderText::makeDeal(); CMarketTraderText::makeDeal();
deselect(); deselect();

View File

@ -22,6 +22,7 @@
#include "../../../CCallback.h" #include "../../../CCallback.h"
#include "../../../lib/texts/CGeneralTextHandler.h" #include "../../../lib/texts/CGeneralTextHandler.h"
#include "../../../lib/mapObjects/IMarket.h"
#include "../../../lib/texts/MetaString.h" #include "../../../lib/texts/MetaString.h"
CTransferResources::CTransferResources(const IMarket * market, const CGHeroInstance * hero) CTransferResources::CTransferResources(const IMarket * market, const CGHeroInstance * hero)
@ -63,7 +64,7 @@ void CTransferResources::makeDeal()
{ {
if(auto toTrade = offerSlider->getValue(); toTrade != 0) if(auto toTrade = offerSlider->getValue(); toTrade != 0)
{ {
LOCPLINT->cb->trade(market, EMarketMode::RESOURCE_PLAYER, GameResID(bidTradePanel->getSelectedItemId()), LOCPLINT->cb->trade(market->getObjInstanceID(), EMarketMode::RESOURCE_PLAYER, GameResID(bidTradePanel->getSelectedItemId()),
PlayerColor(offerTradePanel->getSelectedItemId()), toTrade, hero); PlayerColor(offerTradePanel->getSelectedItemId()), toTrade, hero);
CMarketTraderText::makeDeal(); CMarketTraderText::makeDeal();
deselect(); deselect();

View File

@ -187,9 +187,7 @@ void CMarketWindow::createArtifactsBuying(const IMarket * market, const CGHeroIn
OBJECT_CONSTRUCTION; OBJECT_CONSTRUCTION;
background = createBg(ImagePath::builtin("TPMRKABS.bmp"), PLAYER_COLORED); background = createBg(ImagePath::builtin("TPMRKABS.bmp"), PLAYER_COLORED);
const auto mapObj = dynamic_cast<const CGObjectInstance*>(market); marketWidget = std::make_shared<CArtifactsBuying>(market, hero, LOCPLINT->cb->getTown(market->getObjInstanceID()) ?
assert(market);
marketWidget = std::make_shared<CArtifactsBuying>(market, hero, LOCPLINT->cb->getTown(mapObj->id) ?
VLC->generaltexth->translate("building.core.conflux.special1.name") : CGI->generaltexth->allTexts[349]); VLC->generaltexth->translate("building.core.conflux.special1.name") : CGI->generaltexth->allTexts[349]);
initWidgetInternals(EMarketMode::RESOURCE_ARTIFACT, CGI->generaltexth->zelp[600]); initWidgetInternals(EMarketMode::RESOURCE_ARTIFACT, CGI->generaltexth->zelp[600]);
} }
@ -202,8 +200,7 @@ void CMarketWindow::createArtifactsSelling(const IMarket * market, const CGHeroI
// Create image that copies part of background containing slot MISC_1 into position of slot MISC_5 // Create image that copies part of background containing slot MISC_1 into position of slot MISC_5
artSlotBack = std::make_shared<CPicture>(background->getSurface(), Rect(20, 187, 47, 47), 0, 0); artSlotBack = std::make_shared<CPicture>(background->getSurface(), Rect(20, 187, 47, 47), 0, 0);
artSlotBack->moveTo(pos.topLeft() + Point(18, 339)); artSlotBack->moveTo(pos.topLeft() + Point(18, 339));
const auto mapObj = dynamic_cast<const CGObjectInstance*>(market); const auto mapObj = LOCPLINT->cb->getObj(market->getObjInstanceID());
assert(market);
auto artsSellingMarket = std::make_shared<CArtifactsSelling>(market, hero, LOCPLINT->cb->getTown(mapObj->id) ? auto artsSellingMarket = std::make_shared<CArtifactsSelling>(market, hero, LOCPLINT->cb->getTown(mapObj->id) ?
VLC->generaltexth->translate("building.core.conflux.special1.name") : mapObj->getObjectName()); VLC->generaltexth->translate("building.core.conflux.special1.name") : mapObj->getObjectName());
artSets.clear(); artSets.clear();

View File

@ -819,7 +819,7 @@ void CTransformerWindow::makeDeal()
for(auto & elem : items) for(auto & elem : items)
{ {
if(!elem->left) if(!elem->left)
LOCPLINT->cb->trade(market, EMarketMode::CREATURE_UNDEAD, SlotID(elem->id), {}, {}, hero); LOCPLINT->cb->trade(market->getObjInstanceID(), EMarketMode::CREATURE_UNDEAD, SlotID(elem->id), {}, {}, hero);
} }
} }
@ -1005,7 +1005,7 @@ void CUniversityWindow::updateSecondarySkills()
void CUniversityWindow::makeDeal(SecondarySkill skill) void CUniversityWindow::makeDeal(SecondarySkill skill)
{ {
LOCPLINT->cb->trade(market, EMarketMode::RESOURCE_SKILL, GameResID(GameResID::GOLD), skill, 1, hero); LOCPLINT->cb->trade(market->getObjInstanceID(), EMarketMode::RESOURCE_SKILL, GameResID(GameResID::GOLD), skill, 1, hero);
} }
CUnivConfirmWindow::CUnivConfirmWindow(CUniversityWindow * owner_, SecondarySkill SKILL, bool available) CUnivConfirmWindow::CUnivConfirmWindow(CUniversityWindow * owner_, SecondarySkill SKILL, bool available)

View File

@ -174,6 +174,15 @@ const CGTownInstance* CGameInfoCallback::getTown(ObjectInstanceID objid) const
return nullptr; return nullptr;
} }
const IMarket * CGameInfoCallback::getMarket(ObjectInstanceID objid) const
{
const CGObjectInstance * obj = getObj(objid, false);
if(obj)
return dynamic_cast<const IMarket*>(obj);
else
return nullptr;
}
void CGameInfoCallback::fillUpgradeInfo(const CArmedInstance *obj, SlotID stackPos, UpgradeInfo &out) const void CGameInfoCallback::fillUpgradeInfo(const CArmedInstance *obj, SlotID stackPos, UpgradeInfo &out) const
{ {
//boost::shared_lock<boost::shared_mutex> lock(*gs->mx); //boost::shared_lock<boost::shared_mutex> lock(*gs->mx);

View File

@ -48,6 +48,7 @@ class CGHeroInstance;
class CGDwelling; class CGDwelling;
class CGTeleport; class CGTeleport;
class CGTownInstance; class CGTownInstance;
class IMarket;
class DLL_LINKAGE IGameInfoCallback : boost::noncopyable class DLL_LINKAGE IGameInfoCallback : boost::noncopyable
{ {
@ -189,6 +190,7 @@ public:
virtual std::vector <const CGObjectInstance * > getFlaggableObjects(int3 pos) const; virtual std::vector <const CGObjectInstance * > getFlaggableObjects(int3 pos) const;
virtual const CGObjectInstance * getTopObj (int3 pos) const; virtual const CGObjectInstance * getTopObj (int3 pos) const;
virtual PlayerColor getOwner(ObjectInstanceID heroID) const; virtual PlayerColor getOwner(ObjectInstanceID heroID) const;
virtual const IMarket * getMarket(ObjectInstanceID objid) const;
//map //map
virtual int3 guardingCreaturePosition (int3 pos) const; virtual int3 guardingCreaturePosition (int3 pos) const;

View File

@ -287,7 +287,7 @@ CArtifactSet * CNonConstInfoCallback::getArtSet(const ArtifactLocation & loc)
return hero; return hero;
} }
} }
else if(auto market = dynamic_cast<IMarket*>(getObjInstance(loc.artHolder))) else if(auto market = getMarket(loc.artHolder))
{ {
if(auto artSet = market->getArtifactsStorage()) if(auto artSet = market->getArtifactsStorage())
return artSet.get(); return artSet.get();

View File

@ -23,6 +23,11 @@
VCMI_LIB_NAMESPACE_BEGIN VCMI_LIB_NAMESPACE_BEGIN
ObjectInstanceID CGMarket::getObjInstanceID() const
{
return id;
}
void CGMarket::initObj(vstd::RNG & rand) void CGMarket::initObj(vstd::RNG & rand)
{ {
getObjectHandler()->configureObject(this, rand); getObjectHandler()->configureObject(this, rand);
@ -43,13 +48,6 @@ int CGMarket::availableUnits(EMarketMode mode, int marketItemSerial) const
return -1; return -1;
} }
std::vector<TradeItemBuy> CGMarket::availableItemsIds(EMarketMode mode) const
{
if(allowsTrade(mode))
return IMarket::availableItemsIds(mode);
return std::vector<TradeItemBuy>();
}
CGMarket::CGMarket(IGameCallback *cb): CGMarket::CGMarket(IGameCallback *cb):
CGObjectInstance(cb) CGObjectInstance(cb)
{} {}
@ -58,8 +56,6 @@ std::vector<TradeItemBuy> CGBlackMarket::availableItemsIds(EMarketMode mode) con
{ {
switch(mode) switch(mode)
{ {
case EMarketMode::ARTIFACT_RESOURCE:
return IMarket::availableItemsIds(mode);
case EMarketMode::RESOURCE_ARTIFACT: case EMarketMode::RESOURCE_ARTIFACT:
{ {
std::vector<TradeItemBuy> ret; std::vector<TradeItemBuy> ret;

View File

@ -26,9 +26,9 @@ public:
void initObj(vstd::RNG & rand) override;//set skills for trade void initObj(vstd::RNG & rand) override;//set skills for trade
///IMarket ///IMarket
ObjectInstanceID getObjInstanceID() const override;
int getMarketEfficiency() const override; int getMarketEfficiency() const override;
int availableUnits(EMarketMode mode, int marketItemSerial) const override; //-1 if unlimited int availableUnits(EMarketMode mode, int marketItemSerial) const override; //-1 if unlimited
std::vector<TradeItemBuy> availableItemsIds(EMarketMode mode) const override;
template <typename Handler> void serialize(Handler &h) template <typename Handler> void serialize(Handler &h)
{ {

View File

@ -710,6 +710,11 @@ std::vector<TradeItemBuy> CGTownInstance::availableItemsIds(EMarketMode mode) co
return IMarket::availableItemsIds(mode); return IMarket::availableItemsIds(mode);
} }
ObjectInstanceID CGTownInstance::getObjInstanceID() const
{
return id;
}
void CGTownInstance::updateAppearance() void CGTownInstance::updateAppearance()
{ {
auto terrain = cb->gameState()->getTile(visitablePos())->terType->getId(); auto terrain = cb->gameState()->getTile(visitablePos())->terType->getId();

View File

@ -155,7 +155,7 @@ public:
const IObjectInterface * getObject() const override; const IObjectInterface * getObject() const override;
int getMarketEfficiency() const override; //=market count int getMarketEfficiency() const override; //=market count
std::vector<TradeItemBuy> availableItemsIds(EMarketMode mode) const override; std::vector<TradeItemBuy> availableItemsIds(EMarketMode mode) const override;
ObjectInstanceID getObjInstanceID() const override;
void updateAppearance(); void updateAppearance();
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////

View File

@ -22,7 +22,7 @@ VCMI_LIB_NAMESPACE_BEGIN
bool IMarket::allowsTrade(const EMarketMode mode) const bool IMarket::allowsTrade(const EMarketMode mode) const
{ {
return marketModes.count(mode) > 0; return vstd::contains(marketModes, mode);
} }
bool IMarket::getOffer(int id1, int id2, int &val1, int &val2, EMarketMode mode) const bool IMarket::getOffer(int id1, int id2, int &val1, int &val2, EMarketMode mode) const
@ -180,7 +180,7 @@ std::vector<TradeItemBuy> IMarket::availableItemsIds(const EMarketMode mode) con
case EMarketMode::RESOURCE_RESOURCE: case EMarketMode::RESOURCE_RESOURCE:
case EMarketMode::ARTIFACT_RESOURCE: case EMarketMode::ARTIFACT_RESOURCE:
case EMarketMode::CREATURE_RESOURCE: case EMarketMode::CREATURE_RESOURCE:
for (auto res : GameResID::ALL_RESOURCES()) for(const auto & res : GameResID::ALL_RESOURCES())
ret.push_back(res); ret.push_back(res);
} }
return ret; return ret;

View File

@ -24,6 +24,7 @@ public:
ArtBearer::ArtBearer bearerType() const override {return ArtBearer::ALTAR;}; ArtBearer::ArtBearer bearerType() const override {return ArtBearer::ALTAR;};
}; };
virtual ObjectInstanceID getObjInstanceID() const = 0; // The market is always an object on the map
virtual int getMarketEfficiency() const = 0; virtual int getMarketEfficiency() const = 0;
virtual bool allowsTrade(const EMarketMode mode) const; virtual bool allowsTrade(const EMarketMode mode) const;
virtual int availableUnits(const EMarketMode mode, const int marketItemSerial) const; //-1 if unlimited virtual int availableUnits(const EMarketMode mode, const int marketItemSerial) const; //-1 if unlimited

View File

@ -3560,9 +3560,9 @@ bool CGameHandler::isAllowedExchange(ObjectInstanceID id1, ObjectInstanceID id2)
return true; return true;
} }
auto market = dynamic_cast<const IMarket*>(o1); auto market = getMarket(id1);
if(market == nullptr) if(market == nullptr)
market = dynamic_cast<const IMarket*>(o2); market = getMarket(id2);
if(market) if(market)
return market->allowsTrade(EMarketMode::ARTIFACT_EXP); return market->allowsTrade(EMarketMode::ARTIFACT_EXP);
@ -3917,9 +3917,7 @@ bool CGameHandler::sacrificeArtifact(const IMarket * market, const CGHeroInstanc
COMPLAIN_RET("Evil hero can't sacrifice artifact!"); COMPLAIN_RET("Evil hero can't sacrifice artifact!");
assert(market); assert(market);
const auto mapObj = dynamic_cast<const CGObjectInstance*>(market); const auto artSet = market->getArtifactsStorage();
assert(mapObj);
const auto artSet = getArtSet(mapObj->id);
int expSum = 0; int expSum = 0;
auto finish = [this, &hero, &expSum]() auto finish = [this, &hero, &expSum]()
@ -3937,7 +3935,7 @@ bool CGameHandler::sacrificeArtifact(const IMarket * market, const CGHeroInstanc
int expToGive; int expToGive;
market->getOffer(art->getTypeId(), 0, dmp, expToGive, EMarketMode::ARTIFACT_EXP); market->getOffer(art->getTypeId(), 0, dmp, expToGive, EMarketMode::ARTIFACT_EXP);
expSum += expToGive; expSum += expToGive;
removeArtifact(ArtifactLocation(mapObj->id, artSet->getArtPos(art))); removeArtifact(ArtifactLocation(market->getObjInstanceID(), artSet->getArtPos(art)));
} }
else else
{ {

View File

@ -184,7 +184,7 @@ void ApplyGhNetPackVisitor::visitExchangeArtifacts(ExchangeArtifacts & pack)
void ApplyGhNetPackVisitor::visitBulkExchangeArtifacts(BulkExchangeArtifacts & pack) void ApplyGhNetPackVisitor::visitBulkExchangeArtifacts(BulkExchangeArtifacts & pack)
{ {
if(dynamic_cast<const IMarket*>(gh.getObj(pack.srcHero)) == nullptr) if(gh.getMarket(pack.srcHero) == nullptr)
gh.throwIfWrongOwner(&pack, pack.srcHero); gh.throwIfWrongOwner(&pack, pack.srcHero);
if(pack.swap) if(pack.swap)
gh.throwIfWrongOwner(&pack, pack.dstHero); gh.throwIfWrongOwner(&pack, pack.dstHero);
@ -250,7 +250,7 @@ void ApplyGhNetPackVisitor::visitTradeOnMarketplace(TradeOnMarketplace & pack)
{ {
const CGObjectInstance * object = gh.getObj(pack.marketId); const CGObjectInstance * object = gh.getObj(pack.marketId);
const CGHeroInstance * hero = gh.getHero(pack.heroId); const CGHeroInstance * hero = gh.getHero(pack.heroId);
const auto * market = dynamic_cast<const IMarket*>(object); const auto * market = gh.getMarket(pack.marketId);
gh.throwIfWrongPlayer(&pack); gh.throwIfWrongPlayer(&pack);
gh.throwIfPlayerNotActive(&pack); gh.throwIfPlayerNotActive(&pack);

View File

@ -64,7 +64,7 @@ TEST_F(CatapultTest, NotApplicableInVillage)
TEST_F(CatapultTest, NotApplicableForDefenderIfSmart) TEST_F(CatapultTest, NotApplicableForDefenderIfSmart)
{ {
auto fakeTown = std::make_shared<CGTownInstance>(nullptr); auto fakeTown = std::make_shared<CGTownInstance>(nullptr);
fakeTown->builtBuildings.insert(BuildingID::FORT); fakeTown->addBuilding(BuildingID::FORT);
mechanicsMock.casterSide = BattleSide::DEFENDER; mechanicsMock.casterSide = BattleSide::DEFENDER;
EXPECT_CALL(*battleFake, getDefendedTown()).WillRepeatedly(Return(fakeTown.get())); EXPECT_CALL(*battleFake, getDefendedTown()).WillRepeatedly(Return(fakeTown.get()));
@ -78,7 +78,7 @@ TEST_F(CatapultTest, NotApplicableForDefenderIfSmart)
TEST_F(CatapultTest, DISABLED_ApplicableInTown) TEST_F(CatapultTest, DISABLED_ApplicableInTown)
{ {
auto fakeTown = std::make_shared<CGTownInstance>(nullptr); auto fakeTown = std::make_shared<CGTownInstance>(nullptr);
fakeTown->builtBuildings.insert(BuildingID::FORT); fakeTown->addBuilding(BuildingID::FORT);
EXPECT_CALL(*battleFake, getDefendedTown()).WillRepeatedly(Return(fakeTown.get())); EXPECT_CALL(*battleFake, getDefendedTown()).WillRepeatedly(Return(fakeTown.get()));
EXPECT_CALL(mechanicsMock, adaptProblem(_, _)).Times(0); EXPECT_CALL(mechanicsMock, adaptProblem(_, _)).Times(0);
@ -108,7 +108,7 @@ protected:
{ {
EffectFixture::setUp(); EffectFixture::setUp();
fakeTown = std::make_shared<CGTownInstance>(nullptr); fakeTown = std::make_shared<CGTownInstance>(nullptr);
fakeTown->builtBuildings.insert(BuildingID::FORT); fakeTown->addBuilding(BuildingID::FORT);
} }
private: private:
std::shared_ptr<CGTownInstance> fakeTown; std::shared_ptr<CGTownInstance> fakeTown;