mirror of
https://github.com/vcmi/vcmi.git
synced 2025-01-02 00:10:22 +02:00
market->getObjInstanceID()
This commit is contained in:
parent
58bb2b58e3
commit
2e3e6b1553
@ -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());
|
||||||
}
|
}
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user