mirror of
https://github.com/vcmi/vcmi.git
synced 2025-11-25 22:42:04 +02:00
More fixes for trading. Seems to work now.
This commit is contained in:
@@ -66,6 +66,13 @@ std::string Goals::AbstractGoal::name() const //TODO: virtualize
|
|||||||
case COLLECT_RES:
|
case COLLECT_RES:
|
||||||
desc = "COLLECT RESOURCE " + GameConstants::RESOURCE_NAMES[resID] + " (" + boost::lexical_cast<std::string>(value) + ")";
|
desc = "COLLECT RESOURCE " + GameConstants::RESOURCE_NAMES[resID] + " (" + boost::lexical_cast<std::string>(value) + ")";
|
||||||
break;
|
break;
|
||||||
|
case TRADE:
|
||||||
|
{
|
||||||
|
auto obj = cb->getObjInstance(ObjectInstanceID(objid));
|
||||||
|
if (obj)
|
||||||
|
desc = (boost::format("TRADE %d of %s at %s") % value % GameConstants::RESOURCE_NAMES[resID] % obj->getObjectName()).str();
|
||||||
|
}
|
||||||
|
break;
|
||||||
case GATHER_TROOPS:
|
case GATHER_TROOPS:
|
||||||
desc = "GATHER TROOPS";
|
desc = "GATHER TROOPS";
|
||||||
break;
|
break;
|
||||||
@@ -158,6 +165,7 @@ bool Goals::AbstractGoal::operator==(AbstractGoal & g)
|
|||||||
|
|
||||||
//no check atm
|
//no check atm
|
||||||
case COLLECT_RES:
|
case COLLECT_RES:
|
||||||
|
case TRADE: //TODO
|
||||||
return (resID == g.resID); //every hero may collect resources
|
return (resID == g.resID); //every hero may collect resources
|
||||||
break;
|
break;
|
||||||
case GATHER_TROOPS:
|
case GATHER_TROOPS:
|
||||||
@@ -224,6 +232,19 @@ namespace Goals
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TSubgoal Trade::whatToDoToAchieve()
|
||||||
|
{
|
||||||
|
return iAmElementar();
|
||||||
|
}
|
||||||
|
bool Trade::operator==(CollectRes & g)
|
||||||
|
{
|
||||||
|
if (g.resID == resID)
|
||||||
|
if (g.value == value) //TODO: not sure if that logic is consitent
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
//TSubgoal AbstractGoal::whatToDoToAchieve()
|
//TSubgoal AbstractGoal::whatToDoToAchieve()
|
||||||
//{
|
//{
|
||||||
// logAi->debug("Decomposing goal of type %s",name());
|
// logAi->debug("Decomposing goal of type %s",name());
|
||||||
@@ -1079,7 +1100,8 @@ TSubgoal Goals::CollectRes::whatToDoToTrade()
|
|||||||
}
|
}
|
||||||
else //either it's our town, or we have hero there
|
else //either it's our town, or we have hero there
|
||||||
{
|
{
|
||||||
return sptr(setobjid(objid).setisElementar(true).setpriority(10)); //we can do this immediately - highest priority
|
Goals::Trade trade(resID, value, objid);
|
||||||
|
return sptr(trade.setisElementar(true)); //we can do this immediately - highest priority
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1099,8 +1121,6 @@ bool CollectRes::fulfillsMe(TSubgoal goal)
|
|||||||
|
|
||||||
bool Goals::CollectRes::operator==(CollectRes & g)
|
bool Goals::CollectRes::operator==(CollectRes & g)
|
||||||
{
|
{
|
||||||
if (isElementar != g.isElementar) //elementar means ready to trade on Marketplace / Trading Post
|
|
||||||
return false;
|
|
||||||
if (g.resID == resID)
|
if (g.resID == resID)
|
||||||
if (g.value == value) //TODO: not sure if that logic is consitent
|
if (g.value == value) //TODO: not sure if that logic is consitent
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -56,7 +56,8 @@ enum EGoals
|
|||||||
VISIT_TILE, //tile, in conjunction with hero elementar; assumes tile is reachable
|
VISIT_TILE, //tile, in conjunction with hero elementar; assumes tile is reachable
|
||||||
CLEAR_WAY_TO,
|
CLEAR_WAY_TO,
|
||||||
DIG_AT_TILE,//elementar with hero on tile
|
DIG_AT_TILE,//elementar with hero on tile
|
||||||
BUY_ARMY //at specific town
|
BUY_ARMY, //at specific town
|
||||||
|
TRADE //val resID at object objid
|
||||||
};
|
};
|
||||||
|
|
||||||
//method chaining + clone pattern
|
//method chaining + clone pattern
|
||||||
@@ -414,7 +415,26 @@ public:
|
|||||||
TGoalVec getAllPossibleSubgoals() override;
|
TGoalVec getAllPossibleSubgoals() override;
|
||||||
TSubgoal whatToDoToAchieve() override;
|
TSubgoal whatToDoToAchieve() override;
|
||||||
TSubgoal whatToDoToTrade();
|
TSubgoal whatToDoToTrade();
|
||||||
bool fulfillsMe(TSubgoal goal) override;
|
bool fulfillsMe(TSubgoal goal) override; //TODO: Trade
|
||||||
|
bool operator==(CollectRes & g);
|
||||||
|
};
|
||||||
|
|
||||||
|
class DLL_EXPORT Trade : public CGoal<Trade>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Trade()
|
||||||
|
: CGoal(Goals::TRADE)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
Trade(int rid, int val, int Objid)
|
||||||
|
: CGoal(Goals::TRADE)
|
||||||
|
{
|
||||||
|
resID = rid;
|
||||||
|
value = val;
|
||||||
|
objid = Objid;
|
||||||
|
priority = 10; //do it immediately
|
||||||
|
}
|
||||||
|
TSubgoal whatToDoToAchieve() override;
|
||||||
bool operator==(CollectRes & g);
|
bool operator==(CollectRes & g);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2161,11 +2161,12 @@ void VCAI::tryRealize(Goals::DigAtTile & g)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VCAI::tryRealize(Goals::CollectRes & g) //trade
|
void VCAI::tryRealize(Goals::Trade & g) //trade
|
||||||
{
|
{
|
||||||
if(ah->freeResources()[g.resID] >= g.value) //goal is already fulfilled. Why we need this check, anyway?
|
if(ah->freeResources()[g.resID] >= g.value) //goal is already fulfilled. Why we need this check, anyway?
|
||||||
throw goalFulfilledException(sptr(g));
|
throw goalFulfilledException(sptr(g));
|
||||||
|
|
||||||
|
int accquiredResources = 0;
|
||||||
if(const CGObjectInstance * obj = cb->getObj(ObjectInstanceID(g.objid), false))
|
if(const CGObjectInstance * obj = cb->getObj(ObjectInstanceID(g.objid), false))
|
||||||
{
|
{
|
||||||
if(const IMarket * m = IMarket::castFrom(obj, false))
|
if(const IMarket * m = IMarket::castFrom(obj, false))
|
||||||
@@ -2179,8 +2180,13 @@ void VCAI::tryRealize(Goals::CollectRes & g) //trade
|
|||||||
m->getOffer(i, g.resID, toGive, toGet, EMarketMode::RESOURCE_RESOURCE);
|
m->getOffer(i, g.resID, toGive, toGet, EMarketMode::RESOURCE_RESOURCE);
|
||||||
toGive = toGive * (cb->getResourceAmount(i) / toGive);
|
toGive = toGive * (cb->getResourceAmount(i) / toGive);
|
||||||
//TODO trade only as much as needed
|
//TODO trade only as much as needed
|
||||||
cb->trade(obj, EMarketMode::RESOURCE_RESOURCE, i, g.resID, toGive);
|
if (toGive) //don't try to sell 0 resources
|
||||||
if (ah->freeResources()[g.resID] >= g.value)
|
{
|
||||||
|
cb->trade(obj, EMarketMode::RESOURCE_RESOURCE, i, g.resID, toGive);
|
||||||
|
logAi->debug("Traded %d of %s for %d of %s at %s", toGive, i, toGet, g.resID, obj->getObjectName());
|
||||||
|
accquiredResources += toGet;
|
||||||
|
}
|
||||||
|
if (accquiredResources >= g.value) //we traded all we needed
|
||||||
throw goalFulfilledException(sptr(g));
|
throw goalFulfilledException(sptr(g));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ public:
|
|||||||
void tryRealize(Goals::VisitHero & g);
|
void tryRealize(Goals::VisitHero & g);
|
||||||
void tryRealize(Goals::BuildThis & g);
|
void tryRealize(Goals::BuildThis & g);
|
||||||
void tryRealize(Goals::DigAtTile & g);
|
void tryRealize(Goals::DigAtTile & g);
|
||||||
void tryRealize(Goals::CollectRes & g);
|
void tryRealize(Goals::Trade & g);
|
||||||
void tryRealize(Goals::Build & g);
|
void tryRealize(Goals::Build & g);
|
||||||
void tryRealize(Goals::BuyArmy & g);
|
void tryRealize(Goals::BuyArmy & g);
|
||||||
void tryRealize(Goals::Invalid & g);
|
void tryRealize(Goals::Invalid & g);
|
||||||
|
|||||||
Reference in New Issue
Block a user